博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux I2C Input设备驱动代码的几点理解
阅读量:4103 次
发布时间:2019-05-25

本文共 2062 字,大约阅读时间需要 6 分钟。

最近在做一个I2C键盘的Linux驱动,参考了其他芯片的一些代码,其中陆续发现有些让人迷惑的东西,把我的迷惑及理解在这里加以记录:

1. i2c_driver结构体的probe成员的原型:

    

[cpp]
  1. int (*probe)(struct i2c_client *, const struct i2c_device_id *); 

即:probe函数被调用时会从上边传两个个参数下来,类型分别是i2c_client和i2c_device_id

在i2c_client->dev.platform_data成员里的内容就是i2c_board_info中你所填充的platfrom_data数据。

2. Probe函数只会在驱动加载时调用一次,之后就不会再调用,而如果设备支持open接口,则可能需要在open接口的实现中做大量的可重入处理,因为open接口可能被多次调用且可能被多线程同时调用。

3. 代码:

  

[cpp]
  1. INIT_DELAYED_WORK(&kpad->work, sn7325_work); 

实现的功能是将sn7325_work加入到工作队列中,但现在并不立即执行。

4. input_dev中的几个成员的意义如下:

    input->keycodesize: 每一个键盘码的尺寸(字节数)。

    input->keycodemax: keymap中包含多少个键盘码

    input->keycode: 具体的键盘码表(也叫:Key Matrix或Keymap)

5. 代码:

   

[cpp]
  1. __set_bit(EV_KEY, input->evbit); 

Document里面的示例用了接口 set_bit,二者实际上没什么显著区别,前者不是原子操作,后者是原子操作。

input->evbit是一个标志位集合,通过对它的一些位操作,INPUT子系统可以知道这个设备支持那些event。

[cpp]
  1. __set_bit(kpad->keycode[i] & KEY_MAX, input->keybit); 

这行代码是设置input->keybit这个成员的,input->keybit成员实际上和evbit差不多,通过设置keybit可以使INPUT子系统知道这个设备支持那些按键。

6. input_report_key

这个接口会向INPUT子系统上报按键,原型如下:

[cpp]
  1. static inline void input_report_key(struct input_dev *dev, unsigned int code, int value) 
  2.     input_event(dev, EV_KEY, code, !!value); 

参数:

dev:输入设备

code:要上报的keycode(从keymap中直接或间接得到的某个值)

value:0或1,0表示按键弹起,1表示按键按下

!!value的写法实际上是将int类型转换为bool类型,即最终传递进input_event中的参数要么为0要么为1.

7. input_sync表明时间已经完成

8. keymap如何定义:

可以定义一个宏定义:

[cpp]
  1. #define KEY(row, col, val)  (((row) << 28) | ((col) << 24) | (val)) 

这样:

KEY(0,0, KEY_HOME) 会建立一个4字节数(32bit),最高4bit为行号,次高4bit为列号,剩下的24bit则为系统能识别的KEY值。

系统能识别的KEY值在input.h中有定义,如:KEY_1, KEY_A等。

所以可以自己定义一个keymap,实际上就是一个数组,其中的元素就用KEY的宏定义来初始化,这样在使用的时候也可以对其行号和列号一目了然,当然这是对于行列扫描式的键盘来说的(实际上目前大多数键盘都是行列扫描式)。

当然你也可以不按上边的定义而自己制定一个规则出来,这并没什么不行的,相反,多探索才会有突破~~

转载地址:http://xgfsi.baihongyu.com/

你可能感兴趣的文章
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>