修正uboot网络不可用

简介: <p>通过使用uboot的网络功能可以更新ubook,烧写内核,文件系统,如果网络功能不可能,那还不如同变砖了一样.当然如果支持sd卡启动,可能通过sd卡完成这些功能,但是也太过麻烦了.飞凌的6410开发板提供的uboot的网络驱动是cs8900,但是实际上网卡是dm9000ae.</p> <p>烧入后发无法ping通,tftp不可用,输出:</p> <p></p> <div cla

通过使用uboot的网络功能可以更新ubook,烧写内核,文件系统,如果网络功能不可能,那还不如同变砖了一样.当然如果支持sd卡启动,可能通过sd卡完成这些功能,但是也太过麻烦了.飞凌的6410开发板提供的uboot的网络驱动是cs8900,但是实际上网卡是dm9000ae.

烧入后发无法ping通,tftp不可用,输出:

  1. CS8900 Ethernet chip not found?!  
CS8900 Ethernet chip not found?!
下面,提供简单的修改方法,把驱动改为dm9000,让网络功能用起来.

1.修改include/configs/smdk6410.h

  1. #ifdef  CONFIG_DRIVER_SMC911X      
  2. #undef  CONFIG_DRIVER_CS8900       
  3. #define CONFIG_DRIVER_SMC911X_BASE  0x18800300   
  4. #else   
  5. //注释掉下面3行   
  6. //#define CONFIG_DRIVER_CS8900  0   /* we have a CS8900 on-board */   
  7. //#define CS8900_BASE       0x18800300   
  8. //#define CS8900_BUS16      1   /* the Linux driver does accesses as shorts */   
  9. //增加下面4行   
  10. #define CONFIG_DRIVER_DM9000                1   
  11. #define CONFIG_DM9000_BASE          0x18000000   
  12. #define DM9000_IO                   CONFIG_DM9000_BASE   
  13. #define DM9000_DATA                 (CONFIG_DM9000_BASE+4)   
  14. #define CONFIG_DM9000_USE_16BIT   
  15. //#define CONFIG_DM9000_DEBUG   
  16. #endif  
