blob: 86744a6bbb1bebe5f3803b59db57b9bd4cdabc38 [file] [log] [blame]
b.liu3a41a312024-02-28 09:57:39 +08001/*
2* mbtk_device_info.c
3*
4* MBTK device partition information utils.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------- -------------------------------------------------------
132024/2/27 LiuBin Initial version
14
15******************************************************************************/
16#include <stdio.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <errno.h>
20
21#include "mbtk_device.h"
22#include "mbtk_log.h"
23#include "mbtk_str.h"
24#include "mbtk_mtd.h"
25
26/*
27* mbtk_device_info_basic_t
28* mbtk_device_info_fota_t
29
30*/
31int mbtk_dev_info_read(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size)
32{
33 int fd, len, i;
34 mbtk_device_info_header_t info_header;
35 memset(&info_header, 0, sizeof(mbtk_device_info_header_t));
36
37 switch(item_type) {
38 case MBTK_DEVICE_INFO_ITEM_BASIC:
39 {
40 if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_basic_t)) {
41 LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
42 return -1;
43 }
44 break;
45 }
46 case MBTK_DEVICE_INFO_ITEM_FOTA:
47 {
48 if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_fota_t)) {
49 LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
50 return -1;
51 }
52 break;
53 }
54 case MBTK_DEVICE_INFO_ITEM_MODEM:
55 {
56 if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_modem_t)) {
57 LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
58 return -1;
59 }
60 break;
61 }
62 case MBTK_DEVICE_INFO_ITEM_LOG:
63 {
64 if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_log_t)) {
65 LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
66 return -1;
67 }
68 break;
69 }
70 default:
71 {
72 LOGE("Item type[%d] error.", item_type);
73 return -1;
74 }
75 }
76
77 mbtk_partition_info_t *partition_info = mbtk_partition_get();
78 if(partition_info == NULL) {
79 LOGE("mbtk_partition_get() fail.");
80 return -1;
81 }
82
83 i = 0;
84 char dev[32] = {0};
85 while(i < MBTK_PARTITION_NUM_MAX) {
86 if(partition_info[i].used && strcmp(partition_info[i].name, MBTK_DEVICE_INFO_PARTITION_NAME) == 0) {
87 snprintf(dev, 32, "/dev/%s", partition_info[i].dev);
88 LOGD("%s -> %s", strcmp(partition_info[i].name, dev);
89 break;
90 }
91 i++;
92 }
93 if(strlen(dev) == 0) {
94 LOGE("DEV is null.");
95 return -1;
96 }
97
98 fd = open(dev, O_RDONLY);
99 if (fd < 0) {
100 LOGE("Fatal error: can't open device_info %s\n", dev);
101 return -1;
102 }
103
104 len = read(fd, &info_header, sizeof(mbtk_device_info_header_t));
105 if (len != sizeof(mbtk_device_info_header_t)) {
106 LOGE("Fatal error: read %d bytes(expect %d)\n", len, sizeof(mbtk_device_info_header_t));
107 close(fd);
108 goto fail;
109 }
110
111 if(info_header.tag != MBTK_DEVICE_INFO_PARTITION_TAG) {
112 LOGE("TAG error : %08x", info_header.tag);
113 goto fail;
114 }
115
116 if(info_header.version != MBTK_DEVICE_INFO_CURR_VERSION) {
117 LOGE("Version error : %d", info_header.version);
118 goto fail;
119 }
120
121 LOGD("Item count:%d", info_header.item_count);
122
123 if(info_header.item_header[item_type].addr == 0) {
124 LOGE("No found item : %d", item_type);
125 goto fail;
126 }
127
128 lseek(fd, info_header.item_header[item_type].addr, SEEK_SET);
129 if (read(fd, item_ptr, item_size) != item_size) {
130 LOGE("Read fail:%d", errno);
131 goto fail;
132 }
133
134 close(fd);
135 return 0;
136
137fail:
138 close(fd);
139 return -1;
140}
141