linux驅動安裝

Linux下可以通過兩種方式加載驅動程序:靜態加載和動態加載。

靜態加載就是把驅動程序直接編譯進內核,系統啓動後可以直接調用。靜態加載的缺點是調試起來比較麻煩,每次修改一個地方都要重新編譯和下載內核,效率較低。若採用靜態加載的驅動較多,會導致內核容量很大,浪費存儲空間。

動態加載利用了Linux的module特性,可以在系統啓動後用insmod命令添加模塊(.ko),在不需要的時候用rmmod命令卸載模塊,採用這種動態加載的方式便於驅動程序的調試,同時可以針對產品的功能需求,進行內核的裁剪,將不需要的驅動去除,大大減小了內核的存儲容量。

在臺式機上,一般採用動態加載的方式;在嵌入式產品裏,可以先採用動態加載的方式進行調試,調試成功後再編譯進內核。

二、實例分析

下面以Linux下音頻驅動的加載爲例,分析兩種方式的加載過程。

1、靜態加載

1)解壓內核,修改硬件架構和編譯器;

將內核壓縮文件linux-2.6.8.1-zzm.tar.bz2解壓到/home/sxy/目錄下,命令是\,解壓後得到內核源碼目錄文件linux-2.6.8.1-zzm,進入該目錄,編輯Makefile文件,將ARCH改爲arm,CROSS_CPMPILE改爲arm-linux-,如下圖所示:<喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHAgYWxpZ249"center">\

保存後退出。

2)配置內核;

在內核源碼樹目錄下,輸入make menuconfig命令,進入內核配置界面,進入“Load an Alternate Configuration File”選項,載入配置文件kernel_2410.cfg,保存退出,過程如下圖所示:

\


\

\

再次輸入make menuconfig命令,編輯sound選項,將其編譯進內核(*),結果如下圖所示,最後保存配置,退出。

\

3)編譯內核;

在源碼樹目錄下輸入make zImage命令,編譯完成後可以在/arch/arm/boot/目錄下生成zImage鏡像文件。

4)下載內核

將內核鏡像文件zImage下載到開發板上,當串口終端顯示如下信息時,表示驅動加載成功。

\

2、動態加載

1)解壓內核,過程與靜態編譯時一樣,略;

2) 配置內核,前面過程與靜態編譯時一樣,再次輸入命令make menuconfig,配置sound選項時,將其編譯成模塊(M),結果如下圖所示,最後保存配置,退出;

\

這樣就將聲卡驅動編譯成模塊,可以動態選擇是否加載到內核中。

3)下載內核

將內核鏡像文件zImage下載到開發板上,驗證能否驅動聲卡的過程如下:

\



說明:首先,將虛擬機下的/home/目錄掛載到開發板上的/tmp/目錄下,然後先後加載soundcore.ko和 s3c2410-oss.ko兩個模塊,最後通過lsmod命令查看是否加載上聲卡驅動,結果顯示加載成功,這樣就可以在應用空間編程,實現音頻的錄放等操作。

PS:①採用make menuconfig命令時,選項*代表Y,表示將驅動編譯進內核;M表示將驅動編譯成模塊;空代表N,表示不編譯;

②內核文件與模塊兩者有很多東西必須匹配,編譯器版本、源碼版本、編譯時的配置等,所以當內核文件修改了,譬如修改了驅動的編譯選項(Y、M、N),那麼就必須重新編譯和下載內核,否則會出錯。

三、遇到的問題

問題:動態加載過程中,出現下面錯誤:

\

錯誤:註冊和註銷設備的符號未知。

解決方法:尋找依賴關係,查看幾個符號的定義,發現在soundcore.c文件中定義了以上幾個函數,同時導出了符號,以register_sound_dsp爲例,如下圖所示:

\

所以應該先加載soundcore.ko,後加載s3c2410-oss.ko。

注意:在Kconfig和Makefile文件中定義了依賴關係,也可以查找到問題的原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章