openWRT的DTS文件配置--MT7620A

本文详细解析MT7620A SoC的设备树配置文件,涵盖从根节点到各子节点的具体配置,包括内存、中断控制器、GPIO控制器等关键组件的设置,并展示了如何通过设备树配置实现对硬件资源的有效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://blog.chinaunix.net/uid-29616823-id-4390033.html

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

接上xx路由器的串口后有输出但无法输入,用示波器量下信号-----可能是uboot里面把RX引脚给配置了。

1.属性的定义采用property = value的形式,“”字符串、<>32或64位值、[]二进制[0x01 0x02]
2.用=赋值的才是节点属性,其他是子节点。
3.root节点的compitable属性供内核选择匹配机器码machinetype,其他节点的compitable属性供内核选择匹配对应的驱动
(如三星2416的lcd控制器节点,内核里面lcd的驱动有很多)
4.DTB文件头boot_paras_header,其中的magic字段用来标志Uboot传来的启动参数是DTB还是taglist(bootargs)
,xx_offset标志DTB在内存中的地址。
compatible:兼容的,相容的


/ {---------------------"/"表示根节点的名称,一个设备树只能有一个根节点多个文件中的根节点在编译时会被合并。
#address-cells = <1>;---------------表示地址空间的个数,如系统有两片内存,那就需要<a b c d>两组数据来表示,ab表示内存1的空间 cd表示内存2空间。
#size-cells = <1>;------------------表示地址空间所需字节数,如表示64位的GPIO控制寄存器组就需要<0x00000001 0x000000002 0x00000001 0x000000006>
表示的空间是0x0000000100000000200000001000000006
compatible = "ralink,mtk7620a-soc";----“compatible”属性表示CPU所述系列,如mips架构ralink,mtk7620a系列
、arm架构stm32,cortex-M3系列。

cpus {
cpu@0 {---------节点名称@节点寄存器偏移地址或节点设备编号,若该节点无reg属性则不写定义成空节点即可。
compatible = "mips,mips24KEc";
};
};


chosen {
bootargs = "console=ttyS0,57600";-----通过dts给内核传递uboot的bootargs参数,uboot省事了
};


cpuintc: cpuintc@0 {-------------该节点名称是中断控制器,cpuintc是标签即cpuintc@0,
为了方便引用cpuintc@0。
#address-cells = <0>;
#interrupt-cells = <1>;
interrupt-controller;
compatible = "mti,cpu-interrupt-controller";
};


palmbus@10000000 {------palmbus类似arm的AMBA,属于片内总线。
compatible = "palmbus";
reg = <0x10000000 0x200000>;---reg属性表示该控制器的reg地址及总长度
                ranges = <0x0 0x10000000 0x1FFFFF>;


#address-cells = <1>;----若节点的子节点有控制寄存器,则必须定义这两个属性。
#size-cells = <1>;


sysc@0 {
compatible = "ralink,mt7620a-sysc", "ralink,rt3050-sysc";
reg = <0x0 0x100>;
};


timer@100 {
compatible = "ralink,mt7620a-timer", "ralink,rt2880-timer";
reg = <0x100 0x20>;


interrupt-parent = <&intc>;
interrupts = <1>;
};


watchdog@120 {
compatible = "ralink,mt7620a-wdt", "ralink,rt2880-wdt";
reg = <0x120 0x10>;


resets = <&rstctrl 8>;
reset-names = "wdt";


interrupt-parent = <&intc>;
interrupts = <1>;
};


intc: intc@200 {-----intc为标签(为方便被其他节点引用)
compatible = "ralink,mt7620a-intc", "ralink,rt2880-intc";
reg = <0x200 0x100>;


resets = <&rstctrl 19>;
reset-names = "intc";


interrupt-controller;
#interrupt-cells = <1>;


interrupt-parent = <&cpuintc>;--------引用节点cpuintc
interrupts = <2>;
};


memc@300 {----------描述系统内存的节点,为根节点的子节点
compatible = "ralink,mt7620a-memc", "ralink,rt3050-memc";
reg = <0x300 0x100>;


resets = <&rstctrl 20>;
reset-names = "mc";


interrupt-parent = <&intc>;
interrupts = <3>;
};


gpio0: gpio@600 {
compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
reg = <0x600 0x34>;


resets = <&rstctrl 13>;
reset-names = "pio";


interrupt-parent = <&intc>;
interrupts = <6>;---------表示其在中断控制器中的硬件中断编号,分系统异常中断/systick中断/两个外部中断。。。等


gpio-controller;
#gpio-cells = <2>;-----表示gpio控制寄存器是64位的


ralink,gpio-base = <0>;----该组gpio从GPIO0开始
ralink,num-gpios = <24>;-------到GPIO24结束
ralink,register-map = [ 00 04 08 0c
20 24 28 2c
30 34 ];
};


gpio1: gpio@638 {
compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
reg = <0x638 0x24>;


interrupt-parent = <&intc>;
interrupts = <6>;


gpio-controller;
#gpio-cells = <2>;


ralink,gpio-base = <24>;
ralink,num-gpios = <16>;
ralink,register-map = [ 00 04 08 0c
10 14 18 1c
20 24 ];-----执行cat /proc/iomem显示的数值?


status = "disabled";
};


gpio2: gpio@660 {
compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
reg = <0x660 0x24>;


interrupt-parent = <&intc>;
interrupts = <6>;


gpio-controller;
#gpio-cells = <2>;


ralink,gpio-base = <40>;
ralink,num-gpios = <32>;
ralink,register-map = [ 00 04 08 0c
10 14 18 1c
20 24 ];


status = "disabled";
};


gpio3: gpio@688 {
compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
reg = <0x688 0x24>;


interrupt-parent = <&intc>;
interrupts = <6>;


gpio-controller;
#gpio-cells = <2>;


ralink,gpio-base = <72>;
ralink,num-gpios = <1>;
ralink,register-map = [ 00 04 08 0c
10 14 18 1c
20 24 ];


status = "disabled";
};


i2c@900 {
compatible = "link,mt7620a-i2c", "ralink,rt2880-i2c";
reg = <0x900 0x100>;


resets = <&rstctrl 16>;
reset-names = "i2c";


#address-cells = <1>;
#size-cells = <0>;


status = "disabled";


pinctrl-names = "default";----i2c除了对i2c控制器寄存器定义外,还要对i2c所用的gpio管脚定义
pinctrl-0 = <&i2c_pins>;
};


i2s@a00 {
compatible = "ralink,mt7620a-i2s";
reg = <0xa00 0x100>;


resets = <&rstctrl 17>;
reset-names = "i2s";


interrupt-parent = <&intc>;
interrupts = <10>;


dmas = <&gdma 4>,
<&gdma 5>;
dma-names = "tx", "rx";


status = "disabled";
};


spi@b00 {
compatible = "ralink,mt7620a-spi", "ralink,rt2880-spi";
reg = <0xb00 0x100>;


resets = <&rstctrl 18>;
reset-names = "spi";


#address-cells = <1>;
#size-cells = <1>;


status = "disabled";


pinctrl-names = "default";
pinctrl-0 = <&spi_pins>;-----spi_pins不在dts文件中定义?
};


uartlite@c00 {
compatible = "ralink,mt7620a-uart", "ralink,rt2880-uart", "ns16550a";
reg = <0xc00 0x100>;


resets = <&rstctrl 19>;
reset-names = "uartl";


interrupt-parent = <&intc>;
interrupts = <12>;


reg-shift = <2>;


pinctrl-names = "default";
pinctrl-0 = <&uartlite_pins>;
};


uart@500 {
compatible = "ralink,mt7620a-uart", "ralink,rt2880-uart", "ns16550a";
reg = <0x500 0x100>;


resets = <&rstctrl 12>;
reset-names = "uart";


interrupt-parent = <&intc>;
interrupts = <5>;


reg-shift = <2>;


pinctrl-names = "default";
pinctrl-0 = <&pcm_uartf_pins>;
};


systick@d00 {
compatible = "ralink,mt7620a-systick", "ralink,cevt-systick";
reg = <0xd00 0x10>;


resets = <&rstctrl 28>;
reset-names = "intc";


interrupt-parent = <&cpuintc>;
interrupts = <7>;
};


pcm@2000 {
compatible = "ralink,mt7620a-pcm";
reg = <0x2000 0x800>;


resets = <&rstctrl 11>;--------resets属性含义?
reset-names = "pcm";


interrupt-parent = <&intc>;
interrupts = <4>;


status = "disabled";
};


gdma: gdma@2800 {
compatible = "ralink,mt7620a-gdma", "ralink,rt2880-gdma";
reg = <0x2800 0x800>;


resets = <&rstctrl 14>;
reset-names = "dma";


interrupt-parent = <&intc>;
interrupts = <7>;


#dma-cells = <1>;
#dma-channels = <16>;
#dma-requests = <16>;


status = "disabled";
};
};


pinctrl {
compatible = "ralink,rt2880-pinmux";
pinctrl-names = "default";
pinctrl-0 = <&state_default>;
state_default: pinctrl0 {
};
pcm_uartf_pins: pcm_uartf {
pcm_uartf {
ralink,group = "uartf";
ralink,function = "pcm uartf";
};
};
spi_pins: spi {
spi {
ralink,group = "spi";
ralink,function = "spi";
};
};
i2c_pins: i2c {
i2c {
lantiq,group = "i2c";
lantiq,function = "i2c";
};
};
uartlite_pins: uartlite {
uart {
ralink,group = "uartlite";
ralink,function = "uartlite";
};
};
mdio_pins: mdio {
mdio {
ralink,group = "mdio";
ralink,function = "mdio";
};
};
ephy_pins: ephy {
ephy {
ralink,group = "ephy";
ralink,function = "ephy";
};
};
wled_pins: wled {
wled {
ralink,group = "wled";
ralink,function = "wled";
};
};
rgmii1_pins: rgmii1 {
rgmii1 {
ralink,group = "rgmii1";
ralink,function = "rgmii1";
};
};
rgmii2_pins: rgmii2 {
rgmii2 {
ralink,group = "rgmii2";
ralink,function = "rgmii2";
};
};
};


rstctrl: rstctrl {
compatible = "ralink,mt7620a-reset", "ralink,rt2880-reset";
#reset-cells = <1>;
};


ubsphy {
compatible = "ralink,mt7620a-usbphy";


resets = <&rstctrl 22 &rstctrl 25>;
reset-names = "host", "device";
};


ethernet@10100000 {
compatible = "ralink,mt7620a-eth";
reg = <0x10100000 10000>;


#address-cells = <1>;
#size-cells = <0>;


interrupt-parent = <&cpuintc>;
interrupts = <5>;


resets = <&rstctrl 21 &rstctrl 23>;----当<>内出现多个数据时,一般两个数据一组。。。
reset-names = "fe", "esw";


port@4 {
compatible = "ralink,mt7620a-gsw-port", "ralink,eth-port";
reg = <4>;


status = "disabled";
};


port@5 {
compatible = "ralink,mt7620a-gsw-port", "ralink,eth-port";
reg = <5>;


status = "disabled";
};


mdio-bus {
#address-cells = <1>;
#size-cells = <0>;


status = "disabled";
};
};


gsw@10110000 {
compatible = "ralink,mt7620a-gsw";
reg = <0x10110000 8000>;


interrupt-parent = <&intc>;
interrupts = <17>;
};


sdhci@10130000 {
compatible = "ralink,mt7620a-sdhci";
reg = <0x10130000 4000>;


interrupt-parent = <&intc>;
interrupts = <14>;


status = "disabled";
};


ehci@101c0000 {
compatible = "ralink,rt3xxx-ehci";
reg = <0x101c0000 0x1000>;


interrupt-parent = <&intc>;
interrupts = <18>;


status = "disabled";
};


ohci@101c1000 {
compatible = "ralink,rt3xxx-ohci";
reg = <0x101c1000 0x1000>;


interrupt-parent = <&intc>;
interrupts = <18>;


status = "disabled";
};


pcie@10140000 {
compatible = "ralink,mt7620a-pci";
reg = <0x10140000 0x100
0x10142000 0x100>;


resets = <&rstctrl 26>;
reset-names = "pcie0";


interrupt-parent = <&cpuintc>;
interrupts = <4>;


status = "disabled";
};
};
==============================================================================
例如一个在.dts文件中关于gpio资源的描述:
  gpio: gpio-controller@1070000000800 {
            #gpio-cells = <2>;
            compatible = "cavium,octeon-3860-gpio";
            reg = <0x10700 0x00000800 0x0 0x100>;


            gpio-controller;
........
根据其描述, 可知道gpio控制器的IO内存起始地址为:0x107900000800, 长度为0x100.
即从 0x107900000800 到 0x1079000008ff.
在目标板里使用  cat /proc/iomem  可以看到:
1070000000800-10700000008ff : /soc@0/gpio-controller@1070000000800

====================================================================================
/dts-v1/;


/include/ "xxe.dtsi"


/ {
compatible = "xxx0", "ralink,mt7620a-soc";
model = "xxxxx";------model属性表示my board name。


palmbus@10000000 {
gpio1: gpio@638 {
status = "okay";
};


gpio2: gpio@660 {
status = "okay";
};


spi@b00 {
status = "okay";


m25p80@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "en25q64";
reg = <0 0>;
linux,modalias = "m25p80", "w25p128";
spi-max-frequency = <10000000>;


partition@0 {----@后面为该节点寄存器的偏移地址或设备编号
label = "u-boot";
reg = <0x0 0x30000>;---reg属性表示寄存器偏移地址和长度,
还能表示flash分区的便宜地址和长度
read-only;
};


partition@30000 {
label = "u-boot-env";
reg = <0x30000 0x10000>;
read-only;
};


factory: partition@40000 {
label = "factory";
reg = <0x40000 0x10000>;
};


partition@50000 {
label = "firmware";
reg = <0x50000 0xfb0000>;
};
};
};
};


pinctrl {
state_default: pinctrl0 {
default {
ralink,group = "i2c", "rgmii1", "rgmii2";
ralink,function = "gpio";
};
};
};


ethernet@10100000 {
mtd-mac-address = <&factory 0x28>;
ralink,port-map = "llllw";
};


gsw@10110000 {
ralink,port4 = "ephy";
};


ehci@101c0000 {
status = "okay";
};


ohci@101c1000 {
status = "okay";
};


gpio-leds {
compatible = "gpio-leds";


sys {
label = "xxx:blue:sys";
gpios = <&gpio2 20 1>;---用gpio2组的GPIO管脚,偏移地址是20即该组的第20个管脚,默认输出高电平。
}; 


wan {
label = "xxx:blue:wan";
gpios = <&gpio2 24 1>;
};


wireless {
label = "xxx:blue:wireless";
gpios = <&gpio2 21 1>;
};
};


gpio-keys-polled {
compatible = "gpio-keys-polled";
#address-cells = <1>;
#size-cells = <0>;
poll-interval = <20>;


zigbee {
label = "zigbee";
gpios = <&gpio2 23 1>;-------按此按键后开启zigbee模块业务?
linux,code = <0x197>;
};
reset {
label = "reset";
gpios = <&gpio2 22 1>;
linux,code = <0x198>;-------该属性的含义?
}; 
};


i2c-gpio {
compatible = "i2c-gpio";
gpios = <&gpio0 1 0 &gpio0 2 0>;-------i2c总线配置两个GPIO管脚
i2c-gpio,delay-us = <100>; /*10KHz */
#address-cells = <1>;
#size-cells = <0>;

pcf8563@51 {-----------------pcf8563为挂在该i2c总线的rtc芯片型号
compatible = "nxp,pcf8563";
reg = <0x51>;
}; 
};
};



