Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3125031
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: Android平台

2014-09-20 14:33:16

原文地址:http://blog.chinaunix.net/uid-26009923-id-4067430.html

一.分区的定义
1. 定义分区信息
在arch/arm/mach-s3c64xx/mach-smdk6410.c中
  1. struct mtd_partition ok6410_nand_part[] = {
  2.     {
  3.         .name        = "Bootloader",
  4.         .offset        = 0,
  5.         .size        = (* SZ_1M),
  6.         .mask_flags    = MTD_CAP_NANDFLASH,
  7.     },
  8.     {
  9.         .name        = "Kernel",
  10.         .offset        = (* SZ_1M),
  11.         .size        = (5*SZ_1M) ,
  12.         .mask_flags    = MTD_CAP_NANDFLASH,
  13.     },

  14.     {
  15.         .name        = "User",
  16.         .offset        = (* SZ_1M),
  17.         .size        = (200*SZ_1M) ,
  18.     },
  19.     {
  20.         .name        = "File System",
  21.         .offset        = MTDPART_OFS_APPEND,
  22.         .size        = MTDPART_SIZ_FULL,
  23.     }
  24. };
2.将mtd_partition封装在s3c2410_nand中
在arch/arm/mach-s3c64xx/mach-smdk6410.c中
  1. static struct s3c2410_nand_set ok6410_nand_sets[] = {
  2.     [0] = {
  3.         .name = "nand",
  4.         .nr_chips = 1,
  5.         .nr_partitions = ARRAY_SIZE(ok6410_nand_part),
  6.         .partitions = ok6410_nand_part,
  7.     },
  8. };
3.s3c2410_nand封装在s3c2410_platform_nand中
在arch/arm/mach-s3c64xx/mach-smdk6410.c中
  1. static struct s3c2410_platform_nand ok6410_nand_info = {
  2.     .tacls = 25,
  3.     .twrph0 = 55,
  4.     .twrph1 = 40,
  5.     .nr_sets = ARRAY_SIZE(ok6410_nand_sets),
  6.     .sets = ok6410_nand_sets,
  7. };

4. 将定义的分区信息写入到全局变量中
在arch/arm/mach-s3c64xx/mach-smdk6410.c中
  1. static void __init smdk6410_machine_init(void)
  2. {
  3.     s3c_nand_set_platdata(&ok6410_nand_info);
  4. }
结构体的包含如下:
s3c2410_platform_nand  -->
                                        --> 
                                        -->sets:    s3c2410_nand_set -->
                                                                                       --> mtd_partition

在arch/arm/plat-samsung/dev-nand.c中
  1. void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand)
  2. {
  3.     struct s3c2410_platform_nand * npd = kmemdup(nand, sizeof(struct s3c2410_platform_nand), GFP_KERNEL);
  4.     int size = sizeof(struct s3c2410_nand_set) * npd->nr_sets;   //nr_sets=1
  5.     
  6.     struct s3c2410_nand_set *from = npd->sets;
  7.     struct s3c2410_nand_set *to;

  8.     to = kmemdup(from, size, GFP_KERNEL);   //将
  9.     npd->sets = to;
  10.     
  11.     for (int = 0; i < npd->nr_sets; i++) {
  12.         ret = s3c_nand_copy_set(to);        
  13.         to++;
  14.     }
  15.     s3c_device_nand.dev.platform_data = npd;
  16. }
这个函数就是把以前定义的东东重新copy了一份给npd,这儿完全没有必要这么做
改成如下,简单明了
  1. void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand)
  2. {
  3.     s3c_device_nand.dev.platform_data = nand;
  4. }
5. 分区信息在驱动中的获取
  1. static int s3c_nand_probe(struct platform_device *pdev, enum s3c_cpu_type cpu_type)
  2. {
  3.     struct s3c2410_platform_nand *plat = pdev->dev.platform_data;
  4. }
这个地方就可以通过
    plat->sets->partitions->offset,
    plat->sets->partitions->size,
    plat->sets->partitions->name
找到所对应的分区信息
6. 在驱动中的probe函数中添加partition
s3c_nand_probe
    --> add_mtd_partitions
  1. int add_mtd_partitions(struct mtd_info *master,    const struct mtd_partition *parts, int nbparts)
  2. {
  3.     struct mtd_part *slave;
  4.     uint64_t cur_offset = 0;

  5.     for (= 0; i < nbparts; i++) {
  6.         slave = add_one_partition(master, parts + i, i, cur_offset);
  7.         cur_offset = slave->offset + slave->mtd.size;
  8.     }
  9.     return 0;
  10. }
阅读(752) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~