第一次移植uboot(3)(添加DM9000网卡支持)

上传人:泽*** 文档编号:76002678 上传时间:2022-04-17 格式:DOC 页数:19 大小:67KB
收藏 版权申诉 举报 下载
第一次移植uboot(3)(添加DM9000网卡支持)_第1页
第1页 / 共19页
第一次移植uboot(3)(添加DM9000网卡支持)_第2页
第2页 / 共19页
第一次移植uboot(3)(添加DM9000网卡支持)_第3页
第3页 / 共19页
资源描述:

《第一次移植uboot(3)(添加DM9000网卡支持)》由会员分享,可在线阅读,更多相关《第一次移植uboot(3)(添加DM9000网卡支持)(19页珍藏版)》请在装配图网上搜索。

1、第一次移植uboot(3)( 添加 DM9000 网卡支持 )/*在第二次移植基础上添加DM9000 网卡支持 */*交叉编绎工具/*默认当前目录为1. vi include/configs/fl2440.h(1) 注释 56 行 (#define CONFIG_DRIVER_CS8900 1),57 行(#define CS8900_BASE 0x19000300),58 (#define CS8900_BUS16 1)行(2) 添加 :#define CONFIG_DRIVER_DM90001#define CONFIG_DM9000_BASE 0x20000000选地址 */* 网卡片#

2、define DM9000_IO CONFIG_DM9000_BASE /*传输 I0 数据的地址 ,即 DM9000 的 CMD 引脚为低电平的地址 */#define DM9000_DATA(CONFIG_DM9000_BASE+4)/*传输 DATA 数据的地址 ,即 DM9000 的 CMD 引脚为高电平时的地址 */#define CONFIG_DM9000_USE_16BIT1/*网卡数据传输位数 */(3)84 行(CFG_CMD_NAND| /) 后添加 ;CFG_CMD_PING| /(4) 去掉注释 /*#define CONFIG_ETHADDR 08:00:3e:26:

3、0a:5b */(开发板 MAC 地址 )修改 CONFIG_IPADDR( 开发板 IP 地址 )和 CONFIG_SERVERIP( 主机 IP 地址 )2. 确认 board/fl2440/lowlevel_init.S中宏 B4_BWSCON定义为 (DW16)3. 网卡的 MAC 地址与你设置的不一样 ,解决办法 :(vi drivers/dm9000x.c)/* Initilize dm9000 board*/inteth_init(bd_t * bd)./* Set Node address */*for (i = 0; i < 6; i+)(u16 *) bd->b

4、i_enetaddr)i = read_srom_word(i);*/tekkamanninjachar *tmp = getenv (ethaddr);char *end;for (i=0; i<6; i+) bd->bi_enetaddri = tmp ? simple_strtoul(tmp, &end, 16) : 0;if (tmp)tmp = (*end) ? end+1 : end;/tekkamanninjaprintf(MAC: %02x:%02x:%02x:%02x:%02x:%02x/n,bd->bi_enetaddr0,bd->bi_en

5、etaddr1, bd->bi_enetaddr2, bd->bi_enetaddr3,bd->bi_enetaddr4, bd->bi_enetaddr5);.红色的字符是要做的修改:功能是屏蔽原有获取MAC 地址的语句,替换成从U Boot 的参数区读取数据并存到bd->bi_enetaddri中。 4. 会有“ could not establish link”的提示,而且在显示MAC 地址后很久后才响应,解决办法 : (vidrivers/dm9000x.c)/* Initilize dm9000 board*/inteth_init(bd_t * bd)

6、.DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);/* RX enable */DM9000_iow(DM9000_IMR, IMR_PAR);/* EnableTX/RX interrupt mask*/#if 0i = 0;while (!(phy_read(1) & 0x20) /*autonegation complete bit */udelay(1000);i+;if (i = 10000) printf(could not establish link/n);return 0;printf( li

7、nk=%d/n,i);/* see what weve got */lnk = phy_read(17) >> 12;printf(operating at );switch (lnk) case 1:printf(10M half duplex );break;case 2:printf(10M full duplex );break;case 4:printf(100M half duplex );break;case 8:printf(100M full duplex );break;default:printf(unknown: %d , lnk);break;printf

