英文文檔位址:myandroid/kernel_imx/Documentation/serialg/driver。譯文如下:
底層序列槽API
本檔案介紹新序列槽驅動某些方面的簡要概述。介紹并不全,有任何問題可以通路<[email protected]>。
參考實作包含在amba_pl011.c内。
底層序列槽硬體驅動
--------------------------------
底層序列槽硬體驅動向核心序列槽驅動程式提供端口資訊(定義在uart_port)和一系列控制方法(定義在uart_ops)。底層驅動也可以進行中斷的端口,并提供任何控制台支援。
控制台支援
--------------------------------
序列槽核心提供一些幫助函數,包括确定的正确端口結構(通過uart_get_console)和解碼指令行參數(uart_parse_options)。
還有一個幫助函數(uart_write_console),執行每個字元寫功能,換行符譯成CRLF序列。驅動程式開發者建議使用此函數,而不是實作它們自己的版本。
鎖
--------------------------------
底層硬體驅動程式使用port->lock來執行所需的鎖定功能。有些情況例外(在下面列出的uart_ops中描述)。
有3個鎖,每個端口自旋鎖、每個端口tmpbuf信号和整體信号。
從核心驅動程式,port->lock鎖定以下資料:
port->mctrl
port->icount
info->xmit.head(circ->head)
info->xmit.tail(circ->tail)
底層驅動程式可以随時使用該鎖來提供任意額外的鎖定。
核心驅動程式使用info->tmpbuf_sem鎖,以防止多線程通路端口寫入的使用info->tmpbuf回彈緩沖區。
port_sem信号用來防止在不恰當的時間添加/删除或重新配置端口。
uart_ops
--------------------------------
uart_ops結構是serial_core和硬體特定驅動程式之間重要接口。包含控制硬體的所有方法。
tx_empty(port)
此函數檢查發送fifo和移位通過“端口”中描述的端口是否為空。如果為空,函數應傳回TIOCSER_TEMT,否則傳回0。如果端口不支援此操作,傳回TIOCSER_TEMT。
鎖:none
中斷:取決于調用者;
此調用不休眠。
set_mctrl(port, mctrl)
此函數設定序列槽modem控制模式。mctrl相關的位是:
- TIOCM_RTS RTS signal.
- TIOCM_DTR DTR signal.
- TIOCM_OUT1 OUT1 signal.
- TIOCM_OUT2 OUT2 signal.
- TIOCM_LOOP 設定端口為回環模式
如果相應的位被置位,該信号應被驅動為有效;如果該位清空,該信号應被驅動為無效。
鎖定:采用port->lock
中斷:本地禁用
此調用不休眠。
get_mctrl(port)
傳回modem控制輸入的目前狀态。不應傳回輸出狀态,因為核心驅動追蹤它們的狀态。狀态資訊應包含:
-TIOCM_DCD state of DCD signal
-TIOCM_CTS state of CTS signal
-TIOCM_DSR state of DSR signal
-TIOCM_RI state of RI signal
如果信号目前是有效地,位被設定。如果端口不支援CTS、DCD 或DSR,驅動程式應指明該信号是持續有效的。如果RI不可用,該信号不應表示為有效。
鎖定:采用port->lock
中斷:本地禁用
此調用必須不休眠。
stop_tx(port)
停止發送字元。這可能由于CTS線路變為非活動狀态,或tty層表明由于XOFF字元我們要停止傳輸。
驅動程式應盡快停止傳輸字元。
鎖定:采用port->lock
中斷:本地禁用
此調用不休眠。
start_tx(port)
開始傳輸字元。
鎖定:采用port->lock
中斷:本地禁用
此調用不休眠。
stop_rx(port)
停止接收字元。端口處于即将關閉程序中。
鎖定:采用port->lock
中斷:本地禁用
此調用不休眠。
enable_ms(port)
使能modem狀态中斷。
此方法可被多次調用,當調用shutdown方法時,modem狀态中斷禁用。
鎖定:采用port->lock
中斷:本地禁用
此調用不休眠。
break_ctl(port,ctl)
控制中斷信号的傳輸。如果ctl非零,中斷信号應被傳輸。當另一個調用作為零ctl時,此信号應終止。
鎖定:none
中斷:取決于調用者
此調用不休眠。
startup(port)
抓取任意中斷資源,并初始化任一底層驅動狀态。使能接收端口。不應該啟用RTS和DTR;可通過一個單獨的調用set_mctrl來完成。
此方法隻有在端口最初打開時被調用。
鎖定:采用port_sem
中斷:全球禁用。
shutdown(port)
禁用端口,禁用任何可能有效地中斷條件,以及釋放任何中斷資源。不應該禁用RTS和DTR;可通過一個單獨的調用set_mctrl來完成。
一旦調用完成,驅動程式不能通路port->info。
此方法隻有當沒有更多的使用者端口時才被調用。
鎖定:采用port_sem
中斷:取決于調用者
flush_buffer(port)
重新整理任何寫緩沖區,重置所有的DMA狀态,并停止正在進行的DMA傳輸。
每當port->info->xmit循環緩沖區清零時都被調用。
鎖定:采用port->lock
中斷:本地禁用
此調用不能休眠。
set_termios(port,termios,oldtermios)
改變端口參數,包括:字長、奇偶校驗、停止位。更新read_status_mask而忽略狀态掩碼,表示我們有興趣接收的事件類型。相應的termios->c_cflag位是:
CSIZE - word size
CSTOPB - 2 stop bits
PARENB - parity enable
PARODD- oddparity (when PARENB is in force)
CREAD - enable reception of characters (if not set,
still receive characters from the port, but
throwthem away.
CRTSCTS - if set, enable CTS status changereporting
CLOCAL - if not set, enable modem status change
reporting.
相應的termios->c_iflag位是:
INPCK - enable frame and parity error events to be
passed to the TTY layer.
BRKINT
PARMRK - both of these enable break events to be
passedto the TTY layer.
IGNPAR - ignore parity and framing errors
IGNBRK - ignore break errors, If IGNPAR is also
set,ignore overrun errors as well.
iflag位的互相作用如下(奇偶校驗錯誤為例):
Parity error INPCK IGNPAR
n/a 0 n/a character received, marked as
TTY_NORMAL
None 1 n/a character received, marked as
TTY_NORMAL
Yes 1 0 character received,marked as
TTY_PARITY
Yes 1 1 character discarded
如果你的硬體支援硬體“軟”流量控制,其他标志可以使用(例如,XON / XOFF字元)。
鎖定:none
中斷:取決于調用者
此調用不能休眠。
pm(port,state,oldstate)
在指定的端口上執行任何電源管理有關的活動。狀态表示新狀态(定義為ACPI D0-D3),舊狀态表示以前狀态。從本質上講,D0表示完全供電,D3指斷電。
此函數不應用于抓取任何資源。
當端口最初打開,最終關閉,除非該端口也是系統控制台時,這才被調用。即使CONFIG_PM沒被設定,也會發生。
鎖定:none
中斷:取決于調用者。
type(port)
傳回一個指向字元串常量、描述指定端口的指針,或傳回NULL,在這種情況下,字元串“unknow”被替換。
鎖定:none
中斷:取決于調用者。
release_port(port)
釋放目前在該端口使用的任何記憶體和IO區域資源。
鎖定:none
中斷:取決于調用者。
request_port(port)
請求端口所需任意記憶體和IO區域資源。如果有任何失敗,當該函數傳回時,沒有注冊資源,它應該傳回-EBUSY失敗。
鎖定:none
中斷:取決于調用者。
config_port(port,type)
執行所需端口的自動配置步驟。`type`包括所需配置的位掩碼。UART_CONFIG_TYPE表示端口需要探測和識别。如果未檢測到端口的類型,port->type應設定為已建立的類型或PORT_UNKNOWN。
UART_CONFIG_IRQ表示應采用标準核心自動探測技術探測的中斷信号的自動配置。端口有中斷的内部硬連接配接平台是内有必要的(例如,片上系統的實作)。
鎖定:none
中斷:取決于調用者。
verify_port(port,serinfo)
驗證包含在serinfo新的序列槽資訊适于此端口類型。
鎖定:none
中斷:取決于調用者。
ioctl(port,cmd,arg)
執行任何特定端口的IOCTLs。Ioctl指令使用标準編号系統定義,參見<asm/ioctl.h>。
鎖定:none
中斷:取決于調用者。
其他函數
---------------
uart_update_timeout(port,cflag,baud)
更新的FIFO消耗逾時,port->timeout,根據位數、奇偶校驗位數、停止位和波特率。
鎖定:調用者預計需要port->lock
中斷:n/a。
uart_get_baud_rate(port,termios,old,min,max)
傳回指定termios的波特率數值,考慮到特定38400波特率,B0波特率被映射為9600波特率。
如果波特率不在min..max,舊的波特率不為null,那麼原來的波特率将受到影響。如果超出min..max限制,9600波特将被退回。Termios更新到正在使用的波特率。
注意:min..max必須始終允許9600波特被選中。
鎖定:取決于調用者
中斷:n/a。
uart_get_divisor(port,baud)
傳回除數(baud_base/波特)為指定的波特率,适當地舍入。
如果38400和自定義的除數被選中,傳回自定義的除數來代替。
鎖定:取決于調用者
中斷:n/a。
uart_match_port(port1,port2)
該實用程式可用于确定兩個uart_port結構是否擁有相同的端口。
鎖定:n/a
中斷:n/a。
uart_write_wakeup(port)
當發送緩沖區中的字元數已降低到低于閥值時,驅動程式将調用此函數。
鎖定:使用port->lock。
中斷:n/a。
uart_register_driver(drv)
向核心驅動程式注冊序列槽驅動。我們依次注冊tty層,初始化核心驅動程式每個端口的狀态。
drv->port應該是NULL,調用成功後,使用uart_add_one_port函數注冊每個端口結構。
鎖定:none
中斷:禁用。
uart_unregister_driver()
從核心驅動中删除驅動所有的聲明。如果注冊時使用uart_add_one_port()函數,底層驅動程式必須使用uart_remove_one_port()函數删除所有的端口。
鎖定:none
中斷:禁用。
uart_suspend_port()
uart_resume_port()
uart_add_one_port()
uart_remove_one_port()
其他注意事項
----------------------
它的目的是有一天從uart_port删除“未使用”的條目,底層驅動程式向核心驅動注冊自己的單獨uart_port。這将允許驅動程式把uart_port作為一個指向包含uart_port條目與自己的擴充結構指針來使用:
structmy_port {
structuart_port port;
int my_stuff;
};