如何自行將一個 driver 的 source, make 成 module 好給某個 kernel 使用?

如果您覺得您的問題不屬於 debian desktop 或是 debian server 版的範圍內,請在這裡發問。

版主: mufa

如何自行將一個 driver 的 source, make 成 module 好給某個 kernel 使用?

文章Drake » 週六 4月 16, 2005 9:47 am

最近拿到了一台 Dell Precision 470 的電腦,它的配備是用過的電腦裏最棒的,使用的 SCSI card 是 Adaptec 39320,但因為 Dell 把這張卡改過了,導致不能用公定版的 aic7xxx 或 aic79xx 這兩個 module,為此我一開始用 Red Hat 用了一週 :crying:

後來很幸運找到原因,得知 Adaptect 官網上有 aic7xxx 和 aic7yxx 兩個版本的 driver source,其中的 aic7yxx 剛好可以搞定這張卡。

於是乎我先行使用網路上,有人做好的 kernel 安裝了 2.4.9 kernel 的 Debian(沒有 2.6.- 以後的),然後現在打算安裝 kernel-image-2.6.- 後,再把拿到的 aic7yxx compile 出 2.6.- 可以用的 module,因為硬碟是 SCSI 的,所以好像 module 得 make 進 kernel 或是用 mkinitrd?(我不確定這可不可行)

想來問問大家

1、我是否一定要從 source, make 出一份新的 kernel 且把 aic7yxx 編入 kernel 才行用? 還是可以用 mkinitrd 的方式,只要讓 aic7yxx 編出來的 module ,用此方法掛上就行了?

2、上述的任一情況,我該如何 make aic7yxx 呢?

感謝 :mrgreen:
Drake
活潑的高中生
活潑的高中生
 
文章: 314
註冊時間: 週三 3月 26, 2003 11:00 am

文章d2207197 » 週六 4月 16, 2005 10:21 am

不一定要有 source,安裝官方的 image,再安裝 headers 就可以編譯 module 了。

編出 aic7yxx module 後,安裝到 /lib/modules/[kernel version]/kernel/ 下面
然後用 mkinitrd 建立 initrd image。裡面應該就有包著 aic7yxx 了
頭像
d2207197
鑽研的研究生
鑽研的研究生
 
文章: 1763
註冊時間: 週二 5月 27, 2003 9:57 pm
來自: 火星

文章capitalm » 週六 4月 16, 2005 10:48 am

最好是放在 /lib/modules/[kernel version]/initrd
mkinitrd不會把所有的module包進去,一般來說只有包 ide、scsi 等 root device 會需要的 module。放在 initrd 目錄下才可以確保會包進 initrd中。
另外 mkinitrd 之後可以用 mount -o 把 initrd image mount 起來,檢查module 有沒有包進去。
capitalm
懵懂的國中生
懵懂的國中生
 
文章: 121
註冊時間: 週四 10月 07, 2004 1:14 pm

文章訪客 » 週六 4月 16, 2005 4:15 pm

不過是早上發文,剛從台北回到新竹老家就看到回文,相當興奮,也相當感謝兩位的回覆。

剛剛又研究了一下抓下來的 aic7yxx source 裏的 Makefile,不曉得怎麼 make 中 @@
訪客
 

文章shogun1234 » 週六 4月 16, 2005 5:59 pm

[quote="Anonymous"]不過是早上發文,剛從台北回到新竹老家就看到回文,相當興奮,也相當感謝兩位的回覆。

剛剛又研究了一下抓下來的 aic7yxx source 裏的 Makefile,不曉得怎麼 make 中 @@[/quote]

you ought to read the doc, such as README, INSTALL (contained in the unpacked folder) and so on; which would give you an roughly overview to what the dirver would done and something related to it.
further, normal steps to build dirver often involves in configure, make and make install. hope this helps.
peace
shogun1234
可愛的小學生
可愛的小學生
 
文章: 53
註冊時間: 週三 1月 08, 2003 3:04 pm

