关键流程设计
初始化流程
RTP 模块完全遵循 driver 的通用初始化流程,申请 regs 资源、clk、reset, 还需要注册一个 input 设备,使用 input 子系统提供的注册接口 input_register_device():
int __must_check input_register_device(struct input_dev *);
rtp->idev = idev;
idev->name = pdev->name;
idev->phys = AIC_RTP_NAME "/input0";
idev->open = aic_rtp_open;
idev->close = aic_rtp_close;
idev->id.bustype = BUS_HOST;
idev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);
input_set_capability(idev, EV_KEY, BTN_TOUCH);
input_set_abs_params(idev, ABS_X, 0, AIC_RTP_MAX_VAL, rtp->fuzz, 0);
input_set_abs_params(idev, ABS_Y, 0, AIC_RTP_MAX_VAL, rtp->fuzz, 0);
if (rtp->pressure_det)
input_set_abs_params(idev, ABS_PRESSURE, 0, AIC_RTP_MAX_VAL,
rtp->fuzz, 0);
中断处理流程
RTP 控制器采集的数据完全依赖中断来上报给用户态,包括触摸位置、按下、抬起信息。 流程如下图:
“启动 worker”和“启动 worker”分别是对应手动模式、非周期模式的采样流程,因为这两种情况下都会有一些延迟操作,所以使用 worker 方式来处理。实际运行期间 RTP 只可能工作在一种单一模式,所以运行中只会有一个 worker 在参与调度。
其中,检查的异常事件类型及处理方式如下图:
其中,“数据不完整”仅在自动模式才会出现,实际上有三种原因导致不完整:
-
采样循环不完整:Sample Cycle Incomplete,一组采样点还没有完成就发生了抬起事件。
-
数据超限:Data Over Uncertain Range,数据超出了有效范围。
-
FIFO 下溢:FIFO 上溢意味着数据有效、软件读慢了,所以还可以继续数据。如果是下溢,意味着 FIFO 中的数据分组排列已经乱了,所以直接丢弃。
手动模式的采样流程
手动模式,需要通过软件触发的方式告诉 RTP 控制器要采集什么样的数据,所以采集样本的电信号配置、采集间隔、是否打开按压检测等,都需要在驱动中来妥善安排。 因为每次中断来了后,手动模式需要做的处理较多,而且有一些延迟处理,所以在驱动中使用了一个 worker 专门处理手动模式的流程(接口 aic_rtp_manual_worker())。 手动模式的处理流程较复杂,建议通常情况下采样自动模式。
上图中,在蓝色方框的后面都会有一个判断:如果当前是否抬起状态,如果是就打开按压检测。为了流程的主干更加清晰,所以图中未标注出来。