说明

1 确认参数

.name

.id

.id_len

.chipsize

.erasesize&.pagesize&.oobsize

.read&.write&.erase

可选模式

.read可选模式

.write可选模式

.erase可选模式

确认Flash支持模式:

确认模式参数1 dummy:

确认模式参数3 速率:

确认模式参数2

API确认

.driver

2 uboot移植

3 kernel移植


本文描述如何添加一颗nand/nor flash到海思视觉芯片中;其中包括涉及到的所有参数以及添加的路径;       

        以NADN Flash GD5F2GM7UEYIGR为例,基础SDK版本 Hi3516CV610R001C01SPC020,参考文档《基于fmcv100控制器的Flash移植指南.pdf

        NOR Flash和其版本的SDK在本文同样适配;

说明

文档提供SPI Nand注册样例如下

因此只需确认以下参数即可适配Flash
        .name
        .id
        .id_len
        .chipsize
        .erasesize
        .pagesize
        .oobsize
        .badblock_pos
        .read
        .write
        .erase
        .driver

 

1 确认参数

.name

根据flash名字 GD5F2GM7UEYIGR,即

        .name      = "GD5F1GM7UEYIGR",
 

.id

从Flash手册中查找“READ ID Table”        

        .id        = {0xc8, 0x91},
 

.id_len

根据.id参数确认长度为2即

        .id_len    = _2B,

.chipsize

确认flash容量1Gb=128MB,即:

        .chipsize  = _128M,

.erasesize&.pagesize&.oobsize

FMC 控制器自身集成 ECC 纠错功能, FMC 启动之后会关掉 SPI Nand Flash器件的 ECC ,而关闭 ECC 这个动作,只能支持将 B0h Feature 寄存器的 bit4 置成 0 。 所以,判断一颗SPI Nand Flash 器件 FMC 能不能支持的第一步就是先看看这颗器件的 B0h Feature寄存器的 bit4 是否是 ECC_EN bit ,如果不是,那就不支持。----- 选择ECC OFF

即:

        .erasesize = _128K,
        .pagesize  = _2K,
        .oobsize   = _128B,

.read&.write&.erase

对于此参数根据路径:

uboot:drivers/mtd/nand/raw/fmc100/fmc_spi_nand_ids.c
kernel:drivers/mtd/nand/fmc100/fmc_spi_nand_ids.c

可选模式

.read可选模式

set_read_std

set_read_fast

set_read_dual

set_read_dual_addr

set_read_quad

set_read_quad_addr

.write可选模式

set_write_std

set_write_quad

.erase可选模式

set_erase_sector_128k

set_erase_sector_256k

确认Flash支持模式:

Flash支持以下模式:

.read:set_read_std、set_read_fast、set_read_dual、set_read_dual_addr、set_read_quad、set_read_quad_addr
.write:set_write_std、set_write_quad
.erase:set_erase_sector_128k

即:

read支持:
        &read_std(x, y, z),
        &read_fast(x, y, z),
        &read_dual(x, y, z),
        &read_dual_addr(x, y, z),
        &read_quad(x, y, z),
        &read_quad_addr(x, y, z),

write支持:

        &write_std(x, y, z),
        &write_quad(x, y, z),

erase支持:

        &erase_sector_128k(x, y, z),

确认模式参数1 dummy:

根据文档截图
对于std模式下:read dummy的值为1,write和erase dummy值为0;

即:read_std dummy的值为1,read_fast、erase_sector_128k dummy的值为0

对于dual-output/input和quad-output/input模式下:read和write dummy的值为1;

即:read_dual、read_quad、write_quad的dummy 值为1

对于dual-I/O和quad-I/O模式下:

根据Flash数据手册(右图)dummy为8bit

即read_dual_addr的dummy值为1

根据Flash数据手册(右图)dummy为16bit

read_quad_addr的dummy值为2

确认模式参数3 速率:

根据Flash数据手册(右图)

flash最小速率为104Mhz,最大速率为133Mhz;

确认模式参数2

一般为固定参数,可以不确认

API确认

参数根据路径:

uboot:drivers/mtd/nand/raw/fmc100/fmc_spi_nand_ids.c
kernel:drivers/mtd/nand/fmc100/fmc_spi_nand_ids.c

可以选出以下接口

read支持:
        &read_std(1, INFINITE, 24),
        &read_fast(1, INFINITE, 133),
        &read_dual(1, INFINITE, 133),
        &read_dual_addr(1, INFINITE, 104),
        &read_quad(1, INFINITE, 133),
        &read_quad_addr(2, INFINITE, 104),

write支持:

        &write_std(0, 256, 133),
        &write_quad(0, 256, 133),

erase支持:

        &erase_sector_128k(0, _128K, 133),

.driver

芯片为GD Flash芯片即

.driver    = &spi_driver_general,

2 uboot移植

Uboot 的驱动路径: drivers/mtd/nand/raw/fmc100/fmc_spi_nand_ids.c
在fmc_spi_nand_flash_table结构体添加flash
	{
		.name      = "GD5F1GM7UEYIGR",
		.id        = {0xc8, 0x91},
		.id_len    = _2B,
		.chipsize  = _128M,
		.erasesize = _128K,
		.pagesize  = _2K,
		.oobsize   = _128B,
		.badblock_pos = BBP_FIRST_PAGE,
		.read      = {
			&read_std(1, INFINITE, 24),
			&read_fast(1, INFINITE, 133),
			&read_dual(1, INFINITE, 133),
			&read_dual_addr(1, INFINITE, 104),
			&read_quad(1, INFINITE, 133),
			&read_quad_addr(2, INFINITE, 104),
			0
		},
		.write     = {
			&write_std(0, 256, 133),
			&write_quad(0, 256, 133),
			0
		},
		.erase     = {
			&erase_sector_128k(0, _128K, 104),
			0
		},
		.driver    = &spi_driver_general,
	},

3 kernel移植

内核的驱动路径:drivers/mtd/nand/fmc100/fmc_spi_nand_ids.c
在fmc_spi_nand_flash_table结构体添加flash
	{
		.name      = "GD5F1GM7UEYIGR",
		.id        = {0xc8, 0x91},
		.id_len    = 2,
		.chipsize  = _128M,
		.erasesize = _128K,
		.pagesize  = _2K,
		.oobsize   = 128,
		.badblock_pos = BBP_FIRST_PAGE,
		.read      = {
			&read_std(1, INFINITE, 24),
			&read_fast(1, INFINITE, 133),
			&read_dual(1, INFINITE, 133),
			&read_dual_addr(1, INFINITE, 104),
			&read_quad(1, INFINITE, 133),
			&read_quad_addr(2, INFINITE, 104),
			0
		},
		.write     = {
			&write_std(0, 256, 133),
			&write_quad(0, 256, 133),
			0
		},
		.erase     = {
			&erase_sector_128k(0, _128K, 133),
			0
		},
		.driver    = &spi_driver_general,
	},

将上述flash适配的代码插入到uboot和kernel对应的结构体并重新编译SDK即可

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