You are on page 1of 5

H-JTAG

北京中科凌创电子

NAND FLASH
驱动程序添加指南

文档版本 K

发布日期 2012-02-15

WWW.HJTAG.COM
NAND FLASH 驱动程序添加指南

这个文档简单介绍了如何在 H-FLASHER 中添加 NAND FLASH 驱动。基于这个文档,用户可以添加


新的 NAND FLASH 驱动程序, 或是根据自己的实际需求修改已有的 NAND FLASH 驱动程序。

1. 基本介绍

NAND FLASH 和 NOR FLASH 有很大的差别,NOR FLASH 可以通过地址和数据总线直接访问,而


NAND FLASH 的访问需要通过 NAND FLASH 控制器来实现。因为 NOR FLASH 可以通过数据和地址总线
直接访问,所以可以根据 FLASH 的型号编写一个适用于所有硬件平台的通用的 NOR FLASH 驱动程序。
对 NAND FLASH 而言,其访问和控制需要通过 NAND FLASH 控制器来实现,而不同的 MCU 都有自己的
NAND FLASH 控制器。这就决定了 NAND FLASH 不能象 NOR FLASH 那样,编写一个通用的 FLASH 驱
动程序,适用于所有的硬件平台。对 NAND FLASH,只能通过 MCU + FLASH 组合的形式来编写相应的
FLASH 驱动程序。另外,NAND FLASH 本身的特性决定了其可靠性不如 NOR FLASH,需要使用 ECC 校
验和坏块管理以保证其可靠性。在实际应用当中,不同的应用往往会采用不同的 ECC 算法和坏块管理方
式。为了能满足不同的应用需求,我们提供了所有的 NAND FLASH 驱动程序的项目工程文件和源代码。
用户可以根据自己的实际应用需求,直接修改驱动程序。

要在 H-FLASHER 中添加自己的 NAND FLASH 驱动,需要提供 NAND FLASH 描述文件和对应的


FLASH 驱动程序。H-FLASHER 通过分析 NAND FLASH 描述文件来获取相关的信息,包括,NAND FLASH
的容量,结构,ID 和驱动程序名称等。而 NAND FLASH 驱动程序是实际对 FLASH 进行操作的一段二
进制程序。H-FLASHER 通过与这段程序进行交互,来实现对 FLASH 的操作。关于描述文件和驱动程序
的相关信息,请查看下面的介绍。

2. NAND FLASH 描述文件

NAND FLASH 描述文件是一个简单的文本文件,用户可以用任何文本编辑软件打开和编译。NAND


FLASH 描述文件提供了关于 NAND FLASH 的一些最基本的信息。H-FLASHER 正是通过这些信息来对
FLASH 进行操作的。下面是一个参考的例子(基于三星的 NAND FLASH - K9F1G08)。

FLASH_TYPE=3
FLASH_SIZE=128M
FLASH_ID=0x00A100EC
FLASH_ADDRESS=0x0
FLASH_NAND_DEVICE=(2048+64)x64PAGESx1024BLOCKS
FLASH_WIDTH=8/0/0
FLASH_DRIVER=1003/0/0

版权所有 © 2012 H-JTAG 北京中科凌创电子科技有限公司 1


具体的定义和描述如下:

 FLASH_TYPE=3
用于指定 FLASH 的类型,3 表示 FLASH 为 NAND FLASH。

 FLASH_SIZE=128M
用与指定 FLASH 的容量,单位为 BYTE。示例中表示,FLASH 的容量为 128 M BYTE。

 FLASH_ID=0x00A100EC
用于指定 FLASH 的 ID。示例中,0xA1 为器件 ID,0xEC 为厂商 ID。

 FLASH_ADDRESS=0x0
用于指定 FLASH 的起始地址,对 NAND FLASH 而言,地址需指定为 0x0。

 FLASH_NAND_DEVICE=(2048+64)x64PAGESx1024BLOCKS
用于指定 NAND FLASH 的结构。 示例中表示 FLASH 共有 1024 个 BLOCK,每个 BLOCK 有 64 个
PAGE,每个 PAGE 的大小为(2048+64)个 BYTE,其中 MAIN 区域为 2048 个 BYTE,SPARE 区域
为 64 个 BYTE。

 FLASH_WIDTH=8/0/0
