Files
2025-08-27 09:51:58 +01:00

196 lines
4.8 KiB
C

#include "flash_read_demo.h"
extern struct os_mutex *get_syscfg_lock();
uint8_t flash_read_uuid_demo(uint32_t addr)
{
os_printf("%s:%d\n",__FUNCTION__,__LINE__);
uint8_t id[128] = {0};
struct hgxip_flash_custom_read flash_param;
struct os_mutex *mutex = get_syscfg_lock();
struct syscfg_info info;
struct spi_nor_flash *flash;
os_memset(&info, 0, sizeof(info));
if (syscfg_info_get(&info)) {
return -ENXIO;
}
//这里默认flash1和flash2是同一个,这里就不做判断
flash = info.flash1;
//设置读取flash的参数命令
flash_param.dummys = 8;
flash_param.cmd = 0x4b; //flash读取id的命令
flash_param.size = 128; //id正常是3byte,如果超过3byte,则会循环读取
flash_param.addr = addr;
flash_param.buf = id;
os_mutex_lock(mutex, osWaitForever);
spi_nor_open(flash);
spi_nor_custom_read(flash, (uint32_t)&flash_param);
spi_nor_close(flash);
os_mutex_unlock(mutex);
for(int i=0;i<128;i++)
{
if(i%16 == 0)
{
_os_printf("\r\n");
}
_os_printf("%02X ",id[i]);
}
_os_printf("\r\n");
return 0;
}
uint8_t flash_security_demo(uint32_t addr)
{
os_printf("%s:%d\n",__FUNCTION__,__LINE__);
uint8_t id[128] = {0};
struct os_mutex *mutex = get_syscfg_lock();
struct syscfg_info info;
struct spi_nor_flash *flash;
os_memset(&info, 0, sizeof(info));
if (syscfg_info_get(&info)) {
return -ENXIO;
}
flash = info.flash1;
os_mutex_lock(mutex, osWaitForever);
spi_nor_open(flash);
//擦除
spi_nor_erase_security_reg(flash,addr);
//写入
uint8_t buf[10] = "1234657890";
spi_nor_program_security_reg(flash,addr,buf,10);
//读取
spi_nor_read_security_reg(flash,addr,id,128);
spi_nor_close(flash);
os_mutex_unlock(mutex);
for(int i=0;i<128;i++)
{
if(i%16 == 0)
{
_os_printf("\r\n");
}
_os_printf("%02X ",id[i]);
}
_os_printf("\r\n");
return 0;
}
//通过自定义方式去操作安全区(可能不同flash命令不一样)
uint8_t flash_custom_security_demo(uint32_t addr)
{
os_printf("%s:%d\n",__FUNCTION__,__LINE__);
uint8_t id[128] = {0};
struct hgxip_flash_custom_read flash_param;
struct os_mutex *mutex = get_syscfg_lock();
struct syscfg_info info;
struct spi_nor_flash *flash;
os_memset(&info, 0, sizeof(info));
if (syscfg_info_get(&info)) {
return -ENXIO;
}
//这里默认flash1和flash2是同一个,这里就不做判断
flash = info.flash1;
//设置读取flash的参数命令
flash_param.dummys = 0;
flash_param.cmd = 0x42; //flash读取id的命令
flash_param.size = 128; //id正常是3byte,如果超过3byte,则会循环读取
flash_param.addr = addr;
flash_param.buf = id;
os_mutex_lock(mutex, osWaitForever);
spi_nor_open(flash);
//擦除只需要命令和地址(接口暂时支持这个,有特殊flash需要作兼容)
flash_param.cmd = 0x44;
spi_nor_custom_erase(flash, (uint32_t)&flash_param);
//写入数据到对应区域,需要设置dummys buf 长度 以及命令
memcpy(id,"abcdefghij",10);
flash_param.size = 10;
flash_param.cmd = 0x42;
flash_param.dummys = 0;
spi_nor_custom_write(flash, (uint32_t)&flash_param);
//读取数据,需要设置dummys 命令 buf size
memset(id,0,sizeof(id));
flash_param.cmd = 0x48;
flash_param.dummys = 8;
flash_param.size = sizeof(id);
spi_nor_custom_read(flash, (uint32_t)&flash_param);
spi_nor_close(flash);
os_mutex_unlock(mutex);
for(int i=0;i<128;i++)
{
if(i%16 == 0)
{
_os_printf("\r\n");
}
_os_printf("%02X ",id[i]);
}
_os_printf("\r\n");
return 0;
}
uint8_t flash_reg_opt_demo(void)
{
os_printf("%s:%d\n",__FUNCTION__,__LINE__);
uint8_t buf[4] = {0};
struct hgxip_flash_reg_opt_param opt_param;
struct os_mutex *mutex = get_syscfg_lock();
struct syscfg_info info;
struct spi_nor_flash *flash;
os_memset(&info, 0, sizeof(info));
if (syscfg_info_get(&info)) {
return -ENXIO;
}
//这里默认flash1和flash2是同一个,这里就不做判断
flash = info.flash1;
os_mutex_lock(mutex, osWaitForever);
spi_nor_open(flash);
//read flash status reg
opt_param.buf = buf;
opt_param.cmd = 0x5;
opt_param.pre_cmd = 0xFF;
opt_param.len = 4;
spi_ioctl(flash->spidev, SPI_XIP_REG_OPT, (uint32)&opt_param, 0);
//write flash status reg : write protect
buf[0] |= 0x1c;
opt_param.buf = buf;
opt_param.cmd = 0x01;
opt_param.pre_cmd = 0x50;
opt_param.len = 1;
spi_ioctl(flash->spidev, SPI_XIP_REG_OPT, (uint32)&opt_param, 0);
spi_nor_close(flash);
os_mutex_unlock(mutex);
return 0;
}