|
硬件環(huán)境:SBC-2410X開發(fā)板(CPU:S3C2410X) 內(nèi)核版本:2.6.11.1 運(yùn)行環(huán)境:Debian2.6.8 交叉編譯環(huán)境:gcc-3.3.4-glibc-2.3.3 第一部分 網(wǎng)卡CS8900A驅(qū)動程序的移植
一、從網(wǎng)上將Linux內(nèi)核源代碼下載到本機(jī)上,并將其解壓: #tar jxf linux-2.6.11.1.tar.bz2
二、打開內(nèi)核頂層目錄中的Makefile文件,這個文件中需要修改的內(nèi)容包括以下兩個方面。 (1)指定目標(biāo)平臺。 移植前: ARCH?= $(SUBARCH) 移植后: ARCH :=arm (2)指定交叉編譯器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:這里假設(shè)編譯器就放在本機(jī)的那個目錄下。
三、添加驅(qū)動程序源代碼,這涉及到以下幾個方面。 (1)、從網(wǎng)上下載了cs8900.c和cs8900.h兩個針對2.6.7的內(nèi)核的驅(qū)動程序源代碼,將其放在drivers/net/arm/目錄下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函數(shù)中,memset (&priv,0,sizeof (cs8900_t));函數(shù)之后添加如下兩條語句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解釋。
(2)、修改drivers/net/arm/目錄下的Kconfig文件,在最后添加如下內(nèi)容: Config ARM_CS8900 tristate "CS8900 support" depends on NET_ETHERNET && ARM && ARCH_SMDK2410 help Support for CS8900A chipset based Ethernet cards. If you have a network (Ethernet) card of this type, say Y and read the Ethernet-HOWTO, available from as well as . To compile this driver as a module, choose M here and read . The module will be called cs8900.o. 注:內(nèi)核系統(tǒng)配置文件由2.4版本的config.in變成了2.6版本Kconfig文件,在這個文件里面添加如上內(nèi)容,則在運(yùn)行make menuconfig或者make xconfig命令的時候就會出現(xiàn): [ ] CS8900 support 這一選項(xiàng)。
(3)、修改drivers/net/arm/目錄下的Makefile文件,在最后添加如下內(nèi)容: obj-$(CONFIG_ARM_CS8900) += cs8900.o 注:2.6版本內(nèi)核的Makefile文件也與2.4版本的有所不同。添加以上語句,就會使內(nèi)核在編譯的時候根據(jù)配置將cs8900A的驅(qū)動程序以模塊或靜態(tài)的方式編譯到內(nèi)核當(dāng)中。
(4)、在/arch/arm/mach-s3c2410/mach-smdk2410.c文件中,找到smdk2410_iodesc[]結(jié)構(gòu)數(shù)組,添加如下如下內(nèi)容:{vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE} 修改之后變成了: static struct map_desc smdk2410_iodesc[] __initdata = { /* nothing here yet */ /* Map the ethernet controller CS8900A */ {vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE} }; 注:由于在驅(qū)動程序的開發(fā)的時候,在驅(qū)動程序當(dāng)中所用到的跟設(shè)備有關(guān)的地址都是虛擬地址,也就是說驅(qū)動程序操作的都是虛擬地址,那么要使驅(qū)動程序?qū)υO(shè)備的操作反映到設(shè)備上去,就得將設(shè)備的物理地址映射到正確的虛擬地址上去,從而保證驅(qū)動程序?qū)μ摂M地址的操作也就是對相應(yīng)的物理地址操作。以上添加的語句就是為了將網(wǎng)卡的物理地址(0x19000000)映射到vSMDK2410_ETH_IO所指向的虛擬地址上去,上面的結(jié)構(gòu)還定義了網(wǎng)卡虛擬地址所占用的區(qū)間,也就是從vSMDK2410_ETH_IO開始的SZ_1M大小的去間,并指定了該區(qū)間所指向的域(的屬性)。(疑問:在本開發(fā)板上,網(wǎng)卡占用的是CPU的nGCS3片選信號,也就是在Bank3,根據(jù)處 |