历史上的今天
今天是:2025年07月30日(星期三)
2021年07月30日 | 4.移植uboot-使uboot支持DM9000网卡
2021-07-30 来源:eefocus
本节继续修改让uboot支持DM9000C网卡,便可以通过网络来传输文件
首先uboot已带有dm9000网卡的驱动,位于drivers/net/下的dm9000x.h、dm9000x.c
1.DM9000C介绍
参考之前写的移植DM9000C驱动章节, 我们的DM9000是放在2440的bank4(0X20000000)的片选上面
而DM9000的CMD引脚接在bank4的LADDR2上面
也就是说当向0X20000000地址上读写数据时, 此时CMD为低,则读写的便是DM9000C的地址
向0X20000000+4地址上读写数据时,此时CMD为高,则读写的便是DM9000C的数据
2.修改内存控制器时序
由于之前在start.S里,就调用了board/samsung/smdk2440/lowlevl_init.S来初始化各个bank的配置、时序。所以我们只需要在那里修改bank4的内容即可
(也可以直接在dm9000x.c里的dm9000_initialize()函数设置)
参考之前写的移植DM9000C驱动里的时序
由于兼容DM9000E,所以修改的值尽量大一点,设为:
.long 0x00000740; //BANKCON4
3.修改宏,通过Makefile把dm9000x编译进uboot
3.1 查找宏
cd drivers/net
vi Makefile
找到:

找到有两个宏: CONFIG_CS8900、CONFIG_DRIVER_DM9000
由于uboot默认定义的是CONFIG_CS8900宏,而我们板子上的网卡是dm9000C,所以我们要修改为CONFIG_DRIVER_DM9000宏(宏位于include/configs/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 */
改为:
#define CONFIG_DRIVER_DM9000 /*DM9000*/
#define CONFIG_DM9000_BASE 0x20000000
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
4. 然后来看看初始化dm9000c的流程
1)uboot重定位后进入第二阶段board_init_r():
void board_init_r(gd_t *id, ulong dest_addr) //gd uboot重定位地址
{
... ...
#if defined(CONFIG_CMD_NET)
puts("Net: ");
eth_initialize(gd->bd); // 以太网初始化
#if defined(CONFIG_RESET_PHY_R)
debug("Reset Ethernet PHYn");
reset_phy();
#endif
#endif
... ...
}
2)然后进入board_init_r()->eth_initialize():
int eth_initialize(bd_t *bis)
{
... ...
if (board_eth_init(bis) < 0) //初始化 单板上的以太网
printf("Board Net Initialization Failedn");
... ...
if (!eth_devices) { //初始化失败,打印"No ethernet found.n"
puts ("No ethernet found.n");
bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
}
... ...
}
3)进入board_eth_init(), 位于board/samsung/smdk2440/smdk2440.c
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE); //初始化cs8900
#endif
return rc;
}
4.1从上面代码看到,单板初始化board_eth_init()函数里,只支持初始化CS8900,没有DM9000C
搜索其它单板的board_eth_init()是如何初始化DM9000C的,如下图所示:

所以,我们修改2440单板的board_eth_init(),使它支持DM9000C
修改代码如下(位于board/samsung/smdk2440/smdk2440.c):
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE); //初始化cs8900
#endif
#ifdef CONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis); //初始化DM9000C
#endif
return rc;
}
5.编译测试
使用loady命令重新烧写uboot,打印如下图所示:

然后试验,来ping下PC机,输入:
set ipaddr 192.168.2.103
ping 192.168.2.101
打印如下图所示:

上面表示,MAC(硬件地址)没有设置,我们需要设置ethaddr,来更改MAC地址
输入(参考别人的MAC地址):
set ethaddr 08:00:3e:26:0a:5b //设置MAC地址
ping 192.168.2.101 //重新ping
便可以ping通.
5.1 使用tftp工具,通过网卡来下载内核
tftp工具是通过电脑来设置本机为服务器,然后开发板作为客户端,便可以读取到PC机里的文件了
1)PC机打开tftp工具,设置文件根目录,以及PC本机的IP地址
2)进入开发板,输入:
set serverip 192.168.2.101 //设置PC机地址
tftp 30000000 uImage //下载PC机设置的tftp根目录下的uImage文件
bootm 30000000 //使用bootm命令启动内核代码
启动内核时,打印如下图所示:

由于uboot没有配置mtdparts命令,所以启动内核没成功.
史海拾趣
|
s3c2440+windows ce5.0 用host端口去挂载一个usb接口的外设 为什么不能自动挂载(系统起来后,自动识别usb),要热插拔才能识别。… 查看全部问答> |
|
我是新手刚学习linux下的嵌入式开发,但是配置系统开发环境的时候,有个问题我始终不明白,交叉编译说是当编译器运行在一个为另一系统产生可执行程序的系统上就发生了交叉编译,可是为什么我们需要交叉编译呢,而我们进行交叉编译时所选取的工具是 ...… 查看全部问答> |
|
这次diy应急灯使用了max16823作为led的驱动芯片,实话实说,这款芯片使用的确是方便之极。外围器件可以说是少的可怜,(我的应用中使用了3个电容,1个限流电阻,3个调节电阻)3个调节电阻式用来限制3路leds的流经电流的,换句话说就是调节leds亮度 ...… 查看全部问答> |
|
我运行main前面的汇编程序段,单步执行的时候,程序运行到_data16_memcpy中时,在copy了几个数据后程序忽然跳到cstart_begin开始的地方 但是循环还没有结束 另外: 我注释掉程序中一句,貌似就不会跑飞,可以正常进入main()了 ...… 查看全部问答> |
|
自己飞线焊的9B96的板子,这两天在看SAFERTOS+LWIP,突然网络就就不正常了,可以发数据,但不能收数据。 为了验证一下什么问题,使用academic在https://bbs.eeworld.com.cn/thread-222963-1-2.html中的程序试了一下,还是不能收数据, 通过udp_re ...… 查看全部问答> |
|
在降压转换过程中最常利用的是开关稳压器和LDO稳压器,但缺点在于尺寸太大,LDO如电压偏离值很大时,转换效率就骤降,开关电容稳压器为新兴技术,结合开关电容器和LDO优点,可整合至可携式应用中。设法降低核心处理器的供电电压是手持式装置的全新 ...… 查看全部问答> |