用来描述 FLASH 的位宽。示例中表示 FLASH 的位宽为 8 位。如果 FLASH 为 16 位的,对应的标识为:
FLASH_WIDTH=0/16/0。如果 FLASH 的位宽为 32 位的,对应的标识为:FLASH_WIDTH=0/0/32。

 FLASH_DRIVER=1003/0/0
用来指定 FLASH 的驱动程序。示例中表示 FLASH 的位宽为 8 位,其对应的 FLASH 驱动程序为 1003。
如果 FLASH 的位宽为 8 位的,对应的标识为:驱动程序名字/0/0。如果 FLASH 的位宽为 16 位的,对
应的标识为:0/驱动程序名字/0。如果 FLASH 的位宽为 32 位的,对应的标识为: 0/0/驱动程序名字。
需要注意的是,驱动程序的名字只能以数字指定,并不要和已有的 NAND FLASH 驱动程序重名,以
避免冲突。

要添加一个新的 NAND FLASH 到 H-FLASHER 中去,用户要新建一个描述文件。FLASH 描述文件为


文本格式。用户只需新建一个文本文件,按照上面的格式填入相应的信息即可。描述文件定义好后,还需
要将文件名中的.TXT 后缀去掉,并将文件拷贝到 H-JTAG 安装目录\FDEVICE\NAND-FLASH\下去。重新
运行 H-FLASHER,就能在 FLASH 列表中的 NAND-FLASH 子项中看到,显示的名称为 FLASH 描述文件
的名字。

3. NAND FLASH 驱动程序

NAND FLASH 驱动程序是实际对 FLASH 进行操作的一段二进制程序。H-FLASHER 通过与这段程


序进行交互, 来实现对 FLASH 的操作。在添加了 NAND FLASH 描述文件后,用户还需要提供相应的 NAND
FLASH 驱动程序。

在 H-JTAG 的安装目录下( H-JTAG 安装目录\FDevice\NAND-FLASH\SourceCodes (ADS1.2)),用户可

版权所有 © 2012 H-JTAG 北京中科凌创电子科技有限公司 2


以找到我们所提供的所有的 NAND FLASH 驱动程序的工程文件和源代码。这些驱动程序都是按照固定的
模板编写的,用户可以以它们为参考,根据自己的硬件平台进行修改。需要注意的是,最终生成的驱动程
序二进制代码的大小必须小于 16K BYTE。

在编译生成了自己的驱动程序二进制文件后,用户需要根据 FLASH 描述文件中定义的驱动程序名称,


对二进制驱动程序的文件名做相应的修改。修改好后,再将二进制驱动程序拷贝到 H-JTAG 安装目录
\FDEVICE\NAND-FLASH\DRIVERS\下去。这样,H-FLASHER 就会根据 FLASH 描述文件中指定的驱动
程序名称,自动在 DRIVERS 目录下进行搜索,找到相应的驱动程序。

在我们提供的驱动程序源代码中,所有和 NAND FLASH 相关的定义和实现都包含在了 Flash.H 和


Flash.C 两个文件中。用户在编写自己的驱动程序的时候,一般只需要修改 Flash.H 和 Flash.C 这两个文件,
别的文件不需要修改。Flash.H 文件主要包含了一些和 FLASH 和 MCU 有关的定义,而 Flash.C 文件则包
含了所有对 NAND FLASH 的进行基本操作的函数实现。在 Flash.C 中定义的所有的函数的说明如下:

void nand_init(void)
这个是一个初始化函数,用户可以根据自己的需要,将一些相关的初始化操作放在这个函数内。

U32 nand_read_id(void)
这个是读取 NAND FLASH 的 ID 的函数。这个函数需要读取 FLASH 的 ID 并将其返回。

void nand_read_page(U32 blockidx, U32 pageidx)


