加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

U-Boot NAND FLASH驱动分析

发布时间:2020-12-15 06:13:48 所属栏目:百科 来源:网络整理
导读:U-Boot NAND FLASH 驱动分析 ——西伯利亚的风 一、 初始化函数调用关系 ????初始化函数调用关系如图 1.1 所示。 1. U-Boot 启动过程中调用 nand_init() 初始化 NAND FLASH 。 2. 函数 nand_init() 调用 nand_init_chip() 完成 NAND FLASH 初始化。 3. nand_

U-Boot NAND FLASH驱动分析

——西伯利亚的风

一、 初始化函数调用关系

????初始化函数调用关系如图1.1所示。

1.U-Boot启动过程中调用nand_init()初始化NAND FLASH

2.函数nand_init()调用nand_init_chip()完成NAND FLASH初始化。

3.nand_init_chip()顺序调用board_nand_init()nand_scan()实现NAND FLASH初始化工作。

4.其中board_nand_init()实现S3C2440 NAND FLASH控制器相关的初始化,设置控制器的时序,设置寄存器的读写地址。(最底层)

5.nand_scan()主要实现NAND FLASH各种参数设置(比如自动识别NAND FLASH的大小、每一页的大小、数据宽度等信息),设置对NAND FLASH的片选、读写函数以及NAND FLASH的控制命令。(次底层)


图1.1U-Boot中NAND FLASH初始化函数调用关系.jpg(26.69 K)
2012-4-7 8:34:25

1.1 NAND FLASH初始化函数调用

二、 读数据函数调用关系

????NAND FLASH读数据函数调用关系如图2.1所示。


图2.1读函数调用关系.jpg(35.77 K)
2012-4-7 8:34:25

2.1 读数据函数调用关系

????调用到最后,使用的是一个宏readb,读取nand_chip->IO_ADDR_R地址处的数据,就完成了读数据的过程。

以上所有的函数在u-boot中都已经写好,不需要我们去做。移植时,只需要根据开发板所用的芯片型号,指定nand_chip->IO_ADDR_R所对应的地址就行。这就与具体使用到的处理器的NAND FLASH控制器相关了。对于S3C2440来说,nand_chip->IO_ADDR_R对应的就是NAND FLASH控制器的数据寄存器NFDATA,地址为0x4E000010


三、 关键数据结构

????涉及到的数据结构:struct nand_chip struct mtd_infostruct nand_flash_dev

static void nand_init_chip(struct mtd_info *mtd,struct nand_chip *nand,ulong base_addr)

{


mtd->priv = nand;

……

}

函数中struct mtd_info *mtd:定义了一个mtd_info结构体指针mtd。对于mtd_info众多的成员,U-BootNAND FLASH只用到了其中的一个成员void* priv;用于保存设备相关的结构体nand_chip的地址。

每一个NAND FLASH设备对应一个mtd_info结构体和一个nand_chip结构体。mtd_info结构体中的*priv指向设备对应的nand_chip结构体。如图3.1所示。


图3.1关键数据结构.jpg(28.87 K)
2012-4-7 8:34:25

3.1 U-BootNAND FLASH数据结构

控制NAND FLASH时,通过结构体mtd_info*priv成员找到对应的结构体nand_chip,然后调用读写、片选等函数,最终实现对NAND
FLASH
的控制。

struct nand_flash_dev {
char *name;

int id;

unsigned long pagesize;

unsigned long chipsize;

unsigned long erasesize;

unsigned long options;

};

结构nand_flash_dev的内容比较少,其各项含义为:

nameNAND FLASH的厂家名字

id:?? NAND FLASHID

pagesize:一页的大小,单位为字节Byte

chipsize:整个NAND FLASH 的大小,单位为MB

erasesize:最小擦除大小单位为字节Byte

options:选项。具体作用不清楚,求高人解答。


四、U-Boot 是如何获知外接NAND FLASH的容量大小的

????u-boot先读取外接NAND FLASHID,根据ID struct nand_flash_dev nand_flash_ids[]定义的数组中找到匹配的项,这样就确定NAND FLASH的大小了。

struct nand_flash_dev nand_flash_ids[] = {

……

{"NAND 256MiB 1,8V 8-bit",0xAA,256,NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR},

{"NAND 256MiB 3,3V 8-bit",0xDA,

……

};

???????? 比如对于Jz2440开发板上的用的K9F2G08U0M为例,其自身ID0xDA,在nand_flash_ids[]中找到数据:

{"NAND 256MiB 3, 0xDA,256,NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}

其大小为256,单位为MB,这样就确定了NAND FLASH的大小。这里只分析原理,具体代码请分析u-boot



五、 总结

????没有弄清楚U-BootNAND FLASH结构之前,感觉很复杂,分析清楚之后,就感觉很简单。做移植的,不仅仅要知道怎么做能实现功能,还要知道其原理,这就需要我们多看源码,多读芯片手册,还要勤于思考,这样才能不断进步,掌握核心内容。如有什么不正确的地方,恳请大家指出,大家互相学习,共同进步!

?

声明:本文为个人原创,边移植边写,完全来自实践。本文首先发表在百问网(www.100ask.net)转载请指明出处。

原文地址:http://www.100ask.net/forum/showtopic-3698.aspx

?

免费视频下载地址:

1期共33个视频,免费,下载后可以直接观看,下载地址:
http://115.com/folder/fa55184z#
http://dl.dbank.com/c03o1ebwlo
第一期视频从Linux安装开始,讲解了SDRAMNAND FLASHLCD等硬件操作,U-Boot的移植、内核移植、简单字符驱动的编写,非常详尽。

第二期视频主要是驱动深入讲解,精华啊!

第二期视频需要收费的哦,具体见韦东山老师淘宝店铺:

http://100ask.taobao.com/

?

书籍资料下载:

《嵌入式Linux应用开发完全手册》及相关资源电炉可以下载:

http://www.verycd.com/topics/2828590/

?????? 嵌入式linux应用开发完全手册光盘里的驱动和例子源代码.rar 详情

嵌入式linux应用开发完全手册.pdf 详情

?

如果能买一块韦东山老师的开发板,加上视频讲解,加上书,那学起来就太Easy了!

淘宝店铺上http://100ask.taobao.com/ 全套都有了!!!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读