blob: b65aa04654055f9aa22b667dc47bb9426c77cd7e [file] [log] [blame]
#include "asr_flag.h"
#include "fota.h"
#include "obm2osl.h"
#include "serial.h"
#include "Errors.h"
#include "print.h"
typedef unsigned int uint32; /* Unsigned 32 bit value */
typedef unsigned char uint8; /* Unsigned 8 bit value */
#include "mbtk_device.h"
extern UINT8_T FlashInitDone;
static CHAR *dev_info_buff = NULL;
UINT_T Dev_Info_Get(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size)
{
UINT_T Retval = GeneralError;
P_FlashProperties_T pFlashP = GetFlashProperties(BOOT_FLASH);
UINT_T BlockSize = pFlashP->BlockSize;
if(FlashInitDone && dev_info_buff == NULL)
{
dev_info_buff = (CHAR *)malloc(BlockSize);
if(dev_info_buff == NULL)
return Retval;
memset(dev_info_buff, 0xFF, BlockSize);
Retval = ReadFlash(MBTK_DEV_INFO_PARTITION_ADDR, dev_info_buff, BlockSize, BOOT_FLASH);
if (Retval != NoError)
{
obm_printf("Read dev_info fail [0x%x].\n\r", Retval);
goto EXIT;
}
mbtk_device_info_header_t *header = (mbtk_device_info_header_t*)dev_info_buff;
if(header->tag != MBTK_DEVICE_INFO_PARTITION_TAG || header->item_count != MBTK_DEVICE_INFO_ITEM_NUM) {
obm_printf("dev_info header error: tag - 0x%x, version - 0x%x, item - %d\n\r", header->tag, header->version, header->item_count);
Retval = GeneralError;
goto EXIT;
}
obm_printf("dev_info item - %d, item_type - %d.\n\r", header->item_count, item_type);
switch(item_type) {
case MBTK_DEVICE_INFO_ITEM_BASIC:
{
if(item_size != sizeof(mbtk_device_info_basic_t)) {
obm_printf("item_size != sizeof(mbtk_device_info_basic_t)\n\r");
Retval = GeneralError;
goto EXIT;
}
mbtk_device_info_basic_t *basic_ptr = (mbtk_device_info_basic_t*)item_ptr;
basic_ptr->version = (mbtk_device_info_version_enum)header->version;
if(basic_ptr->version == DEV_INFO_VERSION_V1) {
memcpy(&(basic_ptr->basic.v1), dev_info_buff + header->item_header[item_type].addr,
sizeof(mbtk_device_info_basic_v1_t));
if(memcmp(basic_ptr->basic.v1.name, MBTK_DEVICE_INFO_ITEM_STR_BASIC, 5)) {
obm_printf("dev_info BASIC error: name - %s\n\r", basic_ptr->basic.v1.name);
Retval = GeneralError;
goto EXIT;
}
} else {
memcpy(&(basic_ptr->basic.v2), dev_info_buff + header->item_header[item_type].addr,
sizeof(mbtk_device_info_basic_v2_t));
if(memcmp(basic_ptr->basic.v2.name, MBTK_DEVICE_INFO_ITEM_STR_BASIC, 5)) {
obm_printf("dev_info BASIC error: name - %s\n\r", basic_ptr->basic.v2.name);
Retval = GeneralError;
goto EXIT;
}
}
break;
}
case MBTK_DEVICE_INFO_ITEM_FOTA:
{
if(item_size != sizeof(mbtk_device_info_fota_t)) {
obm_printf("item_size != sizeof(mbtk_device_info_fota_t)\n\r");
Retval = GeneralError;
goto EXIT;
}
mbtk_device_info_fota_t *fota_ptr = (mbtk_device_info_fota_t*)item_ptr;
fota_ptr->version = (mbtk_device_info_version_enum)header->version;
if(fota_ptr->version == DEV_INFO_VERSION_V1) {
memcpy(&(fota_ptr->fota.v1), dev_info_buff + header->item_header[item_type].addr,
sizeof(mbtk_device_info_fota_v1_t));
if(memcmp(fota_ptr->fota.v1.name, MBTK_DEVICE_INFO_ITEM_STR_FOTA, 4)) {
obm_printf("dev_info FOTA error: name - %s\n\r", fota_ptr->fota.v1.name);
Retval = GeneralError;
goto EXIT;
}
} else {
memcpy(&(fota_ptr->fota.v2), dev_info_buff + header->item_header[item_type].addr,
sizeof(mbtk_device_info_fota_v2_t));
if(memcmp(fota_ptr->fota.v2.name, MBTK_DEVICE_INFO_ITEM_STR_FOTA, 4)) {
obm_printf("dev_info FOTA error: name - %s\n\r", fota_ptr->fota.v2.name);
Retval = GeneralError;
goto EXIT;
}
}
break;
}
case MBTK_DEVICE_INFO_ITEM_MODEM:
{
if(item_size != sizeof(mbtk_device_info_modem_t)) {
obm_printf("item_size != sizeof(mbtk_device_info_modem_t)\n\r");
Retval = GeneralError;
goto EXIT;
}
mbtk_device_info_modem_t *modem_ptr = (mbtk_device_info_modem_t*)item_ptr;
modem_ptr->version = (mbtk_device_info_version_enum)header->version;
if(modem_ptr->version == DEV_INFO_VERSION_V1) {
memcpy(&(modem_ptr->modem.v1), dev_info_buff + header->item_header[item_type].addr,
sizeof(mbtk_device_info_modem_v1_t));
if(memcmp(modem_ptr->modem.v1.name, MBTK_DEVICE_INFO_ITEM_STR_MODEM, 5)) {
obm_printf("dev_info MODEM error: name - %s\n\r", modem_ptr->modem.v1.name);
Retval = GeneralError;
goto EXIT;
}
} else {
memcpy(&(modem_ptr->modem.v2), dev_info_buff + header->item_header[item_type].addr,
sizeof(mbtk_device_info_modem_v2_t));
if(memcmp(modem_ptr->modem.v2.name, MBTK_DEVICE_INFO_ITEM_STR_MODEM, 5)) {
obm_printf("dev_info MODEM error: name - %s\n\r", modem_ptr->modem.v2.name);
Retval = GeneralError;
goto EXIT;
}
}
break;
}
case MBTK_DEVICE_INFO_ITEM_LOG:
{
if(item_size != sizeof(mbtk_device_info_log_t)) {
obm_printf("item_size != sizeof(mbtk_device_info_log_t)\n\r");
Retval = GeneralError;
goto EXIT;
}
mbtk_device_info_log_t *log_ptr = (mbtk_device_info_log_t*)item_ptr;
log_ptr->version = (mbtk_device_info_version_enum)header->version;
if(log_ptr->version == DEV_INFO_VERSION_V1) {
memcpy(&(log_ptr->log.v1), dev_info_buff + header->item_header[item_type].addr,
sizeof(mbtk_device_info_log_v1_t));
if(memcmp(log_ptr->log.v1.name, MBTK_DEVICE_INFO_ITEM_STR_LOG, 3)) {
obm_printf("dev_info LOG error: name - %s\n\r", log_ptr->log.v1.name);
Retval = GeneralError;
goto EXIT;
}
} else {
memcpy(&(log_ptr->log.v2), dev_info_buff + header->item_header[item_type].addr,
sizeof(mbtk_device_info_log_v2_t));
if(memcmp(log_ptr->log.v2.name, MBTK_DEVICE_INFO_ITEM_STR_LOG, 3)) {
obm_printf("dev_info LOG error: name - %s\n\r", log_ptr->log.v2.name);
Retval = GeneralError;
goto EXIT;
}
}
break;
}
default:
{
obm_printf("Item type[%d] error.\n\r", item_type);
Retval = GeneralError;
goto EXIT;
}
}
Retval = NoError;
}
EXIT:
return Retval;
}
UINT_T Dev_Info_Save(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size)
{
UINT_T MainRet = NoError;
P_FlashProperties_T pFlashP = GetFlashProperties(BOOT_FLASH);
UINT_T BlockSize = pFlashP->BlockSize;
if (!dev_info_buff)
return GeneralError;
obm_printf("dev_info item - %d, item_size - %d.\n\r", item_type, item_size);
mbtk_device_info_header_t *header = (mbtk_device_info_header_t*)dev_info_buff;
switch(item_type) {
case MBTK_DEVICE_INFO_ITEM_BASIC:
{
if(item_size != sizeof(mbtk_device_info_basic_t)) {
obm_printf("item_size != sizeof(mbtk_device_info_basic_t)\n\r");
return GeneralError;
}
mbtk_device_info_basic_t *ptr = (mbtk_device_info_basic_t*)item_ptr;
if(ptr->version == DEV_INFO_VERSION_V1) {
memcpy(dev_info_buff + header->item_header[item_type].addr, &(ptr->basic.v1), sizeof(mbtk_device_info_basic_v1_t));
} else {
memcpy(dev_info_buff + header->item_header[item_type].addr, &(ptr->basic.v2), sizeof(mbtk_device_info_basic_v2_t));
}
break;
}
case MBTK_DEVICE_INFO_ITEM_FOTA:
{
if(item_size != sizeof(mbtk_device_info_fota_t)) {
obm_printf("item_size != sizeof(mbtk_device_info_fota_t)\n\r");
return GeneralError;
}
mbtk_device_info_fota_t *ptr = (mbtk_device_info_fota_t*)item_ptr;
if(ptr->version == DEV_INFO_VERSION_V1) {
memcpy(dev_info_buff + header->item_header[item_type].addr, &(ptr->fota.v1), sizeof(mbtk_device_info_fota_v1_t));
} else {
memcpy(dev_info_buff + header->item_header[item_type].addr, &(ptr->fota.v2), sizeof(mbtk_device_info_fota_v2_t));
}
break;
}
case MBTK_DEVICE_INFO_ITEM_MODEM:
{
if(item_size != sizeof(mbtk_device_info_modem_t)) {
obm_printf("item_size != sizeof(mbtk_device_info_modem_t)\n\r");
return GeneralError;
}
mbtk_device_info_modem_t *ptr = (mbtk_device_info_modem_t*)item_ptr;
if(ptr->version == DEV_INFO_VERSION_V1) {
memcpy(dev_info_buff + header->item_header[item_type].addr, &(ptr->modem.v1), sizeof(mbtk_device_info_modem_v1_t));
} else {
memcpy(dev_info_buff + header->item_header[item_type].addr, &(ptr->modem.v2), sizeof(mbtk_device_info_modem_v2_t));
}
break;
}
case MBTK_DEVICE_INFO_ITEM_LOG:
{
if(item_size != sizeof(mbtk_device_info_log_t)) {
obm_printf("item_size != sizeof(mbtk_device_info_log_t)\n\r");
return GeneralError;
}
mbtk_device_info_log_t *ptr = (mbtk_device_info_log_t*)item_ptr;
if(ptr->version == DEV_INFO_VERSION_V1) {
memcpy(dev_info_buff + header->item_header[item_type].addr, &(ptr->log.v1), sizeof(mbtk_device_info_log_v1_t));
} else {
memcpy(dev_info_buff + header->item_header[item_type].addr, &(ptr->log.v2), sizeof(mbtk_device_info_log_v2_t));
}
break;
}
default:
{
obm_printf("Item type[%d] error.\n\r", item_type);
return GeneralError;
}
}
MainRet = EraseFlash(MBTK_DEV_INFO_PARTITION_ADDR, BlockSize, BOOT_FLASH);
if (MainRet != NoError)
{
obm_printf("Warning: Erase main Device info error\n\r");
} else {
MainRet = WriteFlash(MBTK_DEV_INFO_PARTITION_ADDR, (UINT_T)dev_info_buff, BlockSize, BOOT_FLASH);
if (MainRet != NoError)
obm_printf("Warning: Write main ASR Flag error\n\r");
}
SetUseSpareArea( FALSE, BOOT_FLASH );
UpdateBBT();
if (MainRet) {
/* Both main and backup ASR flag are not saved */
return ASRFlagSaveError;
}
return NoError;
}