linux ------ input 子系统设备驱动

本文详细介绍了Linux Input子系统的架构组成及其驱动实现流程。重点讲解了input设备的申请、注册及注销过程,并提供了G-sensor设备BMA250的具体驱动实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                linux 的input 子系统主要分:input驱动层、input core层,input handle层与应用空间层,应用空间层不属于内核,处于应用的范畴。

                input core 与 input handle是linux 内核实现好的部分,不需驱动程序员来处理,如果想完成输入设备的驱动,只需现实input driver层的代码。

                实现一个input 设备驱动主要实现这几步代码。

                1.  包含头文件

                      #include <linux/input.h>

                2. 申请input 设备并初始化                    

                      struct input_dev *input_allocate_device(void)
                     {
                               struct input_dev *dev;

                               dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL);
                               if (dev) {
                                      dev->dev.type = &input_dev_type;
                                      dev->dev.class = &input_class;
                                      device_initialize(&dev->dev);
                                      mutex_init(&dev->mutex);
                                      spin_lock_init(&dev->event_lock);
                                      INIT_LIST_HEAD(&dev->h_list);
                                      INIT_LIST_HEAD(&dev->node);

                                      __module_get(THIS_MODULE);
                              }

                              return dev;
                        }

                3. 注册input 设备到系统

                    int input_register_device(struct input_dev *dev)

                4. 注销input 设备

                    void input_unregister_device(struct input_dev *dev)

                5. 释放input 设备

                    void input_free_device(struct input_dev *dev)

 

                简单例子:G-sensor 设备BMA250的input 驱动实现代码:

                (1). 申请设备并注册部分代码

                       static int bma250_input_init(struct bma250_data *bma250)
                       {
                                struct input_dev *dev;
                                int err;

                                dev = input_allocate_device();
                                if (!dev)
                                       return -ENOMEM;
                                dev->name = "acc"; //SENSOR_NAME; changed for sku1 compatible
                                dev->id.bustype = BUS_I2C;

                                /* X */
                                input_set_capability(dev, EV_REL, REL_RX);
                                input_set_abs_params(dev, REL_RX, ABSMIN_2G, ABSMAX_2G, 0, 0);
                                /* Y */
                                input_set_capability(dev, EV_REL, REL_RY);
                                input_set_abs_params(dev, REL_RY, ABSMIN_2G, ABSMAX_2G, 0, 0);
                                /* Z */
                                input_set_capability(dev, EV_REL, REL_RZ);
                                input_set_abs_params(dev, REL_RZ, ABSMIN_2G, ABSMAX_2G, 0, 0);
                                input_set_drvdata(dev, bma250);

                                err = input_register_device(dev);
                                if (err < 0) {
                                        input_free_device(dev);
                                        return err;
                                }
                                bma250->input = dev;

                                return 0;
                       }

                (2). 注销部分代码                      

                       static void bma250_input_delete(struct bma250_data *bma250)
                      {
                                struct input_dev *dev = bma250->input;

                                input_unregister_device(dev);
                                input_free_device(dev);
                      }

 

                    input 子系统的驱动层先调用input_alloc_device申请input device并初始化,接着调用input_register_device把input device注册到input core层。

                    input core层通过handle处理把input device与input handler绑定在一起,驱动层通过timer轮询或中断的方式把设备端提供的数据通过一定的处理传到handle层的buffer,用户空间先打开该input device, 再调用read来获取驱动传给handle层的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值