<think>我们正在处理一个关于在OpenWRT固件中配置鼎桥MT5700m串口以使用qmodem的问题。根据用户的问题,我们需要配置串口以便使用qmodem(一个串口通信工具)。由于鼎桥MT5700m是一个串口设备,我们需要确保OpenWRT能够识别并正确配置该串口设备,然后安装并使用qmodem进行通信。 步骤分解: 1. 确认硬件连接和串口设备:首先,需要确认MT5700m模块通过串口连接到OpenWRT设备(如路由器)的哪个串口上(例如ttyS0、ttyS1等)。通常,OpenWRT设备可能有一个或多个串口,我们需要知道具体连接的是哪个。 2. 检查串口驱动:确保OpenWRT内核已经包含了对应串口的驱动。MT7620a芯片通常有多个串口,默认情况下可能只使能了一个作为控制台。因此,我们需要在设备树中配置额外的串口。 3. 修改设备树(DTS):如果默认的DTS文件没有启用所需的串口,我们需要修改它。根据引用[1],MT7620a的DTS文件位于`target/linux/ramips/dts`目录下。例如,我们可以打开对应的DTS文件(如MT7620a.dts或类似),并确保所需的串口被启用。 4. 编译固件:修改DTS后,需要重新编译OpenWRT固件以包含更改。 5. 安装qmodem:在OpenWRT系统中,qmodem可能不是一个预装软件,我们需要通过opkg包管理器安装。但是,qmodem可能不在默认的软件源中,因此可能需要自行编译或寻找合适的ipk包。 6. 配置串口权限:确保用户有权限访问该串口设备(通常需要将用户加入dialout组,或者修改设备节点的权限)。 7. 使用qmodem:安装完成后,使用qmodem命令连接串口设备。 具体步骤: ### 1. 确认串口设备 在OpenWRT设备上,连接MT5700m模块到串口(如UART1),然后查看系统启动日志(`dmesg`)或检查`/dev/`目录下的串口设备节点,通常为`ttyS0`、`ttyS1`等。 ### 2. 修改设备树(DTS) 如果所需的串口没有出现,可能需要修改设备树。例如,在MT7620a.dts文件中,添加或启用第二个串口(UART1): ```dts &uart1 { status = "okay"; }; ``` 默认情况下,可能只有UART0(作为控制台)被启用。 ### 3. 编译固件 修改DTS后,重新编译固件: ```bash make clean make -j$(nproc) ``` 然后刷写新固件到设备。 ### 4. 安装qmodem 如果qmodem在OpenWRT的软件源中,可以直接安装: ```bash opkg update opkg install qmodem ``` 如果软件源中没有,需要从源码编译。可以尝试在OpenWRT的package目录中查找是否有qmodem的包定义,或者自行创建。 ### 5. 配置串口权限 默认情况下,串口设备可能只有root用户可访问。为了让普通用户(或者运行qmodem的用户)能够访问,可以修改设备节点的权限: ```bash chmod 666 /dev/ttyS1 ``` 或者将用户加入dialout组(如果存在): ```bash adduser root dialout # 如果当前用户是root,通常已经有权,但如果是其他用户则添加 ``` ### 6. 使用qmodem 连接串口设备: ```bash qmodem -d /dev/ttyS1 -b 115200 # 根据实际设备设置波特率 ``` 注意:以上步骤中,修改设备树和编译固件需要一定的OpenWRT开发环境。如果用户不想重新编译固件,也可以尝试在运行时通过内核模块加载的方式启用串口,但修改设备树是最可靠的方法。 另外,关于串口的波特率、数据位、停止位和校验位等参数,需要与MT5700m模块的串口参数一致。 ### 相关问题 1. 如何检查OpenWRT设备上的可用串口? 2. 如何在OpenWRT中修改串口的波特率等参数? 3. 如果qmodem不可用,OpenWRT中还有哪些替代的串口通信工具?</think>### 配置鼎桥MT5700m串口使用qmodem的步骤 #### 1. **确认串口硬件连接** - 检查MT5700m模块的串口引脚(TXD/RXD/GND)与OpenWRT设备(如MT7620a开发板)的对应串口引脚连接 - 确认使用的串口编号(如`ttyS0`、`ttyS1`等),可通过`dmesg | grep tty`查看系统识别的串口设备 #### 2. **修改设备树配置** 根据引用[1],需修改MT7620a的设备树文件: ```dts {5-7} // 文件路径: target/linux/ramips/dts/MT7620a.dts &uart { status = "okay"; // 添加MT5700m的串口配置 compatible = "dtlink,mt5700m"; current-speed = <115200>; // 波特率 }; ``` **关键参数说明**: - `current-speed`:设置串口波特率(MT5700m默认115200bps) - `compatible`:声明设备兼容性标识 #### 3. **编译支持串口的固件** ```bash make menuconfig ``` 启用以下配置: ``` Kernel modules → Serial drivers → kmod-serial-core [*] → kmod-serial-8250 [*] Base system → terminfo [*] # 终端支持 Utilities → ser2net [*] # 串口网络转发工具 ``` #### 4. **安装qmodem工具** 通过opkg安装串口工具: ```bash opkg update opkg install coreutils-stty # 串口配置工具 opkg install lrzsz # ZModem文件传输 # 若qmodem不在仓库,需手动交叉编译 ``` #### 5. **配置串口权限** ```bash stty -F /dev/ttyS1 115200 cs8 -parenb -cstopb # 设置波特率 chmod 666 /dev/ttyS1 # 开放设备权限 ``` #### 6. **使用qmodem通信** ```bash qmodem -d /dev/ttyS1 -b 115200 ``` **操作说明**: - 按`Ctrl+A Z`进入ZModem文件传输菜单 - 使用`sz/rz`命令发送/接收文件 - 输入`AT+指令`与MT5700m模块交互 #### 7. **调试技巧** - 测试连通性:`echo "AT" > /dev/ttyS1` 应返回`OK` - 实时监控:`cat /dev/ttyS1` - 流量控制:添加`crtscts`参数启用RTS/CTS硬件流控 > ⚠️ **注意事项** > 1. MT5700m的`VCC`引脚需接3.3V电平 > 2. 若使用USB转串口模块,需额外安装`kmod-usb-serial`驱动 > 3. 工业环境建议在`dts`中启用`rs485`属性防干扰 ### 常见问题解决 | 现象 | 解决方法 | |------|----------| | 无数据返回 | 检查TX/RX是否交叉连接,接地是否稳定 | | 乱码 | 确认波特率/数据位配置MT5700m默认8N1) | | 权限拒绝 | 创建udev规则:`SUBSYSTEM=="tty", GROUP="dialout"` | | 模块不响应 | 测量供电电压(需3.3V±5%) | ### 参考配置优化 根据引用[2],可添加端口触发规则提升稳定性: ```c struct ip_autofw_info { u_int16_t proto; // 协议类型 u_int16_t dport[2]; // 目标端口范围 u_int16_t to[2]; // 映射端口范围 }; // 示例:将串口数据转发到TCP 9000端口 ser2net -C "9000:raw:0:/dev/ttyS1:115200" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值