ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:21.66KB ,
资源ID:7981132      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7981132.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Uboot08支持DM9000.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Uboot08支持DM9000.docx

1、Uboot08支持DM9000这个移植要结合以下两篇文章u-boot-2009.08在mini2440上的移植u-boot-2009.08版本已经对CS8900、RTL8019和DM9000X等网卡有比较完善的代码支持(代码在drivers/net/目录 下),而且在S3C24XX系列中默认对CS8900网卡进行配置使用。而mini2440开发板使用的则是DM9000网卡芯片,所以只需在开发板上添 加对DM9000的支持即可。还有一点,以前的 U-boot 对于网络延时部分有问题,需要修改许多地方。但是现在的U-boot 网络部分已经基本不需要怎么修改了,只有在DM9000 的驱动和NFS 的

2、TIMEOUT 参数上需要稍微修改一下。 4.1,DM9000驱动代码修改【1】修改static int dm9000_init函数中部分代码,如果不修改这一部分,在使用网卡的时候会报“could not establish link”的错误。打开/drivers/net/dm9000x.c,定位到377行,修改如下:/* Activate DM9000 */* RX enable */DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);/* Enable TX/RX interrupt mask */DM9000_iow

3、(DM9000_IMR, IMR_PAR);#if 0 /default to link MII interfacei = 0;while (!(phy_read(1) & 0x20) /* autonegation complete bit */udelay(1000);i+;if (i = 1650) /printf(could not establish linkn);/return 0;break;#endif【2】对于NFS,增加了延时,否则会出现“* ERROR: Cannot mount”的错误。打开/net/nfs.c,定位到36行,修改如下:#if defined(CONFI

4、G_CMD_NET) & defined(CONFIG_CMD_NFS)#define HASHES_PER_LINE 65/* Number of loading hashes per line*/#define NFS_RETRY_COUNT 30#define NFS_TIMEOUT (CONFIG_SYS_HZ/1000*2000UL) /2000UL【3】添加网卡芯片(DM9000)的初始化函数打开board/samsung/mini2440/mini2440.c,定位到194行附近,文件末尾处,修改如下:int dram_init (void)gd-bd-bi_dram0.star

5、t = PHYS_SDRAM_1;gd-bd-bi_dram0.size = PHYS_SDRAM_1_SIZE;return 0;extern int dm9000_initialize(bd_t *bis);/implicit declaration of function dm9000_initialize#ifdef CONFIG_DRIVER_DM9000int board_eth_init(bd_t *bis)return dm9000_initialize(bis);#endif【4】添加串口 Xmodem 传输协议(可不修改)对于使用串口传输数据到内存的操作,有可能会用到Xmo

6、dem协议。但是原本的kermit协议传输就挺好用的,速度也比较快,所以可添加此功能。打开/common/cmd_load.c,定位到37行,修改如下:#if defined(CONFIG_CMD_LOADB)#if defined(ENABLE_CMD_LOADB_X)static ulong load_serial_xmodem (ulong offset);#endifstatic ulong load_serial_ymodem (ulong offset);#endif然后再定位到480行附近,修改如下:if (load_baudrate != current_baudrate) p

7、rintf (# Switch baudrate to %d bps and press ENTER .n,load_baudrate);udelay(50000);gd-baudrate = load_baudrate;serial_setbrg ();udelay(50000);for (;) if (getc() = r)break;#if defined(ENABLE_CMD_LOADB_X)if (strcmp(argv0,loadx)=0) printf (# Ready for binary (xmodem) download to 0x%08lX at %d bps.n,off

8、set,load_baudrate);addr = load_serial_xmodem (offset); else if (strcmp(argv0,loady)=0) #elseif (strcmp(argv0,loady)=0) #endifprintf (# Ready for binary (ymodem) download to 0x%08lX at %d bps.n,offset,load_baudrate);addr = load_serial_ymodem (offset);再定位到998行附近,修改如下:static int getcxmodem(void) if (ts

