首页 / 操作系统 / Linux / Real6410移植Linux-2.6.39.1记录
// 主题:Real6410移植linux-2.6.39.1
// 作者:kevinjz2010@gmail.com
// 版权:kevinjz原创
// 平台:linux-2.39.1 real6410 (real6410开发板)
// 发布日期:2011-06-21
// 最后修改:2011-06-23
// 注意事项:欢迎转载,但不得在转载的时候擅自修改、删除文章的任何部分
//-----------------------------------------------------------一、于http://www.kernel.org/下载linux-2.6.39.1内核源码,解压至文件夹。二、进入源码所在文件夹,对内核进行配置$ make menuconfig将arch/arm/configs/s3c6400_deconfig拷贝至内核根目录,并修改根目录中的Makefile,将其中的ARCH = armCROSS_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, static struct 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---------------------------------*//*static struct s3c_sdhci_platdata real6410_hsmmc0_pdata = {//该结构体位于plat/sdhci.h.max_width = 4,.cd_type = S3C_SDHCI_CD_INTERNAL, }; static struct 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驱动另外在file systems->native language support中,将default NLS option的值改为utf8,并选上NLS UTF-8 以及nls iso8859-1,simple chinene。 自此,SD驱动配置完成<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->四、添加nand驱动(参考华天正论坛上的移植方法),1、在/arch/arm/mach-s3c64xx/mach-real6410.c中添加分区信息(不许要添加头文件)struct mtd_partition real6410_nand_part[] = {#if 0 {.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),//此处华天正论坛置顶贴上说是定义为,(4*SZ_1M),但经过实验不成功,可能和UOOT中的定义要匹配才行。},{.name = "ubifs",.offset = MTDPART_OFS_APPEND,.size = MTDPART_SIZ_FULL,},};2、定义,在上面的文件加入:static struct s3c2410_nand_set real6410_nand_sets[] = {[0] = {.name = "nand",.nr_chips = 1,.nr_partitions = ARRAY_SIZE(real6410_nand_part),.partitions = real6410_nand_part,},}; static struct 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 menuconfigdevice driver->MTD support中选中MTD partitioning support 、Command line partition table parsing、Caching block device access to MTD devices、NAND Device Support、enable ubi在nand device suppot中选中 NAND Flash support for Samsung S3C SoCs 、 Samsung S3C NAND driver debug、Samsung S3C NAND Hardware ECC 。此处需要注意:对上面几个选项”shift+/”,发现其是对2410进行配置的,所以需要nand驱动文件夹中的Kconfig,将/drivers/mtd/nand/Konfig修改,把对应选项的2410改成3add_mtd_partitionsSC,原因查看Makefile中的对应选项的config要求。在file systems->misc filesystem-> 中加入cramfs、UBI的支持,可以参照real28内核的配置5、将real6410 28内核中的/drivers/mtd/nand/s3c_nand.c拷贝之39内核的相应文件夹,并修改probe函数#if defined(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=/linuxrc video=fb:AT070TN838、最后当然要检查一下内核选项,配置好之后编译下载;9、至此,REAL6410已经能从CRAMFS文件系统启动了!