#ifdef 	CONFIG_DRIVER_SMC911X	
#undef	CONFIG_DRIVER_CS8900	
#define CONFIG_DRIVER_SMC911X_BASE	0x18800300
#else
//注释掉下面3行
//#define CONFIG_DRIVER_CS8900	0	/* we have a CS8900 on-board */
//#define CS8900_BASE	  	0x18800300
//#define CS8900_BUS16		1 	/* the Linux driver does accesses as shorts */
//增加下面4行
#define CONFIG_DRIVER_DM9000                1
#define CONFIG_DM9000_BASE          0x18000000
#define DM9000_IO                   CONFIG_DM9000_BASE
#define DM9000_DATA                 (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT
//#define CONFIG_DM9000_DEBUG
#endif
2.303行
从环境变量中读取MAC地址
把((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);替换为:
  1. char *s, *e;  
  2. s = getenv ("ethaddr");  
  3. for (i = 0; i < 6; ++i)   
  4. {  
  5.     bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;  
  6.     if (s)  
  7.         s = (*e) ? e + 1 : e;  
  8. }  
char *s, *e;
s = getenv ("ethaddr");
for (i = 0; i < 6; ++i) 
{
	bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
	if (s)
		s = (*e) ? e + 1 : e;
}
3.修改318行,修改0x00为0xff
修改MAR寄存器(Multicast Address Register)的值,修正第一次收不到数据的错误
  1. for (i = 0, oft = 0x16; i < 8; i++, oft++)  
  2.     DM9000_iow(oft,0x00);  
  3.     //DM9000_iow(oft, 0xff);  
for (i = 0, oft = 0x16; i < 8; i++, oft++)
	DM9000_iow(oft,0x00);
	//DM9000_iow(oft, 0xff);
4.413行
注释掉下面2行
修正一直无法收到数据的错误,不要每次调用halt的时候都对PHY进行复位操作,否则会引起无法接受到数据的情况  
  1. void  
  2. eth_halt(void)  
  3. {  
  4.     DM9000_DBG("eth_halt\n");  
  5.   
  6.   
  7.     /* RESET devie */  
  8.     //phy_write(0, 0x8000); /* PHY RESET */   
  9.     //DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */   
  10.     DM9000_iow(DM9000_IMR, 0x80);   /* Disable all interrupt */  
  11.     DM9000_iow(DM9000_RCR, 0x00);   /* Disable RX */  
  12. }  
void
eth_halt(void)
{
	DM9000_DBG("eth_halt\n");


	/* RESET devie */
	//phy_write(0, 0x8000);	/* PHY RESET */
	//DM9000_iow(DM9000_GPR, 0x01);	/* Power-Down PHY */
	DM9000_iow(DM9000_IMR, 0x80);	/* Disable all interrupt */
	DM9000_iow(DM9000_RCR, 0x00);	/* Disable RX */
}
这里只是根据别人的文章进行实现,的确可行,但是具体为什么这么做还有些问题需要自己去弄明白.
相关文章
|
5天前
|
弹性计算 网络协议 Shell
自动优化Linux 内核参数
【4月更文挑战第29天】
5 1
|
4月前
|
存储 Ubuntu Linux
linux系统中固化和更新uboot、zImage和dtb方法(经典)
linux系统中固化和更新uboot、zImage和dtb方法(经典)
119 0
|
5月前
|
存储 安全 API
5.2 Windows驱动开发:内核取KERNEL模块基址
模块是程序加载时被动态装载的,模块在装载后其存在于内存中同样存在一个内存基址,当我们需要操作这个模块时,通常第一步就是要得到该模块的内存基址,模块分为用户模块和内核模块,这里的用户模块指的是应用层进程运行后加载的模块,内核模块指的是内核中特定模块地址,本篇文章将实现一个获取驱动`ntoskrnl.exe`的基地址以及长度,此功能是驱动开发中尤其是安全软件开发中必不可少的一个功能。
52 0
5.2 Windows驱动开发:内核取KERNEL模块基址
|
12月前
|
Linux
Linux 内核调试:指令追踪大法
Linux 内核调试:指令追踪大法
238 0
STM32最小系统使用FlyMcu烧写步骤
使用的是FlyMcu操作软件,首先搜索串口,点击搜索到之后选择,三个点选择即将要烧录的hex文件,找到STMISP,选择校验与编程后执行,将BOOT0置1(跳线帽变动),BOOT1不用管,下面选择DTR的低电平复位,RTS高电平进BootLoader,然后点击开始编程,如果软件无动作,可以按一下单片机上的按键,编程结束之后,将BOOT0置0。然后再按一下单片机中的按键及即可运行新程序了。
887 0
STM32最小系统使用FlyMcu烧写步骤
|
Linux 编译器 SoC
内核笔记](一)——设备树的概述(硬件、目标、效果、文件类型)
内核笔记](一)——设备树的概述(硬件、目标、效果、文件类型)
199 0
内核笔记](一)——设备树的概述(硬件、目标、效果、文件类型)
|
搜索推荐 Linux Windows
重编译LINUX内核调整SCTP参数的方法
经过在网络上用搜索引擎反复查找LINUX\SCTP相关资料,才发现LINUX内核2.6.18版本的SCTPINIT强制性添置ECN、ADAPTATION参赛,Forwrd TSN参数可以通过/proc/sys/net/sctp进行开关配置(0携带1不携带)。INIT_ACK消息则强制携带ECN、ADAPTATION参数。在找到这个结果之前经历了很多的误区,如修改LKSCTP、OPENSS7等。这些都是徒劳。
|
开发工具 内存技术
zynq程序固化补充篇: 不切换启动模式强制烧写
使用SDK2018.2第一次进行烧写 Flash,在qspi模式下会报错,只有切换至jtag模式下才可以进行烧录,后续的再次烧录不会出现类似问题。但是调试的时候必须切回jtag模式(将BOOT MODE 5拉低才可以调试)
1476 1
zynq程序固化补充篇: 不切换启动模式强制烧写
|
网络协议 Unix Linux
嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)
Uboot_Kernerl_Add_Watch_Dog:   U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM:  128 MiBCheck spi flash controller v350.
5036 0
|
Ubuntu Linux 数据安全/隐私保护
建立LINUX开发环境并编译LINUX和UBOOT以及生成设备树过程总结
建立LINUX开发环境并编译LINUX和UBOOT以及生成设备树过程总结