Real6410移植Linux-2.6.39.1记录
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 = 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,
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驱动配置完成
四、添加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 menuconfig
device 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:AT070TN83
8、最后当然要检查一下内核选项,配置好之后编译下载;
9、至此,REAL6410已经能从CRAMFS文件系统启动了!
|
评论暂时关闭