基于smart210的内核移植(三)NAND FLASH

NAND FLASH

在我们移植成功dm9000网卡驱动和nfs服务器之后,事实上我们已经可以通过nfs服务器挂载文件系统,整个开发板的系统已经搭建完毕了,只不过内核和文件系统都存在内存里,一旦掉电所有数据都会消失。我们接下来就进行NAND FLASH的驱动移植。

三星提供的 NAND FLASH 驱动为 drivers/mtd/nand/s3c2410.c,只支持 S3C2410/S3C2440/S3C2412。
我们需要修改它,以支持 s5pv210。
在这个驱动中,根据 CPU 类型来决定如何操作硬件。里面定义了一个枚举类型
用来表示 Cpu 类型,我们需要在里面添加 TYPE_S5PV210。
在这里插入图片描述
还定义了一个结构体变量 s3c24xx_driver_ids,里面列出了当前支持的平台设备,我们需要在里面添
加 s5pv210-nand。
在这里插入图片描述
三星公用的 NAND 平台设备在 arch/arm/plat-samsung/devs.c 中定义
在这里插入图片描述
这里的 nand 设备名称默认为 s3c2410-nand,我们需要在 mach-smdkv210.c 中的
smdkv210_machine_init 函数中调用一个函数来设置这个 name 属性,把它设置为 s5pv210-nand,这
样驱动中就会得到 CPU 类型为 TYPE_S5PV210。
s3c_nand_setname(“s5pv210-nand”);
在这里插入图片描述
在这里插入图片描述

下面开始具体的移植
首先在 arch/arm/plat-samsung/include/plat/regs-nand.h 针对 s5pv210 添加 NAND 寄存器索引
在这里插入图片描述
然后修改 drivers/mtd/nand/s3c2410.c,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们要让 drivers/mtd/nand/s3c2410.c 被编译进内核,需要修改 drivers/mtd/nand/Kconfig
在这里插入图片描述
添加了 ARCH_S5PV210,如果不添加 ARCH_S5PV210,配置菜单不会出现这个选项。

在 drivers/mtd/nand/s3c2410.c 中通过名称“nand”获得时钟
info->clk = devm_clk_get(&pdev->dev, “nand”);
s5pv210 的时钟定义在 arch/arm/mach-s5pv210/clock.c 中,这里面没有针对 nand 定义时钟,因此需
要添加,在 init_clocks_off 数组里面添加
在这里插入图片描述
在 arch/arm/plat-samsung/devs.c 中定义的 nand 平台设备如下:
在这里插入图片描述
这里用了一个宏 CONFIG_S3C_DEV_NAND,这个宏默认没有选中,因此需要修改
arch/arm/mach-s5pv210/Kconfig
在这里插入图片描述
在后面添加了 select S3C_DEV_NAND
另外在 nand 平台设备中使用了 S3C_PA_NAND,这个在 s5pv210 中也没定义,需要在
arch/arm/mach-s5pv210/include/mach/map.h 中定义
在这里插入图片描述
在 arch/arm/mach-s5pv210/mach-smdkv210.c 添加头文件
在这里插入图片描述
并定义 nand 平台相关的数据
/* nand info (add by yangyun) */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = “bootloader”,
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = “params”,
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},

[2] = {
	.name	= "kernel",
	.offset	= MTDPART_OFS_APPEND,
	.size	= SZ_1M + SZ_2M,
},

[3] = {
	.name	= "rootfs",
	.offset = MTDPART_OFS_APPEND,
	.size	= MTDPART_SIZ_FULL,
}

};
static struct s3c2410_nand_set smdk_nand_sets[] = {
[0] = {
.name = “NAND”,
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(smdk_default_nand_part),
.partitions = smdk_default_nand_part,
.disable_ecc = 1,
},
};

static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 12,
.twrph0 = 12,
.twrph1 = 5,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};

static void s5pv210_nand_gpio_cfg(void)
{
volatile unsigned long *mp01;
volatile unsigned long *mp03;
volatile unsigned long *mp06;

mp01 = (volatile unsigned long *)ioremap(0xE02002E0, 4);
mp03 = (volatile unsigned long *)ioremap(0xE0200320, 4);
mp06 = (volatile unsigned long *)ioremap(0xE0200380, 4);

*mp01 &= ~(0xFFFF << 8);
*mp01 |= (0x3333 << 8);
*mp03 = 0x22222222;
*mp06 = 0x22222222;

iounmap(mp01);
iounmap(mp03);
iounmap(mp06);

}
static struct platform_device smdkv210_devices[] __initdata =
{

&s3c_device_nand, /
add by yangyun */
}
这里定义了 nand 的分区,要和 u-boot 中的分区一致,以及时序参数

在 smdkv210_machine_init 函数中设置 nand

在这里插入图片描述
之后,配置内核支持 nand
Device Drivers —>
Memory Technology Device (MTD) support —>
Caching block device access to MTD devices
NAND Device Support —>

​ <*> NAND Flash support for Samsung S3C SoCs
执行 make uImage 编译内核,下载到内存运行
在这里插入图片描述
nand flash初始化成功,可以执行 cat /proc/mtd 查看分区信息
在这里插入图片描述
下面将制作好的jffs文件系统烧写到 nand 进行测试。
在这里插入图片描述
在这里插入图片描述
设置启动参数 set bootargs root=/dev/mtdblock4 rootfstype=jffs2 console=ttySAC0,115200
root=/dev/mtdblock4 表示文件系统存放在第 4 个分区。
在这里插入图片描述
启动成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值