硬件:at91rm9200 <br />软件:linux<br />目标:9200的6个gpio口接6个按键,编写了查询方式的驱动,驱动编译通过,加载也成功,但是用测试程序测试的时候没反应。我把源码附上,请各位高手给个建议。<br />typedef char S8;<br />typedef unsigned char U8;<br />typedef int S16;<br />typedef unsigned int U16;<br />typedef long S32;<br />typedef unsigned long U32;<br /><br />U8 set_cnt;<br /><br />#define TIME_KEY 200<br /><br />#define KK0 ((unsigned int)0x1 << 12) //pb12 DOWN<br />#define KK1 ((unsigned int)0x1 << 13) //pb13 Confirm<br />#define KK2 ((unsigned int)0x1 << 14) //pb14 Right<br />#define KK3 ((unsigned int)0x1 << 15) //pb15,left<br />#define KK4 ((unsigned int)0x1 << 16) //pb16,cancle<br />#define KK5 ((unsigned int)0x1 << 17) //pb17 up<br /><br />U8 KEY_FLAG = 0x00;<br /><br />#define key_PageDown_** (0x1<<0)<br />#define confirm_press_** (0x1<<1)<br />#define key_NumAdd_** (0x1<< 2)<br />#define key_NumSubb_** (0x1<<3)<br />#define cancel_press_** (0x1<<4)<br />#define key_PageUp_** (0x1<<5)<br /><br />void kdb_gpio_init(void); //IO端口初始化<br />static int major = 0; <br />static char dev_name[] = "kdb_dev";<br /><br />U8 ReadKey( void);<br /><br />void Delay(U16 t)<br />{<br /> while(t--);<br />}<br /><br />//void Opreat_IO();<br /><br />/*************************************************************************<br />name : void key_close(struct inode * inode, struct file * file)<br />**************************************************************************/<br />static int kbd_close (struct inode * inode, struct file * file)<br />{<br /> printk("key is closed
");<br /> MOD_DEC_USE_COUNT;<br /> return 0;<br />}<br /><br />/**************************************************************************<br />name : static int key_open(struct inode * inode, struct file * file)<br />****************************************************************************/<br />static int kbd_open(struct inode * inode, struct file * file)<br />{<br /> printk("key is open
");<br /> MOD_INC_USE_COUNT;<br /> return 0;<br />}<br /><br />/***************************************************************************8<br /><br />*************************************************************************/<br /><br />static U8 kbd_read(struct file *file,char *buffer,size_t count,loff_t *ppos)<br />{<br /> U8 temp;<br /> temp = ReadKey();<br /> copy_to_user(buffer,&temp,sizeof(U8));<br /> return (sizeof(U8)); <br />}<br /><br /><br />/**********************************************************************************<br />name: atic int kdb_Ioctl(struct inode *inode,<br /> struct file * file,<br /> unsigned int cmd,<br /> unsigned long arg)<br />function: kdb io ioput control<br />***********************************************************************************/<br />static int kbd_Ioctl(struct inode *inode,struct file * file,unsigned long cmd,unsigned long arg)<br />{<br /> <br /> return 0;<br />}<br /><br />/********************************************************************<br />name : struct file_operations kdb_dev_fops<br />function: 文件结构<br />********************************************************************/<br />static struct file_operations kdb_dev_fops = <br />{<br /> owner: THIS_MODULE,<br /> ioctl: kbd_Ioctl, <br /> open: kbd_open, <br /> release: kbd_close, <br /> read: kbd_read,<br />};<br /><br />/**********************************************************<br />name:int __int_module(void)<br />function:初始化模块<br />**********************************************************/<br />static devfs_handle_t devfs_handle;<br />static int __init kdb_init_module(void)<br />{<br /> int ret;<br /> ret = devfs_register_chrdev(major,dev_name,&kdb_dev_fops);<br /> if(ret < 0)<br /> {<br /> printk("embedder linux:init_module failed with %d
",ret);<br /> return ret;<br /> } <br /> else<br /> printk("KERN_INFO:Embedded linux chardevice register successful!
");<br /> if(major == 0)<br /> major = ret;<br /> devfs_handle = devfs_register(NULL,dev_name,DEVFS_FL_DEFAULT,major,0,S_IFCHR|S_IWUSR,&kdb_dev_fops,NULL);<br /> AT91_SYS->PIOB_PER |= KK0 | KK1 | KK2 |KK3 |KK4 | KK5; <br /> AT91_SYS->PIOB_ODR |= KK0 | KK1 | KK2 |KK3 |KK4 | KK5; <br /> AT91_SYS->PMC_PCER |= (0x1 << AT91C_ID_PIOB); //enable the mck clock; <br /> return 0; <br /> <br />}<br /><br />/*******************************************************<br />name: __exit s_cleanup_module(void)<br />function:注销gpio_lcd模块<br />********************************************************/<br />static void __exit kdb_cleanup_module(void)<br />{<br /> int retv;<br /> retv = devfs_unregister_chrdev(major,dev_name);<br /> if(retv < 0)<br /> {<br /> printk("gpio_kdb unregister failed
"); <br /> return;<br /> }<br /> AT91_SYS->PIOB_PDR |= KK0 | KK1 | KK2 |KK3 |KK4 | KK5; <br /> AT91_SYS->PIOB_IFDR |= KK0 | KK1 | KK2 |KK3 |KK4 | KK5; <br /> AT91_SYS->PMC_PCDR = 0x1 << AT91C_ID_PIOB; //enable the mck clock;<br /> printk("kdb goodbye
");<br />}<br /><br />module_init(kdb_init_module);<br />module_exit(kdb_cleanup_module);<br />MODULE_AUTHOR("MZ");<br />MODULE_LICENSE("GPL");<br /><br />U8 ReadKey( )<br />{<br />U8 KK;<br /> KEY_FLAG = 0x00;<br /> KK = (AT91_SYS->PIOB_PDSR & 0x3f000);<br /> if((KK & KK0) == 0 )<br /> {<br /> Delay(TIME_KEY);<br /> if((KK & KK0) == 0 )<br /> KEY_FLAG |= key_PageDown_**; <br /> }<br /> if((KK & KK1) == 0 )<br /> {<br /> Delay(TIME_KEY);<br /> if((KK & KK1) == 0 )<br /> KEY_FLAG |= confirm_press_**; <br /> }<br /> if((KK & KK2) == 0 )<br /> {<br /> Delay(TIME_KEY);<br /> if((KK & KK2) == 0 )<br /> KEY_FLAG |= key_NumAdd_** ; <br /> }<br /> if((KK & KK3) == 0 )<br /> {<br /> Delay(TIME_KEY);<br /> if((KK & KK3) == 0 )<br /> KEY_FLAG |= key_NumSubb_**; <br /> }<br /> if((KK & KK4) == 0 )<br /> {<br /> Delay(TIME_KEY);<br /> if((KK & KK4) == 0 )<br /> KEY_FLAG |= cancel_press_**; <br /> }<br /> if((KK & KK5) == 0 )<br /> {<br /> Delay(TIME_KEY);<br /> if((KK & KK5) == 0 )<br /> KEY_FLAG |= key_PageUp_**; <br /> }<br /><br /> return KEY_FLAG;<br />}<br /><br />测试程序:<br /><br /><br />U8 KEY_FLAG = 0x00;<br />#define key_PageDown_** KEY_FLAG & (0x1<<0)<br />#define confirm_press_** KEY_FLAG & (0x1<<1)<br />#define key_NumAdd_** KEY_FLAG & (0x1<< 2)<br />#define key_NumSubb_** KEY_FLAG & (0x1<<3)<br />#define cancel_press_** KEY_FLAG & (0x1<<4)<br />#define key_PageUp_** KEY_FLAG & (0x1<<5)<br /><br />void Delayms(int t)<br />{<br />short ms=0x1147;<br />short i,j;<br /> for(j=0;j<t;++j)<br /> for(i=0;i<ms;++i);<br />}<br /> <br />void Delay(int t)<br />{<br /> while(--t);<br />}<br /><br />int main(void)<br />{<br /> int fd;<br /> int count;<br /> if((fd = open("/dev/kdb_dev",0)) < 0)<br /> {<br /> printf("can not open /dev/kdb_dev
");<br /><br /> exit(0);<br /> }<br /> printf("kbd fd is %d
",fd);<br /> count = read(fd,&KEY_FLAG,sizeof(U8));<br /> printf("key_flag is %x
",KEY_FLAG);<br /> if(count != sizeof(U8))<br /> {<br /> printf("read ts error!
");<br /> return 0;<br /> }<br /> while(1)<br /> { <br /> if(confirm_press_**)<br /> printf("confirm key
");<br /> else if(cancel_press_** )<br /> printf("cancle key
");<br /> else if( key_PageDown_**)<br /> printf("page down
");<br /> else if(key_PageUp_**)<br /> printf("page up
");<br /> else if(key_NumAdd_**)<br /> printf("confirm key
");<br /> else if(key_NumSubb_**)<br /> printf("confirm key
");<br /> else ;<br />}<br /><br />测试程序只是执行一次,即是终端只显示confirm key ,各位高手看下是什么原因。<br /><br /> |
|