2.19. FLASH应用层API

Overview

flash应用层用户使用API

2.19.1. 示例

示例工程:具体示例代码详见 apps/common/example/peripheral/flash/flash_api/main.c ,示例工程实现需在 apps/demo/demo_DevKitBoard/include/demo_config.h 中开启宏 USE_FLASH_TEST_DEMO

2.19.2. 使用说明

1.flash应用层使用API接口。

函数

int norflash_open(const char *name, struct device **device, void *arg);

描述

norflash_open函数是初始化flash硬件,在用户使用flash的API接口首先需要打开才能使用flash API(多次打开没有影响)

参数

name、device、arg为NULL即可。

返回值

0:成功 其他:失败

函数

int norflash_origin_read(u8 *buf, u32 offset, u32 len);

描述

norflash_origin_read函数是直接SPI读取flash函数,用户应该使用的API接口。当通过norflash_write函数写,则norflash_origin_read读取与写的相同,需要加解密则应用层用户自行处理。

参数

buf:数据地址,offsetf:flash地址,len:数据长度

返回值

0:成功 其他:失败

函数

int norflash_read(struct device *device, void *buf, u32 len, u32 offset);

描述

norflash_read函数是CPU读取flash,用户应使用该API接口时需要注意:读写地址小于VM区域时会做加解密处理。

参数

device为NULL,buf:数据地址,offsetf:flash地址,len:数据长度

返回值

0:成功 其他:失败

函数

int norflash_write(struct device *device, void *buf, u32 len, u32 offset);

描述

norflash_write函数是直接SPI写flash函数,用户应该使用的API接口。当通过norflash_write函数写,则norflash_origin_read读取与写的相同,需要加解密则应用层用户自行处理。

参数

device为NULL,buf:数据地址,offsetf:flash地址,len:数据长度

返回值

0:成功 其他:失败

函数

int norflash_ioctl(struct device *device, u32 cmd, u32 arg);

描述

norflash_ioctl,flash操作命令接口

参数





IOCTL_GET_CAPACITY,获取flash容量(flash实际物理容量大小),arg为容量缓冲区的地址
IOCTL_ERASE_SECTOR,擦除扇区命令,arg为擦除扇区地址
IOCTL_GET_ID,获取flash ID命令,arg为ID缓冲区的地址
IOCTL_GET_UNIQUE_ID,获取flash的UUID,arg为UUID缓冲区的地址,地址可用大小为16字节
IOCTL_SET_WRITE_PROTECT,flash的写保护参数,arg=0(默认0)则解除写保护
IOCTL_GET_WRITE_PROTECT_VALUE,获取当前写保护寄存器1和2的值,返回值:寄存器2在8-15位,寄存器1在0-7位

返回值

0:成功 其他:失败

函数

void flash_read_write_init(void);

描述

应用层用户始化flash硬件接口

参数

void

返回值

void

函数

int flash_write_buff(u8 *buff, u32 addr, u32 len);

描述

应用层用户读写API,使用该函数前,先调用norflash_open函数初始化flash硬件接口

参数

buff:数据地址指针;addr:地址;len:长度

返回值

0:成功 其他:失败

函数

int flash_read_buff(u8 *buff, u32 addr, u32 len);

描述

应用层用户读写API,使用该函数前,先调用norflash_open函数初始化flash硬件接口

参数

buff:数据缓存指针;addr:地址;len:长度

返回值

0:成功 其他:失败

2.读写数据注意事项

Note

注意事项:应用层使用norflash_read函数读取flash时系统会进行解密,因此在读之前需要保证:写flash时候加密,否则读取数据会出错;当使用norflash_origin_read函数读取,无需加解密(如果需要加解密,此时加解密由用户自己完成)。注意flash的写保护区域,(具体说明,请参考 FLASH写保护参数使说明 ) 。

写flash前对数据进行加密函数使用例子:

//==================flash写地址小于VM区,norflash_read函数读取的数据需要进行先加密写进=========================//
void doe(u16 k, void *pBuf, u32 lenIn, u32 addr);//系统的加密函数
u32 get_system_enc_key(void);//系统加密秘钥
u32 get_norflash_vm_addr(void);//获取VM地址,VM长度为isd_config_rule.c文件配置的VM_LEN

//写地址小于VM区,数据进行加密,norflash_read读取正确
//当写flash不加密时,读取只能用norflash_origin_read
void flash_data_doe(u8 *buf, int len)
{
doe(get_system_enc_key(), buf, len, 0);
}

3.测试程序代码如下。

#include "app_config.h"
#include "system/includes.h"
#include "fs/fs.h"
#include "asm/sfc_norflash_api.h"

static void user_flash_test(void)
{
    void flash_test(void);
    void flash_read_write_init(void);
    int flash_write_buff(u8 *buff, u32 addr, u32 len);
    int flash_read_buff(u8 *buff, u32 addr, u32 len);

#if 0
    flash_test();//flash测试,flash_test函数可以测试起始地址到结束地址
#else
    //1.初始化flash硬件,并读取ID、容量等
    flash_read_write_init();//初始化flash硬件,并读取ID、容量等

    unsigned char *buff = malloc(4096);
    if(buff){//4096字节读写测试
        for (int i = 0; i < 4096; i++) {
            buff[i] = (unsigned char)i;
        }
        //2.写数据
        flash_write_buff(buff, 2*1024*1024, 4096);//2M地址起始测试,写
        memset(buff, 0, 4096);

        //3.读数据
        flash_read_buff(buff, 2*1024*1024, 4096);//2M地址起始测试,读
        for (int i = 0; i < 4096; i++) {
            if (buff[i] != (unsigned char)i) {//校验
                printf("user_flash_test test err buff[%d] = %d \n",i,buff[i]);
                break;
            }
        }
        free(buff);
    }
    printf("---> user_flash_test over \n");
#endif
    while (1) {
        os_time_dly(10);
    }
}
static int c_main(void)
{
    os_task_create(user_f
    lash_test, NULL, 12, 1000, 0, "user_flash_test");
    return 0;
}
late_initcall(c_main);

2.19.3. 常见问题

(1) 写入和读出数据不对?

答:写之前擦除对应扇区,确定写入地址和读取地址不在加密区域,对换读函数norflash_read、norflash_origin_read试试, 注意flash的写保护区域 (具体说明,请参考 FLASH写保护参数使说明 )

(2) AC79 最大支持多大容量的FLASH?

答:最高支持128MB的flash,但是代码体积不能够超过16MB,并且如果使用大于16MB 容量的flash, 资源只能够配置单备份