4 裝置註冊和初始化

2021-07-02 13:00:23 字數 1613 閱讀 4059

裝置的驅動程式在載入的時候首先需要呼叫入口函式init_module(),該函式最重要的乙個工作就是向核心註冊該裝置,對於字元裝置呼叫register_chrdev()完成註冊。register_chrdev 的定義為:int register_chrdev(unsignedint major, const char *name, struct file_ operations *fops);

其中,major是為裝置驅動程式向系統申請的主裝置號,如果為0,則系統為此驅動程式動態分配乙個主裝置號。name是裝置名,fops是對各個呼叫的 入口點說明。此函式返回0時表示成功;返回-einval,表示申請的主裝置號非法,主要原因是主裝置號大於系統所允許的最大裝置號;返回-ebusy, 表示所申請的主裝置號正在被其他裝置程式使用。如果動態分配主裝置號成功,此函式將返回所分配的主裝置號。如果register_chrdev()操作成 功,裝置名就會出現在/proc/dvices檔案中。

linux在/dev目錄中為每個裝置建立乙個檔案,用ls –l命令列出函式返回值,若小於0,則表示註冊失敗;返回0或者大於0的值表示註冊成功。註冊以後,linux將裝置名與主、次裝置號聯絡起來。當有對此 裝置名的訪問時,linux通過請求訪問的裝置名得到主、次裝置號,然後把此訪問分發到對應的裝置驅動,裝置驅動再根據次裝置號呼叫不同的函式。

當裝置驅動模組從linux核心中解除安裝,對應的主裝置號必須被釋放。字元裝置在cleanup_module()函式中呼叫 unregister_chrdev()來完成裝置的登出。unregister_chrdev()的定義為:int unregister_chrdev(unsignedint major, const char *name);

此函式的引數為主裝置號major和裝置名name。linux核心把name和major在核心註冊的名稱對比,如果不相等,解除安裝失敗,並返回-einval;如果major大於最大的裝置號,也返回-einval。

包括裝置註冊在內,裝置驅動的初始化函式主要完成的功能是有以下5項。

(1)對驅動程式管理的硬體進行必要的初始化。

對硬體暫存器進行設定。比如,設定中斷掩碼,設定串列埠的工作方式、並口的資料方向等。

(2)初始化裝置驅動相關的引數。

一般說來,每個裝置都要定義乙個裝置變數,用以儲存裝置相關的引數。在這一步驟裡對裝置變數中的項進行初始化。

(3)在核心註冊裝置。

呼叫register_chrdev()函式來註冊裝置。

(4)註冊中斷。

如果裝置需要irq支援,則要使用request_irq()函式註冊中斷。

(5)其他初始化工作。

初始化部分一般還負責給裝置驅動程式申請包括記憶體、時鐘、i/o埠等在內的系統資源,這些資源也可以在open子程式或者其他地方申請。這些資源不用時,應該釋放,以利於資源的共享。

若驅動程式是核心的一部分,初始化函式則要按如下方式宣告:

int __init chr_driver_init(void);

其中__init是必不可少的,在系統啟動時會由核心呼叫chr_driver_init,完成驅動程式的初始化。

當驅動程式是以模組的形式編寫時,則要按照如下方式宣告:

int init_module(void)

當執行後面介紹的insmod命令插入模組時,會呼叫init_module函式完成初始化工作。

初始化 鍵盤裝置

1 bool initinput hwnd hwnd 216 第二步 建立裝置,滑鼠,鍵盤等。17 res pinput createdevice 18 guid syskeyboard,裝置的guid,這裡使用定義好的 19 pkeyboard,裝置指標 20null 21if succeeded...

裝置初始化函式巨集

初始化 的記憶體結構 init begin init.text init init.data initdata setup start init.setup setup param initcall start initcall1.init core initcall initcall2.init ...

AHCI sata裝置初始化流程

檢測sata裝置 檢測hba的存在 根據hba的port挨個檢測是否連線。根據intel文件,需要檢測的項有 pxssts.det 03h,pxssts.ipm 02h或06h 檢測signature,0101的就是sata了 初始化sata裝置 關閉指令執行。設定pxcmd.st 0,pxcmd....