大于限制的oem参数单独保存到一个文件
This commit is contained in:
		| @@ -591,6 +591,8 @@ int ah_add_oem_ext(char *buf) | ||||
|     { | ||||
|         printf(NEW_LINE"Cannot open image file(%s)."NEW_LINE, file_name); | ||||
|         return 0; | ||||
|     } else { | ||||
|         printf(NEW_LINE"Open image file(%s)."NEW_LINE, file_name); | ||||
|     } | ||||
|     memcpy(buf,oem_magic_str,strlen(oem_magic_str)); | ||||
|     buf += strlen(oem_magic_str); | ||||
|   | ||||
| @@ -139,16 +139,16 @@ static iot_bootram_cmd_line_entity_t *btm_cmd_get_entity(char *cmd, int len) | ||||
|  | ||||
|  | ||||
|  | ||||
| static iot_bootram_cmd_line_entity_t *btm_cmd_get_entity_by_index(char *cmd, int len,int index) | ||||
| { | ||||
|     iot_bootram_cmd_line_entity_t *p_cmd_handle = NULL; | ||||
| // static iot_bootram_cmd_line_entity_t *btm_cmd_get_entity_by_index(char *cmd, int len,int index) | ||||
| // { | ||||
| //     iot_bootram_cmd_line_entity_t *p_cmd_handle = NULL; | ||||
|  | ||||
|     if(index >= cline_commands.total_cnt || index < 0){ | ||||
|         return NULL; | ||||
|     } | ||||
|     p_cmd_handle = &(cline_commands.entity[index]); | ||||
|     return p_cmd_handle; | ||||
| } | ||||
| //     if(index >= cline_commands.total_cnt || index < 0){ | ||||
| //         return NULL; | ||||
| //     } | ||||
| //     p_cmd_handle = &(cline_commands.entity[index]); | ||||
| //     return p_cmd_handle; | ||||
| // } | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -34,6 +34,9 @@ | ||||
| #define oem_debug_print(fmt, ...) | ||||
| #endif | ||||
|  | ||||
| #define OEM_FILE_MAX_SIZE       (3000) | ||||
| #define OEM_INFO_MAX_SIZE       (8192) | ||||
|  | ||||
| typedef enum _category_type_t { | ||||
|     CATEGORY_GENERAL = 0, | ||||
|     CATEGORY_RC_HDR, | ||||
| @@ -92,6 +95,9 @@ typedef struct _current_rc_info_t { | ||||
| typedef struct _diff_data_buffer_t { | ||||
|     uint8_t buf[4096]; | ||||
|     uint16_t len_total; | ||||
|     uint16_t len_cut; | ||||
|     uint16_t last_offset; | ||||
|     uint16_t cut_flag; | ||||
| } diff_data_buffer_t; | ||||
|  | ||||
| typedef struct _oem_tool_info_t { | ||||
| @@ -1077,6 +1083,26 @@ again: | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| // 重新装填 rc_hdr | ||||
| // index rc 结构体 的序号,have_next 是否有下一个,buf_index 存放hdr的buf_index | ||||
| static int rc_reflush_rc_hdr(int index, int have_next, int buf_index) | ||||
| { | ||||
|     /* fill header information (crc and offset) */ | ||||
|     oem_tool.rc_list[index]->hdr.have_next = have_next; | ||||
|     oem_tool.rc_list[index]->hdr.crc = | ||||
|         iot_getcrc32((uint8_t *)&oem_tool.rc_list[index]->hdr + | ||||
|                          sizeof(uint32_t), | ||||
|                      sizeof(iot_board_info_v1_t) - sizeof(uint32_t)); | ||||
|  | ||||
|     /* copy header info again */ | ||||
|     // 把修改过参数的rc_hdr 重新复制到buff中 | ||||
|     memcpy(&oem_tool.buf.buf[buf_index], | ||||
|            &oem_tool.rc_list[index]->hdr, sizeof(iot_oem_rc_hdr_v1_t)); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| uint8_t rc_data_merge() | ||||
| { | ||||
|     uint16_t buf_index_last; | ||||
| @@ -1087,6 +1113,7 @@ uint8_t rc_data_merge() | ||||
|         if (oem_tool.rc_list[index]->hdr.mode == 0) { | ||||
|             if (index != 0) { | ||||
|                 /* save the complete resource table */ | ||||
|                 // 不是差分模式 全部复制过来 | ||||
|                 oem_debug_print("save complete rc data\n"); | ||||
|                 memcpy(&oem_tool.buf.buf[oem_tool.buf.len_total], | ||||
|                     &oem_tool.rc_list[index]->hdr, sizeof(iot_board_info_v1_t)); | ||||
| @@ -1116,26 +1143,29 @@ uint8_t rc_data_merge() | ||||
|                 buf_index_last); | ||||
|         } | ||||
|  | ||||
|         /* oem partition size is 4K, including image header(64 bytes) and an | ||||
|         /* oem partition size is 8K, including image header(64 bytes) and an | ||||
|          * iot_oem_cfg_t structure. the remaining space holds differential data. | ||||
|          */ | ||||
|         if (oem_tool.buf.len_total > 4096 - sizeof(iot_oem_cfg_t) - 64) { | ||||
|         if (oem_tool.buf.len_total > OEM_INFO_MAX_SIZE - sizeof(iot_oem_cfg_t) - 64) { | ||||
|             die("diff data length exceeded the limit\n"); | ||||
|         } | ||||
|  | ||||
|         /* fill header information (crc and offset) */ | ||||
|         if (oem_tool.rc_list[index + 1] != 0) { | ||||
|             oem_tool.rc_list[index]->hdr.have_next = 1; | ||||
|             rc_reflush_rc_hdr(index, 1, buf_index_last); | ||||
|         } else { | ||||
|             oem_tool.rc_list[index]->hdr.have_next = 0; | ||||
|             rc_reflush_rc_hdr(index, 0, buf_index_last); | ||||
|         } | ||||
|         oem_tool.rc_list[index]->hdr.crc = \ | ||||
|             iot_getcrc32((uint8_t *)&oem_tool.rc_list[index]->hdr + | ||||
|             sizeof(uint32_t), sizeof(iot_board_info_v1_t) - sizeof(uint32_t)); | ||||
|  | ||||
|         /* copy header info again */ | ||||
|         memcpy(&oem_tool.buf.buf[buf_index_last], | ||||
|             &oem_tool.rc_list[index]->hdr, sizeof(iot_oem_rc_hdr_v1_t)); | ||||
|         if (oem_tool.buf.len_total + sizeof(iot_oem_cfg_t) <= OEM_FILE_MAX_SIZE) { | ||||
|             // 更新截断位置 | ||||
|             oem_tool.buf.len_cut = oem_tool.buf.len_total; | ||||
|         } else { | ||||
|             // 如果本次的数据导致尺寸超出了,则上一个数据需要修改 have_next = 0 | ||||
|             if (oem_tool.buf.cut_flag == 0) { | ||||
|                 rc_reflush_rc_hdr(index - 1, 0, oem_tool.buf.last_offset); | ||||
|                 oem_tool.buf.cut_flag = 1; | ||||
|             } | ||||
|         } | ||||
|         oem_tool.buf.last_offset = buf_index_last; | ||||
|     } | ||||
|  | ||||
|     /* The first resource is put into the OEM architecture */ | ||||
| @@ -1183,6 +1213,20 @@ void load_database_hw(const char *filename) | ||||
|     fclose (fp); | ||||
| } | ||||
|  | ||||
|  | ||||
| static void save_ext_data_hw(const char *filename,const uint8_t *buff,uint32_t size) | ||||
| { | ||||
|     FILE *fp; | ||||
|     fp = fopen(filename, "wb"); | ||||
|     fwrite(buff, size, 1, fp); | ||||
|     fclose(fp); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| void save_database_hw(const char *filename) | ||||
| { | ||||
|     FILE *fp; | ||||
| @@ -1202,10 +1246,16 @@ void save_database_hw(const char *filename) | ||||
|         die ("error write oem.bin: %s", strerror(errno)); | ||||
|  | ||||
|     fwrite(buf, sizeof(iot_oem_cfg_t), 1, fp); | ||||
|     if (oem_tool.buf.len_total) { | ||||
|     if (oem_tool.buf.len_cut) { | ||||
|         // oem_tool.buf中存储的是差分后的配置信息 每个差分都是原配置的一个副本修改差异值 | ||||
|         oem_debug_print("find diff data, write to file\n"); | ||||
|         fwrite(oem_tool.buf.buf, sizeof(uint8_t), oem_tool.buf.len_total, fp); | ||||
|         oem_debug_print("find extra data, size=%d\n",oem_tool.buf.len_cut); | ||||
|         fwrite(oem_tool.buf.buf, sizeof(uint8_t), oem_tool.buf.len_cut, fp); | ||||
|         if (oem_tool.buf.len_total>oem_tool.buf.len_cut){ | ||||
|             printf("have cut oem info, cut size=%ld, total size=%ld\n", | ||||
|                 oem_tool.buf.len_cut+sizeof(iot_oem_cfg_t),oem_tool.buf.len_total+sizeof(iot_oem_cfg_t)); | ||||
|             save_ext_data_hw("oem_ext.bin",&oem_tool.buf.buf[oem_tool.buf.len_cut], | ||||
|                 oem_tool.buf.len_total-oem_tool.buf.len_cut); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fclose(fp); | ||||
|   | ||||
| @@ -160,7 +160,7 @@ CORE_TYPE_UPPER=$(echo $CORE_TYPE_LOWER | tr '[a-z]' '[A-Z]') | ||||
| rm -f $CUR_DIR/sbl.bin | ||||
| rm -f $CUR_DIR/pib.bin | ||||
| rm -f $CUR_DIR/sp.bin | ||||
| rm -f $CUR_DIR/oem.bin | ||||
| rm -f $CUR_DIR/oem*.bin | ||||
| rm -f $CUR_DIR/ht.bin | ||||
| rm -f $CUR_DIR/ht_1p.bin | ||||
| rm -f $CUR_DIR/ht*.fw | ||||
|   | ||||
		Reference in New Issue
	
	Block a user