[RK3288][Android6.0] TS-ADC驱动流程小结
来源:互联网 发布:pano2vr player.js 编辑:程序博客网 时间:2024/05/18 22:12
Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92
RK3288使用TSADC(Temperature-Sensor ADC)来测量CPU温度,支持两种模式:
用户自定义模式: 主动控制读取温度.
自动模式: 自动检测温度,达到阀值就自动报告.
rk3288.dtsi中的device配置:
tsadc: tsadc@ff280000 {
compatible = "rockchip,tsadc";
reg = <0xff280000 0x100>;
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
#io-channel-cells = <1>;
io-channel-ranges;
clock-frequency = <10000>;
clocks = <&clk_tsadc>, <&clk_gates7 2>;
clock-names = "tsadc", "pclk_tsadc";
pinctrl-names = "default", "tsadc_int";
pinctrl-0 = <&tsadc_gpio>;
pinctrl-1 = <&tsadc_int>;
tsadc-ht-temp = <120>;
tsadc-ht-reset-cru = <1>;
tsadc-ht-pull-gpio = <0>;
status = "okay";
};
rockchip_tsadc.c:
tsadc驱动文件.
rockchip-hwmon.c
基于hwmon(HW Monitor)的驱动实现,也就是说tsadc使用hwmon提供接口到userspace.
rockchip_temp_probe -> rockchip-hwmon.c
rockchip_hwmon_init -> rockchip_tsadc.c
request_threaded_irq //申请一个中断线程,对应函数是rockchip_tsadc_auto_ht_interrupt()
create_singlethread_workqueue //创建workqueue thread,对应函数是rockchip_tsadc_auto_ht_work
of_property_read_u32 //读取dts中的tsadc-ht-temp, tsadc-ht-reset-cru,tsadc-ht-pull-gpio
rockchip_tsadc_set_auto_temp //设置为自动温度探测模式,注意参数是1, 指的是channel1.
rockchip_tsadc_auto_mode_set //设置中断和关机的温度, 分别对应的是80和120度
data->ops.read_sensor = rockchip_rk3288_tsadc_get_temp; //读取温度函数接口定义.
INIT_DEFERRABLE_WORK(&data->work, tsadc_monitor); //温度变化的时候同步更新sysfs中的alarm node信息.
sysfs_create_group //在tsadc device下创建sysfs,attr为rockchip_temp_group, 按照SENSOR_DEVICE_ATTR格式来定义,不过最终用的都是sysfs文件创建那一套.
hwmon_device_register //hwmon device注册, 会在/sys/class/hwmon下看到.
当达到80°的时候,中断被触发:
rockchip_tsadc_auto_ht_interrupt ->
queue_work(dev->workqueue, &dev->auto_ht_irq_work) -> //给workqueue执行
rockchip_tsadc_auto_ht_work ->
tsadc_readl //读取中断状态
pm_power_off //过温就执行关机
命令行读取cpu温度:
root@rk3288:/ # cat sys/devices/ff280000.tsadc/temp1_input
64
OS: Android 6.0
Kernel: 3.10.92
RK3288使用TSADC(Temperature-Sensor ADC)来测量CPU温度,支持两种模式:
用户自定义模式: 主动控制读取温度.
自动模式: 自动检测温度,达到阀值就自动报告.
rk3288.dtsi中的device配置:
tsadc: tsadc@ff280000 {
compatible = "rockchip,tsadc";
reg = <0xff280000 0x100>;
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
#io-channel-cells = <1>;
io-channel-ranges;
clock-frequency = <10000>;
clocks = <&clk_tsadc>, <&clk_gates7 2>;
clock-names = "tsadc", "pclk_tsadc";
pinctrl-names = "default", "tsadc_int";
pinctrl-0 = <&tsadc_gpio>;
pinctrl-1 = <&tsadc_int>;
tsadc-ht-temp = <120>;
tsadc-ht-reset-cru = <1>;
tsadc-ht-pull-gpio = <0>;
status = "okay";
};
rockchip_tsadc.c:
tsadc驱动文件.
rockchip-hwmon.c
基于hwmon(HW Monitor)的驱动实现,也就是说tsadc使用hwmon提供接口到userspace.
rockchip_temp_probe -> rockchip-hwmon.c
rockchip_hwmon_init -> rockchip_tsadc.c
request_threaded_irq //申请一个中断线程,对应函数是rockchip_tsadc_auto_ht_interrupt()
create_singlethread_workqueue //创建workqueue thread,对应函数是rockchip_tsadc_auto_ht_work
of_property_read_u32 //读取dts中的tsadc-ht-temp, tsadc-ht-reset-cru,tsadc-ht-pull-gpio
rockchip_tsadc_set_auto_temp //设置为自动温度探测模式,注意参数是1, 指的是channel1.
rockchip_tsadc_auto_mode_set //设置中断和关机的温度, 分别对应的是80和120度
data->ops.read_sensor = rockchip_rk3288_tsadc_get_temp; //读取温度函数接口定义.
INIT_DEFERRABLE_WORK(&data->work, tsadc_monitor); //温度变化的时候同步更新sysfs中的alarm node信息.
sysfs_create_group //在tsadc device下创建sysfs,attr为rockchip_temp_group, 按照SENSOR_DEVICE_ATTR格式来定义,不过最终用的都是sysfs文件创建那一套.
hwmon_device_register //hwmon device注册, 会在/sys/class/hwmon下看到.
当达到80°的时候,中断被触发:
rockchip_tsadc_auto_ht_interrupt ->
queue_work(dev->workqueue, &dev->auto_ht_irq_work) -> //给workqueue执行
rockchip_tsadc_auto_ht_work ->
tsadc_readl //读取中断状态
pm_power_off //过温就执行关机
命令行读取cpu温度:
root@rk3288:/ # cat sys/devices/ff280000.tsadc/temp1_input
64
2 0
- [RK3288][Android6.0] TS-ADC驱动流程小结
- [RK3288][Android6.0] 串口驱动流程小结
- [RK3288][Android6.0] ION 驱动流程小结
- [RK3288][Android6.0] PWM backlight 驱动流程小结
- [RK3288][Android6.0] Display驱动初始化流程小结
- [RK3288][Android6.0] 系统调试串口驱动流程小结
- [RK3288][Android6.0] USB WiFi驱动流程小结
- [RK3288][Android6.0] PWM backlight 驱动流程小结
- [RK3288][Android6.0] Camera HAL流程小结
- [RK3288][Android6.0] StageFright解码流程小结
- [RK3288][Android6.0] Camera HAL流程小结
- [RK3288][Android6.0] USB UVC 驱动小结
- [RK3288][Android6.0] USB ECHI 驱动小结
- [RK3288][Android6.0] 有线耳机驱动小结
- [RK3288][Android6.0] Camera驱动初始化流程
- [RK3288][Android6.0] DDR Frequency控制流程小结
- [RK3288][Android6.0] U-boot 启动流程小结
- [RK3288][Android6.0] U-boot显示模块部分流程小结
- hibernate 设置hbm2ddl.auto=create不能自动建表问题
- Android WebView 远程网页 加载本地资源js/html/css
- redis基础
- 4011: [HNOI2015]落忆枫音
- eclipse中xml文件设置如何变成可编辑模式
- [RK3288][Android6.0] TS-ADC驱动流程小结
- servlet的学习
- gradle ofbiz 16 开发环境搭建
- 哈弗曼树
- C语言中%d,%s,%x,%f,%.100f,%的意思
- Elasticsearch增、删、改、查操作深入详解
- AS导入Library的时候出现问题,依赖库不显示
- NLTK下载
- Power of Two