***********************准备工作***************************
1, 硬件平台:S3C6410
软件平台:Fedora14/16 + arm-linux-gcc 4.2.2-eabi
2,下载linux-3.6.5.tar.bz2,解压源码到目录 urdir (你选择要放的目录,下同)
3,添加yaffs文件系统所需的准备。(独立完整的过程请参考:http://blog.csdn.net/cocoxiaomei/article/details/8498161)
1)下载源代码命令:git clonegit://www.aleph1.co.uk/yaffs2(@qingwu:一般在终端下都有git支持)
也可以在windows下用git工具下载(这里请注意:windows下的文件可能会出现回车换行的错误,比如^M不能识别等,可以参考:
http://blog.csdn.net/cocoxiaomei/article/details/8497929
2)yaffs源代码下载完后,进入yaffs2源代码目录,执行:#./patch-kernel.sh c m urdir/linux-3.6.5(其中c:复制代码 ,m:使用支持多版本代码)
因为我们选择的系统为mini6410,因此接下来的修改以及配置都是在此基础上的。
************************内核源码文件修改*******************************
4,进入解压后的内核源码目录 ,修改Makefile文件。
前者是对体系架构的定义,我们是arm平台。后者是交叉编译工具的选择。修改完成后保存退出。
5,执行 make s3c6400_defconfig,Makefile能够针对S3C6410做一系列默认配置
注:这个命令可能会出错,说没有s3c6410_defoncig的信息,如下:*** Can't find default configuration"arch/arm/configs/s3c6410_defconfig"!
这时可以执行:
[[email protected]]#cp arch/arm/configs/s3c6400_defconfig .config,然后再运行:
[root@localhost linux-3.6.5]# make s3c6400_defconfig 。【注:这里我用的s3c6400,因为目录下只有6400跟6410最近。】
6,修改flash分区信息(line121 of mach-mini6410.c),设置成跟bootloader中的分区信息一致。
[root@localhost linux-3.6.5]# vim arch/arm/mach-s3c64xx/mach-mini6410.c
结构体 mtd_partition mini6410_nand_part[]保存了nand flash的分区信息,修改如下:
static structmtd_partition mini6410_nand_part[] = {
[0] = {
.name = "uboot",
.size = SZ_1M,
.offset = 0,
},
[1] = {
.name ="kernel",
.size = SZ_2M,
.offset = SZ_1M,
},
[2] = {
.name ="rootfs",
.size = SZ_1M * 0x30,
.offset = SZ_1M + SZ_2M,
},
[3] = {
.name ="file_system",
.size =MTDPART_SIZ_FULL,
.offset = SZ_1M * 0x33,
},
};
修改之后分区情况就如下表所示:
表3-1 NAND FLASH分区表
*******************************内核配置界面************************************
7,在内核源码目录执行:make menuconfig,进入内核配置界面(如图):
插播:我在fedora16下运行这一步,报错如下:
|
解决办法:yum install ncurses-devel,安装完之后 make menuconfig,就能进入正常配置界面了。
接下来按照自上而下的顺序进行配置
******************************内核配置过程*************************************
1,System Type:
有很多板级相关的配置选项,可以根据自己的需要选择合适的系统,这里我选择mini6410。
注意:S3C64XXDMA下只能选一个,多选可能会出现板级直接的兼容问题。
2,Device Drivers
2.1)<*> Memory Technology Device (MTD) support:
Caching block device access to MTD devices选项在mtdblock会用到。
进入NAND Device Support下,选择 NAND Flash support for Samsung S3C SoCs
2.2)SCSI device support:SCSI disk support(必选,听说这个是u盘挂载后sd[a]的全称)
2.3)Generic HID driver
进入USB HID support,选择USB HID transport layer。
2.4)USB support,其中 USB Monitor(也可以不选),
USB Mass Storage support(必选):挂载u盘不成功跟这个有关,例如出现错误:
yaffs: dev is 8388609 name is "sda1" rw
yaffs: passed flags ""
3,File systems
3.1)yaffs support
注:之前已添加yaffs文件系统支持,若是在文件系统配置界面中发现没有yaffs的配置选项.
解决办法:在配置界面,查找/yaffs,找到如图的说明:
图中,其中[]内的参数是对应选项当前的状态,要让yaffs_fs选项为[y],依赖于MISC_FILESYSTEMS和
MTD_BLOCK同时为[y],进行相应设置即可。
3.2)VFAT (Windows-95) fs support
这里添加vfat文件支持,解决插入u盘有反应,可以出现sd[a],但是没有设备名(sd[a])的问题 。
4,Nativelanguage support:
这里解决mount时可能的出错:[root@(none) /]# mount -t vfat /dev/sda1 /tmp/sd/
FAT-fs (sda1): IO charset iso8859-1 not found
mount: mounting /dev/sda1 on /tmp/sd/ failed: Invalid argument
*********************内核编译问题及解决办法*********************
1,在源码目录执行make的过程中出现一系列与yaffs有关的错误:
[[email protected]]#make
fs/yaffs2/yaffs_vfs.c:2216:error: 'struct super_block' has no member named 's_dirt'
……
fs/yaffs2/yaffs_vfs.c:2507:error: 'struct mtd_info' has no member named 'sync'
原因是内核版本过高,最新的yaffs2文件也会有版本之间细节不匹配的问题。解决办法请参考:
http://blog.csdn.net/cocoxiaomei/article/details/8498161
2,make。在最终会在arch/arm/boot/目录下生成内核镜象zImage。
**********烧录内核到开发板,可能出现的问题及解决办法********
1,烧录内核到开发板的过程中可能会出现下面的报错:
List of all partitions:
把chip->ecc.mode=NAND_ECC_SOFT 改为chip->ecc.mode=NAND_ECC_NONE。
2,挂载u盘没反应,或者内核启动时出现错误提示:
s3c2410-ohcis3c2410-ohci: startup error -75(或error -62)
原因是时钟没有打开。解决办法:
1)在 arch/arm/mach-s3c64xx/mach-mini6410.c文件中添加头文件:
#include
#include
#include
2)在该文件的mini6410_machine_init()函数中增加下列代码:
/* clock source: 48MHz XTAL */
__raw_writel(__raw_readl(S3C_CLK_SRC) & (~(0x3 << 5)), S3C_CLK_SRC);
__raw_writel(__raw_readl(S3C_CLKREG(0x900))|(1<<16), S3C_CLKREG(0x900));
__raw_writel(0x0, S3C_PHYPWR);
__raw_writel(0x0, S3C_PHYCLK);
__raw_writel(0x1, S3C_RSTCON);
udelay(50);
__raw_writel(0x0, S3C_RSTCON);
udelay(50);
__raw_writel(__raw_readl(S3C_CLK_DIV1) & ~(0xF << 20), S3C_CLK_DIV1);
__raw_writel(__raw_readl(S3C_HCLK_GATE) | S3C_CLKCON_HCLK_UHOST |S3C_CLKCON_HCLK_SECUR, S3C_HCLK_GATE);
__raw_writel(__raw_readl(S3C_SCLK_GATE) | S3C_CLKCON_SCLK_UHOST,S3C_SCLK_GATE);
*****整理笔记绝对是力气活----by qingwu---end*****