900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > arm-linux驱动开发学习7

arm-linux驱动开发学习7

时间:2023-06-10 19:28:52

相关推荐

arm-linux驱动开发学习7

input子系统开发:

可以看出 input 子系统用到了驱动分层模型,我们编写驱动程序的时候只需要关注中间的驱动层、核心层和事件层,这三个层的分工如下: 硬件驱动层,子系统核心层,事件处理层。

1、

(1)其中硬件驱动层负责操作具体的硬件设备,这层的代码是针对具体的驱动程序的,需要驱动程序的作者来编写。输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。

(2)子系统核心层是链接其他两个层之间的纽带与桥梁,向下提供驱动层的接口,向上提供事件处理层的接口。承上启下,为驱动层提供输入设备注册和操作接口。通知事件层对输入事件进行处理。

(3)事件处理层负责与用户程序打交道,将硬件驱动层传来的事件报告给用户程序。

2.Input子系统的三个重要结构体:

input_dev 是硬件驱动层,代表一个input设备

input_handler 是事件处理层,代表一个事件处理器

input_handle 个人认为属于核心层,代表一个配对的input设备与input事件处理器

linux中input系统主设备号是13

次设备号:

0-31 joystick(游戏杆)

32-62 mouse(鼠标)

63 mice(鼠标)

64-95 事件(Event)设备

struct input_event {

struct timeval time; //按键时间

__u16 type; //类型,在下面有定义

__u16 code; //要模拟成什么按键

__s32 value;//是按下还是释放

};

code:

事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0127为键盘上的按键代码,0x1100x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux/input.h文件. 如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向REL_X(代码为0x00),指示鼠标的Y轴方向REL_Y(代码 为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).

value:

事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值.

adxl362振动传感器的官网上提供的linux-spi驱动程序中

1、第687行: __set_bit(EV_ABS, input_dev->evbit);

evbit代表设备产生的事件类型和上报的按键值。事件类型和键值得定义在input.h文件中:

#define EV_SYN0x00 //同步事件#define EV_KEY0x01 //按键事件#define EV_REL0x02 //相对坐标(鼠标)#define EV_ABS0x03 //绝对坐标(TP)#define EV_MSC0x04 //其它#define EV_SW0x05 //开关#define EV_LED0x11 //设备灯#define EV_SND0x12 //声音、警报#define EV_REP0x14 //重复#define EV_FF 0x15 //力反馈#define EV_PWR0x16 //电源#define EV_FF_STATUS0x17 //力反馈状态#define EV_MAX0x1f //最大事件个数#define EV_CNT(EV_MAX+1)

2、adxl362输入振动信号时,当产生动作时通常是采用中断的方式上报动作的。输入设备的驱动程序也是在中断处理函数中上报输入事件的,所以我们还需为我们的输入设备注册一个中断:

int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id) ;

参数:

irq:表示申请的中断号。

handler:表示中断服务例程。

thread_fn:中断线程化,若此处传递的是NULL,表示没有中断线程化。

irqflags:表示中断标志位。

devname:表示请求中断的设备的名称。

dev_id: 对应于request_irq()函数中所传递的第五个参数,可取任意值,但必须唯一能够代表发出中断请求的设备,通常取描述该设备的结构体。 共享中断时所用。

ret = request_threaded_irq(spi->irq, NULL, adxl362_irq,irqflags |IRQF_ONESHOT,dev_name(dev), ac);

3、输入设备子系统所提供的上报事件的主要接口函数有:

/上报绝对坐标事件/

void input_report_abs(struct input_dev *dev, unsigned int code, int value);

/报告同步事件/

void input_sync(struct input_dev *dev);

/*通过输入设备获取adxl设备 */

struct adxl362_state *ac = input_get_drvdata(input);

4、注册输入设备:

ret = input_register_device(input_dev);

通过调用input_register_device将我们的输入设备添加到系统的输入设备链表中

5、资源回收

input_unregister_device(ac->input);

free_irq(spi->irq, ac);//释放工作可以放在模块的清除函数中进行

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。