串列埠驅動相關資料結構
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為自動檢測波...