8、(mode/n);#endifreturn 0;红色的字符是要做的修改:功能是屏蔽无用的语句。其实被屏蔽的语句是MII 接口用的,放在这显然是错误的,无端的浪费了 10 秒钟。 5. 此时还是 PING 不通 ,解决办法 :注释掉eth_halt 函数的内容 .vi drivers/dm9000x.cvoid eth_halt(void)/DM9000_DBG(eth_halt/n);/* RESET devie */phy_write(0, 0x8000);/* PHY RESET */ DM9000_iow(DM9000_GPR, 0x01); Power-Down PHY */*/ DM

9、9000_iow(DM9000_IMR, 0x80); all interrupt */* Disable/DM9000_iow(DM9000_RCR, 0x00);/* DisableRX */6. 现在每回上电开发板第一次 PING 时还是 PING 不通 ,但从第二次开始就能 PING 通了,因为当使用PING 命令时才会掉用网卡初始化函数inteth_init(bd_t * bd),为了第一次就能PING 通可以先初始化下网卡:vi lib_arm/board.c(1) 文件头添加 :#ifdef CONFIG_DRIVER_DM9000extern int eth_init(bd_t

10、 * bd);#endif(2)void start_armboot (void)函数中 for 循环上面添加 :#ifdef CONFIG_DRIVER_DM9000eth_init(gd->bd);#endif(由于没有 ICMP 协议 ,所以主机PING 开发板是PING 不通的 )相关链接 :uboot-2009.08添加DM9000X网卡的支持移植 U 到友善之臂SBC2440V4( 补: DM9000网卡移植 )U BOOT DM9000驱动完全注释658搞了好几天就是不能通过网口下内核,明明ping主机都是通的,但是 ping 不通 VM 上的 ubuntu, 不过用 sn

11、iffit 抓包 ubuntu确实收到开发板发来的 ICMP 包了 ,并且也回复了 ICMP 包,今天才发现原来 FL2440 用的网卡是 DM9000AE, 而的网卡驱动是 DM9000 的 ,这两之间还是有些区别的 ,晕死啊 .再网上找到的解决办法是:无奈参考 Linux 内核中代码, 发现 Linux 的 dm9000 在 rx 函数中添加 do while 循环,于是按照 Linux 内核源码在 u-boot 中也添加 do while 循环。do/* Check packet ready or not */DM9000_ior(DM9000_MRCMDX); /* Dummy rea

12、d */rxbyte = DM9000_inb(DM9000_DATA); /* Got most updated data */if (rxbyte = 0)return 0;/* Status check: this byte must be 0 or 1 */if (rxbyte > 1) DM9000_iow(DM9000_RCR, 0x00); /* Stop Device */DM9000_iow(DM9000_ISR, 0x80); /* Stop INT request*/DM9000_DBG(rx status check: %d/n, rxbyte);DM9000_D

13、BG(receiving packet/n);/* A packet ready now & Get status/length */DM9000_outb(DM9000_MRCMD, DM9000_IO); /* */RxStatus = DM9000_inw(DM9000_DATA);RxLen = DM9000_inw(DM9000_DATA); /* */DM9000_DBG(rx status: 0x%04x rx len: %d/n, RxStatus, RxLen);/* Move data from DM9000 */* Read received packet fro

14、m RX SRAM */tmplen = (RxLen + 1) / 2;for (i = 0; i < tmplen; i+)(u16 *) rdptr)i = DM9000_inw(DM9000_DATA);/printf(%d ,(u16 *) rdptr)i);/* */if (RxStatus & 0xbf00) | (RxLen < 0x40)| (RxLen > DM9000_PKT_MAX) if (RxStatus & 0x100) printf(rx fifo error/n);if (RxStatus & 0x200) print

15、f(rx crc error/n);if (RxStatus & 0x8000) printf(rx length error/n);if (RxLen > DM9000_PKT_MAX) printf(rx length too big/n);dm9000_reset(); else /* Pass to upper layer */DM9000_DBG(passing packet to upper layer/n);NetReceive(NetRxPackets0, RxLen);/return RxLen;while (rxbyte = DM9000_PKT_RDY);/return 0;return RxLen;测试结果:大部分时候都可以ping 通了,因为有调试信息,tftp 速度十几 k。网上还有个建议在 tx 函数前加入以上内容清空 dm9000ae 寄存器DM9000_ior(DM9000_MRRH);DM9000_ior(DM9000_MRRL);我放在 do 的前面,貌似也有一定作用参考链接 :6410u-boot 移植 dm9000ae驱动6017.shtmldm9000ae在 u-boot 上的移植小结

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!