Linux-4.3在mini6410上的移植

移植最后失败告终,主要是因为nandflash坏块计算部分,友善只提供了库文件,但是这个库需要调用到mtd和nand_chip等结构体,这些结构体都被定义在mtd.h和nand.h等头文件中,且新版本的内核里面的成员有所变动,最后导致s3c_nand_mlc.fo库部分按照老版本内核结构体计算结构体地址偏移,最后初始化失败。

总结一下经验:
①如果需要干净的内核环境,推荐还是使用与硬件提供商相近或者一致的内核版本(怪不得网上的人都只移植2.6.38),特别是部分代码没有开源的情况下,否则如果你的库引用了一些系统头文件,而这些头文件在新版本内核下有改动,必将导致移植失败;
②移植的方向应该是:修改添加进新内核的文件,让这些文件适应内核的调用环境(修改这些文件的函数入参等等);
③由于内核的Makefile自动生成了头文件依赖关系,所以如果修改了头文件,完全没有必要重新make clean后编译。

1.修改Makefile
CROSS_COMPILE :=arm-linux-
ARCH:=arm

2.make s3c6410_defconfig
make menuconfig,进入配置菜单进行修改:
进入菜单之后,将SystemType下面不需要用到的其他单板支持删除掉,只保留MINI6410
make uImage编译

4.nand驱动移植:
①修改Mach-mini6410.c文件中的分区表:

struct mtd_partition mini6410_nand_part[] = {
    {
        .name       = "Bootloader",
        .offset     = 0,
        .size       = (4 * 128 *SZ_1K),
        .mask_flags = MTD_CAP_NANDFLASH,
    },
    {
        .name       = "Kernel",
        .offset     = (4 * 128 *SZ_1K),
        .size       = (5*SZ_1M) ,
        .mask_flags = MTD_CAP_NANDFLASH,
    },
    {
        .name       = "File System",
        .offset     = MTDPART_OFS_APPEND,
        .size       = MTDPART_SIZ_FULL,
    }
};

对于mlc2分区在s3c_nand.c中,可以根据实际修改:

static struct mtd_partition mini6410_nand_part_mlc[] = {
    {
        .name       = "Bootloader",
        .offset     = 0,
        .size       = (4 * SZ_1M),
        .mask_flags = MTD_CAP_NANDFLASH,
    },
    {
        .name       = "Kernel",
        .offset     = (4 * SZ_1M),
        .size       = (8 * SZ_1M) ,
        .mask_flags = MTD_CAP_NANDFLASH,
    },
    {
        .name       = "File System",
        .offset     = MTDPART_OFS_APPEND,
        .size       = MTDPART_SIZ_FULL,
    }
};

②拷贝文件:
arch/arm/plat-samsung/include/plat/regs-nand.h
arch/arm/plat-samsung/include/plat/nand.h
include/linux/mtd/nand.h
(覆盖后,修改142行,添加:

    NAND_ECC_SOFT_BCH,

在末尾添加:

/*
 * oob operation modes
 *
 * MTD_OOB_PLACE:   oob data are placed at the given offset
 * MTD_OOB_AUTO:    oob data are automatically placed at the free areas
 *          which are defined by the ecclayout
 * MTD_OOB_RAW:     mode to read oob and data without doing ECC checking
 */
typedef enum {
    MTD_OOB_PLACE,
    MTD_OOB_AUTO,
    MTD_OOB_RAW,
} mtd_oob_mode_t;

#define MTD_DEBUG_LEVEL0    (0) /* Quiet   */
#define MTD_DEBUG_LEVEL1    (1) /* Audible */
#define MTD_DEBUG_LEVEL2    (2) /* Loud    */
#define MTD_DEBUG_LEVEL3    (3) /* Noisy   */
#ifdef CONFIG_MTD_DEBUG
#define DEBUG(n, args...)               \
    do {                        \
        if (n <= CONFIG_MTD_DEBUG_VERBOSE)  \
            printk(KERN_INFO args);     \
    } while(0)
#else /* CONFIG_MTD_DEBUG */
#define DEBUG(n, args...)               \
    do {                        \
        if (0)                  \
            printk(KERN_INFO args);     \
    } while(0)
#endif /* CONFIG_MTD_DEBUG */

)

