jz2440开发板移植U-boot之修改代码支持DM9000网卡

今天我们来移植U-boot到jz2440开发板,修改代码支持DM9000网卡。查看之前写的移植记录请点击链接:点击查看之前的移植记录

现在大多数开发板都支持DM9000网卡。我们的U-boot源码里面也是有DM9000网卡的驱动程序的。文件为Dm9000x.c(drivers\net).
首先我去网卡目录的Makefile文件中搜索dm9000字符串:
Makefile截图
由Makefile得知,如果我们定义了CONFIG_DRIVER_DM9000这个宏,那么dm9000网卡就会被编译进去(同时要去掉cs8900网卡)。

首先在smdk2440.h中找到下面的宏定义:

#define CONFIG_CS8900       /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE  0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */

这是cs8900网卡的定义,我们把它去掉,加上dm9000所需要的宏:

#ifdef 0
#define CONFIG_CS8900       /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE  0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#else
#define CONFIG_DRIVER_DM9000
#endif

重新编译uboot(肯定会显示有错误,不可能这么简单就弄好了,但是我们一步解决一个错误):
显示错误:

dm9000x.c:156: error: 'DM9000_DATA' undeclared (first use in this function)
dm9000x.c:156: error: (Each undeclared identifier is reported only once
dm9000x.c:156: error: for each function it appears in.)
。。。。
。。。。

显示说dm9000x.c中的56行没有定义DM9000_DATA这个宏参数。在经验不足,对驱动程序了解不多的情况下,我们没有办法知道这个宏参数是干什么的,但是我们可以仿照uboot中现有的程序中相同的地方模仿。我们在uboot源码中搜索DM9000_DATA这个字符串:
输入:grep “DM9000_DATA” * -nR (这是Linux下搜索字符串的命令)
显示很多配置文件中用到了DM9000_DATA这个参数,我们随便找一个配置文件进去看看别人是怎么配置的,假如找的是这个吧:

include/configs/at91sam9261ek.h:159:#define DM9000_DATA                 (CONFIG_DM9000_BASE + 4)

好,进去看了之后,别的是这么配置DM9000的网卡参数的:

#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE              0x04014000
#define DM9000_IO                       CONFIG_DM9000_BASE
#define DM9000_DATA                     (CONFIG_DM9000_BASE + 2)

原来是我们少定义了一些参数。那么我们来看看如何取值CONFIG_DM9000_BASE 与DM9000_DATA。
在分析之前先说一下:
DM9000属于内存类接口,想要操作内存类接口,需要知道它的1)访问地址,同时还要根据DM9000的实际情况2)设置内存控制器的时序以及位宽。

1)设置访问地址:
首先是 CONFIG_DM9000_BASE ,这个是DM9000的基地址,是CPU用来识别网卡的一个基地址。 查看DM9000网卡原理图:它的片选引脚是:nGCS4,那么我们查看2440手册,因为网卡是内存类的接口,所以我们看2440手册内存控制器那一章,找到片选信号的地址分配表:
地址
从中可以看出:nGCS4这个片选引脚对应的初始地址是:0x20000000。那么我们就把CONFIG_DM9000_BASE这个值设为0x20000000,就会把nGCS4引脚设为低电平,从而片选到DM9000网卡设备。

然后是 DM9000_DATA的地址取值。查看原理图知,cpu只发出了LADDR2给DM9000网卡内的CMD引脚, 说明CPU只关心访问地址的第2位,所以我们把基地址加4,设置一下第二位的值:#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
那么总的修改是:

#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE              0x20000000
#define DM9000_IO                       CONFIG_DM9000_BASE
#define DM9000_DATA                     (CONFIG_DM9000_BASE + 4)

那么我们已经设置好了上面说的第一步,设置访问地址,下面再看如何设置内存控制器的时序以及位宽。

2)设置内存控制器的时序以及位宽:
uboot中lowlevel_init.S中有设置内存控制器寄存器的相关的代码:

SMRDATA:.long 0x22011110     //BWSCON.long 0x00000700     //BANKCON0.long 0x00000700     //BANKCON1.long 0x00000700     //BANKCON2.long 0x00000700     //BANKCON3  .long 0x00000700     //BANKCON4.long 0x00000700     //BANKCON5.long 0x00018005     //BANKCON6.long 0x00018005     //BANKCON7.long 0x008C04F4     // REFRESH.long 0x000000B1     //BANKSIZE.long 0x00000030     //MRSRB6.long 0x00000030     //MRSRB7

