| #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; |
| } |
| |