U-Boot NAND FLASH驱动分析
2012-10-18 09:17
316 查看
一、初始化函数调用关系
初始化函数调用关系如图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.1 NAND
FLASH初始化函数调用
二、读数据函数调用关系
NAND FLASH读数据函数调用关系如图2.1所示。
图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_info、struct
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-Boot中NAND
FLASH只用到了其中的一个成员void* priv;用于保存设备相关的结构体nand_chip的地址。
每一个NAND FLASH设备对应一个mtd_info结构体和一个nand_chip结构体。mtd_info结构体中的*priv指向设备对应的nand_chip结构体。如图3.1所示。
图3.1 U-Boot中NAND
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的内容比较少,其各项含义为:
name:NAND
FLASH的厂家名字
id: NAND
FLASH的ID
pagesize:一页的大小,单位为字节Byte
chipsize:整个NAND
FLASH 的大小,单位为MB
erasesize:最小擦除大小单位为字节Byte
options:选项。具体作用不清楚,求高人解答。
四、U-Boot是如何获知外接NAND
FLASH的容量大小的
u-boot先读取外接NAND
FLASH的ID,根据ID 在struct
nand_flash_dev nand_flash_ids[]定义的数组中找到匹配的项,这样就确定NAND FLASH的大小了。
struct nand_flash_dev nand_flash_ids[] = {
……
{"NAND
256MiB 1,8V 8-bit",0xAA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR},
{"NAND
256MiB 3,3V 8-bit", 0xDA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR},
……
};
比如对于Jz2440开发板上的用的K9F2G08U0M为例,其自身ID为0xDA,在nand_flash_ids[]中找到数据:
{"NAND
256MiB 3,3V 8-bit", 0xDA, 0, 256,
0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}
其大小为256,单位为MB,这样就确定了NAND
FLASH的大小。这里只分析原理,具体代码请分析u-boot。
五、总结
没有弄清楚U-Boot中NAND
FLASH结构之前,感觉很复杂,分析清楚之后,就感觉很简单。做移植的,不仅仅要知道怎么做能实现功能,还要知道其原理,这就需要我们多看源码,多读芯片手册,还要勤于思考,这样才能不断进步,掌握核心内容。如有什么不正确的地方,恳请大家指出,大家互相学习,共同进步!
(U-Boot NAND FLASH移植请看:U-Boot
NAND FLASH移植 http://www.100ask.net/forum/showtopic-3697.aspx)
声明:本文为个人原创,边移植边写,完全来自实践。本文首先发表在百问网(www.100ask.net)转载请指明出处。
初始化函数调用关系如图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.1 NAND
FLASH初始化函数调用
二、读数据函数调用关系
NAND FLASH读数据函数调用关系如图2.1所示。
图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_info、struct
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-Boot中NAND
FLASH只用到了其中的一个成员void* priv;用于保存设备相关的结构体nand_chip的地址。
每一个NAND FLASH设备对应一个mtd_info结构体和一个nand_chip结构体。mtd_info结构体中的*priv指向设备对应的nand_chip结构体。如图3.1所示。
图3.1 U-Boot中NAND
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的内容比较少,其各项含义为:
name:NAND
FLASH的厂家名字
id: NAND
FLASH的ID
pagesize:一页的大小,单位为字节Byte
chipsize:整个NAND
FLASH 的大小,单位为MB
erasesize:最小擦除大小单位为字节Byte
options:选项。具体作用不清楚,求高人解答。
四、U-Boot是如何获知外接NAND
FLASH的容量大小的
u-boot先读取外接NAND
FLASH的ID,根据ID 在struct
nand_flash_dev nand_flash_ids[]定义的数组中找到匹配的项,这样就确定NAND FLASH的大小了。
struct nand_flash_dev nand_flash_ids[] = {
……
{"NAND
256MiB 1,8V 8-bit",0xAA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR},
{"NAND
256MiB 3,3V 8-bit", 0xDA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR},
……
};
比如对于Jz2440开发板上的用的K9F2G08U0M为例,其自身ID为0xDA,在nand_flash_ids[]中找到数据:
{"NAND
256MiB 3,3V 8-bit", 0xDA, 0, 256,
0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}
其大小为256,单位为MB,这样就确定了NAND
FLASH的大小。这里只分析原理,具体代码请分析u-boot。
五、总结
没有弄清楚U-Boot中NAND
FLASH结构之前,感觉很复杂,分析清楚之后,就感觉很简单。做移植的,不仅仅要知道怎么做能实现功能,还要知道其原理,这就需要我们多看源码,多读芯片手册,还要勤于思考,这样才能不断进步,掌握核心内容。如有什么不正确的地方,恳请大家指出,大家互相学习,共同进步!
(U-Boot NAND FLASH移植请看:U-Boot
NAND FLASH移植 http://www.100ask.net/forum/showtopic-3697.aspx)
声明:本文为个人原创,边移植边写,完全来自实践。本文首先发表在百问网(www.100ask.net)转载请指明出处。
相关文章推荐
- u-boot nand flash驱动架构分析一
- nand flash 驱动分析之Uboot下
- u-boot nand flash驱动架构分析一
- U-Boot NAND FLASH驱动分析
- U-boot-2009.08移植(五)uboot架构中NAND Flash驱动修改
- 千兆网口 Freescale ETSEC + Marvell 88E1111 uboot Linux 驱动分析 四
- 结合2012.10版本的u-boot分析SD卡驱动(笔记)
- Tiny210(S5PV210) U-BOOT(五)----Nand Flash源码分析
- uboot中nand flash代码分析(3)
- 千兆网口 Freescale ETSEC + Marvell 88E1111 uboot Linux 驱动分析 五
- S5PV210-uboot源码分析-uboot的硬件驱动部分
- MTD(2)---nand flash的底层驱动代码分析 .
- 结合2012.10版本的u-boot分析SD卡驱动(笔记)
- 嵌入式Linux驱动学习之路(三)u-boot配置分析
- s3c2410的nand flash的驱动分析
- uboot中nand flash代码分析(2)
- U-boot1.1.6移植之Makefile分析(一)——推荐linux/android驱动初学者必看文章
- 千兆网口 Freescale ETSEC + Marvell 88E1111 uboot Linux 驱动分析
- 千兆网口 Freescale ETSEC + Marvell 88E1111 uboot Linux 驱动分析 一
- s3c2410的nand flash的驱动分析