.long 0x22011110 //BWSCON这个寄存器应该是设置的位宽,.long 0x00000700 //BANKCON4(nGCS4)这个应该是设置时序的寄存器
1)首先我们在2440手册中搜索BWSCON这个寄存器。在207页有设置位宽的寄存器位操作(其中19:18:17:16位对应的是BANK4,所以查看是否需要设置这四位):
2440手册
DW4是设置位宽的的位,对应17:16位。我们计算.long 0x22011110 //BWSCON这个寄存器的值,用寄存器位查看器知:
这里写图片描述
17:16位对应的是01.那么查看手册知01 = 16-bit。查看原理图得知,DM9000网卡的位宽刚好是16位,所以,不需要修改了。18位的等待信号DM9000上没有,不需要设置。19位的也没有用到,不需要设置。
2)再看如何设置时序(设置BANKCON4寄存器)。找到如下图:
设置时序寄存器的值
这里面就是设置DM9000的时序了,至于怎么设置(为什么这么设置),可以参考韦东山第二期视频移植DM9000网卡驱动程序那一节里面有详细讲过,这里不再讲解。
看看原始设置的各个位是对少:
原始设置
对比之前韦东山二期视频讲解的DM9000时序设置,我们在这里将位7:6设置为01。则对应的寄存器的值为:
修改好的寄存器的值
所以将BANKCON4的值改为0x00000740。
然后重新编译:
编译顺利通过。
将生成的镜像文件烧写到NOR FLASH,启动:
这里写图片描述
看到,显示Net: No ethernet found。那么我们去源码中搜索看是哪个地方。
源码中搜索:Net:
Board.c中:

#if defined(CONFIG_CMD_NET)puts("Net:   ");eth_initialize(gd->bd);

跳到:eth_initialize:
里面有一个函数board_eth_init:
我们找board_eth_init 函数(smdk2410.c,这个名字一直没有改成2440的,忘记了,暂时这么用吧,不影响):

int board_eth_init(bd_t *bis)
{int rc = 0;
#ifdef CONFIG_CS8900rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endifreturn rc;
}

发现没有初始化我们的DM9000网卡。我们在DM9000网卡驱动程序中找到:dm9000_initialize。应该是DM9000的初始化函数。我们在linux下搜索这个dm9000_initialize:grep “dm9000_initialize” * -nR,看看有没有类似的初始化。发现大多是这样的:

return dm9000_initialize(bis);

那么我们将上面的board_eth_init函数改成:

int board_eth_init(bd_t *bis)
{int rc = 0;
#ifdef CONFIG_CS8900rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif#ifdef CONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis);
#endifreturn rc;
}

重新编译,启动:
这里写图片描述
OK啦,我们的网卡终于加好了。
现在ping一下电脑看看:
先设置ip:
set ipaddr 10.11.235.102
ping 10.11.235.146
显示

*** ERROR: `ethaddr' not set

没有设置mac地址,重启设置:
set ipaddr 192.168.1.102
set ethaddr 00:0c:29:4d:e4:f4 (可以随便设置)
ping 192.168.1.102
显示如下:
显示图片
OK!显示主机alive。已经ping通了。下面我们试一下看看能不能用tftp下载。因为uboot没有集成TFTP工具,那么我们就用windows上的tftp工具进行下载内核。
如图为TFTP下载工具(注意服务器ip)
tftp下载工具
在板子上uboot上设置:
set serverip 192.168.1.102
tftp 30000000 uImage_4.3
下载内核的截图
然后启动内核:
bootm 30000000
成功启动内核。说明我们已经成功了!!!现在下载比用dnw下载要方便快捷的多。

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移植U-BOOT之裁剪和修改默认参数(易用性)启动内核,以及对uboot进行分区

今天我们来裁剪U-BOOT,使其更加易用,修改默认参数,以及制作最终修改好得补丁文件方便以后的快速移植。 那么如果想看之前的关于网卡以及flash等的移植,请点击链接查看:点击链接查看 在裁剪修改之前呢,我们…

移植U-BOOT之支持烧写YAFFS文件系统以及制作U-BOOT补丁

今天,我们来移植U-BOOT让其支持YAFFS文件系统映像的烧写,以及最后的终极目标,制作Uboot补丁,因为我们信心苦苦移植好了Uboot,如果换一个地方的或者换一台电脑之类的,我们也不想再浪费时间从头开始移植&…

【数据结构学习之完全从零实现所有数据结构的代码编写之一】泛型编程简介

学习交流加 个人qq: 1126137994个人微信: liu1126137994学习交流资源分享qq群: 962535112 今天开始系统性学习数据结构内容,之前也看过大话数据结构这本书,对大多数概念以及数据结构都有一定的了解,但是就是…

zookeeper 安装和使用

1.Windows安装和使用zookeeper 之前整理过一篇文章《zookeeper 分布式锁服务》,本文介绍的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非常简单&#xf…

【移植Linux 3.4.2内核第一步】之简单修改

前一阵子已经将U-boot移植好了,从今天开始,我们开始移植linux内核。移植的内核为3.4.2,移植的开发板为:jz2440开发板。 想看之前移植U-boot的记录,可以查看我的博客专栏,点击链接:点击查看U-bo…

前端学习(77):css中常见margin塌陷问题之解决办法

塌陷问题 当两个盒子在垂直方向上设置margin值时&#xff0c;会出现一个有趣的塌陷现象。 ①垂直并列 首先设置两个DIV,并为其制定宽高 1 1 /*HTML部分*/2 <body>3 <div class"box1">box1</div>4 <div class"box2">box2…

HBase2.0 vs HBase1.x 延时比较

hbase2.0已经正式发布&#xff0c;对比之前1.x版本&#xff0c;2.0在读写链路上做了完善的优化&#xff0c;offheap、netty rpc等&#xff0c;这里做个小测试实验对比1.x和2.0在读写上的延时情况。本测试基于特定测试环境与软件版本得到的结果&#xff0c;仅供参考。 测试介绍 …

【数据结构学习之完全从零实现所有数据结构的代码编写之二】智能指针

今天我们依然暂时不讲解数据结构里面的内容&#xff0c;我们来复习一下昨天学的模板技术用于数据结构编程的思想&#xff0c;给出一个模板技术的实例&#xff1a;智能指针的应用。喜欢看我分享的加我q:1126137994 加我共同学习交流各种技术。 为什么会引入智能指针呢&#xff…

职责链模式(Chain of Responsibility)

重要概念 1. 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 2.请求是沿着链条传递到有一个处理点对象负责处理这个请求为止。请求者无需…

mootools

$();// 选择ID为”body_wrap“的元素$(body_wrap);.getElement();// 选择ID为”body_wrap“的元素下面的第一个链接$(body_wrap).getElement(a); or #xxx or .xxx.getElements();// 选择ID为”body_wrap“的元素下面的所有链接$(body_wrap).getElements(a); $(body_wrap).getE…

图形化界面客户端连接phoenix操作hbase

下载客户端软件 DBeaver https://dbeaver.io/download/ 选择对应系统的版本&#xff0c;我这里选择解压版windows64位 创建连接 注意&#xff1a;URL模板就不要一般是默认 选择合适的版本&#xff08;跟你服务器的版本一致&#xff09;&#xff0c;下载jar包 点击测试或完成即…

【C++深度剖析教程12】数组操作符的重载

之前写的C学习记录忘记打编号了&#xff0c;从今天开始&#xff0c;所有内容&#xff0c;记录编号&#xff0c;方便以后的查阅复习。今天学习的是C中&#xff0c;数组操作符的重载。 上一篇博文写的是介绍C中的字符串类&#xff0c;我们知道&#xff0c;C标准库中通过string类…

前端学习(80):按类型划分标签(inline)

解决font-size中间有间隙 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compat…

HBase shell 命令介绍

HBase shell是HBase的一套命令行工具&#xff0c;类似传统数据中的sql概念&#xff0c;可以使用shell命令来查询HBase中数据的详细情况。安装完HBase之后&#xff0c;如果配置了HBase的环境变量&#xff0c;只要在shell中执行hbase shell就可以进入命令行界面&#xff0c;HBase…

【C++深度剖析教程13】函数对象的分析

今天来学习函数对象。什么是函数对象呢&#xff1f;下面我们以一个例子来引出函数对象的概念。 假设我们需要编写一个函数&#xff0c;实现下面这些功能&#xff1a; -函数可以获得斐波那契数列每一项的值 -每调用一次返回一个值 -函数可根据需要重复用使用 实现上面的几个…

IE图标消失 HTML文件图标变为未知图标的解决方法

有时候保存在硬盘里的HTM和HTML文件图标会突然变为未知的图标&#xff0c;而且它们往往还是与IE关联&#xff0c;也没有发现病毒。原因我怎么也弄不明白&#xff0c;但可以通过对注册表做些修改来恢复&#xff0c;详细步骤如下: 1.首先打开注册表编辑器&#xff0c;定位到HKEY_…

(SQuirreL SQL Client 客户端 )使用Apache Phoenix 实现 SQL 操作HBase

Apache Phoenix 相信大家并不陌生&#xff0c;它是HBase的SQL驱动&#xff0c;Phoenix 使得Hbase 支持通过JDBC的方式进行访问&#xff0c;并将你的SQL查询转换成Hbase的扫描和相应的动作。 兼容性&#xff1a; Phoenix 2.x - HBase 0.94.x Phoenix 3.x - HBase 0.94.x Phoen…

【C++深度剖析教程14】经典问题解析三之关于赋值的疑问

今天我们来总结一下&#xff0c;之前所学C中所遇到的一些经典的问题。 第一个疑问是&#xff1a; -什么时候需要重载赋值操作符 -编译器是否提供默认的赋值操作&#xff1f; 解答&#xff1a; *编译器为每个类默认重载了赋值操作符 *默认的赋值操作符仅完成了浅拷贝 *当…

微服务架构和SOA的区别

1. 2. 4 微服 务 架构 与 SOA 的 区别 1. 3. 1 微 服务 的 拆分 对于 一般 的 公司 而言&#xff0c; 实践 微 服务 有 非常 大的 技术 挑战&#xff0c; 所以 并不是 所有 的 公司 都 适合 将 单体 架构 拆分 成 微服 务 架构。 一般来说&#xff0c; 微服 务 架构 比较 适合 …