嵌入式Linux之串列埠驅動結構

2021-08-15 17:09:03 字數 2750 閱讀 6152

串列埠驅動相關資料結構

struct uart_driver;		//串列埠驅動結構

struct uart_port; //埠結構,串列埠驅動只有乙個,埠卻有多個,乙個埠對應乙個實際的串列埠

struct uart_ops; //函式操作集

struct uart_state; //狀態結構

struct uart_info; //串列埠資訊結構

資料結構詳細介紹進此:

(一)初始化串列埠流程

~~~~~~~~

《samsung.c》檔案中對串列埠進行了初始化。

註冊:uart_register_driver初始化:

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對串列埠進行了開啟。

使能接收: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回應我現在有資料而且還沒處理完,你先等等。

判斷迴圈緩衝或者串列埠狀態是否可以傳送

利用迴圈緩衝寫入資料,一次中斷最多傳送256個字元(count=256)

3.1 判斷傳送fifo時候是空的

3.2 如果fifo為空,從迴圈緩衝中取出資料開始寫入,否則退出寫入

3.3 調整迴圈緩衝的位置

計算迴圈緩衝資料量,如果迴圈緩衝中的資料低於某個數量(這裡是256),通知應用程式可再次往串列埠寫入。(就是喚醒之前傳送時阻塞的程序)

判斷迴圈緩衝的資料,如果為空,關閉傳送中斷

(四)資料接收流程
串列埠接收資料中斷處理函式:s3c24xx_serial_rx_chars~

讀取暫存器

檢測fifo資料量,如果為0,退出讀取

讀取暫存器uerstat,從urxh,讀取接收到的字元

流控

根據uerstat暫存器記錄錯誤型別

如果收到sysrq字元,進行特殊處理

將接收到的字元送入串列埠驅動

把串列埠驅動收到的資料送入線路規程

嵌入式Linux驅動初探 虛擬串列埠裝置驅動編寫

所謂虛擬串列埠裝置意為這個串列埠是虛擬的,不能用來實現與下位機的串列埠收發。但是他可以將從使用者那兒收到的資料,原封不動的回傳給使用者。相當於乙個回環。這一功能的實現主要是在驅動中實現乙個fifo。驅動接收到使用者資料後,先將之放入fifo,當使用者需要資料 讀取資料 時,驅動從fifo中把資料讀出...

嵌入式linux之NOR FLASH驅動

flash 儲存器介面還有兩個標準 cfi和jedec。cfi為公共flash介面 common flash inte ce 用來幫助程式從flash晶元中獲取操作方式資訊,而不用在程式中硬編碼flash的id。jedec用來幫助程式讀取flash的製造商id和裝置id,以確定flash的大小和演算...

嵌入式Linux學習記錄之串列埠

6ull的uart urxd暫存器儲存這串列埠接收到的資料 uart utxd暫存器為傳送資料暫存器,如果需要通過串列埠傳送資料,只需要將資料寫入uart utxd暫存器 uart ucr1 4是串列埠的控制暫存器。uart ucr1的bit0是使能位,為1的時候使能uart。bit14為自動檢測波...