linux内核移植-DM9000C移植笔记

 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 <asm/io.h>
#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配置成模块,即<M>DM9000 support。不然,make uImage时会出现错误。

6、下载配置好的uImage和根文件系统。下载就不多说了,相信能看到这应该都会。

7、加载网卡驱动。下载好,直接启动内核。进入Shell的命令行模式。先找到dm9dev9000c.ko,我直接把它放到根目录,使用ls命令,就可以看到。加载模块,使用命令:insmod ./dm9dev9000c.ko。出现如图信息。卸载的话使用命令:rmmod ./dm9dev9000c.ko。注意每次启动都要加载一下。


8、验证。

查看网卡信息,因为网卡默认是关闭的,用ifconfig eth0 up打开网卡。就可以看到信息了。


配置网卡ip。注意和主机在同一网段。再ping一下看能否通信,如图,这样就使用的模块的方式把网卡一直成功了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值