天天看點

嵌入式Linux之序列槽驅動結構

序列槽驅動相關資料結構

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》檔案中對序列槽進行了初始化。
  1. 注冊:

    uart_register_driver

  2. 初始化:

    2.1 取出uart_port

    2.2 初始化uart_port:擷取硬體位址->擷取中斷編号->複位序列槽FIFO

    2.3 添加端口(序列槽):

    uart_add_one_port

    2.4 建立屬性檔案:

    device_create_file

    ,在/sys目錄下建立相應的屬性檔案

    2.5 初始化動态頻率調節:

    s3c24xx_serial_cpufreq_register

(二)打開裝置流程

         ~~~~~~~~         《samsung.c》檔案中:

s3c24xx_serial_startup

對序列槽進行了打開。
  1. 使能接收:

    rx_enabled

  2. 注冊接收中斷:

    request_irq

  3. 使能發送:

    tx_enabled

  4. 注冊發送中斷:

    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

  1. 先發送一個标志,相當于序列槽和PC的通知,例如序列槽詢問PC是否可以開始發送,PC回應我現在有資料而且還沒處理完,你先等等。
    嵌入式Linux之序列槽驅動結構
  2. 判斷循環緩沖或者序列槽狀态是否可以發送
    嵌入式Linux之序列槽驅動結構
  3. 利用循環緩沖寫入資料,一次中斷最多發送256個字元(count=256)
    嵌入式Linux之序列槽驅動結構

    3.1 判斷發送FIFO時候是空的

    3.2 如果FIFO為空,從循環緩沖中取出資料開始寫入,否則退出寫入

    3.3 調整循環緩沖的位置

  4. 計算循環緩沖資料量,如果循環緩沖中的資料低于某個數量(這裡是256),通知應用程式可再次往序列槽寫入。(就是喚醒之前發送時阻塞的程序)
    嵌入式Linux之序列槽驅動結構
  5. 判斷循環緩沖的資料,如果為空,關閉發送中斷
    嵌入式Linux之序列槽驅動結構

(四)資料接收流程

序列槽接收資料中斷處理函數:

s3c24xx_serial_rx_chars

  ~  
  1. 讀取寄存器
    嵌入式Linux之序列槽驅動結構
  2. 檢測FIFO資料量,如果為0,退出讀取
    嵌入式Linux之序列槽驅動結構
  3. 讀取寄存器UERSTAT,從URXH,讀取接收到的字元
    嵌入式Linux之序列槽驅動結構
  4. 流控
    嵌入式Linux之序列槽驅動結構
  5. 根據UERSTAT寄存器記錄錯誤類型
  6. 如果收到sysrq字元,進行特殊處理
  7. 将接收到的字元送入序列槽驅動
  8. 把序列槽驅動收到的資料送入線路規程

繼續閱讀