序列槽驅動相關資料結構
struct uart_driver; //序列槽驅動結構
struct uart_port; //端口結構,序列槽驅動隻有一個,端口卻有多個,一個端口對應一個實際的序列槽
struct uart_ops; //函數操作集
struct uart_state; //狀态結構
struct uart_info; //序列槽資訊結構
資料結構詳細介紹進此:http://www.cnblogs.com/hello2mhb/p/3341291.html
(一)初始化序列槽流程
~~~~~~~~ 《samsung.c》檔案中對序列槽進行了初始化。
- 注冊:
uart_register_driver
初始化:
2.1 取出uart_port
2.2 初始化uart_port:擷取硬體位址->擷取中斷編号->複位序列槽FIFO
2.3 添加端口(序列槽):
2.4 建立屬性檔案:
uart_add_one_port
device_create_file
,在/sys目錄下建立相應的屬性檔案
2.5 初始化動态頻率調節:
s3c24xx_serial_cpufreq_register
(二)打開裝置流程
~~~~~~~~ 《samsung.c》檔案中:對序列槽進行了打開。
s3c24xx_serial_startup
- 使能接收:
rx_enabled
- 注冊接收中斷:
request_irq
- 使能發送:
tx_enabled
- 注冊發送中斷:
request_irq
(三)資料發送流程
~~~~~~~~ 讀寫資料會用到循環緩沖,在uart_write函數中将使用者的資料寫入到循環緩沖中,在
s3c24xx_serial_tx_chars
,函數中将循環緩沖中的資料寫入到寄存器。
《tty_io.c》檔案中如下定義:
static ssize_t tty_write(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
函數調用流程:
tty_write ——> do_tty_write ——> copy_from_user /*通過此調用流程完成寫資料操作*/
序列槽發送資料中斷處理函數: s3c24xx_serial_tx_chars
- 先發送一個标志,相當于序列槽和PC的通知,例如序列槽詢問PC是否可以開始發送,PC回應我現在有資料而且還沒處理完,你先等等。
![]()
嵌入式Linux之序列槽驅動結構 - 判斷循環緩沖或者序列槽狀态是否可以發送
![]()
嵌入式Linux之序列槽驅動結構 - 利用循環緩沖寫入資料,一次中斷最多發送256個字元(count=256)
![]()
嵌入式Linux之序列槽驅動結構 3.1 判斷發送FIFO時候是空的
3.2 如果FIFO為空,從循環緩沖中取出資料開始寫入,否則退出寫入
3.3 調整循環緩沖的位置
- 計算循環緩沖資料量,如果循環緩沖中的資料低于某個數量(這裡是256),通知應用程式可再次往序列槽寫入。(就是喚醒之前發送時阻塞的程序)
![]()
嵌入式Linux之序列槽驅動結構 - 判斷循環緩沖的資料,如果為空,關閉發送中斷
![]()
嵌入式Linux之序列槽驅動結構
(四)資料接收流程
序列槽接收資料中斷處理函數:~
s3c24xx_serial_rx_chars
- 讀取寄存器
![]()
嵌入式Linux之序列槽驅動結構 - 檢測FIFO資料量,如果為0,退出讀取
![]()
嵌入式Linux之序列槽驅動結構 - 讀取寄存器UERSTAT,從URXH,讀取接收到的字元
![]()
嵌入式Linux之序列槽驅動結構 - 流控
![]()
嵌入式Linux之序列槽驅動結構 - 根據UERSTAT寄存器記錄錯誤類型
- 如果收到sysrq字元,進行特殊處理
- 将接收到的字元送入序列槽驅動
- 把序列槽驅動收到的資料送入線路規程