嵌入式Linux系統設備驅動程序的開發(fā)
定義好net_device結構體后,根據實際情況編寫操作函數,其中hard_start_xmit()函數是用來發(fā)送數據的,set_mac_address()是進行網絡參數設置的。
當linux初始化時將調用初始化函數int device_init( ),該函數包括以下內容:
注冊所用設備。linux用設備號來標識字符設備和塊設備。設備號分為主設備號和從設備號,最終形成設備接點。設備節(jié)點在訪問字符設備和塊設備的設備驅動程序時將使用。通常主設備號標識設備對應的驅動程序,大多數設備是“一個主設備號對應一個驅動程序”,如:虛擬控制臺和串口終端由驅動程序4管理。次設備號由內核使用,用于確定設備文件所指的設備。字符設備和塊設備注冊時必須先定義好設備號。
字符設備注冊函數如下:
int register_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);
其中 major是主設備號。
由于對網絡設備驅動程序的訪問不需要設備節(jié)點,它的注冊函數如下:
int register_netdev(struct net_device *dev)
注冊設備所用的中斷。中斷在現代計算機結構中有重要的地位,操作系統必須提供程序響應中斷的能力。一般是把一個中斷處理程序注冊到系統中去。操作系統在硬件中斷發(fā)生后調用驅動程序的處理程序。
注冊中斷所用的函數如下:
int request_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);
其中,irq是中斷向量;handler是中斷處理函數;flags是中斷處理中的掩碼;devices是設備名;dev_id是在中斷共享使用的id。
當linux不使用該設備時,就要調用清除函數void_devicie_exit ( ),它同初始化函數相對應的,主要是:
注銷設備,字符設備注銷函數如下:
int unregister_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);
注銷中斷,注銷中斷所用的函數如下:
int free_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);
釋放資源,模塊初始化和清除函數采用module_init(device_init),module_exit(device_exit) 形式
編寫服務子程序
服務于I/O請求的子程序,又稱為驅動程序的上半部分。調用這部分是由于系統調用的結果。這部分程序在執(zhí)行的時候.系統仍認為是和進行調用的進程屬于同一個進程. 只是用戶態(tài)變成了核心態(tài),具有進行此系統調用的用戶程序的運行環(huán)境.因此可以在其中調用sleep等與進程運行環(huán)境有關的函數。
中斷服務子程序,又稱為驅動程序的下半部分。在Linux系統中.并不是直接從中斷向量表中調用設備驅動程序的中斷服務子程序,而是由Linux系統來接收硬件中斷,再由系統調用中斷服務子程序。中斷可以產生在任何一個進程運行的時候,因此在中斷服務程序被調用的時候.不能依賴于仟何進程的狀態(tài),也就不能調用任何與進程運行環(huán)境相關的函數。因為設備驅動程序一般支持同一類型的若干設備,所以一般在系統調用中斷服務程序的時候,都帶有一個或多個參數,以唯一標識請求服務的設備。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論