Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1051368
  • 博文数量: 139
  • 博客积分: 1823
  • 博客等级: 上尉
  • 技术积分: 3403
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-05 09:54
文章存档

2014年(7)

2013年(16)

2012年(48)

2011年(68)

分类: 嵌入式

2011-09-07 21:01:21

从六月末就开始了UBOOT移植,开始遇到的问题就是DM9000移植不成功,开发板PING不能通主机,一PING主机,LCD屏就会出现一条黑线,接着慢慢变白。
我打开了DEBUG,但是无济于事,打开后仍然是:
  1. [u-boot@MINI2440]# ping 192.168.0.16
  2. dm9000_init
  3. resetting DM9000

一步步研究,发现是

DM9000_iow(DM9000_GPCR, 0x0);写IO,即把0写入DM9000_GPCR中会出现上述情况,又找到原型,分析了下:

 

  1. static void
  2. DM9000_iow(int reg, u8 value)
  3. {
  4. DM9000_outb(reg, DM9000_IO);
  5. DM9000_outb(value, DM9000_DATA);
  6. }
  7. #define DM9000_outb(d,r) ( *(volatile u8 *)r = d )

 

为什么一旦写DM9000的寄存器就会出现死机呢?

开始一直以为是DM9000的BASE没有选对,但是对照了光盘上带的VIVI查看,发现是0X19000300.(DM9000AEP的CS接nGCS3,CMD接LADDR2)

四处找资料,分析基址是怎么得来的。结果发现0X18000000到0X19FFFFFF都是可以对DM9000进行片选的。

今天终于运气来了,实然想知道DM9000是如何对寄存器进行读写的。百度了一篇很不错的文章,专门讲了一下DM9000的寄存器读写时序问题。文中谈到了移植DM9000驱动时要修改的三个地方:

修改BWSCON寄存器
修改BANKCON4寄存器
修改MAC信息

由于DM9000A没有用到WAIT信号,但在lowlevel_init.S中却定义了:

 

  1. #define B3_BWSCON (DW16 + WAIT + UBLB)

 

试着修改一下:

 

  1. #define B3_BWSCON (DW16)

 

然后make mini2440_config

make

下载到开发板上,竟然ping通了:

 

phy_read(0x1): 0x0
phy_read(0x1): 0x0
phy_read(0x11): 0x0
operating at unknown: 0 mode
Using dm9000 device
dm9000_send: length: 42

dm9000_send: 00: ff ff ff ff ff ff 08 08
dm9000_send: 08: 11 18 12 27 08 06 00 01
dm9000_send: 10: 08 00 06 04 00 01 08 08
dm9000_send: 18: 11 18 12 27 c0 a8 00 02
dm9000_send: 20: 00 00 00 00 00 00 c0 a8
dm9000_send: 28: 00 10
transmit done

receiving packet
rx status: 0x0001 rx len: 64
dm9000_rx: length: 64

dm9000_rx: 00: 08 08 11 18 12 27 00 16
dm9000_rx: 08: ec 36 45 36 08 06 00 01
dm9000_rx: 10: 08 00 06 04 00 02 00 16
dm9000_rx: 18: ec 36 45 36 c0 a8 00 10
dm9000_rx: 20: 08 08 11 18 12 27 c0 a8
dm9000_rx: 28: 00 02 00 00 00 00 00 00
dm9000_rx: 30: 00 00 00 00 00 00 00 00
dm9000_rx: 38: 00 00 00 00 ea 5a 8c 9a
passing packet to upper layer
dm9000_send: length: 42

dm9000_send: 00: 00 16 ec 36 45 36 08 08
dm9000_send: 08: 11 18 12 27 08 00 45 00
dm9000_send: 10: 00 1c 00 01 40 00 ff 01
dm9000_send: 18: fa 7c c0 a8 00 02 c0 a8
dm9000_send: 20: 00 10 08 00 f7 fe 00 00
dm9000_send: 28: 00 01
transmit done

receiving packet
rx status: 0x0001 rx len: 64
dm9000_rx: length: 64

dm9000_rx: 00: 08 08 11 18 12 27 00 16
dm9000_rx: 08: ec 36 45 36 08 00 45 00
dm9000_rx: 10: 00 1c 39 18 40 00 40 01
dm9000_rx: 18: 80 66 c0 a8 00 10 c0 a8
dm9000_rx: 20: 00 02 00 00 ff fe 00 00
dm9000_rx: 28: 00 01 00 00 00 00 00 00
dm9000_rx: 30: 00 00 00 00 00 00 00 00
dm9000_rx: 38: 00 00 00 00 8f 46 5b ac
passing packet to upper layer
host 192.168.0.16 is alive
[u-boot@MINI2440]#

 

OK了,终于OK了,就是这个问题。

但是回想起来,好像在移植UBOOT的文章中都没有提到要修改 BWSCON 的位宽。

 

后记:细心的朋友也许会发现,这是tekkaman的作品,对,是他老人家的。我自己也修改了一个UBOOT,但是也PING不通,以为是我自己不细心造成的,所以就在网上下载了他老人家的,起到对比的作用。

阅读(7387) | 评论(0) | 转发(5) |
给主人留下些什么吧!~~