您的位置:首页 > 运维架构 > Linux

Real6410移植linux-2.6.39.1记录(1)-启动cramfs根文件系统

2011-06-21 16:16 435 查看
// 主题:Real6410移植linux-2.6.39.1

// 作者:kevinjz2010@gmail.com

// 版权:kevinjz原创

// 平台:linux-2.39.1 real6410 (real6410开发板)

// 发布日期:2011-06-21

// 最后修改:2011-10-06

// 注意事项:欢迎转载,但不得在转载的时候擅自修改、删除文章的任何部分

//-------------------------------------------------------------------------------------------------



一、http://www.kernel.org/下载linux-2.6.39.1内核源码,解压至文件夹。
二、进入源码所在文件夹,对内核进行配置
$make menuconfig
将arch/arm/configs/s3c6400_deconfig拷贝至内核根目录,并修改根目录中的Makefile,将其中的
ARCH= arm
CROSS_COMPILE= arm-linux-
$make s3c6400_deconfig
以上即生成了s3c6410的默认配置,之后在次基础上进行修改。
修改内核中的机器识别码,/arch/arm/tools/mach-types.h,搜索6410,将其机器码改为1626(与u-boot中的匹配即可,也可一修改uboot中的机器码/include/configs/smdk6410.h
注:编译器采用gcc-4.5.1
三、添加SD驱动(参考华天正论坛上的移植方法):
1、首先,platform设备注册。修改arch/arm/mach-s3c64xx/mach-real6410.c文件
在其中加入:
&s3c_device_hsmmc0,
&s3c_device_hsmmc1,

staticstruct platform_device *real6410_devices[] __initdata ={//定义6410中的外设->platform_device结构体中的设备种类,各种外设的具体定义一般在plat文件夹中定义。
//其中包括外设的name,此值需要和相应外设驱动中platform_driver结构体中的name相对应,
//如nand的名称在arch/arm/plat-sumsang/dev-nand.h中
//定义为"s3c6410-nand",在驱动文件/drivers/mtd/nand/s3c_nand.c中对应为"s3c6410-nand"
//又如SD->hsmmc0外设,其name在arch/arm/plat-sumsang/dev-hsmmc.c中定义为"s3c-sdhci",
//在驱动文件drivers/mmc/host/sdhci-s3c.c中的platform_driver中对应为"s3c-sdhci"
//每个外设有其独有的资源->resource(包括寄存器资源以及中断资源,
//其中申明了外设在cpu寄存其中的地址范围以及中断种类,一般在plat文件夹中定义)
//每个外设有其独有的定义结构体(在plat文件夹中对应的头文件中定义)
&real6410_device_eth,
&s3c_device_hsmmc0,
&s3c_device_hsmmc1,
&s3c_device_fb,
&s3c_device_nand,
&s3c_device_adc,
&s3c_device_ts,
&s3c_device_ohci,
};

2、定义platdata,若要使用自定义数据,则在上面的文件中添加:
/*--------------------------------SD---------------------------------*/
/*staticstruct s3c_sdhci_platdata real6410_hsmmc0_pdata ={//该结构体位于plat/sdhci.h
.max_width= 4,
.cd_type= S3C_SDHCI_CD_INTERNAL,
};

staticstruct s3c_sdhci_platdata real6410_hsmmc1_pdata = {
.max_width= 4,
.cd_type= S3C_SDHCI_CD_PERMANENT,
};*/
若要使用内核默认设置数据,则在arch/arm/plat-samsung/dev-hsmmc(num).c中定义了,可以直接使用。

3、在real6410_machine_init函数中加入:
//--------------------------------若使用自定义,则添加如下--------------SD驱动初始化注册
// s3c_sdhci0_set_platdata(&real6410_hsmmc0_pdata);//该函数位于plat-samsung/dev-hsmmc(0~3).c中
// s3c_sdhci1_set_platdata(&real6410_hsmmc1_pdata);
//--------------------------------若使用默认定义则用以下的-----------------------------------
s3c_sdhci0_set_platdata(&s3c_hsmmc0_def_platdata);
s3c_sdhci1_set_platdata(&s3c_hsmmc1_def_platdata);
//实际经测试,此步骤可以省略,应该内核某处已经完成了这个任务,但我没有找到在哪里。

4、加入头文件
#include<plat/sdhci.h>
#include<linux/mmc/host.h>

5、在内核中添加配置中选择SD驱动
$make menuconfig,按REAL手册中的添加SD驱动
另外在filesystems->native
language support中,将defaultNLS option的值改为utf8,并选上NLSUTF-8以及nlsiso8859-1,simplechinene。

自此,SD驱动配置完成

四、添加nand驱动(参考华天正论坛上的移植方法),

1、在/arch/arm/mach-s3c64xx/mach-real6410.c中添加分区信息(不许要添加头文件)
structmtd_partition real6410_nand_part[] = {
#if0
{
.name= "Bootloader",
.offset= 0,
.size= (256*SZ_1K),
.mask_flags= MTD_CAP_NANDFLASH,
},
{
.name="Kernel",
.offset= (256*SZ_1K),
.size= (4*SZ_1M)-(256*SZ_1K),
.mask_flags= MTD_CAP_NANDFLASH,
},
#endif
{
.name= "cramfs",
.offset= (4*SZ_1M),
.size= (4*SZ_1M),
},
{
.name= "ubifs",
.offset= MTDPART_OFS_APPEND,
.size= MTDPART_SIZ_FULL,
},
};
2、定义,在上面的文件加入:
staticstruct s3c2410_nand_set real6410_nand_sets[] = {
[0]= {
.name ="nand",
.nr_chips =1,
.nr_partitions =ARRAY_SIZE(real6410_nand_part),
.partitions =real6410_nand_part,
},
};

staticstruct s3c2410_platform_nand real6410_nand_info ={//读写nand的时钟信息,在S3C6410手册中查找数据
.tacls =25,
.twrph0 =55,
.twrph1 =40,
.nr_sets =ARRAY_SIZE(real6410_nand_sets),
.sets =real6410_nand_sets,
};
<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->
3、在real6410_machine_init函数中加入:
//---------------------------------nand驱动初始化注册-----------------------------------------
s3c_nand_set_platdata(&real6410_nand_info);

4、配置内核
$make menuconfig
devicedriver->MTD support中选中
MTDpartitioning support、Commandline
partition table parsing、Cachingblock
device access to MTD devices、NANDDevice
Support、enableubi
在nanddevice
suppot中选中NANDFlash
support for Samsung S3C SoCs 、SamsungS3C
NAND driver debug、SamsungS3C
NAND Hardware ECC 。
此处需要注意:对上面几个选项查看帮助("?")发现它们是对2410进行配置的,所以需要nand驱动文件夹中的Kconfig,将/drivers/mtd/nand/Konfig修改,把对应选项的“2410”改成“S3C”,原因查看Makefile中的对应选项的config要求。
在filesystems->misc
filesystem-> 中加入cramfs、UBI的支持,可以参照real28内核的配置

5、将real641028内核中的/drivers/mtd/nand/s3c_nand.c拷贝之39内核的相应文件夹,并修改probe函数#ifdefined(CONFIG_MTD_NAND_S3C_HWECC)之前的部分,可以将友善38内核的相应部分复制过来。

6、编译cramfs文件系统
$sudo apt-get install cramfsprogs
拷贝REAL6410的cramfs系统源码,
$mkcramfs root_mkfs rootfs.cramfs

下载文件系统到开发板
7、修改内核启动参数
setenv bootargs noinitrd root=/dev/mtdblock0 console=ttySAC0 init=/linuxrcvideo=fb:AT070TN83






8、最后当然要检查一下内核选项,配置好之后编译下载;

9、至此,REAL6410已经能从CRAMFS文件系统启动了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: