s3c2440_uboot移植(六)添加DM9000网卡

在Makefile中添加uboot的DM9000网卡驱动

在drivers/net/Makefile文件中找到,如下面的:
Makefile文件
可知,要支持DM9000,我们需要在配置文件里添加CONFIG_DRVIER_DM9000的宏定义:
在这里插入图片描述
然后我们make一下进行编译:
make编译
发现编译出错,原因是有一个DM9000_DATA 的宏未定义,我们使用grep "DM9000_DATA" * -nR 命令查看一下其的定义:
configs
可以看到这些configs文件里面的头文件都定义了相应的DM9000_DATA 的宏,我们打开其中一个参考一下:
其它配置文件
例如上面的pm9261.h 文件中,我们看到还需要定义DM9000_IODM9000_DATA 这些宏,我们把这些宏补充到我们的配置文件中:
在这里插入图片描述
在这里插入图片描述

  • BASE 的地址为s3c2440的(nGCS4),所以地址为 0x2000_0000 ~ 0x0x2800_0000 时都会使能nGCS4,选中网卡。
  • CMD 连接LADDR2 地址,当CMD 接高电LDATA 充当数据线,当LDATA为低电平充当 Index port。

我们再重新make一下:
在这里插入图片描述
自此,我们就重新成功将DM9000 编译进我们的uboot了,但现在还不一定能运行。

设置配置内存控制器

时序分析

在这里插入图片描述
根据对DM9000CEP的处理器读写操作时序,结合s3c2440芯片的内存控制器时序分析,如上图所示。我们可以得出内存控制器的设置为下面的表格所示。

时间取值
Tacs0 clk
Tcos0 clk
Tacc1或2clk
Tcoh1 clk
Tcah1 clk
Tacp取默认值
PMC取默认值

Tacc 需要大于等于10ns,结合我们的内存控制器使用的时钟是HCLK 为100MHZ,一个Clock 正好为10ns,为了效率我们可以去1个Clock 时间,为了保险我们也可以取2个Clock时间。(实测下来得取2clk,在最后面我会说明1个clk时遇到的问题

Tcoh 保持时间,进行写操作时,我们需要在撤销#IOW后再保持3ns的SD数据,因此我们得让#CS引脚至少再维持1个clk 的时钟

Tcah 正常可以取0Clock,但是DM9000CEP 两次连续的读写操作之间(IOR#和IOW#)需要有一个时间间隔,这个间隔综合下来不能少于2个Clock,而我们的Tacs 和Tcos 都是0个Clock,为了防止可能连续操作可能出现时序问题。我们就让Tcah 来填充这个2个Clock的间隔。而前面的Tcoh又正好处于两次读(写)操作之间,减去Tcoh的一个时钟,我们的 Tcah就只需要一个时钟就可以了

源码修正

在这里插入图片描述

修改lowlevel_init.S 的代码,如图所示,我修改了BANK4 的配置寄存器的配置信息。(未取两个clk的情况)

修改board/samsung/smdk2440.c 文件在原来smdk2410使用的cs8900网卡的基础上,新添一个DM9000网卡的初始化操作。通过宏开关来操纵。
在这里插入图片描述
修改smdk2440.h 文件:
在这里插入图片描述
SERVERIP:我设置为了我编译内核的ubuntu 18.04 STL的网卡地址。

IPADDR:为了使其和我的ubuntu能够互联,这里将ip地址设置为与ubuntu同一子网的地址。

测试

添加厂商id

在这里插入图片描述
我们第一次烧入,然后ping 我们的ubuntu 主机,发现出现dm9000 not found at 0x20000000 id: 0x2b2a2928的错误。我们在ubuntu中使用grep "dm9000 not found" * -nR 定位我们的错误语句出现的地方。
在这里插入图片描述
在dm9000x.c 文件的第252行:
在这里插入图片描述
我们发现DM9000_ID 定义的设备号和厂商ID组合是0x90000A46,对比数据手册发现我们的DM9000CEP的不同,因此我们在246行处添加我们的DM9000CEP芯片的设备ID和厂商ID的组合。

其ID在数据手册中的定义如下图所示:
在这里插入图片描述
我们再重新编译烧入。

修改时钟为2clk

在这里插入图片描述

重新烧写入后又发现了新的问题,我们同样使用grep 命令进行定位:

在这里插入图片描述

ISR寄存器里面记录的DM9000的数据传输位宽,结合数据手册(下图),我们发现正常读取ISR寄存器应该是的第7、6位应该是00才对,而结合输出错误读出了11,所以我们猜测是内存控制器设置出现了问题。

在这里插入图片描述
最后在实际测试下来将Tacc设置为2clk时钟后就不会出现上面的问题。

最后一次烧入

在这里插入图片描述

至此,我们就使我们的uboot可以成功支持DM9000CEP网卡了。

总结

我们往uboot中添加DM9000CEP网卡经历了以下过程:

  1. 修改drivers/net/Makefile 文件,将DM9000的代码编译进uboot。为此我们需要在s3c2440.h配置文件中添加CONFIG_DRVIER_DM9000的配置项;
  2. 同时还要在配置文件中添加DM9000_DATA CONFIG_DM9000_BASEDM9000_DATA三个使用DM9000x.c代码需要的宏定义。它们用于指定DM9000被映射到内存控制器的内存地址;
  3. 修改内存控制器,需要分析DM9000CEP的处理器读写操作时序;
  4. 修改dm9000x.c 的源码,添加DM9000CEP的设备ID和厂商ID;
  5. 使用ping 命令测试连通性;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值