root@rk3566-buildroot:/# udevadm info /dev/ttyS1
root@rk3566-buildroot:/# stty -F /dev/ttyS1
root@rk3566-buildroot:/# stty -F /dev/ttyS1
root@rk3566-buildroot:/# stty -F /dev/ttyS1 raw 115200 cs8 -parenb -cstopb
root@rk3566-buildroot:/# stty -F /dev/ttyS1
root@rk3566-buildroot:/# echo "hello" >> /dev/ttyS1
root@rk3566-buildroot:/# cat /dev/ttyS1
./uart_test /dev/ttyS1 115200 8 0 1
20250322在荣品的PRO-RK3566开发板的buildroot系统下使用内置命令测试UART1
2025/3/22 11:14
./uart_test /dev/ttyS1 115200 8 0 1
20250321在荣品的PRO-RK3566开发板的buildroot系统下使用UART1
2025/3/21 17:27
缘起:需要在荣品的PRO-RK3566开发板/产品的buildroot系统下使用UART1。
根据DTS文件,很容易知道UART被被用作AP6256的UART1接口了。直接全部屏蔽掉。
@余顺?我司RK3566的buildroot项目不需要WIFI/BT AP6256,请问如何彻底关闭?
BT用的UART1用作 通讯用。直接关闭AP6256以免潜在的隐患
可以 通过./build.sh kernle-config 查看对应的驱动是否是在内核加载的
要从根源上禁止掉,启动的加载系统的时候是否有insmod bcmdhd.ko,可以找这个etc下的脚本,或wlan 相关的脚本
代码修改的部分:
Z:\source\kernel\arch\arm64\boot\dts\rockchip\rk356x\pro-rk3566.dts
&i2c1 {
status = "okay";
};
&i2c4 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2c4m1_xfer>;
rtc@51 {
status = "okay";
compatible = "rtc,hym8563";
reg = <0x51>;
};
};
&usbdrd_dwc3 {
dr_mode = "host";
extcon = <&usb2phy0>;
status = "okay";
};
&uart1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart1m0_xfer>;
};
&uart3 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart3m0_xfer>;
};
&uart6 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart6m0_xfer>;
};
&uart7 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart7m0_xfer>;
};
&uart9 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart9m0_xfer>;
};
&spi1 {
status = "okay";
spi1_dev@0 {
compatible = "rockchip,spidev";
reg = <0>;
spi-max-frequency = <12000000>;
spi-lsb-first;
};
};
&sdmmc2 {
max-frequency = <150000000>;
supports-sdio;
bus-width = <4>;
disable-wp;
cap-sd-highspeed;
cap-sdio-irq;
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk>;
sd-uhs-sdr104;
status = "okay";
};
//&uart1 {
// status = "okay";
// pinctrl-names = "default";
// pinctrl-0 = <&uart1m1_xfer &uart1m1_ctsn>;
//};
//&wireless_bluetooth {
// uart_rts_gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_LOW>;
// pinctrl-names = "default", "rts_gpio";
// pinctrl-0 = <&uart1m1_rtsn>;
// pinctrl-1 = <&uart1_gpios>;
// BT,reset_gpio = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
// BT,wake_gpio = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
// BT,wake_host_irq = <&gpio4 RK_PB1 GPIO_ACTIVE_HIGH>;
// status = "okay";
//};
&wireless_wlan {
pinctrl-names = "default";
pinctrl-0 = <&wifi_host_wake_irq>;
WIFI,host_wake_irq = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>;
};
&rk_headset {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;
headset_gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>;
};
&pinctrl {
rp-pins {
rp_bat_pins: rp-bat-pins {
rockchip,pins =
<0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>,
<0 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
headphone {
hp_det: hp-det {
rockchip,pins = <3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_down>;
};
};
wireless-wlan {
wifi_host_wake_irq: wifi-host-wake-irq {
rockchip,pins = <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_down>;
};
};
//wireless-bluetooth {
// uart1_gpios: uart1-gpios {
// rockchip,pins = <4 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>;
// };
//};
};
&rk809_codec {
mic-in-differential;
};
确认GPIO口的状态:
pin 75 (gpio2-11): (MUX UNCLAIMED) gpio2:75
pin 76 (gpio2-12): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 126 (gpio3-30): fe650000.serial (GPIO UNCLAIMED) function uart1 group uart1m1-xfer
pin 127 (gpio3-31): fe650000.serial (GPIO UNCLAIMED) function uart1 group uart1m1-xfer
pin 75 (gpio2-11): fe650000.serial gpio2:75 function uart1 group uart1m0-xfer
pin 76 (gpio2-12): fe650000.serial (GPIO UNCLAIMED) function uart1 group uart1m0-xfer
pin 126 (gpio3-30): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 127 (gpio3-31): (MUX UNCLAIMED) (GPIO UNCLAIMED)
2.测试串口
2.1 节点配置好后,烧录运行,一般会在/dev/下面看到类似ttyS0,ttyS1等设备文件,它对应的就是uart0,查看串口信息:
udevadm info /dev/ttyS1
通过上面命令,可以看到如下串口信息,注意地址,它与uart在dtsi中定义的地址对应,比如下面ttyS0地址对应uart0的0xfdd50000
2.2 串口波特率
stty -F /dev/ttyS1 查看波特率
stty -F /dev/ttyS1 raw 115200 cs8 -parenb -cstopb 设置波特率为115200
stty命令
1. 串口配置
stty -F /dev/ttyS1 raw 115200 cs8 -parenb -cstopb
/dev/ttyS1 :串口文件描述符
115200 :波特率为115200
cs8 :数据位8位
-parenb :无校验位
-cstopb :1位停止位
raw:显示原始值,不进行转义。如果不加raw的话,从串口发送数据到设备,shell不能显示。
stty --help帮助文档:
N :set the input and output speeds to N bauds
设置波特率为N,例如9600 4800
csN: set character size to N bits, N in [5…8]
设置数据位为N,例如cs8 ,cs7
[-]cstopb:use two stop bits per character (one with ‘-’)
设置停止位:
cstopb:2位停止位
-cstopb:1位停止位
[-]parenb:generate parity bit in output and expect parity bit in input( 在输出中产生奇偶校验位,并要求在输入中也有奇偶校验位 )
parenb使终端进行奇偶校验,-parenb则是禁止校验
-parenb:无校验位
[-]parodd:set odd parity (or even parity with ‘-’)
parenb parodd:奇校验
parenb -parodd:偶校验
2.3 linux命令对串口读写
cat /dev/ttyS1 读取串口收到的信息
echo "hello" >> /dev/ttyS1 向串口发送信息
3. python脚本测试串口
3.1 要向自动测试串口,使用python是一个不错的选择,需要安装python3串口支持:
sudo apt install python3-serial
完整的LOG:
root@rk3566-buildroot:/#
root@rk3566-buildroot:/# udevadm info /dev/ttyS1
P: /devices/platform/fe650000.serial/tty/ttyS1
N: ttyS1
E: DEVNAME=/dev/ttyS1
E: DEVPATH=/devices/platform/fe650000.serial/tty/ttyS1
E: MAJOR=4
E: MINOR=65
E: SUBSYSTEM=tty
root@rk3566-buildroot:/#
root@rk3566-buildroot:/# stty -F /dev/ttyS1
[ 238.797615] of_dma_request_slave_channel: dma-names property of node '/serial@fe650000' missing or empty
speed 9600 baud; line = 0;
[ 238.797674] dw-apb-uart fe650000.serial: failed to request DMA, use interrupt mode
-brkint -imaxbel
root@rk3566-buildroot:/#
root@rk3566-buildroot:/# stty -F /dev/ttyS1
speed 9600 baud; line = 0;
-brkint -imaxbel
root@rk3566-buildroot:/#
root@rk3566-buildroot:/# stty -F /dev/ttyS1 raw 115200 cs8 -parenb -cstopb
root@rk3566-buildroot:/#
root@rk3566-buildroot:/# stty -F /dev/ttyS1
speed 115200 baud; line = 0;
min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost
-isig -icanon
root@rk3566-buildroot:/#
root@rk3566-buildroot:/# echo "hello" >> /dev/ttyS1
root@rk3566-buildroot:/#
root@rk3566-buildroot:/# cat /dev/ttyS1
5aA*E5aA*E^C
root@rk3566-buildroot:/#
hello
5aA*E
5aA*E
35 61 41 2A 45
5aA*E
参考资料:
https://blog.youkuaiyun.com/weixin_42098934/article/details/143893131
RK356x-10:串口(uart)配置与调试
https://zhuanlan.zhihu.com/p/644415360
瑞芯微Core 3566系列:使用UART
https://blog.youkuaiyun.com/luotuo28/article/details/125896180
Linux串口调试总结