Add device_info partition.
Change-Id: Ia8d86a5cd4b1bd46cd3923f2cad09931fc877eb0
diff --git a/mbtk/mbtk_lib/src/mbtk_device_info.c b/mbtk/mbtk_lib/src/mbtk_device_info.c
new file mode 100755
index 0000000..86744a6
--- /dev/null
+++ b/mbtk/mbtk_lib/src/mbtk_device_info.c
@@ -0,0 +1,141 @@
+/*
+* mbtk_device_info.c
+*
+* MBTK device partition information utils.
+*
+*/
+/******************************************************************************
+
+ EDIT HISTORY FOR FILE
+
+ WHEN WHO WHAT,WHERE,WHY
+-------- -------- -------------------------------------------------------
+2024/2/27 LiuBin Initial version
+
+******************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "mbtk_device.h"
+#include "mbtk_log.h"
+#include "mbtk_str.h"
+#include "mbtk_mtd.h"
+
+/*
+* mbtk_device_info_basic_t
+* mbtk_device_info_fota_t
+
+*/
+int mbtk_dev_info_read(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size)
+{
+ int fd, len, i;
+ mbtk_device_info_header_t info_header;
+ memset(&info_header, 0, sizeof(mbtk_device_info_header_t));
+
+ switch(item_type) {
+ case MBTK_DEVICE_INFO_ITEM_BASIC:
+ {
+ if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_basic_t)) {
+ LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
+ return -1;
+ }
+ break;
+ }
+ case MBTK_DEVICE_INFO_ITEM_FOTA:
+ {
+ if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_fota_t)) {
+ LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
+ return -1;
+ }
+ break;
+ }
+ case MBTK_DEVICE_INFO_ITEM_MODEM:
+ {
+ if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_modem_t)) {
+ LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
+ return -1;
+ }
+ break;
+ }
+ case MBTK_DEVICE_INFO_ITEM_LOG:
+ {
+ if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_log_t)) {
+ LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
+ return -1;
+ }
+ break;
+ }
+ default:
+ {
+ LOGE("Item type[%d] error.", item_type);
+ return -1;
+ }
+ }
+
+ mbtk_partition_info_t *partition_info = mbtk_partition_get();
+ if(partition_info == NULL) {
+ LOGE("mbtk_partition_get() fail.");
+ return -1;
+ }
+
+ i = 0;
+ char dev[32] = {0};
+ while(i < MBTK_PARTITION_NUM_MAX) {
+ if(partition_info[i].used && strcmp(partition_info[i].name, MBTK_DEVICE_INFO_PARTITION_NAME) == 0) {
+ snprintf(dev, 32, "/dev/%s", partition_info[i].dev);
+ LOGD("%s -> %s", strcmp(partition_info[i].name, dev);
+ break;
+ }
+ i++;
+ }
+ if(strlen(dev) == 0) {
+ LOGE("DEV is null.");
+ return -1;
+ }
+
+ fd = open(dev, O_RDONLY);
+ if (fd < 0) {
+ LOGE("Fatal error: can't open device_info %s\n", dev);
+ return -1;
+ }
+
+ len = read(fd, &info_header, sizeof(mbtk_device_info_header_t));
+ if (len != sizeof(mbtk_device_info_header_t)) {
+ LOGE("Fatal error: read %d bytes(expect %d)\n", len, sizeof(mbtk_device_info_header_t));
+ close(fd);
+ goto fail;
+ }
+
+ if(info_header.tag != MBTK_DEVICE_INFO_PARTITION_TAG) {
+ LOGE("TAG error : %08x", info_header.tag);
+ goto fail;
+ }
+
+ if(info_header.version != MBTK_DEVICE_INFO_CURR_VERSION) {
+ LOGE("Version error : %d", info_header.version);
+ goto fail;
+ }
+
+ LOGD("Item count:%d", info_header.item_count);
+
+ if(info_header.item_header[item_type].addr == 0) {
+ LOGE("No found item : %d", item_type);
+ goto fail;
+ }
+
+ lseek(fd, info_header.item_header[item_type].addr, SEEK_SET);
+ if (read(fd, item_ptr, item_size) != item_size) {
+ LOGE("Read fail:%d", errno);
+ goto fail;
+ }
+
+ close(fd);
+ return 0;
+
+fail:
+ close(fd);
+ return -1;
+}
+