• 高通平台8953 Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953 android7.1实例分析篇)


    在前两篇中我们了解了DTS的背景基础知识以及发挥作用的流程,这篇文章我们以android 7.1 高通的MSM8953平台为例来添加一个基础的i2c设备(包含一个gpio中断)。

    1,首先我们在该i2c设备的驱动中找到了匹配设备与驱动程序的compatible

    [objc]  view plain  copy
     
    1. static const struct of_device_id iqs263_of_match[] = {  
    2.     { .compatible = "azopteq,iqs263", },  
    3.     { },  
    4. };  

    2,由此compatible可以找到dts中对应的设备

    kernelarcharm64ootdtsqcommsm8953-mtp.dts

    [objc]  view plain  copy
     
    1. &i2c_8 { /* BLSP2 QUP4 */  
    2.     iqs263@44 { //Capacitive Touch Controller Driver  
    3.         compatible = "azopteq,iqs263";  
    4.         reg = <0x44>;  
    5.           
    6.         pinctrl-names = "default";  
    7.         pinctrl-0 = <&iqs263_irq_config>;  
    8.           
    9.         vdd-supply = <&pm8953_l5>;  
    10.         vio-supply = <&pm8953_l5>;  
    11.         interrupt-parent = <&tlmm>;  
    12.         interrupts = <40x2>;  
    13.         azopteq,irq-gpio =<&tlmm 40x2>;  
    14.     };  
    15. };  

    2.1,其中compatible属性标识的名字是与驱动程序中名字相匹配的

    2.2,其中reg属性及@符号后的十六进制数字标识了该设备iqs263的i2c地址为0x44

    2.3,&i2c_8前的&表明此处仅仅是对i2c_8节点的补充,我们可以找到该节点定义的地方

    kernelarcharm64ootdtsqcommsm8953.dtsi

    [objc]  view plain  copy
     
    1. &soc {  
    2.     i2c_8: i2c@7af8000 { /* BLSP2 QUP4 */  
    3.         compatible = "qcom,i2c-msm-v2";  
    4.         #address-cells = <1>;  
    5.         #size-cells = <0>;  
    6.         reg-names = "qup_phys_addr";  
    7.         reg = <0x7af8000x600>;  
    8.         interrupt-names = "qup_irq";  
    9.         interrupts = <300>;  
    10.         qcom,clk-freq-out = <400000>;  
    11.         qcom,clk-freq-in  = <19200000>;  
    12.         clock-names = "iface_clk", "core_clk";  
    13.         clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>,  
    14.             <&clock_gcc clk_gcc_blsp2_qup4_i2c_apps_clk>;  
    15.   
    16.         pinctrl-names = "i2c_active", "i2c_sleep";  
    17.         pinctrl-0 = <&i2c_8_active>;  
    18.         pinctrl-1 = <&i2c_8_sleep>;  
    19.         qcom,noise-rjct-scl = <0>;  
    20.         qcom,noise-rjct-sda = <0>;  
    21.         qcom,master-id = <84>;  
    22.         dmas = <&dma_blsp160x20000020x20>,  
    23.             <&dma_blsp130x20000020x20>;  
    24.         dma-names = "tx", "rx";  
    25.     };  
    26.     rpm_bus: qcom,rpm-smd {  
    27.         compatible = "qcom,rpm-smd";  
    28.         rpm-channel-name = "rpm_requests";  
    29.         rpm-channel-type = <15>; /* SMD_APPS_RPM */  
    30.     };    


    这当中的大部分属性都与平台相关了,可以看到定义了该i2c接口的时钟源、中断格式等。这部分一般由平台提供,作为驱动工程师了解即可。

    2.3.1,i2c_8节点中的pinctrl-0指向了定义其io口的节点i2c_8_active和i2c_8_sleep,代码如下可见该i2c的IO口为Gpio98和Gpio99

    kernelarcharm64ootdtsqcommsm8953-pinctrl.dtsi

    [objc]  view plain  copy
     
    1. &soc {  
    2.     tlmm: pinctrl@1000000 {  
    3.         i2c_8 {  
    4.             i2c_8_active: i2c_8_active {  
    5.                 /* active state */  
    6.                 mux {  
    7.                     pins = "gpio98", "gpio99";  
    8.                     function = "blsp_i2c8";  
    9.                 };  
    10.   
    11.                 config {  
    12.                     pins = "gpio98", "gpio99";  
    13.                     drive-strength = <2>;  
    14.                     bias-disable;  
    15.                 };  
    16.             };  
    17.   
    18.             i2c_8_sleep: i2c_8_sleep {  
    19.                 /* suspended state */  
    20.                 mux {  
    21.                     pins = "gpio98", "gpio99";  
    22.                     function = "gpio";  
    23.                 };  
    24.   
    25.                 config {  
    26.                     pins = "gpio98", "gpio99";  
    27.                     drive-strength = <2>;  
    28.                     bias-disable;  
    29.                 };  
    30.             };  
    31.         };  
    32.           
    33.         iqs263_irq_config: iqs263_irq_config {  
    34.             mux {  
    35.                 pins = "gpio48";  
    36.                 function = "gpio";  
    37.             };  
    38.   
    39.             config {  
    40.                 pins = "gpio48";  
    41.                 drive-strength = <2>;  
    42.                 bias-pull-up;  
    43.             };  
    44.         };    



    2.4,iqs263节点中的pinctrl-0 属性指向了表明其io口属性的节点为iqs263_irq_config,相关代码也在2.3.1指示的msm8953-pinctrl.dtsi文件中。

    其中定义了iqs263的中断IO脚为Gpio48

    2.5,iqs263节点中的vdd-supply,vio-supply属性指示了表明iqs263芯片供电的引脚的节点pm8953_l5,代码如下

    kernelarcharm64ootdtsqcommsm8953-regulator.dtsi

    [objc]  view plain  copy
     
    1. &rpm_bus {  
    2.     rpm-regulator-ldoa5 {  
    3.         status = "okay";  
    4.         pm8953_l5: regulator-l5 {  
    5.             regulator-min-microvolt = <1800000>;  
    6.             regulator-max-microvolt = <1800000>;  
    7.             qcom,init-voltage = <1800000>;  
    8.             status = "okay";  
    9.         };  
    10.     };  


    2.6,iqs263的interrupts = <48 0x2>属性表明中断号为48,2代表下降沿触发。相关知识可以参考: 高通平台8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)

    ##########################################################

  • 相关阅读:
    Node_JS
    读JS高级——第五章-引用类型 _记录
    读JS高级(兼容&&BOM&&私有变量&&面向对象)
    JS高级设计第七章——复习知识点
    nodeJs抓取网页
    表单脚本api_contenteditable
    泛——复习js高级第三版
    nodeJS
    Eclipse布局问题小记
    再议负载均衡算法
  • 原文地址:https://www.cnblogs.com/fire909090/p/13846792.html
Copyright © 2020-2023  润新知