关键流程设计
初始化流程
TSensor 模块完全遵循 driver 的通用初始化流程,申请 regs 资源、clk、reset,另外需要使用 Thermal 子系统的注册接口 thermal_zone_device_register()来注册 zone 设备。
struct thermal_zone_device *thermal_zone_device_register(const char *, int, int, void *, struct thermal_zone_device_ops *, struct thermal_zone_params *, int, int);
其中关键参数有:设备名称、zone 设备的 ops、以及私有数据等,ops 中我们暂时只提供 get_temp()接口的定义:
static struct thermal_zone_device_ops tsen_cpu_ops = { .get_temp = tsen_cpu_get_temp, }; static struct thermal_zone_device_ops tsen_adc_ops = { .get_temp = tsen_adc_get_temp, };
初始化流程
TSensor 驱动的初始化接口通过 INIT_DEVICE_EXPORT(drv_tsen_init)
完成,会通过调用
Sensor 子系统的接口 rt_hw_sensor_register() 注册一个 Sensor 设备。
TSensor 控制器的初始化过程,主要步骤有:
-
初始化模块的 clk
-
注册中断
-
初始化默认参数
-
向设备框架中注册 Sensor 设备
中断处理流程
在中断处理函数中,可以通过私有数据来传递 zone 设备信息,从中获取到到该通道对应的寄存器基地址,就可以读到相应的报警状态。
TSensor 支持使用中断方式来读取数据,这样避免软件去做等待处理。

-
对于非周期模式:当用户层触发 ops->get_temp() 接口,就会启动一次硬件去读数据
-
当硬件准备好数据,会产生一个中断
-
在中断处理函数中,用 Flag 来区分是哪个通道有数据,逐个通道扫描将数据读出,会缓存到一个全局变量中
-
对于周期模式:TSensor 控制器会自动按给定周期产生一次数据中断
注:
- TODO:需要针对不同类型的报警状态,增加相应的处理。
- 当前默认高温保护为 poweroff,可修改高温保护行为。