第一步:建立Linux驅動的骨架
linux內核使用驅動時候,需要先初始化,包括建立設備文件,分配內存地址空間等,退出的時候要釋放資源,刪除設備文件,釋放內存地址空間等。所以在linux驅動中需要提供兩個函數來分別處理驅動初始化和退出的工作,這兩個函數分別用module_init和module_exit宏來指定,linux驅動一般都需要指定這兩個函數,所以linux驅動有一個C文件,文件中包含處理驅動初始化和退出的函數,以及指定這兩個函數的module_init和module_exit宏.
第二步:注冊和注銷設備文件
任何一個驅動都有設備文件,misc_register,misc_deregister
第三步:指定與驅動相關的信息
驅動程序帶自描述內容,比如用modinfo可以獲取包括作者名稱,版本號等等,有MODULE_AUTHOR,MODULE_LICENSE,MODULE_ALIAS,MODULE_DESCRIPTION等宏
第四步:指定回調函數
linux驅動的各個動作也可稱為事件,這些時間就有相應的回調函數,
第五步:編寫功能邏輯
編寫程序,來實現該驅動所要求達到的功能,可以由多個函數/多個文件/甚至多個模塊組成
第六步:編寫Makefile
一個新的驅動程序必須要有一個Makefile,obj-m表示將驅動作為模塊編譯,obj-y則表示將驅動編譯進內核,
echo 'obj-m := led.o' > Makefile
上句表示新建一個Makefile文件,文件中只有一個話:obj-m := led.o
該句表示用make指令編譯時,會將源代碼目錄中的led.c或led.s文件編譯成led.o文件,並且led.o會被編譯進led.ko文件,然後使用insmod或modprobe命令來裝載led.ko.如果使用的不是obj-m,而是obj-y,則led.o將會被編譯進build-in.o,最終被連接進內核。build-in.o是連接同一類程序的.o文件生產的中間目標文件。make menuconfig可以配置是否最終編譯進內核。
如果驅動依賴其他程序,如process.c,data.c,則Makefile需要按如下寫:
obj-m := led.o
led-y := process.o data.o
依賴文件由module-y或module-objs決定,module就是指led。
第七步:編譯驅動程序
可以直接將驅動編譯進內核,也可以作為模塊單獨編譯
第八步:安裝/卸載驅動
將驅動編譯進內核,則只要linux使用該內核,則驅動將自動加載。如果不編譯進內核,而是以模塊存在,在需要使用insmod或modprobe命令來裝載驅動模塊,用rmmod命令來卸載驅動模塊。