当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。
分类: LINUX
2013-04-30 20:41:37
刚才我们是把内核下载到SDRAM中直接运行,现在我们把内核烧写进nandflash,明显的,我们需要对u-boot 添加nandflash支持.
通过前面我们可以看到我们需要提过对nandflahs
1,初始化
2,读
3,写
4,擦
这几种基本的操作
同时由于我们的代码要同时支持2410和2440 所以我们跟上面 nandflash裸机代码一样,准备了两套代码,然后又使用了个公共入口,公共入口和具体两套代码的哪一套关联起来,再初始化nandflash后以结构体赋值的形式确定.
修改1)
我们实现的代码在 cpu/arm920t/s3c24x0/nand_flash.c中,包括上面4个基本的操作,其中初始化的函数是 board_nand_init()
创建nand_flash.c文件,把代码写上
修改2)
修改所在目录下的makefile
COBJS = i2c.o interrupts.o serial.o speed.o \
usb_ohci.o nand_flash.o
添加红色的内容
修改3)
然后要添加NAND 操作命令
include/configs/btq2440.h
CFG_CMD_NAND
把这行的注释取消掉
然后就可以了.
修改4)
要在include/s3c24x0.h 中定义这个nandfalsh控制器的SFR的对应结构体
/* NAND FLASH (see S3C2440 manual chapter 6) */
typedef struct {
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCONT;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFMECCD0;
S3C24X0_REG32 NFMECCD1;
S3C24X0_REG32 NFSECCD;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFESTAT0;
S3C24X0_REG32 NFESTAT1;
S3C24X0_REG32 NFMECC0;
S3C24X0_REG32 NFMECC1;
S3C24X0_REG32 NFSECC;
S3C24X0_REG32 NFSBLK;
S3C24X0_REG32 NFEBLK;
} /*__attribute__((__packed__))*/ S3C2410_NAND;
在include/s3c2440.h 中定义取得这个SFR列表首地址的两个定西
一个是宏定义首地址
#define S3C2440_NAND_BASE 0x4E000000
一个是取得这个地址的函数
static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
{
return (S3C2440_NAND * const)S3C2440_NAND_BASE;
}
修改5)
需要在 include/configs/btq2440.h 中定义几个宏
最后添加
#define CFG_NAND_BASE 0
#define CFG_MAX_NAND_DEVICE 1
#define NAND_MAX_CHIPS 1
说说关于nandflash 代码的使用:
关于u-boot的使用,主要有两个
1)一个是我们烧写各种各样的内容到nandflash, 比如裸机代码(小于4KB的时候,比较好用),或者Linux内核,或者根文件系统
2)再一个是我们如果把u-boot烧写到nandfalsh,那么我们的u-boot启动的时候我们要使用CopyCode2SDRAM,把u-boot自身从nandflash拷贝到SDRAM中,这个可以看裸机代码那,也可以看其他的u-boot
研究一下
从新把u-boot 烧写进nor flash
启动后,下载内核
tftp 30000000 uImage
nand erase 0 200000 (把nand flash 0x0 – 0x200000 这2M的nandflash擦掉(前提是我们的uImage小于2M))
nand write.jffs2 30000000 0 $(filesize)
注意的是,write.jffs2这个是说明,我们写入的格式是jffs2,不是把jffs2写进去
写入的内容是第三个参数 ,这个地址处开始的内容..
重新开机,正常启动引导内核,还是在挂载根文件系统的时候失败了,继续走,我们搞根文件系统
Dahuanxihuopusa2013-05-09 16:56:40
MRX220517:楼主,我想知道
不同的根文件nand write.jffs2 30000000 0 $(filesize)
30000000这个地址怎么计算啊
这个30000000 是上一步,把根文件系统镜像下载到ram的 ram地址。
后面的0 是烧写到nandflash的地址。(从nandflash启示地址的偏移量,是个相对地址)
烧写的内容大小是后面的 $(filesize)