对于我们这样的初学者来说,不懂的UBOOT的原理,或者只知道那么一点点儿很肤浅的知识,哪怕是一个小小的问题,就可能困扰你一天,甚至一个月。
从六月末移植UBOOT到现在,已经有2个多月的时间了,中间虽然学了LINUX设备驱动程序。但现在的情况是,移植的UBOOT只带DM9000A的驱动,USB驱动还未移植。不过在这过程中,我收获颇丰。下面一一列出在UBOOT移植过程中遇到的问题,以免自己在将来又犯上同样的错误,却苦苦等待着很简单的答案。
问题一:
按照《嵌入式LINUX之我行》的UBOOT移植方法,修改好代码以后,下载到NAND FLASH中,在输出以下文字后死机:
- U-Boot 2009.08 ( 9 11 2011 - 20:00:03)
- DRAM: 64 MB
- Flash: 512 kB
- NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!
- 64 MiB
- In: serial
- Out: serial
- Err: serial
解决方法:DM9000A网卡驱动有问题,下一个初始化的就是网卡驱动了。
问题二:
ping 192.168.0.16 主机时会死机,LCD屏会先出一道黑线,然后又全部变白。(这个问题困扰我达两月之久。起初以为是开发板有问题,然后送厂检修,果然网络不稳定。一个星期后,板回到我手中,再次ping,还是同样的问题,但是在WINCE下网络已经很稳定了,所以这次开发板是没有问题的了。其实找到解决这个问题的方法纯属意外,在某个论坛上浏览帖子时,发现别人描述的现象跟我的一样,那个前辈理解的比较深刻,提到可能是CPU占用过高,LCD屏刷新不过来。正是这个现象的描述,提醒了我:DM9000A的读写时序是什么样的?DM9000A是如何读取BUFFER中的数据的?)
解决方法:在某人的BLOG中找到了DM9000A的时序图(现已转载了我的BLOG),仔细研读:片选使能(nGCS)--》写命令使能(nOE)——》写命令全能结束--》片选使能结束。
首先,我的DM9000A的片选使能没有问题,其次检查片选使能后的Tcos,发现这里有问题,原来是没有设置BANK3上的位宽为16bit。由于网上比较流行的S3C2440开发板的DM9000的片选都是在BANK4上,而UBOOT默认的BANK4就是16bit的,所以不会出问题。
在board/samsung/my2440/lowlevel_init.S中修改#define B3_BWSCON (DW16)即OK。
问题三:
ping 主机的时候出现:operating at unknown: 0 mode。
解决方法:
/drivers/net/dm9000x.c
修改phy_read(int reg) 函数中的延时即解决,详细情况如下:
- /*
- Read a word from phyxcer
- */
- static u16
- phy_read(int reg)
- {
- u16 val;
- /* Fill the phyxcer register into REG_0C */
- DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);
- DM9000_iow(DM9000_EPCR, 0xc); /* Issue phyxcer read command */
- udelay(1000); //udelay(100); /* Wait read complete */
- DM9000_iow(DM9000_EPCR, 0x0); /* Clear phyxcer read command */
- val = (DM9000_ior(DM9000_EPDRH) << 8) | DM9000_ior(DM9000_EPDRL);
- /* The read data keeps on REG_0D & REG_0E */
- DM9000_DBG("phy_read(0x%x): 0x%x\n", reg, val);
- return val;
- }
未完待续……
阅读(659) | 评论(0) | 转发(0) |