program for block device driver of devfs type
對linux的devfs型別的驅動程式的編寫可以從以下幾大內容理解和入手:
通過分析驅動程式源**可以發現驅動程式一般可分三部分:
核心資料結構;核心資料和資源的初始化,註冊以及註消,釋放;底層裝置操作函式;
還有dma和irq的初始化檢查和 登記,
int request_irq(unsigned int irq ,void(*handle)(int,void *,struct pt_regs *),unsigned int long flags,
const char *device);
irq: 是要申請的中斷。
handle:中斷處理函式指標。
flags:sa_interrupt 請求乙個快速中斷,0 正常中斷。
device:裝置名。
如果登記成功,返回0,這時在/proc/interrupts檔案中可以看你請求的中斷。
dma主要是在記憶體中分配交換記憶體空間.還有緩衝區,裝置請求佇列的初始化.
還有裝置控制暫存器的檢查和初始化,還有對裝置自身相關的資料結構的初始化,填寫一些裝置特定的資料等.
然後,開始註冊
devfs_register()向vfs註冊統一的裝置操作函式.
static struct file_operations ***_fops = ;
blk_init_queue()佇列初始化函式.
request_irq()中斷註冊函式
相應的註消函式:
devfs_unregister (devfs_handle_t de){};
free_irq()釋放中斷,i/o資源,釋放緩衝區,釋放裝置,請求佇列,vfs節點等.
模組方式驅動程式的載入和解除安裝.
static int __init _init_module (void)
static void __exit _cleanup_module (void)
c. 底層裝置操作函式的編寫
read().write(),open(),release(),check_media_change(),revalidate()等.
open()和release()
開啟裝置是通過呼叫file_operations結構中的函式open( )來完成的,它是驅動程式用來為今後的操作完成初始化準備工作的。在大部分驅動程式中,open( )通常需要完成下列工作:
1. 檢查裝置相關錯誤,如裝置尚未準備好等。
2. 如果是第一次開啟,則初始化硬體裝置。
3. 識別次裝置號,如果有必要則更新讀寫操作的當前位置指標f_ops。
4. 分配和填寫要放在file->private_data裡的資料結構。
5. 使用計數增1。
釋放裝置是通過呼叫file_operations結構中的函式release( )來完成的,這個裝置方法有時也被稱為close( ),它的作用正好與open( )相反,通常要完成下列工作:
1. 使用計數減1。
2. 釋放在file->private_data中分配的記憶體。
3. 如果使用計算為0,則關閉裝置。
read()和 write()
字元裝置的讀寫操作相對比較簡單,直接使用函式read( )和write( )就可以了。但如果是塊裝置的話,則需要呼叫函式block_read( )和block_write( )來進行資料讀寫,這兩個函式將向裝置請求表中增加讀寫請求,以便linux核心可以對請求順序進行優化。由於是對記憶體緩衝區而不是直接對裝置進行操作的,因此能很大程度上加快讀寫速度。如果記憶體緩衝區中沒有所要讀入的資料,或者需要執行寫操作將資料寫入裝置,那麼就要執行真正的資料傳輸,這是通過呼叫資料結構blk_dev_struct中的函式request_fn( )來完成的。
ioctl()--將cmd進行解釋,並送到裝置的控制暫存器.事實上,read()和write()也要通過ioctl()來完成操作的 .
ioctl();
switch case2:;
switch case n:;
. .
default : ;
} end case
總結:
我們可以看出乙個linux的驅動程式通常包含如下:
初始化裝置模組、
中斷處理模組、裝置釋放模組、裝置解除安裝模組
裝置開啟模組、資料讀寫和控制模組、
驅動裝載模組、驅動釋放模組.
Linux驅動程式設計(十) 驅動註冊
驅動註冊使用結構體platform driver,該結構體在 include linux platform device.h 中,使用命令開啟 vim include linux platform device.h驅動註冊函式platform driver register,驅動解除安裝函式plat...
Linux驅動程式設計(一)
簡單的linux驅動 mem.c檔案 include include module license gpl static int mem init void static void mem exit void module init mem init module exit mem exit mak...
Linux驅動程式設計簡述
linux 裝置驅動程式層次結構 作為unix 作業系統的乙個變種 linux 作業系統實現了大多數 unix 操作系 統的系統設施。系統將所有的裝置 不僅僅是磁碟上的檔案 都看成檔案,並納入檔案系統得範疇,通過檔案系統介面對裝置進行操作。下圖是針對 linux 系統中普通裝置 非磁碟檔案 的驅動程...