返回信息流硬件上由于44B0地址线A1与SST39VF1601地址线A0连接,因此这个地址要左移1位:
所以我修改为
#define CFG_FLASH_ADDR0 (0x5555<<1)/* 1st address for flash config cycles */
#define CFG_FLASH_ADDR1 (0x2AAA<<1)/* 2nd address for flash config cycles */
这时结果出错:
Unknown flash on bank 0
如果不修改的话,就正常
这是为什么呢?
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #3501同步于 2009/1/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
uboot移植flash问题
DGrayman
2009/1/7镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
你说地址线A1与flash芯片的A0连接?是不是说反了?
我们虽然不是这个板子,但是我们板子上是CPU的A0和flash的A1连接的。因为flash工作于x16模式,因此flash的A0可以不用(A0用于x8模式下Byte选择)
这个再查查原理图对照一下吧。
至于你说的出错“Unknown flash”,可能是由于flash基地址配置错误后,无法正确的读到flash的CHIPID,因此flash驱动报错说型号不明。
我查过电路图了,确实是CPU的A1连接flash的A0;
而之所以没有左移我也弄懂了,原因如下:
#define CFG_FLASH_WORD_SIZE unsigned short
volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *)addr;
addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA;
因为使用了指针,就巧妙地进行了移位处理,也更加便于移植。
【 在 DGrayman 的大作中提到: 】
: 硬件上由于44B0地址线A1与SST39VF1601地址线A0连接,因此这个地址要左移1位:
: 所以我修改为
: #define CFG_FLASH_ADDR0 (0x5555<<1)/* 1st address for flash config cycles */
: ...................
地址是不需要偏移的,空出来一个地址就是为了字节对齐,比如这个图里的,用一个地址读出的数据是32位(正常一个地址对应一个字节,也就是8位),因此地址线要空两位,保证地址+4的时候再读下32位(也就是下四个字节),你偏移了反而没有这种效果了
flash的A0确实总是空着的,不知道为什么,不要想当然认为cpu和flash的地址线是0-0 1-1这样对样的,完全不是这样的.
【 在 DGrayman 的大作中提到: 】
: 我查过电路图了,确实是CPU的A1连接flash的A0;
: 而之所以没有左移我也弄懂了,原因如下:
: #define CFG_FLASH_WORD_SIZE unsigned short
: ...................
你的说明我怎么看不懂?
由于SST39VF1601每个可寻址的单元是16位的,即2字节,而CPU一个地址对应的是一个字节,所以CPU的A1应该接Flash的A0,即CPU访问两个连续的两个字节对于SST39VF1601来说实际上是一个单元,字节的区分只有靠字节屏蔽引脚或软件来处理了。在CPU编程方面其实是透明的,这只是硬件设计人员应该考虑的问题。
不知这样的回答楼主是否满意?
【 在 DGrayman 的大作中提到: 】
: 我查过电路图了,确实是CPU的A1连接flash的A0;
: 而之所以没有左移我也弄懂了,原因如下:
: #define CFG_FLASH_WORD_SIZE unsigned short
: ...................
这个“而之所以没有左移我也弄懂了,原因如下:”,我翻来覆去看了3遍才大概看明白你的意思。
你是说,CFG_FLASH_ADDR0作为下标使用,实际访问的地址换算时需要乘2(因为是short类型的),也就相当于左移一位了。
因此CPU的A1接在flash的A0上也就说的通了:由于使用short类型指针进行操作,总线地址变化的颗粒度总是2字节,于是CPU的A0也就不要了。
没理解错吧?
【 在 proakis 的大作中提到: 】
: 由于SST39VF1601每个可寻址的单元是16位的,即2字节,而CPU一个地址对应的是一个字节,所以CPU的A1应该接Flash的A0,即CPU访问两个连续的两个字节对于SST39VF1601来说实际上是一个单元,字节的区分只有靠字节屏蔽引脚或软件来处理了。在CPU编程方面其实是透明的,这只是硬件设计人员应该考虑的问题。
: 不知这样的回答楼主是否满意?
同意这个说法;也就是因为这样,所以我开始就认为应该对擦写指令地址要左移一位,这样正好对准flash的地址指令,也因此将include/configs/myboard.h中的读写指令修改成:
#define CFG_FLASH_ADDR0 (0x5555<<1)
但是后来发现,在访问flash时是用这种下面所示的方式访问的:
addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA;
原以为这个时侯CPU的地址线信号为addr2+CFG_FLASH_ADDR0,其实不然,这个时候地址线信号应该为
addr2+CFG_FLASH_ADDR0<<1
【 在 hobby 的大作中提到: 】
: 这个“而之所以没有左移我也弄懂了,原因如下:”,我翻来覆去看了3遍才大概看明白你的意思。
: 你是说,CFG_FLASH_ADDR0作为下标使用,实际访问的地址换算时需要乘2(因为是short类型的),也就相当于左移一位了。
: 因此CPU的A1接在flash的A0上也就说的通了:由于使用short类型指针进行操作,总线地址变化的颗粒度总是2字节,于是CPU的A0也就不要了。
: ...................
就是这个意思,也就是说CPU的A0线未接,也就是一个地址对应着一个16bit,对吗?
这样的话,软件中访问0x0000_0000,将能读到一个16bit的数据么?
【 在 DGrayman 的大作中提到: 】
: 就是这个意思,也就是说CPU的A0线未接,也就是一个地址对应着一个16bit,对吗?
: 这样的话,软件中访问0x0000_0000,将能读到一个16bit的数据么?
根据你接了多少根数据线,8位数据线就不需要偏移,16位数据线a0就空着,32位数据线a0 a1都要空着