linux下的中断_Croxd的博客-CSDN博客
- 基础知识:
- 三根通信线:SCL、SDA、GND,是同步、串行、电平、低速、近距离的总线结构,支持多个设备挂在同一总线上。
- 通信双方必须以主从式结构为主(master)一个为从(slave),主设备掌握每次通信的主动性,并根据主设备的节奏从设备中被动响应。每个设备在总线上都有一个唯一的地址(slave address),主设备通过地址找到自己想要通信的设备(本质是广播)。
- I2C主要用途是主SoC与外围设备的通信最大的优势是可以在总线扩展多个外围设备的支持。各种常见的物联网传感器芯片(如gsensor、均使用温度、湿度、光强、酸碱度、烟雾浓度、压力等。I2C接口和主SoC进行连接。
- 电容式触摸屏芯片的多个引脚形成两个接口。一个接口是I2C负责和主SoC连接(作为设备本身)SoC电容触摸屏芯片通过接口初始化和控制,芯片通过接口向SoC报告触摸事件信息(触摸坐标等),我们使用电容式触摸屏时关注接口;另一个接口是电容式触摸板的管理接口,电容式触摸屏芯片通过接口控制触摸板的硬件。该接口由电容式触摸屏公司关注,其触摸屏芯片内部固件编程需要处理,我们使用电容式触摸屏的人并不在乎。
- 理解IIC四个关键结构:i2c_client 通过注册信息i2c_adapter 注册时 从 i2c_register_board_info() 的i2c_board_info结构体获取I2C设备信息.它包含了从机地址。(但现在用设备树传输参数更方便) (1)struct i2c_adapter IIC适配器 (2)struct i2c_algorithm IIC算法,时序 (3)struct i2c_client IIC(从机)设备信息 (4)struct i2c_driver IIC(从机)设备驱动
- 调用初始化代码 (goodix_ts_init) ---->i2c_add_driver(&goodix_ts_driver) IIC驱动的注册 ---->goodix_ts_driver ---->of_match_table ---->goodix_match_table
- ()。goodix_match_table.compatible = "goodix,gt9xx"与 DTSI 文件中的compatible 一致 ,则执行 probe
- i(client->adapter, I2C_FUNC_I2C)。 IIC如果适配器不够,适配器的能力测试就会出错
- (&client->dev)。从dst设备树获取 INT 中断、RST 引脚的信息
- INIT_WORK(&ts->work, goodix_ts_work_func)。 初始化创建工作队列,中断触发后,将事件处理放在下半部分,调用队列goodix_ts_work_func计算上报坐标值的函数
- (ts)。 向系统申请所需的io口:INT、RST
- (ts)。 当读取到IC是CHIP_TYPE_GT9F只有在类型中,才会初始化下载。HIP_TYPE_GT9F: 内部是Nor Flash,每次都要download.CHIP_TYPE_GT9: 内部是Nand Flash,除非需要更新配置文件,否则不需要每次下载.
- (client)。 测试IIC通信是否正常
- (client, &version_info)。 获取版本信息
- (ts)。 初始化tp固件参数
- (client, SWITCH_ON)。 esd防静电开启
- (ts)。 创建更新TP固件的线程
- (ts)。 注册到 input 去输入子系统
- ():为输入设备分配相应的空间
- ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; 声明功能:支持同步、按钮、绝对坐标
- (ts->input_dev, EV_KEY, touch_key_array[index]); //如果有按键,可以处理的按键事件就会受到伤害。这里指的是菜单键,HMOE剑和返回键
- i(ts->input_dev, EV_KEY, KEY_POWER); 如果定义滑动唤醒,则声明电源事件
- (ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); 多点触摸信息是可以的ABS_MT承载并按一定顺序发送,如ABS_MT_POSITION_X,ABS_MT_POSITION_Y,然后通过调用 input_mt_sync()产生一个 SYN_MT_REPORT event 标记一个点的结尾,并且需要报告一帧数据 input_sync();
- (ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0) 触摸的方向可以由 ABS_MT_TOUCH_MAJOR、ABS_MT_WIDTH_MAJOR、ABS_MT_MT_MAJOR 提供
- (ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); 支持硬件跟踪多个信息,即商店属于哪条线等
- (ts->input_dev) 注册input子系统
- (ts); //请求中断
- (ts->client->irq, goodix_ts_irq_handler,irq_table[ts->int_trigger_type], ts->client->name, ts); 中断申请函数,指定了中断线与绑定的函数是 goodix_ts_irq_handler,如果发生中断该函数就会被调用。参数1:中断线:2:中断函数,3:触发方式:4:设备名,5:私有数据。
- (goodix_wq, &ts->work);
- : goodix_wq=create_singlethread_workqueue("goodix_wq"); //在函数 goodix_ts_init中,创建工作队列和工作线程,初始化时创建线程
- :NIT_WORK(&ts->work,goodix_ts_work_func); 在工作队列&ts->work中增加 goodix_ts_work_func任务。也就是当中断函数触发时,执行中断函数goodix_ts_irq_handler(),中断函数里面对队列调度,调用队列中的goodix_ts_work_func(),坐标点的计算、上报、多点处理都在这个函数中执行。
- (goodix_wq, &ts->work);
- ()。如果资源有限或者其他因素导致申请失败,那么会采用轮询机制来处理。轮询机制是定义一个定时器来处理,hrtimer 是一种高精度定时器,定时器到期就会调用这个函数。接着调用 hrtimer_start()开启定时器功能。
- (ts->client->irq, goodix_ts_irq_handler,irq_table[ts->int_trigger_type], ts->client->name, ts); 中断申请函数,指定了中断线与绑定的函数是 goodix_ts_irq_handler,如果发生中断该函数就会被调用。参数1:中断线:2:中断函数,3:触发方式:4:设备名,5:私有数据。
- (client); //如果创建了读写节点接口,基于这个节点的接口,方便用户层与内核通讯
- (&ts->pindev); // 注册为 PIN 输入设备
- ; //到这边设置为1说明全部初始化 probe成功
- 事件处理层:input event,处理核心层传输过来的数据处理成用户说理解的方式,即用 event 结构体方式呈现给用户。
- 核心层:为设备驱动层提供规范的接口,把设备驱动层获取得到的数据传送给事件处理层。
- 设备驱动层:实现对硬件设备的读写访问、中断设置,把触摸的坐标信息通过调用核心层的接口传递给事件处理层。这部分就是驱动工程师所要做的内容。