1. 程式人生 > >RK3288除錯串列埠

RK3288除錯串列埠

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等呼叫:
這裡寫圖片描述
這樣disabled串列埠的device時,rk_fiq_debugger部分結束:
這裡寫圖片描述


而fiq debugger驅動仍然能夠執行,當printk輸出訊息時,呼叫到uart_putc(debug_putc)時就會出錯,因此不能只將fiq-debugger disabled。
RK提供的fiq debugger功能是將debugger功能和普通uart功能程式碼整合到了一起,程式碼中通過CONFIG_FIQ_DEBUGGER_CONSOLE巨集來配置fiq debugger除錯串列埠。
這裡寫圖片描述
fiq_debugger_tty_init()函式進行除錯串列埠的初始化。
CONFIG_FIQ_DEBUGGER巨集:

#ifdef  CONFIG_FIQ_DEBUGGER
#define CONFIG_FIQ_DEBUGGER_NO_SLEEP
#define CONFIG_FIQ_DEBUGGER_CONSOLE
#define CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE
#endif

[arch/arm/mach-rockchip/Makefile]
obj-$(CONFIG_FIQ_DEBUGGER) += rk_fiq_debugger.o

關閉除錯串列埠只需要取消CONFIG_FIQ_DEBUGGER巨集的配置。