天天看點

linux中serial driver了解

英文文檔位址: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;

       };

繼續閱讀