[RK3288][Android6.0] 系統除錯串列埠驅動流程小結
阿新 • • 發佈:2018-12-22
Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92
rk3288提供了fiq debugger功能, 因此rk將debug uart和普通uart區分開來,
debug uart的初始化整合到了fiq debugger程式碼中完成,不過uart的初始化
方法還是遵循linux的uart初始化標準,包括tty driver分配,註冊, ops的設定等.
fiq debugger這裡不做討論,可參考
http://www.linaro.org/blog/core-dump/debugging-arm-kernels-using-nmifiq/
程式碼中和uart debugger相關的用巨集CONFIG_FIQ_DEBUGGER_CONSOLE包起來了,
只看這部分即可.
初始化部分:
fiq_debugger_init -> fiq_debugger.c
fiq_debugger_tty_init ->
alloc_tty_driver //分配一個tty driver,後面並填充
tty_set_operations //設定tty對應的struct tty_operations, 為fiq_tty_driver_ops,最終會操作到rk_fiq_debugger.c中的介面函式.
tty_register_driver //註冊tty driver到serial core中,讓系統知道此tty driver的存在.
platform_driver_register(&fiq_debugger_driver) -> //對應的platform device在rk_fiq_debugger.c而不是dts中.
fiq_debugger_probe ->
request_irq //irq處理函式fiq_debugger_uart_irq()
register_console //註冊後當前console,printk()輸出log的時候就會呼叫它最終輸出到除錯串列埠. 註冊對應的console是fiq_debugger_console
//static struct console fiq_debugger_console = {
//.name = "ttyFIQ", //最後的字元裝置就是/dev/ttyFIQx
//.write = fiq_debugger_console_write, //printk()最終會呼叫它.
//};
fiq_debugger_tty_init_one -> //初始化並註冊uart port, 上一篇分析串列埠驅動有說過,,每個串列埠用port表示
tty_port_init
tty_port_register_device
可以看到和標準的串列埠驅動註冊類似.
printk()輸出log:
printk ->
vprintk_emit ->
console_unlock
console_cont_flush -> printk.c
call_console_drivers ->
con->write -> //呼叫對用cosole的write()函式
fiq_debugger_console_write fiq_debugger.c
state->pdata->console_write //如果有就呼叫console thread去輸出.
fiq_debugger_putc ->
state->pdata->uart_putc -> 此函式在rk_fiq_debugger.c的rk_serial_debug_init()中註冊
debug_putc -> rk_fiq_debugger.c
rk_fiq_write
使用者空間write:
SyS_write ->
vfs_write ->
tty_write ->
n_tty_write ->
process_output_block ->
tty->ops->write -> //前面有註冊了tty driver對應的ops為fiq_tty_driver_ops
fiq_tty_write ->
fiq_debugger_putc ->
state->pdata->uart_putc -> 此函式在rk_fiq_debugger.c的rk_serial_debug_init()中註冊
debug_putc -> rk_fiq_debugger.c
rk_fiq_write
兩種方式最終呼叫輸出介面一樣.
OS: Android 6.0
Kernel: 3.10.92
rk3288提供了fiq debugger功能, 因此rk將debug uart和普通uart區分開來,
debug uart的初始化整合到了fiq debugger程式碼中完成,不過uart的初始化
方法還是遵循linux的uart初始化標準,包括tty driver分配,註冊, ops的設定等.
fiq debugger這裡不做討論,可參考
http://www.linaro.org/blog/core-dump/debugging-arm-kernels-using-nmifiq/
程式碼中和uart debugger相關的用巨集CONFIG_FIQ_DEBUGGER_CONSOLE包起來了,
只看這部分即可.
初始化部分:
fiq_debugger_init -> fiq_debugger.c
fiq_debugger_tty_init ->
alloc_tty_driver //分配一個tty driver,後面並填充
tty_set_operations //設定tty對應的struct tty_operations, 為fiq_tty_driver_ops,最終會操作到rk_fiq_debugger.c中的介面函式.
tty_register_driver //註冊tty driver到serial core中,讓系統知道此tty driver的存在.
platform_driver_register(&fiq_debugger_driver) -> //對應的platform device在rk_fiq_debugger.c而不是dts中.
fiq_debugger_probe ->
request_irq //irq處理函式fiq_debugger_uart_irq()
register_console //註冊後當前console,printk()輸出log的時候就會呼叫它最終輸出到除錯串列埠. 註冊對應的console是fiq_debugger_console
//static struct console fiq_debugger_console = {
//.name = "ttyFIQ", //最後的字元裝置就是/dev/ttyFIQx
//.write = fiq_debugger_console_write, //printk()最終會呼叫它.
//};
fiq_debugger_tty_init_one -> //初始化並註冊uart port, 上一篇分析串列埠驅動有說過,,每個串列埠用port表示
tty_port_init
tty_port_register_device
可以看到和標準的串列埠驅動註冊類似.
printk()輸出log:
printk ->
vprintk_emit ->
console_unlock
console_cont_flush -> printk.c
call_console_drivers ->
con->write -> //呼叫對用cosole的write()函式
fiq_debugger_console_write fiq_debugger.c
state->pdata->console_write //如果有就呼叫console thread去輸出.
fiq_debugger_putc ->
state->pdata->uart_putc -> 此函式在rk_fiq_debugger.c的rk_serial_debug_init()中註冊
debug_putc -> rk_fiq_debugger.c
rk_fiq_write
使用者空間write:
SyS_write ->
vfs_write ->
tty_write ->
n_tty_write ->
process_output_block ->
tty->ops->write -> //前面有註冊了tty driver對應的ops為fiq_tty_driver_ops
fiq_tty_write ->
fiq_debugger_putc ->
state->pdata->uart_putc -> 此函式在rk_fiq_debugger.c的rk_serial_debug_init()中註冊
debug_putc -> rk_fiq_debugger.c
rk_fiq_write
兩種方式最終呼叫輸出介面一樣.