ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2011年10月5日 星期三

mxc_uart.c 的 mxcuart_init( ) 被放在 module_init(mxcuart_init),所以在 kernel 啟動時,會自動被呼叫。

mxcuart_init 負責:
  1. uart_register_driver
  2. platform_driver_register
mxc_uart 的 platform driver name 是 mxcintuart。
對應的 platform device 在 arch/arm serial.c 李,一共宣告了 5 個 (因為有 5 個 serial port, -- 51 只有 3 個)
platform_device 的資料: platform_data 是 uart_mxc_port 其中包含有 .port 這個 property。
裡面有 flags 這個 field。

這個flag 是給 driver 用的(?),因為 serial_core.c 的 suspend/resume function 會依照 consoel_suspend_enabled 來動作,並且 update port->flag 的 ASYNC_SUSPEND 這個 flag。



看來是 uart_open 沒有被 call 到,所以 resume 狀態和 suspend 狀態不一致。

看一下 uart_open 對那些 hardware register 有動作: uart_change_pm(state,0); uart_startup(state,0); uart_update_termios(state)
mxcuart_startup ( ) 變更的 register 有:
  1. MXC_UARTUSR1, MXC_UARTUSR2
  2. UARTUCR3
  3. MXC_UARTUCR2
  4. MXC_UARTUFCR
  5. MXC_UARTUCR1



還是認真看一下..

整個就只有mxc_uart_early, mxc_uart, serial_core 三個。
要是要用 uart 當作 console ,就要加上 mxc_uart_early,否則不僅 kernel msg show 不出來,shell 也沒有動作。

mxc_uart_early 的 init 被藏在很不清楚的地方 (why not follow DEBUG_LL & EARLY_CONSOL ?)
在MACHINE_START( ) 的 timer .init : mx51_babbage_timer_init ( ) 中。
clock_init 完後,就 call early_console_setup(UART1_BASE_ADDR, uart_clk);

實際上就是call mxc_early_serial_console_init(base, clk);

early_console_setup( ) 傳進去的 UART1_BASE_ADDR, uart_clk 會填在 static 變數 mxc_early_device 的 port.mapbase 和 clk 裡。
雖然 mxc_early_device 的 structure mxc_early_uart_device 宣告了內含一個很大的 structure : uart_port,實際上只有用到裡面的 membase 這個 field 而已.........

比較有用的變數是 static struct console mxc_early_uart_console __initdata = { .name = "ttymxc", .write = early_mxcuart_console_write, .setup = mxc_early_uart_setup, .flags = CON_PRINTBUFFER | CON_BOOT, .index = -1, }; 這被用來 register_console(&mxc_early_uart_console);

*** -- 這個 early_driver 只有實做 write,沒有 read 喔...
*** 沒有看到設 baudrate..

register_console 在 kernel/printk.c

可以看到 呼叫 early_setup( ),還有把 cmdline option 傳進setup( ).. 執行的 code。

還可以看到當真正的 console register 時,bootconsole 會自動 unregister..

printk 用來紀錄所有register 的 console 是 struct console { char name[16]; void (*write)(struct console *, const char *, unsigned); int (*read)(struct console *, char *, unsigned); struct tty_driver *(*device)(struct console *, int *); void (*unblank)(void); int (*setup)(struct console *, char *); int (*early_setup)(void); short flags; short index; int cflag; void *data; struct console *next; }; 其中 next 是用來做出 linking list


整個 printk.c 包含register_console ,還有 prtintk,就是把message 從所有 console 的 write( ) 送出去。

printk.c : 中的 release_console_sem( ) 就會把 buffer 內容從所有 registered console 送出去..



---- 所以整個只有 write,,,,,

沒有留言:

標籤

網誌存檔