本文转自:http://www.arm32.com/post/11017.html
上接:[Linux学习内核移植相关笔记第1部分
注意1):本小节假定您已经按照前面的方法安装了 USB 驱动, 并把开发板设置为 NOR
Flash 启 动 ,系 统 更新和安装完 毕 请 设 置为 Nand Flash 启 动。
注意1)配置好上面的基本配置后的内核并编译产生 zImage 后,并且烧到板上(烧到哪里?根据友善的资料知道,把友善开发板拨到 NorFlash 方式启动,然后根据 supervivi 在串口上的提示,可以烧写到SDRAM ( 我的开发板是64M SDRAM,64M NandFlash,2M NorFlash友善P12)中,然后启动系统看效果,也可以烧写到 NandFlash 中,然后启动系统看效果)
(可以正常引导(运行)后,下一步需要做什么?
需要在 linux 中添加NandFlash 的驱动(即需要对编译好 linux 内核完善下,再编译产生 zImage,
具体如何完善,参考“天嵌Linux手册”pdf 文档的 P30-P34,其实过程也是很简单,就是完善下 linux 内核对各种容量的 NandFlash 的驱动支持,然后用#make menuconfig 进入配置单,把已经完善的 NandFlash 配置选型添加到该配置单即可)。
再次编译的 zImage,重新烧写到开发板中并启动,在启动信息里面将会比上次编译的zImage 多了写 NandFlash 的信息。下面就是如何完善内核的NandFlash驱动)。
第6步:完善内核的NandFlash驱动(这一部分在天嵌linux手册P30有更详细描述)
进行 Nand Flash 的移植,其实在 linux 里面已经做好了 Nand Flash 的驱动,我们只需要进行修改就可以使用了。
修改内核源码“arch/arm/plat-s3c24xx/common-smdk.c”文件,在 109 行左右,有一个结构体名为:
smdk_default_nand_part[], 要跟bootloader的一致。在我的板子中修改如下所示:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "QinziqiangBoot",
.size = 0x000000030000,
.offset = 0,
},
[1] = {
.name = "QinziqiangKernel",
.offset = 0x000000050000,
.size = 0x000000200000,
},
[2] = {
.name = "QinziqiangRoot",
.offset = 0x000000250000,
.size = 0x000003DAC000,
},
};
然后修改 Nand Flash 的读写匹配时间,修改 common-smdk.c 文件的刚刚修改后的大概 140 行左右的smdk_nand_info 结构体,修改内容如下: (红色部分所示,这个步骤可以不用做)
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 10,
.twrph0 = 25,
.twrph1 = 10,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
附:参考 天嵌Linux手册文档的 P31-P32 大
致了解到,
uboot,kernel,yaffs2 通常占用多少 Flash
64M 的 NandFlash 分区情况
boot: 0x00000000 ---0x00020000 大小共:0x00020000 256K
Kernel: 0x00200000 ---0x00040000 大小共:0x00400000 2M
Yaffs2: 0x00400000 --- 0x03FF8000 大小共:0x03BF8000 60M
128M 的 NandFlash 分区情况
boot: 0x00000000 ---0x00020000 大小共:0x00020000 256K
Kernel: 0x00200000 ---0x00040000 大小共:0x00400000 2M
Yaffs2: 0x00400000 ---0x07FA0000 大小共:0x07BA0000 123.7M
256M—1G 的 NandFlash 分区情况
boot: 0x00000000 ---0x00020000 大小共:0x00020000 256K
Kernel: 0x00200000 ---0x00040000 大小共:0x00400000 2M
Yaffs2: 0x00400000 ---0x0FF80000 大小共:0x0FB80000 251.5M
剩余的部分供用户使用。
第7步:完善内核:添加对应的NandFlash驱动配置
然后需要在刚刚完成的配置单中添加上对 Nand Flash 支持的配置选项,输入:
#make menuconfig,进入配置单选项,然后配置如下所示:
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<> RedBoot partition table parsing
[] Command line partition table parsing
<*> Direct char device access to MTD devices
-*- Common interface to block layer for MTD 'translation layers
<*> Caching block device access to MTD devices
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[*] S3C2410 NAND Hardware ECC
Nand Flash Capacity select (256MB~1GB Nand for EmbedSky Board) --->
说明 1:上面绿色部分的选项只有一种情况下才能选择:Linux-2.6.30.4 内核+256MB 以及更大容量的Nand Flash 时才能选择; 对于其他版本的 Linux 内核不管是不是 256MB 的 Nand Flash 都不需要选择该选项 (我是没选)。
说明 2:上面红色部分是我们需要选择的 Nand Flash 的容量,请更加实际情况进行选择,下面列出了。
它的配置选项,带 X 的就是被选中的:
( ) 64MB Nand for EmbedSky Board
( ) 128MB Nand for EmbedSky Board
(X) 256MB~1GB Nand for EmbedSky Board
这里列出各个 Nand Flash 容量判别方式:
K9F1208U0C 是 64MB 的 Nand Flash;
K9F1G08U0A 是 128MB 的 Nand Flash;
K9FXG08U0A 是 256MB 到 1GB 的 Nand Flash(其中 X=2、4、8)
配置完毕这些之后,保存配置单。
请根据您所使用的开发板的情况进行配置。
第8步:在次编译内核
# make clean
再次
#make zImage
并查看驱动的使用情况
然后再编译出镜像,然后烧写到开发板,,你可以在打印信息中看到刚刚做好的 Nand Flash
的分区信息。
下面是我开发板运行后的部分结果(从中可以看到“QinziqiangBoot”, "QinziqiangKernel"
, "QinziqiangRoot"):
........
Bad eraseblock 3773 at 0x000003af4000
Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x000000000000-0x000000030000 : "QinziqiangBoot"
0x000000050000-0x000000250000 : "QinziqiangKernel"
0x000000250000-0x000003ffc000 : "QinziqiangRoot"
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
yaffs: block 3625 is marked bad
block 3626 is bad
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:2.
Freeing init memory: 120K
......
下接:[Linux学习内核移植相关笔记第3部分