文章Drake » 週一 4月 18, 2005 12:13 am

d2207197 寫:不一定要有 source,安裝官方的 image,再安裝 headers 就可以編譯 module 了。

還是不了要怎麼做

因為單看 aic7yxx 的 Makefile,覺得很怪:
#
# drivers/scsi/aic7xxx/Makefile
#
# Makefile for the Linux aic7xxx SCSI driver.
#

O_TARGET := aic7xxx_drv.o

list-multi := aic7xxx.o aic79xx.o

obj-$(CONFIG_SCSI_AIC7XXX) += aic7xxx.o
ifeq ($(CONFIG_PCI),y)
obj-$(CONFIG_SCSI_AIC79XX) += aic79xx.o
endif

EXTRA_CFLAGS += -I$(TOPDIR)/drivers/scsi -Werror
ifeq ($(wildcard $(TOPDIR)/include/linux/rhconfig.h), \
$(TOPDIR)/include/linux/rhconfig.h)
EXTRA_CFLAGS += -DAIC_RED_HAT_LINUX_KERNEL
endif
#EXTRA_CFLAGS += -g

# Platform Specific Files
obj-aic7xxx = aic7xxx_osm.o aic7xxx_proc.o

# Core Files
obj-aic7xxx += aic7xxx_core.o aic7xxx_93cx6.o
ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
obj-aic7xxx += aic7xxx_reg_print.o
endif

#EISA Specific Files
AIC7XXX_EISA_ARCH = $(filter i386 alpha,$(ARCH))
ifneq ($(AIC7XXX_EISA_ARCH),)
obj-aic7xxx += aic7770.o
# Platform Specific EISA Files
obj-aic7xxx += aic7770_osm.o
endif

#PCI Specific Files
ifeq ($(CONFIG_PCI),y)
obj-aic7xxx += aic7xxx_pci.o
# Platform Specific PCI Files
obj-aic7xxx += aic7xxx_osm_pci.o
endif

# Platform Specific U320 Files
obj-aic79xx = aic79xx_osm.o aic79xx_proc.o aic79xx_osm_pci.o
# Core Files
obj-aic79xx += aic79xx_core.o aic79xx_pci.o
ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
obj-aic79xx += aic79xx_reg_print.o
endif

# Override our module desitnation
MOD_DESTDIR = $(shell cd .. && $(CONFIG_SHELL) $(TOPDIR)/scripts/pathdown.sh)

include $(TOPDIR)/Rules.make

aic7xxx_core.o: aic7xxx_seq.h
$(obj-aic7xxx): aic7xxx_reg.h
aic7xxx.o: aic7xxx_seq.h aic7xxx_reg.h $(obj-aic7xxx)
$(LD) $(LD_RFLAG) -r -o $@ $(obj-aic7xxx)

aic79xx_core.o: aic79xx_seq.h
$(obj-aic79xx): aic79xx_reg.h
aic79xx.o: aic79xx_seq.h aic79xx_reg.h $(obj-aic79xx)
$(LD) $(LD_RFLAG) -r -o $@ $(obj-aic79xx)

ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y)
# Create a dependency chain in generated files
# to avoid concurrent invocations of the single
# rule that builds them all.
aic7xxx_seq.h: aic7xxx_reg.h
aic7xxx_gen = aic7xxx_seq.h aic7xxx_reg.h
ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
aic7xxx_reg.h: aic7xxx_reg_print.c
aic7xxx_gen += aic7xxx_reg_print.c
aic7xxx_asm_cmd = aicasm/aicasm -I. -r aic7xxx_reg.h \
-p aic7xxx_reg_print.c -i aic7xxx_osm.h \
-o aic7xxx_seq.h aic7xxx.seq
else
aic7xxx_asm_cmd = aicasm/aicasm -I. -r aic7xxx_reg.h \
-o aic7xxx_seq.h aic7xxx.seq
endif
$(aic7xxx_gen): aic7xxx.seq aic7xxx.reg aicasm/aicasm
$(aic7xxx_asm_cmd)
endif

