歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux服務器

linux驅動編譯與加載

編譯驅動源碼,modpost老是出錯,於是進入/usr/src/`uname -r`目錄下

  #make scripts

  接著再編譯源碼,之前的錯誤消失了。出現了新的錯誤:

  **1.c:1052:error:void value not ignored as it ought to be

  **1.c源代碼中的1052行是:

  ret = unregister_chrdev(MAJOR, DEVICE_NAME);

  當注銷此行時可以編譯通過,找到linux/fs.h頭文件,裡面定義了unregister_chrdev()函數:

  extern void unregister_chrdev(unsigned int,const char *);

  此處定義的為void類型函數,而在程序中將其賦值給了ret,這就造成了編譯錯誤。

  於是注釋了相應的代碼,用unregister_chrdev(MAJOR, DEVICE_NAME);代替即可。這樣就能通過編譯了。又出現了新的問題:

  **2.c:474:’SA_INTERRUPT’undeclared(first use in this function)//{ 原來頭文件裡沒有SA_INTERRUPT了,一般使用IRQF_SHARED 了。}

  頭文件為/usr/src/linux-2.6.26.8RedHawk5.2.4/include/linux下的interrupte.h

  **2.c:474:’SA_SHIRQ’undeclared(first use in this function)//{ SA_SHIRQ 已經不支持了,用 IRQF_SHARED }

  於是修改了這行,通過編譯。

  新的問題又出現了:

  **3.c:57:error:’POLL_IN’undeclared(first use in this function)

  考慮肯定是由於頭文件的問題,直接注銷此行,先編譯通過再說,編譯成功!

  終於生成了**.ko的模塊!

  但是,新的問題又出現了,始終加載不了該模塊

  在/lib/modules/2.6.26.8-RedHawk-5.2.4-Moxa/kernel中新建文件夾extra

  將生成的**.ko文件復制到該文件下

  # depmod

  #modprobe **.ko

  FATAL:Module **.ko not found.

  再用insmod命令試試

  #insmod **.ko

  Insmod:error inserting ‘**.ko’: -1 Wrong medium type

  使用命令#dmesg:

  最後兩行顯示:

  [PCI-**]:Error in find_device: no card

  [PCI-**]:Error in find_device: no card

  因為沒有插入板卡所致

Copyright © Linux教程網 All Rights Reserved