日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dtsi与dts_[dts]DTS实例分析

發布時間:2024/9/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dtsi与dts_[dts]DTS实例分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

此篇源文件arch/arm/boot/dts/imx6sx.dtsi

1. dts和dtsi完成的功能

以下是兩段較為常見的dtsi和dts代碼

1 uart5: serial@021f4000 {2 compatible = "fsl,imx6sx-uart",3 "fsl,imx6q-uart", "fsl,imx21-uart";4 reg = <0x021f4000 0x4000>;5 interrupts = ;6 clocks = ,7 ;8 clock-names = "ipg", "per";9 dmas = , ;10 dma-names = "rx", "tx";11 status = "disabled";12 };

以上這段代碼更多出現在*.dtsi中

一般會在*.dtsi中將芯片的外設接口資源都做定義,

如uart5作為該外設的label,node-name@unit-address作為設備的名稱,node-name只是設備類型,uart1/uart2/uart3等可以都是serial名稱,而@后面則跟著設備寄存器起始地址。

compatible默認屬性,

reg寄存器地址和長度,該uart5節點的父節點為aips2,在父節點中指明#address-cells = <1>;#size-cells = <1>;這決定了子節點字段長度address為1, length為1. 所以reg格式為reg = <0x021f4000 0x4000>;

interrupts對應的中斷號和中斷出發方式,uart5的父節點為aips2,而aips2的父節點為soc,soc節點定義了interrupt-parent = ;給出了節點所依附的中斷控制器,如果節點沒有指定interrupt-parent,那么就從父節點繼承,所以該uart5節點繼承了soc的中斷控制器,即intc. 而intc節點的#interrupt-cells = <3>;所以就有了該節點中interrupts = ;三個字段,具體這三個字段的含義可以參考芯片文檔的描述。其中GIC_SPI定義在include/dt-bindings/interrupt-controller/arm-gic.h值為0,

clock外設時鐘,在include/dt-bindings/clock/imx6sx-clock.h,指定設備工作時鐘

status一般會設為disabled。

1 &uart5 {2 pinctrl-names = "default";3 pinctrl-0 = ;4 fsl,uart-has-rtscts;5 status = "okay";6 };

以上這段代碼更多出現在*.dts中

在*.dts中如果想對該設備進行操作,需要進行override,至少status需要從disabled設置為okay, 當然也有可能需要對compatible屬性進行重寫(為了和自己的driver匹配),另外需要使用&label首先引用該設備,使用pinctrl-names和pinctrl-0進行引腳的配置,當然這里可能出現多組引腳的配置,如下代碼:

1 &usdhc3 {2 pinctrl-names = "default", "state_100mhz", "state_200mhz";3 pinctrl-0 = ;4 pinctrl-1 = ;5 pinctrl-2 = ;6 bus-width = <8>;7 cd-gpios = ;8 wp-gpios = ;9 keep-power-in-suspend;10 enable-sdio-wakeup;11 vmmc-supply = ;12 status = "okay";13 };

而這里面的pinctrl-0對應的pinctrl_usdhc3內容如下:

1 pinctrl_usdhc3: usdhc3grp {2 fsl,pins = <

3 MX6SX_PAD_SD3_CMD__USDHC3_CMD 0x17069

4 MX6SX_PAD_SD3_CLK__USDHC3_CLK 0x10071

5 MX6SX_PAD_SD3_DATA0__USDHC3_DATA0 0x17069

6 MX6SX_PAD_SD3_DATA1__USDHC3_DATA1 0x17069

7 MX6SX_PAD_SD3_DATA2__USDHC3_DATA2 0x17069

8 MX6SX_PAD_SD3_DATA3__USDHC3_DATA3 0x17069

9 MX6SX_PAD_SD3_DATA4__USDHC3_DATA4 0x17069

10 MX6SX_PAD_SD3_DATA5__USDHC3_DATA5 0x17069

11 MX6SX_PAD_SD3_DATA6__USDHC3_DATA6 0x17069

12 MX6SX_PAD_SD3_DATA7__USDHC3_DATA7 0x17069

13 MX6SX_PAD_KEY_COL0__GPIO2_IO_10 0x17059 /*CD*/

14 MX6SX_PAD_KEY_ROW0__GPIO2_IO_15 0x17059 /*WP*/

15 >;16 };

這種pinctrl的設置可參照/Documentation/devicetree/bindinsg/pinctrl下示例代碼

2. 通常會碰到的實際問題

到此,問題出現了:

1. 當寫一個按鍵驅動,應該如何在*.dts或者*.dtsi中操作?

2. 當在串口driver中需要使用到某個pin腳作為普通輸出IO,該如何操作?

3. 當在串口driver中需要使用某個muxpin腳作為ADC或者其他服用功能該如何操作?

4. 當在串口driver中有可能想使能某個功能而不想寫定在driver代碼中,該如何操作?

5. 當想向driver中傳入一個常數如做delay延時操作等等,該如何操作?

解答:

1. 當寫一個按鍵驅動,應該如何在*.dts或者*.dtsi中操作?

1 gpio-keys {2 compatible = "gpio-keys";3 pinctrl-names = "default";4 pinctrl-0 = ;5

6 volume-up {7 label = "Volume Up";8 gpios = ;9 linux,code = ;10 };11

12 volume-down {13 label = "Volume Down";14 gpios = ;15 linux,code = ;16 };17 };

1 pinctrl_gpio_keys: gpio_keysgrp {2 fsl,pins = <

3 MX6SX_PAD_CSI_DATA04__GPIO1_IO_18 0x17059

4 MX6SX_PAD_CSI_DATA05__GPIO1_IO_19 0x17059

5 >;6 };

2. 當在串口driver中需要使用到某個pin腳作為普通輸出IO,該如何操作?

1 sii902x_reset: sii902x-reset {2 compatible = "gpio-reset";3 reset-gpios = ;4 reset-delay-us = <100000>;5 #reset-cells = <0>;6 status = "disabled";7 };

最簡單的不需要pinctrl來進行pin腳的設置,為什么???

3. 當在串口driver中需要使用某個muxpin腳作為ADC或者其他服用功能該如何操作?

這個問題其實上面有提到,就像上述的多個pin-names和多個pinctrl在后面的pinctrl中配置這個復用的管腳即可。

4. 當在串口driver中有可能想使能某個功能而不想寫定在driver代碼中,該如何操作?

1 &uart5 {2 pinctrl-names = "default";3 pinctrl-0 = ;4 fsl,uart-has-rtscts;5 status = "okay";6

7 };

只需要在driver中使用of函數讀取此屬性,如果有此字段,可以使能某些操作;如果沒有就失能某些操作。

5. 當想向driver中傳入一個常數如做delay延時操作等等,該如何操作?

1 &usdhc3 {2 pinctrl-names = "default", "state_100mhz", "state_200mhz";3 pinctrl-0 = ;4 pinctrl-1 = ;5 pinctrl-2 = ;6 bus-width = <8>;7 cd-gpios = ;8 wp-gpios = ;9 keep-power-in-suspend;10 enable-sdio-wakeup;11 vmmc-supply = ;12 status = "okay";13 };

只需要在driver中讀取bus-width字段的值,即可獲取到8這個常量,注意在devicetree中命名字段更多使用"-"而非下劃線"_".

總結

以上是生活随笔為你收集整理的dtsi与dts_[dts]DTS实例分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。