dm9000移植

一直在学习驱动的移植,不过对硬件这块不熟,看了网上的这篇文章,觉得不错,我再加以注解,望原作者见谅。

 

先看如下关于dm9000和mini2440的连接图:

s3c2440_to_dm9000

 

从上面可以简单得出这些:
a. dm9000的访问地址为BANK4的基址(也许是通过上面的nGCS4看出来的)。(这个我是不明白的)
b. 只有一根地址线ADDR2。
c. 总线位宽为16位,有nWAIT信号。
d. 使用中断引脚为EINT7(使用GPF7实现的)。

 

我对这个东西还是比较陌生的,不过一直在努力学习之中,相信只要像做到,不管你以前是作什么的,都可以作的很好。

一 增加DM9000平台设备
增加平台设备前首先要先定义该平台设备,这主要修改arch/arm/plat-s3c24xx/devs.c文件。
1.添加头文件 ,在devs.c文件的头文件引入处添加如下代码:

#include <linux/dm9000.h>

2.定义dm9000平台资源 ,在devs.c文件的合适处添加如下代码(其实看一下源文件就知道合适的意思):

 

NOTE:
a.s3c_dm9k_resource数组定义了3个资源:两个内存空间和一个中断号。数组项0、1定义了访问dm9000时使用的地址。在dm9000的芯片手册上有如下的介绍:

    CMD Command Type
         When high, the access of this command cycle is DATA port
         When low, the access of this command cycle is ADDRESS port

所以数组项0、1的.start域就容易理解了,S3C2410_CS4中addr2为0,表示传输地址;S3C2410_CS4 + 4中addr2为1,表示传输数据。数组项[2]定义的中断号就较容易理解。
b.结构s3c_dm9k_platdata中指定了数据总线宽度为16。
c.结构s3c_device_dm9k就是dm9000的平台设备,其中.resource和.dev项分别指向前面定义的s3c_dm9k_resource和s3c_dm9k_platdata。

3.把定义的平台设备加入到内核设备列表中 ,在common-smdk.c文件的smdk_devs数组中添加一下代码:(我的为mach-mini2440.c文件mini2440_devices数组)

&s3c_device_dm9k,

这样,系统启动时就会把这个数组中的设备注册到内核中。

二 修改dm9000.c文件
对dm9000的枚举最终由dm9000_probe函数来实现。
1.添加头文件 ,在dm9000.c的头文件引入处增加以下代码,定义了一些寄存器的宏定义:

  1. #if defined(CONFIG_ARCH_S3C2410)   
  2. #include <mach/regs-mem.h>   
  3. #endif   

2.修改probe函数 ,通过设置存储控制器使BANK4可用,修改后的dm9000_probe函数如下,其中修改的地方都由CONFIG_ARCH_S3C2410包括:

a.第24-27行定义了两个变量,用来保存BWSCON和BANKCON4的值,下面将会用到。

b.第32-39对BANK4进行了设置。首先设置BWSCON,

9对BANK4进行了设置。首先设置BWSCON,

  1. #if defined(CONFIG_ARCH_S3C2410)   
  2.     *((volatile  unsigned  int  *)S3C2410_BWSCON) =  
  3.             (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;  
  4.     *((volatile  unsigned  int  *)S3C2410_BANKCON4) = 0x1f7c;  
  5. #endif   
  

主要是设置了总线宽度16,nWAIT,ST。(具体的可以参考s3c2440数据手册的BUS WIDTH & WAIT CONTROL REGISTER (BWSCON))。然后设置BANKCON4的时间参数,值为0×1f7c(pmc:normal Tacp:6clk Tcah:4clk Tcoh:1clk Tacc:14clk Tcos:4clk 具体可以参考s3c2440数据手册的BANK CONTROL REGISTER)

c.第209-216的代码是我自己给注释的,据其意思,上面首先给MAC赋值,然后检测合法性,但经实践,判断语句总成立,所以在linux启动 注册dm9000时总输出Invalid ethernet MAC address.反正后面也会再次给MAC地址赋值,所以干脆把这几行代码注释掉。

d.第218-227行就是给MAC地址赋值的,听说赋什么值都可以,有这么神奇吗?

e.第266-269行恢复寄存器原来的值。

f.以上的步骤和代码都是参考书上的,但可惜的是,按照上面步骤去修改,系统能成功加载dm9000驱动,但无法ping通,这个事确实让我很苦 恼,上网找了很多资料,最后发现大多数都需要调用writel来设置BWSCON、GPFCON和中断等。所以无计之下参考了mini2440中的一段代 码,出自附送光盘的无操作系统代码测试的dm9000部分。

到此 ,代码的移植到此为止,然后是配置内核,以使用dm9000。在

-> Device Drivers                                                    
--> Network device support
--> Network device support (NETDEVICES [=y])
--> Ethernet (10 or 100Mbit)

处将DM9000网卡选为编译进内核。
然后在/etc/init.d/rcS文件的开始处加入

ifconfig
 eth0 192.168.1.22<
pre>
当然,ip地址是因人而定的,尽量设为和PC在同一个网段。重新将内核下载到开发板后启动,有如下提示:<
pre lang
="text"
>
dm9000 Ethernet Driver
Hello, I use the MAC with 08:00:3e:26 :0a:5b:
eth0: dm9000 at c4852000,c4854004 IRQ 51 MAC: 08:00:3e:26 :0a:5b
...
...
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0x41E1

然后将开发板和PC机连在同一个网段上,终于ping通了PC机了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值