在前兩篇中我們了解了DTS的背景基礎知識以及發揮作用的流程,這篇文章我們以android 7.1 高通的MSM8953平台為例來添加一個基礎的i2c設備(包含一個gpio中斷)。
1,首先我們在該i2c設備的驅動中找到了匹配設備與驅動程序的compatible
- static const struct of_device_id iqs263_of_match[] = {
- { .compatible = "azopteq,iqs263", },
- { },
- };
2,由此compatible可以找到dts中對應的設備
kernel\arch\arm64\boot\dts\qcom\msm8953-mtp.dts
- &i2c_8 { /* BLSP2 QUP4 */
- iqs263@44 { //Capacitive Touch Controller Driver
- compatible = "azopteq,iqs263";
- reg = <0x44>;
- pinctrl-names = "default";
- pinctrl-0 = <&iqs263_irq_config>;
- vdd-supply = <&pm8953_l5>;
- vio-supply = <&pm8953_l5>;
- interrupt-parent = <&tlmm>;
- interrupts = <48 0x2>;
- azopteq,irq-gpio =<&tlmm 48 0x2>;
- };
- };
2.1,其中compatible屬性標識的名字是與驅動程序中名字相匹配的
2.2,其中reg屬性及@符號后的十六進制數字標識了該設備iqs263的i2c地址為0x44
2.3,&i2c_8前的&表明此處僅僅是對i2c_8節點的補充,我們可以找到該節點定義的地方
kernel\arch\arm64\boot\dts\qcom\msm8953.dtsi
- &soc {
- i2c_8: i2c@7af8000 { /* BLSP2 QUP4 */
- compatible = "qcom,i2c-msm-v2";
- #address-cells = <1>;
- #size-cells = <0>;
- reg-names = "qup_phys_addr";
- reg = <0x7af8000 0x600>;
- interrupt-names = "qup_irq";
- interrupts = <0 302 0>;
- qcom,clk-freq-out = <400000>;
- qcom,clk-freq-in = <19200000>;
- clock-names = "iface_clk", "core_clk";
- clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>,
- <&clock_gcc clk_gcc_blsp2_qup4_i2c_apps_clk>;
- pinctrl-names = "i2c_active", "i2c_sleep";
- pinctrl-0 = <&i2c_8_active>;
- pinctrl-1 = <&i2c_8_sleep>;
- qcom,noise-rjct-scl = <0>;
- qcom,noise-rjct-sda = <0>;
- qcom,master-id = <84>;
- dmas = <&dma_blsp2 10 64 0x20000020 0x20>,
- <&dma_blsp2 11 32 0x20000020 0x20>;
- dma-names = "tx", "rx";
- };
- rpm_bus: qcom,rpm-smd {
- compatible = "qcom,rpm-smd";
- rpm-channel-name = "rpm_requests";
- rpm-channel-type = <15>; /* SMD_APPS_RPM */
- };
這當中的大部分屬性都與平台相關了,可以看到定義了該i2c接口的時鍾源、中斷格式等。這部分一般由平台提供,作為驅動工程師了解即可。
2.3.1,i2c_8節點中的pinctrl-0指向了定義其io口的節點i2c_8_active和i2c_8_sleep,代碼如下可見該i2c的IO口為Gpio98和Gpio99
kernel\arch\arm64\boot\dts\qcom\msm8953-pinctrl.dtsi
- &soc {
- tlmm: pinctrl@1000000 {
- i2c_8 {
- i2c_8_active: i2c_8_active {
- /* active state */
- mux {
- pins = "gpio98", "gpio99";
- function = "blsp_i2c8";
- };
- config {
- pins = "gpio98", "gpio99";
- drive-strength = <2>;
- bias-disable;
- };
- };
- i2c_8_sleep: i2c_8_sleep {
- /* suspended state */
- mux {
- pins = "gpio98", "gpio99";
- function = "gpio";
- };
- config {
- pins = "gpio98", "gpio99";
- drive-strength = <2>;
- bias-disable;
- };
- };
- };
- iqs263_irq_config: iqs263_irq_config {
- mux {
- pins = "gpio48";
- function = "gpio";
- };
- config {
- pins = "gpio48";
- drive-strength = <2>;
- bias-pull-up;
- };
- };
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,代碼如下
kernel\arch\arm64\boot\dts\qcom\msm8953-regulator.dtsi
- &rpm_bus {
- rpm-regulator-ldoa5 {
- status = "okay";
- pm8953_l5: regulator-l5 {
- regulator-min-microvolt = <1800000>;
- regulator-max-microvolt = <1800000>;
- qcom,init-voltage = <1800000>;
- status = "okay";
- };
- };
2.6,iqs263的interrupts = <48 0x2>屬性表明中斷號為48,2代表下降沿觸發。相關知識可以參考: 高通平台8953 Linux DTS(Device Tree Source)設備樹詳解之二(DTS設備樹匹配過程)
##########################################################