ddd
全部博文(22)
分类: 嵌入式
2010-05-29 19:01:41
(1)如果在启动时,
U-boot
打印出:
“Warning - bad CRC, using default environment”
,说明
U-boot
没有在存放
ENV
的固态存储器中找到有效的
ENV
,只好使用编译时定义的默认
ENV
。如果
U-boot
存放
ENV
的固态存储器的驱动是没问题的,那只要运行
saveenv
就可以把当前系统的所有
ENV
写入固态存储器,下次启动就不会有这个警告了。
ENV
可以放在多种固体存储器中,对于
mini2440
来说
Nor Flash
、
Nand Flash
或
EEPROM
都可以,这依赖
include/configs
下的配置文件是如何定义的。例如:
Nor Flash
:
#define CONFIG_ENV_IS_IN_FLASH 1
#define CONFIG_ENV_OFFSET 0X40000
#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
Nand Flash
:
#define CONFIG_ENV_IS_IN_NAND 1
#define CONFIG_ENV_OFFSET 0X40000
#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
EEPROM
:
#define CONFIG_ENV_IS_IN_EEPROM 1 /* use EEPROM for environment vars */
#define CONFIG_ENV_OFFSET 0x000 /* environment starts at offset 0 */
#define CONFIG_ENV_SIZE 0x400 /* 1KB */
CONFIG_ENV_OFFSET
:是在整个存储器中的偏移地址;
CONFIG_ENV_SIZE
:是指用来保存
ENV
的分区大小。
注意
CONFIG_ENV_OFFSET
和
CONFIG_ENV_SIZE
的设置,请不要覆盖了其他分区
(2) Uboot.bin
文件是可执行的二进制代码文件。我们重点是讲描
.bin
文件的组成。我们把可执行文件分为两种情况:分别为存放态和运行态。
1.
存放态
存放态是指可执行文件通过
fromelf
产生后
,
在存储介质
(flash
或磁盘
)
上的分布
.
此时可执行文件一
般由两部分组成:分别是代码段和数据段。代码段又分为可执行代码段
(.text)
和只读数据段
(.rodata),
数据段又分为初始化数据段
(.data)
和未初始化数据段
(.bss)
。可执行文件的存放态如下:
+----------------+-----------
| .bss |
+---------------+--
数据段
| .data |
+---------------+-----------
| .rodata |
|__________|
代码段
| .text |
+-------------+-----------
2.
运行态
可执行文件通过装载过程
,
搬入到
RAM
中运行
,
这时候可执行文件就变成运行态。在对可执行代码各段有另一个名称:
| ... |
+-------------+-----------
| .bss | ZI
段
+-------------+--
数据段
| .data | RW
段
+-------------+-----------
| .rodata |
|_____________|
代码段
(RO
段
)
| .text |
+-------------+-----------
| ... |
装载前
当可执行文件装载后
,
在
RAM
中的分布如下:
| ... |
+-------------+-- ZI
段结束地址
| ZI
段
|
+-------------+-- ZI
段起始地址
|
保留区
2 |
+-------------+-- RW
段结束地址
| RW
段
|
+-------------+-- RW
段起始地址
|
保留区
1 |
+-------------+-- RO
段结束地址
| RO
段
|
+-------------+-- RO
段起始地址
| ... |
装载后
所以装载过程必须完成把执行文件的各个段从存储介质上搬到
RAM
指定的位置。而这个装载过程由谁来完成呢?由我们的启动程序来完成
.
(3)nandflash芯片内部存储布局及存储操作特点
一片
Nand flash
为一个设备
(device),
其数据存储分层为:
1
设备
(Device) = 4096
块
(Blocks)
1
块
(Block) = 32
页
/
行
(Pages/rows) ;
页与行是相同的意思
,
叫法不一样
1
页
(Page) = 528
字节
(Bytes) =
数据块大小
(512Bytes) + OOB
块大小
(16Bytes)
在每一页中,最后
16
个字节(又称
OOB
)用于
Nand Flash
命令执行完后设置状态用,剩余
512
个字节又分为前半部分和后半部分。可以通过
Nand Flash
命令
00h/01h/50h
分别对前半部、后半部、
OOB
进行定位通过
Nand Flash
内置的指针指向各自的首地址。
存储操作特点:
1.
擦除操作的最小单位是块。
2. Nand Flash
芯片每一位
(bit)
只能从
1
变为
0
,而不能从
0
变为
1
,所以在对其进行写入操作之前要一定将相应块擦除
(
擦除即是将相应块得位全部变为
1).
3. OOB
部分的第六字节
(
即
517
字节
)
标志是否是坏块,如果不是坏块该值为
FF
,否则为坏块。
4.
除
OOB
第六字节外,通常至少把
OOB
的前
3
个字节存放
Nand Flash
硬件
ECC
码
寻址方式
Samsung K
片内寻址采用
26
位地址形式。从第
0
位开始分四次通过
I/O0
-
I/O7
进行
传送,并进行片内寻址。具体含义如下:
0
-
7
位:字节在上半部、下半部及
OOB
内的偏移地址
8
位:值为
0
代表对一页内前
256
个字节进行寻址
值为
1
代表对一页内后
256
个字节进行寻址
9
-
13
位:对页进行寻址
14
-
25
位:对块进行寻址
当传送地址时
,
从位
0
开始