【RK3568 linux-6.6内核ttyS9只能收不能发送问题】

📅 2026/8/7 8:01:13
【RK3568 linux-6.6内核ttyS9只能收不能发送问题】
矿鸿1.3版本rk3568使用linux-6.6内核驱动1.问题描述板卡启动成功ttyS7正常收发ttyS9只能收不能发送。2.问题分析2.1对比设备树uart7和uart9配置一致//rs232-7uart7{statusokay;pinctrl-namesdefault;pinctrl-0uart7m1_xfer;};//rs232-9uart9{statusokay;pinctrl-namesdefault;pinctrl-0uart9m1_xfer;};2.2 查看原理图确定引脚复用GPIO4_C5和GPIO4_C6uart9m1_xfer:uart9m1-xfer{rockchip,pins/* uart9_rxm1 */4RK_PC64pcfg_pull_up,/* uart9_txm1 */4RK_PC54pcfg_pull_up;};确认引脚复用正常2.3 查看TRM手册手册地址https://opensource.rock-chips.com/images/2/26/Rockchip_RK3568_TRM_Part1_V1.3-20220930P.PDF看到UART9基地址为0xFE6D0000UART9复用寄存器偏移地址为GRF_GPIO4C_IOMUX_H Address: Operational Base offset (0x0074)3.调试3.1用 loopback 测试排除硬件短接板端 RS232-9 的 TX 和 RX或直接在 SOC 引脚 GPIO4_C5 和 GPIO4_C6 短接microcom-s9600/dev/ttyS9#输入字符看是否能回显能回显 → 芯片级 TX/RX 都正常问题在 RS232 收发器、连接器或线缆不能回显 → 继续查内核/引脚3.2 读寄存器值devmem0xfe6d0074000000003.3 写寄存器值根据手册bit6:4和bit10:8写4devmem0xfdc6007440x07700440发现回显正常根因确认pinctrl 驱动为 GPIO4 计算了错误的 GRF iomux 寄存器偏移量4.源码修改---./drivers/pinctrl/pinctrl-rockchip-oh.c2026-08-0514:18:22.9916877340800./drivers/pinctrl/pinctrl-rockchip-ohcopy.c2026-08-0512:00:51.7105179530800-1247,61247,15if(bank-recalced_maskBIT(pin))rockchip_get_recalced_mux(bank,pin,reg,bit,mask);/* OH variant: GPIO4_PC4 iomux bit position is 16, not standard 0 */if(bank-bank_num4pin20)bit16;//addif(bank-bank_num4(pin21||pin22))dev_info(dev,OH UART9: GPIO4 pin %d mux %d - reg0x%x bit%d\n,pin,mux,reg,bit);/* rk3562 force jtag m1 */if(ctrl-typeRK3562){-1344,61353,18 data|(muxmask)bit;retregmap_update_bits(regmap,reg,rmask,data);}//addif(bank-bank_num4(pin20||pin21||pin22))dev_info(dev,OH UART9 WR: pin %d mux %d reg0x%x data0x%x rmask0x%x ret%d\n,pin,mux,reg,data,rmask,ret);/* OH variant: force correct value for GPIO4 iomux register 0x74 (UART9) */if(bank-bank_num4reg0x74pin21){u32 verify;regmap_write(regmap,0x74,0x07700440);regmap_read(regmap,0x74,verify);dev_info(dev,OH UART9 FORCE: wrote 0x07700440 to 0x74, readback0x%x\n,verify);}returnret;}-5001,105022,22 IOMUX_WIDTH_4BIT,IOMUX_WIDTH_4BIT,IOMUX_WIDTH_4BIT),-PIN_BANK_IOMUX_FLAGS(4,32,gpio4,IOMUX_WIDTH_4BIT,/* OH variant: GPIO4 iomux registers start at GRF0x60 instead of 0x80 */PIN_BANK_IOMUX_FLAGS_OFFSET(4,32,gpio4,IOMUX_WIDTH_4BIT,IOMUX_WIDTH_4BIT,IOMUX_WIDTH_4BIT,-IOMUX_WIDTH_4BIT),IOMUX_WIDTH_4BIT,0x60,-1,-1,-1),};/* OH variant: GPIO4_PC4 iomux bit position differs from standard RK3568 */staticstructrockchip_mux_recalced_datark3568_oh_mux_recalced_data[]{{.num4,.pin20,/* GPIO4_PC4 */.reg0x74,.bit16,.mask0xf,},};staticstructrockchip_pin_ctrlrk3568_pin_ctrl __maybe_unused{-5016,65049,8.pmu_mux_offset0x0,.grf_drv_offset0x0200,.pmu_drv_offset0x0070,.iomux_recalcedrk3568_oh_mux_recalced_data,.niomux_recalcedARRAY_SIZE(rk3568_oh_mux_recalced_data),.iomux_routesrk3568_mux_route_data,.niomux_routesARRAY_SIZE(rk3568_mux_route_data),.pull_calc_regrk3568_calc_pull_reg_and_bit,5.验证microcom-s9600/dev/ttyS9 helloworld可以回显