include/linux/mtd/bbm.h(覆盖)
drivers/mtd/nand/nand_ids.c(覆盖)
drivers/mtd/nand/nand_bbt.c(覆盖后修改:根据编译错误将mtd各个操作方法加上下划线前缀)
drivers/mtd/nand/s3c_nand.c
(修改758行改成

    s3c_nand.clk = clk_get(&pdev->dev, "hclk");

929行改为:

    mtd_device_parse_register(s3c_mtd, NULL, NULL, partitions, nr_partitions);

)
drivers/mtd/nand/s3c_nand_mlc.fo(复制)
drivers/mtd/nand/nand_base.c
(修改3449行:

    mtd->_erase = nand_erase;
    mtd->_point = NULL;
    mtd->_unpoint = NULL;
    mtd->_read = nand_read;
    mtd->_write = nand_write;
    mtd->_panic_write = panic_nand_write;
    mtd->_read_oob = nand_read_oob;
    mtd->_write_oob = nand_write_oob;
    mtd->_sync = nand_sync;
    mtd->_lock = NULL;
    mtd->_unlock = NULL;
    mtd->_suspend = nand_suspend;
    mtd->_resume = nand_resume;
    mtd->_block_isbad = nand_block_isbad;
    mtd->_block_markbad = nand_block_markbad;
    mtd->writebufsize = mtd->writesize;

修改3526行:

#ifdef CONFIG_MTD_PARTITIONS
    /* Deregister partitions */
    del_mtd_partitions(mtd);
#endif
    /* Deregister the device */
    del_mtd_device(mtd);
改为:
    mtd_device_unregister(mtd);

)
drivers/mtd/nand/Kconfig
165行添加:

config MTD_NAND_S3C
    tristate "Nand Flash support for FriendlyARM"
    depends on (ARCH_S3C64XX || ARCH_S5P64XX || ARCH_S5PC1XX) && MTD_NAND
    help
      This enables the NAND flash controller on the S3C.
      No board specfic support is done by this driver, each board
      must advertise a platform_device for the driver to attach.

config MTD_NAND_S3C_DEBUG
    bool "S3C NAND driver debug"
    depends on MTD_NAND_S3C
    help
      Enable debugging of the S3C NAND driver

config MTD_NAND_S3C_HWECC
    bool "S3C NAND Hardware ECC"
    depends on MTD_NAND_S3C
    help
      Enable the use of the S3C internal ECC generator when
      using NAND. Early versions of the chip have had problems with
      incorrect ECC generation, and if using these, the default of
      software ECC is preferable.
      If you lay down a device with the hardware ECC, then you will
      currently not be able to switch to software, as there is no
      implementation for ECC method used by the S3C

drivers/mtd/nand/Makefile
(修改20行左右,添加

obj-$(CONFIG_MTD_NAND_S3C)         += s3c_nand.o

文件末尾添加/修改:

nand-objs := nand_base.o nand_bbt.o
S3C_NAND_MLC_SRC = $(shell ls drivers/mtd/nand/s3c_nand_mlc.c 2>/dev/null)
ifeq ($(S3C_NAND_MLC_SRC),) 
obj-$(CONFIG_MTD_NAND_S3C)         += s3c_nand_mlc.fo
else
obj-$(CONFIG_MTD_NAND_S3C)         += s3c_nand_mlc.o
endif

)
/drivers/mtd/ofpart.c(覆盖)
/drivers/mtd/ubi/build.c(覆盖)

③make menuconfig进行配置:

Device Drivers  ---> 
       <*> Memory Technology Device (MTD) support  --->  
                 <*>   Command line partition table parsing
                 <*>   Caching block device access to MTD devices
                 <*>   NAND Device Support  ---> 
                         < >   NAND Flash support for Samsung S3C SoCs(去掉不选)
                         <*>   NAND Flash support for FriendlyARM
                                      [*]     S3C NAND Hardware ECC 
                <*>   Enable UBI - Unsorted block images  --->

File systems  --->
        [*] Miscellaneous filesystems  --->
                <*>   UBIFS file system support  

5.网卡驱动移植
(2).使能网卡驱动,方便先挂载nfs文件系统

[*]Networking Support
        Networking options
                [*]Packet socket
                [*]Unix domain sockets
                [*]TCP/IP networking
                [*]  IP: kernel level autoconfiguration
                [*]  IP: DHCP support
                [*]  IP: BOOTP support
                [*]  IP: RARP support 

Device Drivers ------>
       Network device support------->
               [*]Ethernet device support------->
                       [*]DM9000 support

[*] Network File Systems  ---> 
      <*>   NFS client support
      <*>     NFS client support for NFS version 2 
      <*>     NFS client support for NFS version 3
      <*>     NFS client support for NFS version 4
      [*]   Root file system on NFS
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值