Linux设备驱动的分层设计思想
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-04-19
*/ void input_report_key(struct input_dev *dev, unsigned int code, int value); /* 报告相对坐标 */ void input_report_rel(struct input_dev *dev, unsigned int code, int value); /* 报告绝对坐标 */ void input_report_abs(struct input_dev *dev, unsigned int code, int value); /* 报告同步事件 */ void input_sync(struct input_dev *dev); 而所有的输入事件,内核都用统一的数据结构来描述,这个数据结构是input_event,形如代码清单7. 代码清单7 input_event结构体 1 struct input_event { 2 struct timeval time; 3 __u16 type; 4 __u16 code; 5 __s32 value; 6 }; drivers/input/keyboard/gpio_keys.c基于input架构实现了一个通用的GPIO按键驱动.该驱动基于 platform_driver架构,名为“gpio-keys”.它将硬件相关的信息(如使用的GPIO号,电平等)屏蔽在板文件 platform_device的platform_data中,因此该驱动可应用于各个处理器,具有良好的跨平台性.代码清单8列出了该驱动的 probe()函数. 代码清单8 GPIO按键驱动的probe()函数 1 static int __devinit gpio_keys_probe(struct platform_device *pdev) 2 { 3 struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; 4 struct gpio_keys_drvdata *ddata; 5 struct input_dev *input; 6 int i, error; 7 int wakeup = 0; 8 9 ddata = kzalloc(sizeof(struct gpio_keys_drvdata) 10 pdata->nbuttons * sizeof(struct gpio_button_data), 11 GFP_KERNEL); 12 input = input_allocate_device(); 13 if (!ddata || !input) { 14 error = -ENOMEM; 15 goto fail1; 16 } 17 18 platform_set_drvdata(pdev, ddata); 19 20 input->name = pdev->name; 21 input->phys = "gpio-keys/input0"; 22 input->dev.parent = &pdev->dev; 23 24 input->id.bustype = BUS_HOST; 25 input->id.vendor = 0x0001; 26 input->id.product = 0x0001; 27 input->id.version = 0x0100; 28 29 ddata->input = input; 30 31 for (i = 0; i < pdata->nbuttons; i ) { 32 struct gpio_keys_button *button = &pdata->buttons[i]; 33 struct gpio_button_data *bdata = &ddata->data[i]; 34 int irq; 35 unsigned int type = button->type ?: EV_KEY; 36 37 bdata->input = input; 38 bdata->button = button; 39 setup_timer(&bdata->timer, 40 gpio_check_button, (unsigned long)bdata); 41 42 ... 43 error = request_irq(irq, gpio_keys_isr, 44 IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING | 45 IRQF_TRIGGER_FALLING, 46 button->desc ? button->desc : "gpio_keys", 47 bdata); 48 if (error) { 49 ... 50 } 51 52 if (button->wakeup) 53 wakeup = 1; 54 55 input_set_capability(input, type, button->code); 56 } 57 58 error = input_register_device(input); 59 if (error) { 60 pr_err("gpio-keys: Unable to register input device, " 61 "error: %d\n", error); 62 goto fail2; 63 } 64 65 device_init_wakeup(&pdev->dev, wakeup); 66 67 return 0; 68 ... 69 } 上述代码的第12行分配了1个输入设备,第20~27行初始化了该input_dev的一些属性,第58行注册了这个输入设备.第31~56行则申 请了此GPIO按键设备需要的中断号,并初始化了timer.第55行设置此输入设备可告知的事情. 在注册输入设备后,底层输入设备驱动的核心工作只剩下在按键、触摸等人为 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: Linux模拟超级终端minicom下一篇: linux下打印宽字符
关于Linux设备驱动的分层设计思想的所有评论