struct console mxc_consol
register_console(&mxc_console);
mxc_reg 跟 mxc_console 各自包含對方:
struct uart_console mxc_reg = {
.con = (&mxc_sonsole);
};
struct console mxc_console = {
.data = &mxc_reg;
}
另外一個是 module_init 階段執行的 mxcuart_init
uart_register(&mxc_reg);
platform_driver_register(&mxcuart_driver);
mxcuart_driver 是 platform_driver 結構,name 是 mxcintuart (internal uart ?)platform_driver 的 mxcuart_resume(struct platform_device *pdev) 只是..
取出 platform_device 的 data : (uart_mxc_port)。參照裡面的 port.flag,決定要不要call uart_resume_port( ):
uart_mxc_port *umxc = platform_get_drvdata(pdev);
if (umxc && umxc->port.flags & ASYNC_SUSPENDED) {
umxc->port.state->port.tty->hw_stopped = 0;
uart_resume_port(&mxc_reg, &umxc->port);
}
這裡的 uart_resume_port 在 serial_core.c 裡。uart_resume_port 也是取出 argument :uart_driver 裡的tty_port 結構資料 : port。
依照 port-> flags 的內容決定要不要對 hardware 動作。
所以 mxcuart_resume --- uart_resume_port 裡面都有對 port 動作,但是兩個的 port 並不一樣。
mxcuart_resume 是:
platform_device --> (uart_mxc_port) --> port.flags
uart_resume_port 是:
uart_driver --> uart_state -->tty_port --> flags
好像不相關.mxcuart_resume 的參數: platform_device 是宣告在另一個 source : arch:
static struct platform_device mxc_uart_device1 = {
.name = "mxcintuart",
.id = 0,
.num_resources = ARRAY_SIZE(mxc_uart_resources1),
.resource = mxc_uart_resources1,
.dev = {
.platform_data = &mxc_ports[0],
},
};
mxc_port 是:
static uart_mxc_port mxc_ports[] = {
[0] = {
.port = {
.iotype = SERIAL_IO_MEM,
.fifosize = 32,
.flags = ASYNC_BOOT_AUTOCONF ,
.line = 0,
},
.ints_muxed = 1,
.mode = MODE_DCE,
.ir_mode = NO_IRDA,
.enabled = 1,
.cts_threshold = UART1_UCR4_CTSTL,
.dma_enabled = UART1_DMA_ENABLE,
.dma_rxbuf_size = UART1_DMA_RXBUFSIZE,
.rx_threshold = UART1_UFCR_RXTL,
.tx_threshold = UART1_UFCR_TXTL,
.dma_tx_id = MXC_DMA_UART1_TX,
.dma_rx_id = MXC_DMA_UART1_RX,
.rxd_mux = MXC_UART_RXDMUX,
},
看到那個 flags 欄位。這個欄位好像沒有改變。
uart_resume_port( ) 的參數是mxc_uart_resume 呼叫時傳進去的。
uart_resume_port(&mxc_reg, &umxc->port);
所以就是
沒有留言:
張貼留言