• u-boot中nandflash初始化流程分析(转)


    u-boot中nandflash初始化流程分析(转)

    原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/

     

    下面对nand flash的初始化代码nand_init()进行分析:
    1.如果定义(CONFIG_COMMANDS & CFG_CMD_NAND)没定义(CFG_NAND_LEGACY) 则start_armboot()调用driver/nand/nand.c中的nand_init(),否则如果定义(CONFIG_COMMANDS & CFG_CMD_NAND)并且有定义了CFG_NAND_LEGACY,则调用自己定义的nand_init()。在我当前的情景中是使用driver/nand/nand.c中的nand_init()。

    2.nand_init()调用本文件中的nand_init_chip()对nand进行初始化。

    3.nand_init_chip()首先调用board_nand_init()。

    4.board_nand_init()是需要自己添加的函数,这个函数的主要功能是对struct nand_chip结构体的函数指针赋值,让它们指向自己为nand驱动编写的一些函数,对未赋值的指针,uboot会在后面为其赋上通用nand驱动函数指针。

    5.nand_init_chip()接着调用nand_scan().

    6.nand_scan()定义在drivers/nand/nand_base.c文件中。它首先对struct nand_chip结构体中在board_nand_init()函数中未赋值的指针赋上通用nand驱动函数指针。

    7.通用nand驱动函数nand_select_chip()赋值给struct nand_chip结构体的函数指针用于打开或关闭nand芯片,0为打开,1为关闭。在这个函数中会调用nand_chip结构体中的hwcontrol函数指针,这个指针指向的函数是需要自己编写的。这个函数指针在board_nand_init()函数中被赋值。主要作用是向nand flash发送一些nand flash开启与关闭命令。

    8.nand_scan()剩余部分初始化nand_chip和mtd_info结构体。

    9.nand_scan()最后在返回时调用drivers/nand/nand_bbt.c文件中的nand_default_bbt()。

    10.nand_default_bby()选择一个坏块描述表,返回时调用本文件中的nand_scan_bbt()。

    11.nand_scan_bbt()寻找建立一个坏块描述表。

    12.最后返回到nand_init(),这样nand驱动的初始化完成了。

    下面对命令nand read addr ofs size的执行流程进行分析:
    1.nand read addr ofs size命令的作用是从nand flash地址的偏移量ofs处读取长度为size字节的数据存储到内存地址addr处。

    2.common/main.c文件中的main_loop()主要执行read_line()读取命令行。

    3.read_line()读取到命令行后会调用common/main.c文件中的run_command()。

    4.run_command()调用common/command.c文件中的find_cmd()在.u_boot_cmd段中寻找该命令的cmd_tbl_t结构,找到后返回该结构。该命令的结构是通过定义在include/command.h中的宏定义U_BOOT_CMD登记进.u_boot_cmd段中的。

    5.run_command()找到该命令的cmd_tbl_t结构后则执行该命令对应的函数。对于本情景是nand命令对应的函数do_nand()。

    6.do_nand()有两个版本,一个是定义了CFG_NAND_LEGACY。另一个是未定义CFG_NAND_LEGACY。这两个版本都定义在common/cmd_nand.c文件中。对于本情景使用未定义CFG_NAND_LEGACY的do_nand()函数。要使用do_nand()还必须定义宏CONFIG_COMMANDS&CFG_CMD_NAND。(若未定义CFG_NAND_LEGACY则在这个情景中的do_nand()函数调用的函数都定义在drivers/nand_legacy/nand_legacy.c文件中)。

    7.对于我们的情景do_nand()会调用定义在include/nand.h文件中的nand_read()。

    8.nand_read()则调用本nand芯片对应的nand_info_t结构的read指针。而read指针在nand_scan()中被指向了同文件(drivers/nand/nand_base.c)中的nand_read()函数。

    9.nand_read()函数最终会调用nand_chip结构中的cmdfunc指针,通过这个指针指向的函数向nand flash芯片发送命令。最终完成整个命令的执行。

  • 相关阅读:
    Robot Framework--06 用户关键字User Keyword
    Robot Framework--05 案例设计之流程与数据分离
    Robot Framework--04 工作区
    Robot Framework--03 案例及资源区
    Robot Framework--02 菜单栏&工具栏
    Robot Framework--01 创建简单工程示例
    uoj#35 后缀排序(后缀数组模版)
    【学习笔记】动态树Link-Cut-Tree
    【随意学学】三分法
    【学习笔记】dsu on tree
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/3933607.html
Copyright © 2020-2023  润新知