ifeq ($(CONFIG_AIC79XX_BUILD_FIRMWARE),y)
# Create a dependency chain in generated files
# to avoid concurrent invocations of the single
# rule that builds them all.
aic79xx_seq.h: aic79xx_reg.h
aic79xx_gen = aic79xx_seq.h aic79xx_reg.h
ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
aic79xx_reg.h: aic79xx_reg_print.c
aic79xx_gen += aic79xx_reg_print.c
aic79xx_asm_cmd = aicasm/aicasm -I. -r aic79xx_reg.h \
-p aic79xx_reg_print.c -i aic79xx_osm.h \
-o aic79xx_seq.h aic79xx.seq
else
aic79xx_asm_cmd = aicasm/aicasm -I. -r aic79xx_reg.h \
-o aic79xx_seq.h aic79xx.seq
endif
$(aic79xx_gen): aic79xx.seq aic79xx.reg aicasm/aicasm
$(aic79xx_asm_cmd)
endif

aicasm/aicasm: aicasm/*.[chyl]
$(MAKE) -C aicasm
Drake
活潑的高中生
活潑的高中生
 
文章: 314
註冊時間: 週三 3月 26, 2003 11:00 am

文章d2207197 » 週一 4月 18, 2005 12:44 am

make aic7xxx_core.o 吧
我也不太清楚
頭像
d2207197
鑽研的研究生
鑽研的研究生
 
文章: 1763
註冊時間: 週二 5月 27, 2003 9:57 pm
來自: 火星

文章Drake » 週一 4月 18, 2005 8:55 am

shogun1234 寫:
Anonymous 寫:不過是早上發文,剛從台北回到新竹老家就看到回文,相當興奮,也相當感謝兩位的回覆。

剛剛又研究了一下抓下來的 aic7yxx source 裏的 Makefile,不曉得怎麼 make 中 @@


you ought to read the doc, such as README, INSTALL (contained in the unpacked folder) and so on; which would give you an roughly overview to what the dirver would done and something related to it.
further, normal steps to build dirver often involves in configure, make and make install. hope this helps.
peace

actually, I have read it and there is no info about how to make it :-P
Drake
活潑的高中生
活潑的高中生
 
文章: 314
註冊時間: 週三 3月 26, 2003 11:00 am

文章Drake » 週二 4月 19, 2005 1:57 pm

At last, I used the most time-consuming and stupid method to fix it.
  • Grab a Debian installation CD using 2.4 kernel with built-in new aic7xxx(aic7yxx) from http://wiki.osuosl.org/display/LNX/Debi ... %20Servers
  • Do installation by this CD until 'installing base packages'
  • Then, I switch the CD with a Debian woody 3.0r4
  • After that, I have a Debian Linux with kernel 2.4.9
  • After apt-get update, kernle-package, kernel-source-2.6.x are installed
  • Then the aic7yxx's source code is put into kernel-source-2.6, which is in /usr/src/kernel~/drivers/scsi/aic7xxx. That is, the original aic7xxx source is replaced by new one from http://www.adaptec.co.uk/worldwide/supp ... .4.tar.bz2
  • There is one thing to notice. Because the companying Makefile in aic7yxx is a little strange, I used the original Makefile and 2 Kconfig~ files.
  • Do make my own kernel by make-kpkg
  • Use mkinitrd to make my own initrd-image with aic7xxx and aacrain included by inserting these two module names to /etc/mkinitrd/modules and running mkinitrd /boot/initrd-image-2.6.x 2.6.x
  • Update grub by running update-grub or you can manually modify /boot/grub/menu.lst
  • Reboot. Now Debian knows that weird modified Adaptec 39320 by Dell


Hope this result helpful :-)
Drake
活潑的高中生
活潑的高中生
 
文章: 314
註冊時間: 週三 3月 26, 2003 11:00 am


回到 debian misc

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客