前提:
norflash初始化正常,能够正常从nor上执行。
我们将板子设为nor启动,那么0地址对应nor,我们先将uboot烧写到nor中。我们先看下这款NorFlash的手册,找到操作flash的命令表:
nor命令表.png
下面简单的举一些例子:
复位(reset):
往任何一个地址写入F0即可。
读ID:
很多的Nor Flash可以配置成位宽16bit(Word),位宽8bit(Byte),我们这款norflash数据位宽为16bit。下面我们按照nor手册尝试一下:
往地址555H写入AAH(解锁)
往地址2AAH写入55H(解锁)
往地址555H写入90H(命令)
读0地址得到厂家ID(C2H)
读1地址得到设备ID(22DAH或225BH)
退出读ID状态(给任意地址写F0H就可以了)
上面的地址是对于norflash的,那么我们CPU要怎么发送地址呢?
从上面原理图我们知道CPU和nor的地址是错位相连的,也就是:
比如:
cpu地址 | nor地址 |
---|---|
A15~A1 | A14~A0 |
那么可以看到cpu的地址实际相当于是nor地址左移了一位,那么比如要想给nor上的555H地址写入AAH,那么CPU要发出的地址应该为0x555<<1,也就是nor地址的2倍。
下面对在Nor Flash的操作,cpu的操作,U-BOOT上的操作进行比较,如下表:
Nor Flash的操作 | cpu的操作 | U-BOOT上的操作 |
---|---|---|
往地址555H写入AAH(解锁) | 往地址AAAH写入AAH(解锁) | mw.w aa aaa |
往地址2AAH写入55H(解锁) | 往地址554H写入55H(解锁) | mw.w 554 55 |
往地址555H写入90H(命令) | 往地址AAAH写入90H(命令) | mw.w aaa 90 |
读0地址得到厂家ID(C2H) | 读0地址得到厂家ID(C2H) | md.w 0 1 (1:表示读一次) |
读1地址得到设备ID(22DAH或225BH) | 读2地址得到设备ID(22DAH或225BH) | md.w 2 1 |
退出读ID状态(给任意地址写F0H) | 退出读ID状态(给任意地址写F0H) | mw.w 0 f0 |
readId.png
读数据:
前面我们说过, nor可以像ram一样的读,所以只要做好内存控制器的初始化工作就可以直接读了。
readdata.png
读属性:
通常内核里面要识别一个 Nor Flash 有两种方法:
一种是 jedec 探测,就是在内核里面事先定义一个数组,该数组里面放有不同厂家各个芯片的一些参数,探测的时候将 flash 的 ID 和数组里面的 ID 一一比较,如果发现相同的,就使用该数组的参数。 jedec 探测的优点就是简单,只要通过flash的数组编号,即可访问该款flash属性,缺点是如果内核要支持的 flash 种类很多,这个数组就会很庞大。
一种是 CFI(common flash interface)探测,就是直接发各种命令来读取芯片的信息,比如 ID、容量等,芯片本身就包含了电压有多大,容量有有多少等信息。
我们的这款norflash属于cfi探测,下面对在Nor Flash上操作,2440上操作,U-BOOT上操作cfi 探测(读取芯片信息)进行比较参考芯片手册。
Nor Flash上操作cfi | 2440上操作cfi | U-BOOT上操作cfi |
---|---|---|
往55H地址写入98H(进入cfi模式) | 往AAH地址写入98H | mw.w aa 98 |
读地址10H得到0051(‘q‘) | 读地址20H得到0051 | md.w 20 1 |
读地址11H得到0052(‘r‘) | 读地址22H得到0052 | md.w 22 1 |
读地址12H得到0059(‘y‘) | 读地址24H得到0059 | md.w 24 1 |
读地址27H得到容量 | 读地址4EH得到容量 | md.w 4e 1 |
我们之前讲过norflash可以像内存一样,用md命令直接读取,不能像内存一样直接写,那么
s3c2440裸机-内存控制器(三-3、norflash编程之uboot中操作norflash)
原文:https://www.cnblogs.com/fuzidage/p/12877760.html