0
点赞
收藏
分享

微信扫一扫

OpenWRT(九)DTS及串口

工程与房产肖律师 2022-02-18 阅读 101


一、DTS

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>;
};
};

三、OpenWRT串口的使用

以RT5350进行举例:

1、进入openwrt/target/linux/ramips/dts目录,打开rt5350.dtsi,即上面的文件。找到下面的内容:

OpenWRT(九)DTS及串口_字段

将红色框框的内容去掉就使能了串口。

2、因为uart的配置在uartlite(调试串口)前面,所以uart会被初始化为ttyS0,而ttyS0之前却被配置为调试串口。

OpenWRT(九)DTS及串口_字段_02

为了解决这个问题,我们将uart的配置放到uartlite后面就可以了!

OpenWRT(九)DTS及串口_ios_03

3、串口引脚之前被配置为普通IO口,所以为了防止干扰需要把IO口中的配置去掉。打开openwrt/target/linux/ramips/dts/MPRA2.dts,找到下面内容

OpenWRT(九)DTS及串口_openwrt_04

把红色框框的内容去掉。

4、重新编译就OK了! 将编译好的固件下载到开发板后启动系统后,在/dev/目录下会多出ttyS1这个设备。这个就是我们添加的串口设备。


OpenWRT(九)DTS及串口_ios_05


举报

相关推荐

0 条评论