9、tc()return (getc();return -1;#if defined(ENABLE_CMD_LOADB_X)static ulong load_serial_xmodem (ulong offset)int size;char buf32;int err;int res;connection_info_t info;char xmodemBuf1024;ulong store_addr = 0;ulong addr = 0;size = 0;info.mode = xyzModem_xmodem;res = xyzModem_stream_open (&info, &err);if

10、 (!res) while (res =xyzModem_stream_read (xmodemBuf, 1024, &err) 0) store_addr = addr + offset;size += res;addr += res;#ifndef CFG_NO_FLASHif (addr2info (store_addr) int rc;rc = flash_write (char *) xmodemBuf,store_addr, res);if (rc != 0) flash_perror (rc);return (0); else#endifmemcpy (char *) (stor

11、e_addr), xmodemBuf,res); else printf (%sn, xyzModem_error (err);xyzModem_stream_close (&err);xyzModem_stream_terminate (false, &getcxmodem);flush_cache (offset, size);printf (# Total Size = 0x%08x = %d Bytesn, size, size);sprintf (buf, %X, size);setenv (filesize, buf);return offset;#endifstatic ulon

12、g load_serial_ymodem (ulong offset)再定位到1169行,修改如下:#if defined(CONFIG_CMD_LOADB)U_BOOT_CMD(loadb, 3, 0,do_load_serial_bin,load binary file over serial line (kermit mode), off baud n - load binary file over serial line with offset off and baudrate baud);#if defined(ENABLE_CMD_LOADB_X)U_BOOT_CMD(loadx,

13、 3, 0, do_load_serial_bin,load binary file over serial line (xmodem mode), off baud n - load binary file over serial line with offset off and baudrate baud);#endifU_BOOT_CMD(loady, 3, 0,do_load_serial_bin,load binary file over serial line (ymodem mode), off baud n - load binary file over serial line

14、 with offset off and baudrate baud);【5】修改配置文件,在mini2440.h中加入相关定义打开/include/configs/mini2440.h,定位到60行附近,修改如下:/* Hardware drivers*/#if 0#define CONFIG_DRIVER_CS89001/* we have a CS8900 on-board */#define CS8900_BASE0x19000300#define CS8900_BUS161 /* the Linux driver does accesses as shorts */#endif #d

15、efine CONFIG_NET_MULTI1#define CONFIG_DRIVER_DM9000 1#define CONFIG_DM9000_BASE 0x20000300 /网卡片选地址#define DM9000_IO CONFIG_DM9000_BASE#define DM9000_DATA (CONFIG_DM9000_BASE+4) /网卡数据地址#define CONFIG_DM9000_NO_SROM1/#define CONFIG_DM9000_USE_16BIT#undef CONFIG_DM9000_DEBUG注意:u-boot-2009.08 可以自动检测DM90

16、00网卡的位数,根据开发板原理图可知网卡的数据位为16位,并且网卡位于CPU的BANK4上,所以只需在 board/samsung/mini2440/lowlevel_init.S中设置 #define B4_BWSCON (DW16) 即可,不需要此处的 #define CONFIG_DM9000_USE_16BIT 1给u-boot加上ping命令,用来测试网络通不通/* Command line configuration.*/#include #define CONFIG_CMD_CACHE#define CONFIG_CMD_DATE#define CONFIG_CMD_ELF#de

17、fine CONFIG_CMD_NAND#define CONFIG_CMD_JFFS2 /* JFFS2 Support*/#define CONFIG_CMD_PING /*ping command support*/恢复被注释掉的网卡MAC地址和修改你合适的开发板IP地址以及内核启动参数:#define CONFIG_BOOTDELAY3#define CONFIG_ETHADDR08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0#define CONFIG_IPADDR10.1.0.129#define CONFIG_SERVE

18、RIP10.1.0.128#define CONFIG_GATEWAYIP10.1.0.1#define CONFIG_OVERWRITE_ETHADDR_ONCE/*#define CONFIG_BOOTFILEelinos-lart */定位到139行附近,加入使能串口传输数据到内存的操作:#define ENABLE_CMD_LOADB_X1 /使能串口传输数据到内存的操作#if defined(CONFIG_CMD_KGDB)#define CONFIG_KGDB_BAUDRATE115200/* speed to run kgdb serial port */* whats this

19、 ? its not used anywhere */#define CONFIG_KGDB_SER_INDEX1/* which serial port to use */#endif4.2,重新编译u-boot,下载到Nand中从Nand启动,查看启动信息和环境变量并使用ping命令测试网卡,操作如下:Enter your selection: aUSB host is connected. Waiting a download.Now, Downloading ADDRESS:30000000h,TOTAL:154934RECEIVED FILE SIZE: 154934 (151KB/

