天天看點

[RK3288][Android6.0] TS-ADC驅動流程小結

Platform: RK3288

OS: Android 6.0

Kernel: 3.10.92

RK3288使用TSADC(Temperature-Sensor ADC)來測量CPU溫度,支援兩種模式:

使用者自定義模式: 主動控制讀取溫度.

自動模式: 自動檢測溫度,達到閥值就自動報告.

rk3288.dtsi中的device配置:

tsadc: [email protected] {

    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    //設定為自動溫度探測模式,參數channel表示隻針對此channel設定,rk3288 cpu對應是channel 1.

            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    //過溫就執行關機

實際測試中斷并沒有被觸發(注意TSADC_TEMP_INT_EN的值是0),不過修改關機溫度(tsadc-ht-temp)确實會關機,是TSSHUT觸發直接硬體關機了。rockchip_tsadc_set_cmpn_shut_vale()設定了關機的閥值,參數就是tsadc-ht-temp對應的值。

[RK3288][Android6.0] TS-ADC驅動流程小結

指令行讀取cpu溫度:

[email protected]:/ # cat sys/devices/ff280000.tsadc/temp1_input                     

54

或者

[email protected]:/sys/class/hwmon/hwmon0/device # cat temp1_input                                        

55

平台上一共有四路sensor讀取内部溫度, 0保留,1讀取cpu,2讀取gpu, 3未知。

有趣的是,文檔說系統有三路sensor,但是寄存器卻給出了4路配置,醉了...

[RK3288][Android6.0] TS-ADC驅動流程小結

繼續閱讀