AC695N-SoundBox-SDK/apps/soundbox/user_api/product_info_api.c

115 lines
3.3 KiB
C
Raw Normal View History

2026-08-09 00:00:00 +00:00
#include "product_info_api.h"
#include "syscfg_id.h"
#include "vm.h"
#include "app_config.h"
#include "typedef.h"
#include "system/includes.h"
#define PRODUCT_INFO_API_EN 0 //默认不开启
#if (PRODUCT_INFO_API_EN)
struct __product_info_head {
s16 crc;
u16 len;
const u8 data[];
} __attribute__((packed));
typedef enum _FLASH_ERASER {
CHIP_ERASER = 0,
BLOCK_ERASER,
SECTOR_ERASER,
PAGE_ERASER,
} FLASH_ERASER;
//*----------------------------------------------------------------------------*/
/**@brief 获取产品信息地址偏移
@param
@return
@note 使1218
*/
/*----------------------------------------------------------------------------*/
static u32 product_info_get_ptr(void)
{
u32 flash_capacity = sdfile_get_disk_capacity();
u32 addr = flash_capacity - 256 + 80;
printf("flash capacity:%x \n", flash_capacity);
return sdfile_flash_addr2cpu_addr(addr);
}
//*----------------------------------------------------------------------------*/
/**@brief 产品信息检查
@param para:
@return
@note 使1218
*/
/*----------------------------------------------------------------------------*/
static int product_info_check(const u8 *para)
{
struct __product_info_head *head;
//fill head
head = (struct __product_info_head *)para;
if (head->len >= 0xff) {
printf("product info len err!!\n");
return -1;
}
///crc check
u8 *crc_data = (u8 *)(para + sizeof(((struct __product_info_head *)0)->crc));
u32 crc_len = sizeof(struct __product_info_head)
- sizeof(((struct __product_info_head *)0)->crc)/*head crc*/
+ (head->len)/*content crc,include end character '\0'*/;
s16 crc_sum = 0;
crc_sum = CRC16(crc_data, crc_len);
if (crc_sum != head->crc) {
("product info crc error !!! %x %x \n", (u32)crc_sum, (u32)head->crc);
return -1;
}
return 0;
}
//*----------------------------------------------------------------------------*/
/**@brief 获取产品信息接口
@param buf: len:
@return
@note 使1218
*/
/*----------------------------------------------------------------------------*/
int product_info_prase(u8 *buf, u16 len)
{
//产品信息内容建议不要超过128
u8 *data_ptr = (u8 *)product_info_get_ptr();
int ret = product_info_check((const u8 *)data_ptr);
if (ret) {
return -1;
}
struct __product_info_head *head = (struct __product_info_head *)data_ptr;
if (len < head->len) {
printf("prase buf not enough\n");
return -1;
}
memcpy(buf, data_ptr + sizeof(struct __product_info_head), head->len);
return 0;
}
//测试代码
#if 0
void product_info_debug(void)
{
printf("product_info_debug \n");
u8 tst_data[128] = {0};
product_info_prase(tst_data, sizeof(tst_data));
printf("tst_data = %s\n", tst_data);
put_buf(tst_data, 256);
//针对获出来的数据结合方案需求进行解析
}
#endif
#endif//PRODUCT_INFO_API_EN