115 lines
3.3 KiB
C
115 lines
3.3 KiB
C
|
|
#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 产品信息是在芯片烧写的时候, 使用1拖2或者1拖8进行烧录的
|
|||
|
|
*/
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
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 产品信息是在芯片烧写的时候, 使用1拖2或者1拖8进行烧录的
|
|||
|
|
*/
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
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 产品信息是在芯片烧写的时候, 使用1拖2或者1拖8进行烧录的
|
|||
|
|
*/
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
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
|
|||
|
|
|