{"Samsung K9F1208U0B",NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0}的分析

发布一个patch,在附件中。该patch主要是针对Samsung flash芯片K9f1208U0B的体系结构信息进行设置。全部的修改该只有一行代码,但是分析工作是更加重要,以下的陈述针对flash芯片的移植工作的流程以及思考方向。
   
    整个u-boot在arm体系环境下的引导过程是从lib_arm 目录下board.c void start_armboot (void)函数开始的。在其中第305行,见到如下函数的调用。
 

nand_init();        /* go init the NAND */


    该函数的主要作用就是进行flash芯片的初始化工作。该函数位drivers/nand_legacy
/nand_legacy.c 文件的第99行。实现代码很简短如下所示:

void nand_init(void)
{
        S3C2410_NAND * const nand = S3C2410_GetBase_NAND();

        NF_Init();

        printf ("%4lu MB/n", nand_probe((ulong)nand) >> 20);
}


    其中在nand_probe()函数内实现了对flash芯片的扫描过程,提到扫描的过程就不得不涉及到一个非常重要的结构体nand_chip,这个结构体定义在include/linux/mtd/nand_legacy.h中。该结构体包含了很多关于flash结构信息的变量,并且在drivers/nand_legacy/nand_legacy.c的第217行定义了如下的数组:

    struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE] = {{0}};


    每个flash device都占用一个该数组的节点。随后在nand_probe()中第622行调用的NanD_IdentChip()函数,会读取一个flash设备的ID信息,识别、并存放到nand_dev_desc[]中。NanD_IdentChip函数的原型如下:
   

static int NanD_IdentChip(struct nand_chip *nand, int floor, int chip)

  
    该函数的职责为通过与flash芯片通讯获得flash ID,并到已存在的一个flash硬件列表中去寻找ID所对应的芯片,并获得该芯片所对应的flash的体系结构信息
    以上指责包括两大重要操作:
          (1)读取flash ID信息。
          (2)查找硬件列表。
    而通过(2)我们就可以直接的定位到移植点,并展开移植工作。

    在读取ID结束后,该段代码程序会为两个变量进行赋值,一个是fmr,另一个则是id。经过一些基本判断工作后,将进入硬件列表的扫描过程中,代码如下:

    for (i = 0; nand_flash_ids[i].name != NULL; i++) {
        if (mfr == nand_flash_ids[i].manufacture_id &&
            id == nand_flash_ids[i].model_id) {
#ifdef NAND_DEBUG
            printf("Flash chip found:/n/t Manufacturer ID: 0x%2.2X, "
                   "Chip ID: 0x%2.2X (%s)/n", mfr, id,
                   nand_flash_ids[i].name);
#endif
            if (!nand->mfr) {
                nand->mfr = mfr;
                nand->id = id;

    .........................
    .........................

  
    在扫描中,我发现它会去扫描一个结构体列表,并且比对mfr以及id的信息,这个结构体列表为nand_flash_dev结构体类型的nand_flash_ids[],声明在include/linux/mtd/nand_ids.h头文件中,打开该头文件,就可以看到这个结构体数组的信息:

static struct nand_flash_dev nand_flash_ids[] = {
{"Toshiba TC5816BDC",     NAND_MFR_TOSHIBA, 0x64, 21, 1, 2, 0x1000, 0},
{"Toshiba TC5832DC",      NAND_MFR_TOSHIBA, 0x6b, 22, 0, 2, 0x2000, 0},
              ..........................
{"Samsung Unknow 64M",    NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0},
{"Samsung KM29W32000",    NAND_MFR_SAMSUNG, 0xe3, 22, 0, 2, 0x2000, 0},
{"Samsung unknown 4Mb",   NAND_MFR_SAMSUNG, 0xe5, 22, 0, 2, 0x2000, 0},


    而其中Samsung Unknow 64M就是在我输入nand info时显示给我的终端信息的一部分。因此有了一种豁然开朗的感觉。之后的任务就是搞清楚nand_flash_dev结构体的结构类型,并根据Samsung的数据手册填写结构体信息就可以解决flash芯片的移植问题了。

    该结构体定义在include/linux/mtd/nand_legacy.h中结构体如下:

struct nand_flash_dev {
    char * name;           //完整的设备名称
    int manufacture_id;    // 表示生产商的编号
    int model_id;          //设备id号
    int chipshift;         //总共容纳地址的位数
    char page256;          //flash的页字节数是否为256
    char pageadrlen;       //地址需要多少字节数减一(行列地址总共)
    unsigned long erasesize; //擦写block的单位大小
    int bus16;             //是否为16位总线
};


    根据以上的结构我在nand_flash_ids中填写上了一个信的体系结构信息:

{"Samsung K9F1208U0B",NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0},


    编译烧写后,运行nand info后出现的不再是Samsung unknow 64M,而是Samsung K9F1208U0B了。

    到此为止,flash芯片的移植工作基本完成。

    题外话:
    nand info 命令就是通过访问nand_dev_desc[]数组来显示flash相关的信息的。代码在common/cmd_nand.c中第696行:
   

    case 2:
        if (strcmp (argv[1], "info") == 0) {
            int i;

            putc ('/n');

            for (i = 0; i < CFG_MAX_NAND_DEVICE; ++i) {
                if (nand_dev_desc[i].ChipID ==
                    NAND_ChipID_UNKNOWN)
                    continue;    /* list only known devices */
                printf ("Device %d: ", i);
                nand_print (&nand_dev_desc[i]);
            }
            return 0;

 

 

 

转载:http://blogold.chinaunix.net/u1/51351/showart_408277.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值