亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2525 | 回復: 7
打印 上一主題 下一主題

IO端口是否要配置 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-08-04 16:28 |只看該作者 |倒序瀏覽
在寫開發(fā)板的按鍵驅動時,我并沒有對按鍵的端口進行設置,看datasheet上,默認配置是那些端口工作在輸入方式,但我使用中斷方式的驅動還是可以正常工作,這是怎么回事呢?

論壇徽章:
0
2 [報告]
發(fā)表于 2010-08-05 07:17 |只看該作者
哦,我現(xiàn)在也迷惑在按鍵驅動中,可否看一下你的代碼?

論壇徽章:
0
3 [報告]
發(fā)表于 2010-08-05 08:39 |只看該作者
本帖最后由 heyangya 于 2010-08-05 14:54 編輯
哦,我現(xiàn)在也迷惑在按鍵驅動中,可否看一下你的代碼?
linuxman-phil 發(fā)表于 2010-08-05 07:17

  1. /*
  2. S2、S3、S4、S5 四個按鍵用到以下四個I/O口:EINT0/GPF0 EINT2/GPF2 EINT3/GPF3 EINT4/GPF4 當鍵被按下去時,會產生相應的中斷


  3. */


  4. #include <linux/kernel.h>
  5. #include <linux/module.h>
  6. #include <linux/init.h>
  7. #include <linux/types.h>
  8. #include <linux/fs.h>
  9. #include <linux/kdev_t.h>
  10. #include <linux/cdev.h>
  11. #include <mach/irqs.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/timer.h>
  14. #include <asm/atomic.h>

  15. #define DEV_NAME "my_button_driver"
  16. #define DEV_COUNT 4        //按鍵數(shù)目

  17. unsigned int dev_major=230;

  18. //設備結構體
  19. struct my_dev_struct
  20. {
  21.         unsigned int id;//設備ID
  22.         int irq_num;//中斷號
  23.         char name[10];//設備名
  24. };

  25. struct my_dev_struct mydevs[]=
  26. {
  27.         {0,IRQ_EINT0,"KEY_0"},
  28.         {1,IRQ_EINT2,"KEY_1"},
  29.         {2,IRQ_EINT3,"KEY_2"},
  30.         {3,IRQ_EINT4,"KEY_3"},
  31. };

  32. struct timer_list key_timers[DEV_COUNT];//定時器數(shù)組
  33. atomic_t a_key_press=ATOMIC_INIT(0);//是否被按下

  34. void timer_handler(unsigned long arg)
  35. {
  36.         struct my_dev_struct * devp=(struct my_dev_struct *)arg;
  37.         printk("%s is pressed!\n",devp->name);
  38.         atomic_dec(&a_key_press);
  39. }
  40. irqreturn_t interrupt_hander(int irq, void *dev_id)
  41. {
  42.         atomic_inc(&a_key_press);
  43.         if(atomic_dec_and_test(&a_key_press))
  44.         {
  45.                 struct my_dev_struct * devp=(struct my_dev_struct *)dev_id;
  46.                 int num=devp->id;
  47.                 atomic_inc(&a_key_press);
  48.                 init_timer(&key_timers[num]);
  49.                 key_timers[num].function=timer_handler;
  50.                 key_timers[num].expires=jiffies+HZ/10;
  51.                 key_timers[num].data=(unsigned long)devp;
  52.                 add_timer(&key_timers[num]);
  53.         }
  54.         return IRQ_RETVAL(IRQ_HANDLED);
  55. }

  56. int dev_open(struct inode *inode,struct file *filp)
  57. {
  58.         int i,retval;
  59.         for(i=0;i<DEV_COUNT;i++)
  60.         {
  61.                 //請求中斷
  62.                 retval=request_irq(mydevs[i].irq_num,interrupt_hander,IRQF_TRIGGER_LOW|IRQF_DISABLED,mydevs[i].name,(void*)&mydevs[i]);
  63.                 if(retval)
  64.                         goto error;
  65.         }
  66.         return 0;
  67. error:
  68.         i--;
  69.         while(i>=0)
  70.                 free_irq(mydevs[i].irq_num,(void*)&mydevs[i--]);
  71.         return retval;
  72. }

  73. //設備關閉后,釋放中斷
  74. int dev_release(struct inode *inode,struct file *filp)
  75. {
  76.         int i;
  77.         for(i=0;i<DEV_COUNT;i++)
  78.         {
  79.                 free_irq(mydevs[i].irq_num,(void*)&mydevs[i]);
  80.         }
  81.         return 0;
  82. }



  83. //文件操作結構體
  84. static struct file_operations fops=
  85. {
  86.         .owner        =        THIS_MODULE,
  87.         .open        =        dev_open,
  88.         .release        =        dev_release,
  89. };

  90. //注冊設備
  91. static int __init my_button_init(void)
  92. {
  93.         int err;
  94.         err=register_chrdev(dev_major,DEV_NAME,&fops);
  95.         if(err)
  96.         {
  97.                 printk("register_chrdev error!\n");
  98.                 goto error;
  99.         }
  100.         return 0;
  101. error:
  102.         return -EBUSY;
  103. }

  104. //注銷字符設備
  105. static void __exit my_button_exit(void)
  106. {
  107.         unregister_chrdev(dev_major,DEV_NAME);
  108. }

  109. module_init(my_button_init);
  110. module_exit(my_button_exit);

  111. MODULE_LICENSE("GPL");
復制代碼

論壇徽章:
0
4 [報告]
發(fā)表于 2010-08-05 14:45 |只看該作者
在你的中斷申請函數(shù)里有配置選項:IRQF_TRIGGER_LOW|IRQF_DISABLED,應該是配置成低電平觸發(fā),快速中斷模式。

論壇徽章:
0
5 [報告]
發(fā)表于 2010-08-05 15:13 |只看該作者
應該是這樣,謝謝

論壇徽章:
0
6 [報告]
發(fā)表于 2010-08-08 13:50 |只看該作者
kan kan

論壇徽章:
0
7 [報告]
發(fā)表于 2010-08-09 16:18 |只看該作者
IO響應中斷需要設置成輸入方式,正好是你的默認配置

論壇徽章:
0
8 [報告]
發(fā)表于 2010-08-10 00:39 |只看該作者
LZ做的嵌入式的把? 這個 和 X86區(qū)別還是有點大的. 包括你那個 255個設備號的問題,也許都有關系.
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP