免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11532 | 回复: 3
打印 上一主题 下一主题

编写uboot下Nor Flash驱动的注意事项 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-23 11:02 |只看该作者 |倒序浏览
编写uboot下Nor Flash驱动的注意事项

Version: 0.8

Date:20090823

Author:crifan

Mail:green-waste(At)163.com



最近工作遇到的,走了点弯路,记录下来,也许能给其他人点帮助。也算是自己记录点东西,万一需要,以备后查。

Nor Flash中的一些术语】

1.
Bottom/Top Boot Sect(底部/顶部 启动块)

所谓的boot sect,是指的是Nor Flash和Nand Flash不太一样。Nand Flash从开始到最后,都是由同样大小的page所组成的。
Nor Flash,一般都是有个boot sect,好像是由于历史原因,常将Nor Flash用于作为存储启动代码的设备,也就是从Nor Flash启动,所以,这个boot sect块,专门设计出来,用于存放启动代码。如果详细解释,按照datasheet中的描述就是,第一个或最后一个,此处是bottom sect,所以是最后一个64KB大小的块,被分为4个独立的块。第一个16KB,用于少量的系统初始化代码。而2个8KB的块用于存储参数,余下的32KB的块叫做Main Block,用于存储应用程序的代码。

2.
Sector(扇区)

此处的sector(扇区)也就是flash里面的最小的擦除单位:块(block)。
所以sector count,也就是有多少个block。

3.
Sector Count (扇区数)和Sector List

此处的Nor Flash,M29W320DB,一共有正常的63个64KB的block,加上上面提到的原先是正常的1个64KB分成的4个小块,所以是63+4=67个。
而所谓的驱动中的sector list,也就是block list,代码注释写的也很清楚了:

ulong
start[CFG_MAX_FLASH_SECT];
/* physical sector start addresses */

用于存储每一个块的起始地址的。也是需要你驱动初始化的。对于这里的M29W320DB,也很简单了,从开始顺序加上块大小64K,直到最后3个,计算一下对应地址,填进去就可以了。

4.
Protect(写保护)

Nor Flash从软件的寄存器配置和硬件上,都提供了对应的保护机制,目的是,防止有意或无意间,把那些不希望被改动/删除的数据破坏了。比如有些机制把Flash的一些系统启动参数存储Nor Flash,或者是其他某种原因,只允许你使用部分Nor Flash的空间,所以,把这类需要保护的部分,在uboot的flash_info_t的结构体中,把对应的位设置成1:

uchar
protect[CFG_MAX_FLASH_SECT]; /* sector protection status
*/

这样,之后程序就可以避免有意无意的擦除有用的数据了。


【写Nor Flash驱动时的一些注意事项】
1.
位宽(bitwidth,X8/X16/X32

Nor Flash控制器,此处我这里用的是,ARM的PromeCell PL172,MPMC(MultiPort Memory Controller),可以接多种不同的存储设备,比如SRAM(Static Memory),Nor Flash,而其中又可以分别设置是否支持Page Mode,Extended wait和写保护(启用写保护,就可以看出是ROM了)等。
在硬件上MPMC和Nor Flash连接好了之后。在使用Nor Flash之前,要初始化MPMC。
这里说的,要注意位宽,是因为我开始就没注意到,所以,在开始初始化MPMC的时候,设置MPMCStaticConfig寄存器的时候,设置成了X16(16位),但是,后来去uboot中找到别人的Nor Flash的驱动(参考的是\board\oxc\flash.c),发出的命令去读ID,也都是X8(8位)的:

addr[0x0AAA] = 0xAA;


addr[0x0555] = 0x55;


addr[0x0AAA] = 0x90;

所以,导致读取Manufacture ID 和Device ID,都无法读正确,读的都是0xFF。后来重新去确认,在配置MPMCStaticConfig的时候,是配置的X16模式,然后再发命令,也对应的是按照X16模式发命令,可以参考:\board\mvs1\flash.c中的代码,读取ID时是:

addr[0x0555] = 0x00AA;


addr[0x02AA]= 0x0055;


addr[0x0555] = 0x0090;

才能正确读取到期望出的ID:

value = addr[0];
/* manufacturer ID
*/

读出来的是0x20h。

value = addr[1];
/* device ID
*/

读出来的是0x22CB
datasheet中的匹配:
Manufacturer Code: 0020h
Bottom Device Code M29W320DB: 22CBh

2.
不同位宽对应不同的时序

此处说的时序,也就是上面提到的,X8和X16发的地址,是不一样的,而且顺序也不同。
而且还有一小点要注意的是,记得转换地址成对应的类型:
X8是vu_char *
X16是 vu_short *
这样再写入对应的地址和数值,就可以了。

3.
reset命令

看了uboot中的代码,好像是其他设备,多数的reset命令,都是0xFF。
而这里用到的是STM(STMicroelectronics,后来好像改成Intel和ST合资的恒忆(Numonyx)了。。。)的 Nor Flash,M29W320DB (32 M, bottom boot sect)
,比较特殊些,是0xF0。


4.
boot sector的位置

刚刚看了下datasheet,很汗的是,本以为bottom sect是底部的sect,是地址最大的那个,结果datasheet中的是倒叙计算开始处的,也就是地址最大的那个块,是第一个块,所以,此处的boot sector 是块0-3:
# Size (KByte/KWord) Address Range(x8 )/ Address Range (x16)
66 64/32 3F0000h-3FFFFFh
1F8000h-1FFFFFh

。。。。。
。。。。。
3 32/16 008000h-00FFFFh
004000h-007FFFh

2 8/4
006000h-007FFFh
003000h-003FFFh

1 8/4
004000h-005FFFh
002000h-002FFFh

0 16/8 000000h-003FFFh
000000h-001FFFh


[ 本帖最后由 crifan 于 2009-8-23 11:04 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-05 11:06 |只看该作者
沙发

论坛徽章:
0
3 [报告]
发表于 2009-09-05 21:51 |只看该作者
原帖由 crifan 于 2009-8-23 11:02 发表
编写uboot下Nor Flash驱动的注意事项
Version: 0.8
Date:20090823
Author:crifan
Mail:green-waste(At)163.com


最近工作遇到的,走了点弯路,记录下来,也许能给其他人点帮助。也算是自己记录点东西, ...


如果你已经知道 FLASH 驱动怎么写,那么请使用 U-Boot 的 CFI 驱动。

论坛徽章:
0
4 [报告]
发表于 2009-09-19 20:42 |只看该作者

回复 #3 abutter 的帖子

我原先是直接用的CFI,发现识别出来的型号不对,所以又自己参照别人的写了个单独的驱动。
不过现在,不用这么麻烦了,找了个破解版本的Jlink,直接烧写Nor,使用起来,效果很好。呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP