RK3288芯片总共有5路串口,默认情况下:
UART_BB(串口1)、UART_BT(串口0)、UART_GPS(串口3)、UART_EXP(串口4)、UART_DBG(串口2)。默认使用串口2为调试串口,即UART_DBG,UART_DBG不支持自动流控制(auto flow-control,AFC),支持高达115200波特率的红外数据通信标准(SIR 1.0)。
有时需要的串口不够用,需要关闭串口调试,切换调试串口为普通串口:
调试串口就是将普通串口切换成了console来处理,rockchip调试串口的数据处理代码在arch/arm/mach-rockchip/rk_fiq_debugger.c中,其中dts默认参数如下:
fiq-debugger {
compatible = "rockchip,fiq-debugger";
rockchip,serial-id = <2>;
rockchip,signal-irq = <106>;
rockchip,wake-irq = <0>;
status = "disabled";
};
rockchip,serial-id = <2>,指定调试串口的串口为串口2.
取消调试串口就是不加载编译这个代码,这样uart2就是默认的普通串口来使用。
因此,sed -i “s/CONFIG_FIQ_DEBUGGER=y/# CONFIG_FIQ_DEBUGGER is not set/g” .config即可
make menuconfig如下:
Device Drivers —>
[*] Staging drivers —>
Android —>
[ ] FIQ Mode Serial Debugger //不选中即可
[arch/arm/mach-rockchip/rk_fiq_debugger.c]
Rk_fiq_debugger.c代码是device代码,而在dts中的compatible = “rockchip,fiq-debugger”代表的就是设备是okay还是disabled,这也就解释了为何当时在测试时fiq-debugger置为disabled时recovery部分就会挂掉,因为在printk输出打印消息时,调试串口的console初始化是成功的,但是却没有对应的writr,read等函数去操作,如下函数最终会被printk,read,write等调用:
![](//file.elecfans.com/web2/M00/68/93/pYYBAGMbDd6AFnbtAAC0H2sYSO0353.jpg)
这样disabled串口的device时,rk_fiq_debugger部分结束:
![](//file.elecfans.com/web2/M00/67/FA/poYBAGMbDd-AeGWDAABYaj0wsEw036.jpg)
而fiq debugger驱动仍然能够执行,当printk输出消息时,调用到uart_putc(debug_putc)时就会出错,因此不能只将fiq-debugger disabled。
RK提供的fiq debugger功能是将debugger功能和普通uart功能代码集成到了一起,代码中通过CONFIG_FIQ_DEBUGGER_CONSOLE宏来配置fiq debugger调试串口。
![](//file.elecfans.com/web2/M00/67/FA/poYBAGMbDd-AXDR5AACWsrgWGWw015.jpg)
fiq_debugger_tty_init()函数进行调试串口的初始化。
CONFIG_FIQ_DEBUGGER宏:
![](//file.elecfans.com/web2/M00/68/93/pYYBAGMbDd-AbRTRAABUTkSFoQA848.jpg)
[arch/arm/mach-rockchip/Makefile]
obj-$(CONFIG_FIQ_DEBUGGER) += rk_fiq_debugger.o
关闭调试串口只需要取消CONFIG_FIQ_DEBUGGER宏的配置。
原作者:HelloBirthday