JZ2440的网卡是DM900C,按照完全手册搞了半天,也没成功,最后才知道linux2.6.22.6内核里带的dm9000.c驱动并不支持。DM900C的移植过程是在第二套视频里讲的。现在把过程列一下。移植过程来自移植DM9000C网卡驱动程序(S3C2440)。
一、开发环境
1、内核:linux2.6.22.6;
2、JZ2440;
3、ubuntu 9.10;
4、dm9dev9000c.c。
二、移植过程
1、修改驱动dm9dev9000c.c。
(1)1610行#ifdef MODULE和最后一行#endif注释掉。
(2)最后几行添加修饰命令,并修改入口和出口函数的名字(可以不用改)
module_init(dm9000c_init); //dm9000c_init对应之前入口函数init_module
module_exit(dm9000c_exit);//dm9000c_exit对应cleanup_module
(3)修改原init_module、cleanup_module函数。
(4)网卡的片选信号接在nGCS4,如果可以识别网卡,低电平有效,根据S3C2440芯片手册的memory controller一节,CPU发出的物理地址必须在0x20000000-0x28000000,才能识别出网卡;在网卡驱动程序的入口函数里添加一行语句:iobase=(int)ioremap(0x20000000,1024);在出口函数注销映射iounmap((void *)iobase)。
(5)开发板的DM9000C网卡中断引脚是接的外部中断7,即IRQ_EINT7,在入口函数添加一行语句 irq=IRQ_EINT7。
(6)修改中断触发方式。源厂商提供的网卡驱动程序无触发方式,需设置一个触发方式,申请中断函数是dmfe_open,在该函数里将中断方式修改了request_irq(dev->irq,&dmfe_interrupt,IRQF_TRIGGER_RISING,dev->name,dev)。
(7)根据驱动程序的调试得知,需注释源厂商提供的驱动程序其中dmfe_probe1函数里的一行语句。
(8)设置S3C2440的memory controller寄存器(如果不设置,这样网卡驱动程序就依赖uboot,为了更加完善,配置一下寄存器。在入口函数dm9000c_init里添加:
volatile unsigned long *bwscon;
volatile unsigned long *bankcon4;
unsigned long val;
// 映射,设置寄存器
bwscon=ioremap(0x48000000,4);//0x48000000为bwscon的物理地址
bankcon4=ioremap(0x48000014,4);
//
*bit[19]=0 ST4 0 = Not using UB/LB (The pins are dedicated nWBE[3:0])
*bit[18]=0 ws4 0 = WAIT disable//dm9000c网卡芯片没有接等待信号
*bit[17:16]=1 dw4 01 = 16-bit //dm9000c网卡是16位模式
//
val=*bwscon;
val &=~(0xf<<16);
val |=(1<<16);
*bwscon=val;
//
*bit[14:13]=0 地址信号发出后多久发片选信号 00 = 0 clock
*bit[12:11]=0 片选信号发出后多久发出读信号 00 = 0 cloc
*bit[10:8]=1 读/写信号脉冲宽度 001 = 2 clocks
*bit[7:6]=1 读信号消失后,地址信号和片选信号还要维持多久 01 = 1 clock
*bit[5:4]=0 片选信号消失多久后地址信号消失 00 = 0 clock
*bit[1:0]=0 正常模式 00 = normal (1 data)
//
*bankcon4=(1<<8)|(1<<6);
iounmap(bwscon);//释放映射的地址
iounmap(bankcon4);
//if((db->chip_revision!=0x1A) || ((chip_info&(1<<5))!=0) || ((chip_info&(1<<2))!=1)) return -ENODEV;
(9)添加头文件
到此驱动程序修改好了,拷贝到虚拟机里进行编译时,出现了错误,发现缺少了头文件,根据提示添加一下几句:
#include
#include <asm-arm/delay.h>
#include <asm/irq.h>
#include <linux/io.h>
2、在驱动目录下添加makefile文件。
KERN_DIR = /work/system/linux-2.6.22.6 //编译网卡驱动程序使用的linux内核所在的目录
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m +=dm9dev9000c.o //驱动程序的名字
3、make。
在驱动目录使用命令$make,生成dm9dev9000c.ko文件。
4、把文件拷到文件系统目录,如直接放到根目录/myfs下。看准不是内核目录,作为初学者,本人就犯了这个低级错误,浪费不少时间,同时也暴露了没理解基本的东西,欠思考。使用mkyaffs2image。制作yaffs2格式的根文件系统,可以参考《构建根文件系统》。
5、配置内核支持DM9000。参考《linux设备驱动-DM9000移植》的第五点,需要注意的是,把DM9000配置成模块,即
6、下载配置好的uImage和根文件系统。下载就不多说了,相信能看到这应该都会。
7、加载网卡驱动。下载好,直接启动内核。进入Shell的命令行模式。先找到dm9dev9000c.ko,我直接把它放到根目录,使用ls命令,就可以看到。加载模块,使用命令:insmod ./dm9dev9000c.ko。出现如图信息。卸载的话使用命令:rmmod ./dm9dev9000c.ko。注意每次启动都要加载一下。
8、验证。
查看网卡信息,因为网卡默认是关闭的,用ifconfig eth0 up打开网卡。就可以看到信息了。
配置网卡ip。注意和主机在同一网段。再ping一下看能否通信,如图,这样就使用的模块的方式把网卡一直成功了。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章