mxcuart_init 負責:
- uart_register_driver
- platform_driver_register
對應的 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 有:
- MXC_UARTUSR1, MXC_UARTUSR2
- UARTUCR3
- MXC_UARTUCR2
- MXC_UARTUFCR
- 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,,,,,
沒有留言:
張貼留言