4.5.5. 设计说明
4.5.5.1. 源码说明
源代码位于:drivers/thermal/zx_thermal.c
4.5.5.2. 模块架构
Linux内核中有一个Thermal子系统,代码目录见drivers/thermal,软件框架如下图:
其中:
zone device:获取温度的设备
cool device:控制温度的设备,cool和zone可以设置bind关系。
governor:控温策略
Thermal Core内部用一个delayed_work循环执行thermal_zone_device_update(),其流程如下:
4.5.5.3. 关键流程设计
4.5.5.3.1. 初始化流程
TSensor模块完全遵循platform_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,
};
4.5.5.3.2. 中断处理流程
在中断处理函数中,可以通过私有数据来传递zone设备信息,从中获取到到该通道对应的寄存器基地址,就可以读到相应的报警状态。
TSensor 支持使用中断方式来读取数据,这样避免软件去做等待处理。
对于非周期模式:当用户层触发 ops->get_temp() 接口,就会启动一次硬件去读数据
当硬件准备好数据,会产生一个中断
在中断处理函数中,用INT Flag来区分是哪个通道有数据,逐个通道扫描将数据读出,会缓存到一个全局变量中
对于周期模式:TSensor 控制器会自动按给定周期产生一次数据中断
备注
TODO:需要针对不同类型的报警状态,增加相应的处理。
当前默认高温保护为poweroff,可修改高温保护行为。
4.5.5.4. 数据结构设计
4.5.5.4.1. aic_tsen_dev
管理TSensor控制器的设备资源:
struct aic_tsen_dev {
struct attribute_group attrs;
void __iomem *regs;
struct platform_device *pdev;
struct clk *clk;
struct reset_control *rst;
u32 pclk_rate;
u32 irq;
u32 ch_num;
struct aic_tsen_ch chan[AIC_TSEN_MAX_CH];
};
4.5.5.5. 接口设计
以下接口提供给 Linux Thermal 子系统调用的标准接口。
4.5.5.5.1. tsen_cpu_get_temp
函数原型 |
static inline int tsen_cpu_get_temp(struct thermal_zone_device *thermal, int *temp) |
---|---|
功能说明 |
读取CPU位置处的sensor温度数据 |
参数定义 |
thermal - 指向thermal zone设备
temp - 用来保存读取到的温度
|
返回值 |
0,成功 |
注意事项 |
4.5.5.5.2. tsen_adc_get_temp
函数原型 |
static inline int tsen_adc_get_temp(struct thermal_zone_device *thermal, int *temp) |
---|---|
功能说明 |
读取ADC位置处的sensor温度数据 |
参数定义 |
thermal - 指向thermal zone设备
temp - 用来保存读取到的温度
|
返回值 |
0,成功 |
注意事项 |