这个是 PAGE 的读取操作函数。函数的参数包括 BLOCK 的索引和 PAGE 的索引。这个函数需要根据
指定的 BLOCK 索引和 PAGE 索引,将指定 PAGE 的数据(MAIN 区域)读取出来,并通过调用
write_to_host()函数将数据返回给 H-FLASHER。需要注意的是,每次调用 write_to_host()需返回 4 个
BYTE 的数据给 HOST。

void nand_dump_page(U32 blockidx, U32 pageidx)


这个也是 PAGE 的读取操作函数。函数的参数包括 BLOCK 的索引和 PAGE 的索引。这个函数需要根
据指定的 BLOCK 索引和 PAGE 索引,将指定 PAGE 的数据(包括 MAIN 和 SPARE 区域)读取出来,
并通过调用 write_to_host()函数将数据返回给 H-FLASHER。需要注意的是,每次调用 write_to_host()
需返回 4 个 BYTE 的数据给 HOST。nand_dump_page()和 nand_read_page()的区别在于,read 函数只读
取并返回 MAIN 区域的数据,而 dump 函数会读取并返回 MAIN 区域和 SPARE 区域的数据。

U32 nand_program_page(U32 blockidx, U32 pageidx)


这个是 PAGE 的编程操作函数。函数的参数包括 BLOCK 的索引和 PAGE 的索引。这个函数需要通过
调用 read_from_host()函数,接收一个 PAGE 的数据(数据长度为 MAIN 区域的大小),并根据指定的
BLOCK 索引和 PAGE 索引,将数据写到指定的 PAGE 中去。需要注意的是,每次调用 read_from_host()
从 HOST 读取的数据为 4 个 BYTE。另外,在该函数中是否进行 ECC 操作,以及是否对 SPARE 区域
进行写操作,完全是由用户决定的。

U32 nand_program_page_main_and_spare(U32 blockidx, U32 pageidx)


这个也是 PAGE 的编程操作函数。函数的参数包括 BLOCK 的索引和 PAGE 的索引。这个函数需要通
过调用 read_from_host()函数, 接收一个 PAGE 的数据(数据长度为 MAIN 区域加 SPARE 区域的大小)

并根据指定的 BLOCK 索引和 PAGE 索引,将数据写到指定的 PAGE 中去。需要注意的是,每次调用

版权所有 © 2012 H-JTAG 北京中科凌创电子科技有限公司 3


read_from_host()从 HOST 读取的数据为 4 个 BYTE。另外,该函数接收的数据涵盖了 MAIN 区域和
SPARE 区域,所以写操作也涵盖了 MAIN 区域和 SPARE 区域。这是该函数和 nand_program_page()
函数的区别。

U32 nand_erase_block(U32 blockidx)


这个是 BLOCK 擦除操作函数。函数的参数为需要擦除的 BLOCK 的索引。这个函数需要将指定的
BLOCK 擦除掉,并返回擦除结果。

U32 nand_check_blank(U32 blockidx)


这个函数用来对指定的 BLOCK 进行检查,看看其是否为空(全 0xFF)。参数为需要检查的 BLOCK 的
索引。

U32 nand_mark_badblock(U32 blockidx)


这个函数用来将一个 BLOCK 标识为坏块。函数的参数为需要标识的 BLOCK 的索引。

U32 nand_is_badblock(U32 blockidx)


这个函数用来检查一个 BLOCK 是否为坏块。函数的参数为需要检查的 BLOCK 的索引。

U32 nand_info_table(void)
这个函数用来接收坏块表和替换表。该函数只在 RELOCATE 编程模式下有用。在 RELOCATE 编程模
式下,编程完成后,H-FLASHER 会将坏块表和替换表发送给驱动程序。这个函数就是用来接收这些
信息的。在实际应用当中,用户可以根据自己的需求,修改这个函数,对接收到的坏块表和替换表进
行处理,例如建立坏块表和替换表,并按照一定的格式写入到特定的地址中去。

4. 获取更多的信息和帮助

用户如果需要获取更多的信息或帮助,可以通过电子邮件或是电话与我们联系。我们会根据用户的需
求,提供相应的帮助。我们的具体联系方式,可以通过我们的网站 (WWW.HJTAG.COM) 获取。

版权所有 © 2012 H-JTAG 北京中科凌创电子科技有限公司 4

You might also like