- 论坛徽章:
- 0
|
本帖最后由 colorshape 于 2011-03-31 23:27 编辑
好的,把代码主要部分贴出来,没有贴出来的就是些头文件包含,多谢指教:)- #define BUTTONDEVNAME "button"
- #define BUTTONDEVNR 255
- struct button_struc {
- int irq;
- int pin;
- int pin_setting;
- char *name;
- };
- static int button_major = BUTTONDEVNR;
- struct cdev button_dev;
- static int keypressed = 0;
- static char *str = "param dev_id in request_irq()";
- static struct button_struc button_info = {
- .irq = IRQ_EINT8,
- .pin = S3C2410_GPG0,
- .pin_setting = S3C2410_GPG0_EINT8,
- .name = "KEY0",
- };
- static volatile char keyval;
- static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
- static irqreturn_t button_isr(int irq,void *dev_id)
- {
- struct button_struc *button_info_l = (struct button_struc *)dev_id;
- keyval = (!s3c2410_gpio_getpin(button_info_l->pin))+'0';
- keypressed = 1;
- wake_up_interruptible(&button_waitq);
- return IRQ_RETVAL(IRQ_HANDLED);
- }
- static int button_open(struct inode *inode,struct file *file)
- {
- int err;
- err = request_irq(button_info.irq,button_isr,IRQ_TYPE_EDGE_BOTH,button_info.name,(void *)&button_info);
- if(err) {
- disable_irq(button_info.irq);
- free_irq(button_info.irq,(void *)&button_info);
- }
- keypressed = 0;
- return 0;
- }
- static int button_close(struct inode *inode,struct file *filp)
- {
- free_irq(button_info.irq,(void *)&button_info);
- return 0;
- }
- static int button_read(struct file *filp,char __user *buf,size_t cnt,loff_t *offp)
- {
- unsigned long err;
- if(!keypressed){
- if(filp -> f_flags & O_NONBLOCK)
- return -EAGAIN;
- else
- wait_event_interruptible(button_waitq,keypressed);
- }
- keypressed = 0;
- err = copy_to_user(buf,str,min(strlen(str),cnt));
- return err?(-EFAULT):min(strlen(str),cnt);
- }
- struct file_operations button_fops = {
- .owner = THIS_MODULE,
- .open = button_open,
- .read = button_read,
- .release = button_close,
- };
- static int __init button_init(void)
- {
- dev_t devnr = MKDEV(BUTTONDEVNR,0);
- int err,retval;
- if(button_major){
- retval = register_chrdev_region(devnr,1,BUTTONDEVNAME);
- } else {
- retval = alloc_chrdev_region(&devnr,0,1,BUTTONDEVNAME);
- }
- if(retval) {
- return retval;
- }
- cdev_init(&button_dev,&button_fops);
- button_dev.owner = THIS_MODULE;
- err = cdev_add(&button_dev,devnr,1);
- if(err) {
- printk("Error when adding device BUTTON.\n");
- }
- printk("Device "BUTTONDEVNAME" initialized!\n");
- return 0;
- }
- static void __exit button_exit(void)
- {
- cdev_del(&button_dev);
- printk("Button delete successfully!\n");
- }
- module_init(button_init);
- module_exit(button_exit);
复制代码 |
|