DTS是Device Tree Source的縮寫,它用來描述設備的硬件細節。說簡單點就是開發闆的配置文件。
分析OpenWRT的dts文件以rt5350.dtsi作為分析
//DTS格式有點類似Json
/ { // "/"表示root節點
//#address-cells和#size-cells分别決定reg屬性的address和length字段的長度。比如reg<0x500 0x100>,0x500和0x100兩個數值都是32位的
#address-cells = <1>; //地址長度為1個32位的整型
#size-cells = <1>; //length為1個32位的整型
//ralink:廠商 rt5350-soc:具體的芯片型号
compatible = "ralink,rt5350-soc"; //定義系統名稱,compatible屬性用于驅動和設備的綁定,屬性值形式:<manufacturer>,<model>
cpus { //芯片中的所有cpu定義
cpu@0 { //cpu@0表示第一個cpu,如果還有其他cpu就依次定義為cpu@1 cpu@2 .....
compatible = "mips,mips24KEc"; //mips的cpu内核,mips24KEc是具體型号
};
};
chosen {
bootargs = "console=ttyS0,57600"; //啟動參數,定義了串口ttyS0為調試串口,波特率為57600
};
cpuintc: cpuintc@0 {
#address-cells = <0>;
#interrupt-cells = <1>; //中斷号長度
interrupt-controller;
compatible = "mti,cpu-interrupt-controller";
};
aliases { //定義别名
spi0 = &spi0;
spi1 = &spi1;
serial0 = &uartlite; //uartlite的别名為serial0
};
palmbus@10000000 { // @後面代表address
compatible = "palmbus";
reg = <0x10000000 0x200000>; //address: 0x10000000 length:0x200000
ranges = <0x0 0x10000000 0x1FFFFF>; //地址轉換表 :<子地址 父地址 子地址空間的映射大小>
#address-cells = <1>; //決定子節點reg的address字段長度
#size-cells = <1>; //決定子節點reg的length字段長度
sysc@0 {
compatible = "ralink,rt5350-sysc", "ralink,rt3050-sysc"; //兼容rt5350和rt3050
reg = <0x0 0x100>;
};
timer@100 {
compatible = "ralink,rt5350-timer", "ralink,rt2880-timer";
reg = <0x100 0x20>;
//在RT5350中,将GPIO設置為中斷方式,當它觸發中斷時,CPU的中斷控制器先獲取中斷,在這裡叫一級中斷。
//判斷它是GPIO中斷,然後進入GPIO中斷控制器判斷是哪個GPIO産生的中斷,這裡叫二級中斷,再進行中斷處理。
interrupt-parent = <&intc>; //當上級發生intc中斷時才來查詢是否是該中斷。
interrupts = <1>; //中斷等級
};
watchdog@120 {
compatible = "ralink,rt5350-wdt", "ralink,rt2880-wdt";
reg = <0x120 0x10>;
resets = <&rstctrl 8>;
reset-names = "wdt";
interrupt-parent = <&intc>;
interrupts = <1>;
};
intc: intc@200 {
compatible = "ralink,rt5350-intc", "ralink,rt2880-intc";
reg = <0x200 0x100>;
resets = <&rstctrl 19>;
reset-names = "intc";
interrupt-controller;
#interrupt-cells = <1>;
interrupt-parent = <&cpuintc>;
interrupts = <2>;
};
memc@300 {
compatible = "ralink,rt5350-memc", "ralink,rt3050-memc";
reg = <0x300 0x100>;
resets = <&rstctrl 20>;
reset-names = "mc";
interrupt-parent = <&intc>;
interrupts = <3>;
};
uart@500 {
compatible = "ralink,rt5350-uart", "ralink,rt2880-uart", "ns16550a";
reg = <0x500 0x100>;
resets = <&rstctrl 12>;
reset-names = "uart";
interrupt-parent = <&intc>;
interrupts = <5>;
reg-shift = <2>;
status = "disabled";
};
gpio0: gpio@600 {
compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio";
reg = <0x600 0x34>;
resets = <&rstctrl 13>;
reset-names = "pio";
interrupt-parent = <&intc>;
interrupts = <6>;
gpio-controller;
#gpio-cells = <2>;
ralink,gpio-base = <0>;
ralink,num-gpios = <22>;
ralink,register-map = [ 00 04 08 0c
20 24 28 2c
30 34 ];
};
gpio1: gpio@660 {
compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio";
reg = <0x660 0x24>;
interrupt-parent = <&intc>;
interrupts = <6>;
gpio-controller;
#gpio-cells = <2>;
ralink,gpio-base = <22>;
ralink,num-gpios = <6>;
ralink,register-map = [ 00 04 08 0c
10 14 18 1c
20 24 ];
status = "disabled"; //本模塊狀态
};
i2c@900 {
compatible = "link,rt5350-i2c", "ralink,rt2880-i2c";
reg = <0x900 0x100>;
resets = <&rstctrl 16>;
reset-names = "i2c";
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&i2c_pins>;
status = "disabled";
};
spi0: spi@b00 {
compatible = "ralink,rt5350-spi", "ralink,rt2880-spi";
reg = <0xb00 0x40>;
resets = <&rstctrl 18>;
reset-names = "spi";
#address-cells = <1>;
#size-cells = <1>;
pinctrl-names = "default";
pinctrl-0 = <&spi_pins>;
status = "disabled";
};
spi1: spi@b40 {
compatible = "ralink,rt5350-spi", "ralink,rt2880-spi";
reg = <0xb40 0x60>;
resets = <&rstctrl 18>;
reset-names = "spi";
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&spi_cs1>;
status = "disabled";
};
uartlite: uartlite@c00 {
compatible = "ralink,rt5350-uart", "ralink,rt2880-uart", "ns16550a";
reg = <0xc00 0x100>;
resets = <&rstctrl 19>;
reset-names = "uartl";
interrupt-parent = <&intc>;
interrupts = <12>;
pinctrl-names = "default";
pinctrl-0 = <&uartlite_pins>;
reg-shift = <2>;
};
systick@d00 {
compatible = "ralink,rt5350-systick", "ralink,cevt-systick";
reg = <0xd00 0x10>;
interrupt-parent = <&cpuintc>;
interrupts = <7>;
};
};
pinctrl { //引腳控制
compatible = "ralink,rt2880-pinmux";
pinctrl-names = "default";
pinctrl-0 = <&state_default>;
state_default: pinctrl0 {
};
spi_pins: spi {
spi {
ralink,group = "spi";
ralink,function = "spi";
};
};
i2c_pins: i2c {
i2c {
ralink,group = "i2c";
ralink,function = "i2c";
};
};
phy_led_pins: phy_led {
phy_led {
ralink,group = "led";
ralink,function = "led";
};
};
uartlite_pins: uartlite {
uart {
ralink,group = "uartlite";
ralink,function = "uartlite";
};
};
uartf_pins: uartf {
uartf {
ralink,group = "uartf";
ralink,function = "uartf";
};
};
spi_cs1: spi1 {
spi1 {
ralink,group = "spi_cs1";
ralink,function = "spi_cs1";
};
};
};
rstctrl: rstctrl {
compatible = "ralink,rt5350-reset", "ralink,rt2880-reset";
#reset-cells = <1>;
};
usbphy: usbphy {
compatible = "ralink,rt3352-usbphy";
#phy-cells = <1>;
resets = <&rstctrl 22 &rstctrl 25>;
reset-names = "host", "device";
};
ethernet@10100000 {
compatible = "ralink,rt5350-eth";
reg = <0x10100000 0x10000>;
resets = <&rstctrl 21 &rstctrl 23>;
reset-names = "fe", "esw";
interrupt-parent = <&cpuintc>;
interrupts = <5>;
mediatek,switch = <&esw>;
};
esw: esw@10110000 {
compatible = "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
resets = <&rstctrl 23>;
reset-names = "esw";
interrupt-parent = <&intc>;
interrupts = <17>;
};
wmac@10180000 {
compatible = "ralink,rt5350-wmac", "ralink,rt2880-wmac";
reg = <0x10180000 0x40000>;
interrupt-parent = <&cpuintc>;
interrupts = <6>;
ralink,eeprom = "soc_wmac.eeprom";
};
ehci@101c0000 {
compatible = "generic-ehci";
reg = <0x101c0000 0x1000>;
phys = <&usbphy 1>;
phy-names = "usb";
interrupt-parent = <&intc>;
interrupts = <18>;
};
ohci@101c1000 {
compatible = "generic-ohci";
reg = <0x101c1000 0x1000>;
phys = <&usbphy 1>;
phy-names = "usb";
interrupt-parent = <&intc>;
interrupts = <18>;
};
};
以RT5350進行舉例: 1、進入openwrt/target/linux/ramips/dts目錄,打開rt5350.dtsi,即上面的文件。找到下面的内容:
将紅色框框的内容去掉就使能了串口。
2、因為uart的配置在uartlite(調試串口)前面,所以uart會被初始化為ttyS0,而ttyS0之前卻被配置為調試串口。
為了解決這個問題,我們将uart的配置放到uartlite後面就可以了!
3、串口引腳之前被配置為普通IO口,所以為了防止幹擾需要把IO口中的配置去掉。打開openwrt/target/linux/ramips/dts/MPRA2.dts,找到下面内容 :
把紅色框框的内容去掉。
4、重新編譯就OK了! 将編譯好的固件下載到開發闆後啟動系統後,在/dev/目錄下會多出ttyS1這個設備。這個就是我們添加的串口設備
喜歡這篇文章或者對你有幫助,歡迎點贊,分享,關注!!
更多精彩文章,歡迎關注微信公衆号"嵌入式軟件開發交流" !
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!