日期:2014-05-16  浏览次数:20605 次

Linux3.4.0 Yaffs2文件系统移植-支持Android4.0


本文章主要针对FS100,S5PC100的Android4.0.4 Yaffs2文件系统移植过程,对于类似Android系统或类似Linux内核(版本高于2.6.35)有参考意义。

本文分两部分:

  1. Nandflash驱动移植
  2. Yaffs2文件系统移植

一、Nandflash驱动移植

由于内核里面没有S5PC100的Nandflash驱动,所以,我们将Nandflash的驱动文件拷贝到内核目录中:

将s3c_nand.c拷贝到:drivers/mtd/nand/中(s3c_nand.c放到了空间共享里了:http://download.csdn.net/detail/mr_raptor/4848511)。

Nand驱动修改位置:

1. 添加Nand物理地址

@arch/arm/mach-s5pc100/include/mach/map.h

添加如下内容:

// MichaelTang add for Nandflash start
/* NAND flash controller */
#define S5PC1XX_PA_NAND         (0xE7200000)
#define S5PC1XX_SZ_NAND         SZ_1M
// MichaelTang add for Nandflash end ----

2. 添加一个新的头文件:

@arch/arm/mach-s5pc100/include/mach/nand.h

#ifndef __MACH_NAND_H
#define __MACH_NAND_H
#include <linux/mtd/partitions.h>
struct s3c_nand_mtd_info {
        uint chip_nr;
        uint mtd_part_nr;
        struct mtd_partition *partition;
};
#endif

3. 修改寄存器头文件

@arch/arm/plat-samsung/include/plat/regs-nand.h

在regs-nand.h中添加如下宏:

// MichaelTang add for nand reg start
/* for s3c_nand.c */
#define S3C_NFCONF              S3C2410_NFREG(0x00)
#define S3C_NFCONT              S3C2410_NFREG(0x04)
#define S3C_NFCMMD              S3C2410_NFREG(0x08)
#define S3C_NFADDR              S3C2410_NFREG(0x0c)
#define S3C_NFDATA8             S3C2410_NFREG(0x10)
#define S3C_NFDATA              S3C2410_NFREG(0x10)
#define S3C_NFMECCDATA0         S3C2410_NFREG(0x14)
#define S3C_NFMECCDATA1         S3C2410_NFREG(0x18)
#define S3C_NFSECCDATA          S3C2410_NFREG(0x1c)
#define S3C_NFSBLK              S3C2410_NFREG(0x20)
#define S3C_NFEBLK              S3C2410_NFREG(0x24)
#define S3C_NFSTAT              S3C2410_NFREG(0x28)
#define S3C_NFMECCERR0          S3C2410_NFREG(0x2c)
#define S3C_NFMECCERR1          S3C2410_NFREG(0x30)
#define S3C_NFMECC0             S3C2410_NFREG(0x34)
#define S3C_NFMECC1             S3C2410_NFREG(0x38)
#define S3C_NFSECC              S3C2410_NFREG(0x3c)
#define S3C_NFMLCBITPT          S3C2410_NFREG(0x40)
#define S3C_NF8ECCERR0          S3C2410_NFREG(0x44) 
#define S3C_NF8ECCERR1          S3C2410_NFREG(0x48)
#define S3C_NF8ECCERR2          S3C2410_NFREG(0x4C)           
#define S3C_NFM8ECC0            S3C2410_NFREG(0x50)         
#define S3C_NFM8ECC1            S3C2410_NFREG(0x54)        
#define S3C_NFM8ECC2            S3C2410_NFREG(0x58)       
#define S3C_NFM8ECC3            S3C2410_NFREG(0x5C)      
#define S3C_NFMLC8BITPT0        S3C2410_NFREG(0x60)     
#define S3C_NFMLC8BITPT1        S3C2410_NFREG(0x64)  

#define S3C_NFCONF_NANDBOOT     (1<<31)
#define S3C_NFCONF_ECCCLKCON    (1<<30)
#define S3C_NFCONF_ECC_MLC      (1<<24)
#define S3C_NFCONF_ECC_1BIT     (0<<23)
#define S3C_NFCONF_ECC_4BIT     (2<<23)
#define S3C_NFCONF_ECC_8BIT     (1<<23)
#define S3C_NFCONF_TACLS(x