20、S, 1S)Downloaded file at 0x30000000, size = 154924 bytesWrite to flash ok: skipped size = 0x0, size = 0x25d2c. .nand 方式上电重启后:U-Boot 2009.08 ( 5鏈?09 2011 - 15:01:04)DRAM: 64 MBFlash: 2 MBNAND: 128 MiBIn: serialOut: serialErr: serialNet: dm9000u-bootMINI2440#显示下环境变量:u-bootMINI2440# printenvbootdelay=3

21、baudrate=115200netmask=255.255.255.0stdin=serialstdout=serialstderr=serialipaddr=10.1.129serverip=10.1.0.128ethact=dm9000Environment size: 141/131068 bytesping测试:u-bootMINI2440# ping 10.1.0.128dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 00:00:00:00:00:00operating at 100M

22、 full duplex mode* ERROR: ethaddr not setdm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 00:00:00:00:00:00operating at 100M full duplex modeping failed; host 10.1.0.128 is not alive需要设定IP地址和MAC地址u-bootMINI2440# setenv ipaddr 10.1.0.129u-bootMINI2440# setenv serverip 10.1.0.1

23、28u-bootMINI2440# setenv setenv ethaddr 12:34:56:78:9A:BCu-bootMINI2440# saveenvSaving Environment to NAND.Erasing Nand.Erasing at 0x4000000000002 - 0% complete.Writing to Nand. doneu-bootMINI2440#然后再进行ping测试:u-bootMINI2440# ping 10.1.0.128dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16

24、bit modeMAC: 12:34:56:78:9a:bcoperating at 100M full duplex modeUsing dm9000 deviceping failed; host 10.1.0.128 is not aliveu-bootMINI2440#可以看到,启动信息里面显示了Net:dm9000,printenv查看的环境变量也和include/configs/mini2440.h中设置的一致。但是现在有个问题就是ping不能通过。经过一段时间在网上搜索,原来有很多人都碰到了这种情况。出现问题的地方可能是DM9000网卡驱动中关闭网卡的地方,如是就试着修改代码如下

25、:打开drivers/net/dm9000x.c,定位到456行附近,屏蔽掉dm9000_halt函数中的内容:/* Stop the interface. The interface is stopped when it is brought.*/static void dm9000_halt(struct eth_device *netdev)#if 0DM9000_DBG(%sn, _func_);/* RESET devie */phy_write(0, 0x8000);/* PHY RESET */DM9000_iow(DM9000_GPR, 0x01);/* Power-Down

26、PHY */DM9000_iow(DM9000_IMR, 0x80);/* Disable all interrupt */DM9000_iow(DM9000_RCR, 0x00);/* Disable RX */#endif重新编译下载,nand启动,运行结果:u-bootMINI2440# ping 10.1.0.128dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 00:00:00:00:00:00operating at unknown: 0 mode* ERROR: ethaddr no

27、t setdm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 00:00:00:00:00:00operating at unknown: 0 modeping failed; host 10.1.0.128 is not aliveu-bootMINI2440# setenv gatewayip 10.1.0.1u-bootMINI2440# setenv ethaddr 12:34:56:78:9a:bc /MAC地址,随便设u-bootMINI2440# ping 10.1.0.128dm900

28、0 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 12:34:56:78:9a:bcoperating at unknown: 0 modeUsing dm9000 devicehost 10.1.0.128 is aliveu-bootMINI2440# saveenvSaving Environment to NAND.Erasing Nand.Erasing at 0x4000000000002 - 0% complete.Writing to Nand. doneu-bootMINI2440# pin

29、g 10.1.0.128dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 12:34:56:78:9a:bcoperating at unknown: 0 modeUsing dm9000 devicehost 10.1.0.128 is aliveu-bootMINI2440#结果,只是第一次ping不通,以后都是可以ping通的(据网友们说这是正常的)。4.3,tftp功能测试首先需要将友善官方移植好的有关mini2440的内核文件zImage_T35复制到linux 宿主机的/tftpboot目录下,因为u-boot默认的此目录,然后执行:u-bootMINI2440# tftp 0x

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1