4.5.5. 设计说明

4.5.5.1. 源码说明

源代码位于:drivers/thermal/zx_thermal.c

4.5.5.2. 模块架构

Linux内核中有一个Thermal子系统,代码目录见drivers/thermal,软件框架如下图:

../../../_images/sw_system5.png

图 4.21 Linux Thermal 子系统架构图

其中:

  • zone device:获取温度的设备

  • cool device:控制温度的设备,cool和zone可以设置bind关系。

  • governor:控温策略

Thermal Core内部用一个delayed_work循环执行thermal_zone_device_update(),其流程如下:

../../../_images/thermal_delayed_work.png

图 4.22 Linux Thermal 子系统中的delayed_work处理流程

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 支持使用中断方式来读取数据,这样避免软件去做等待处理。

../../../_images/tsen_irq_flow.png

图 4.23 TSensor 非周期模式的数据采集流程

  • 对于非周期模式:当用户层触发 ops->get_temp() 接口,就会启动一次硬件去读数据

  • 当硬件准备好数据,会产生一个中断

  • 在中断处理函数中,用INT Flag来区分是哪个通道有数据,逐个通道扫描将数据读出,会缓存到一个全局变量中

  • 对于周期模式:TSensor 控制器会自动按给定周期产生一次数据中断

备注

  1. TODO:需要针对不同类型的报警状态,增加相应的处理。

  2. 当前默认高温保护为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,成功

注意事项