[bugfix][T108][bug-view-1376][gsw][oem]调用read和write接口均失败,libmbtk_lib.so库中没有对应定义

Change-Id: I5db6d7cf8a8c5883feab06553c891695d9611975
diff --git a/mbtk/libmbtk_lib/common/mbtk_oem_rw.c b/mbtk/libmbtk_lib/common/mbtk_oem_rw.c
new file mode 100755
index 0000000..74cd150
--- /dev/null
+++ b/mbtk/libmbtk_lib/common/mbtk_oem_rw.c
@@ -0,0 +1,230 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <fcntl.h>

+#include <unistd.h>

+#include <sys/ioctl.h>

+#include <mtd/mtd-user.h>

+#include <errno.h>

+#include <dlfcn.h>

+#include "mbtk_log.h"

+

+

+

+

+#define FLASH_DEVICE    "/dev/mtd32"

+#define BACKUP_DEVICE   "/dev/mtd33"

+

+

+/**

+ * @brief 从指定的flash页面读取数据

+ * @param block_id 块ID(从1开始)

+ * @param data 存储读取数据的缓冲区

+ * @param len 存储读取数据长度的指针

+ * @return GSW_HAL_SUCCESS 或 GSW_HAL_FAIL

+ */

+int mbtk_oem_read_data_ext(unsigned int block_id, void *data, unsigned int *len) 

+{

+    int fd;

+    struct mtd_info_user mtd_info;

+    off_t offset;

+    ssize_t bytes_read;

+    unsigned int max_block_id;

+    // 输入参数验证

+    if (!data || !len) 

+    {

+        LOGE("invalid :data or len is NULL\n");

+        return -2;

+    }

+

+    // 打开flash设备

+    fd = open(FLASH_DEVICE, O_RDONLY);

+    if (fd == -1) 

+    {

+        LOGE("open flash device error %s\n", strerror(errno));

+        return -1;

+    }

+

+    // 获取MTD设备信息

+    if (ioctl(fd, MEMGETINFO, &mtd_info) < 0) 

+    {

+        LOGE("Get MTD info erro:%s\n", strerror(errno));

+        close(fd);

+        return -1;

+    }

+

+    // 计算最大块ID

+    max_block_id = mtd_info.size / mtd_info.erasesize;

+

+    // 验证block_id

+    if (block_id < 1 || block_id > max_block_id) 

+    {

+        LOGE("invalid block_id: %u (max: %u)\n", block_id, max_block_id);

+        close(fd);

+        return -2;

+    }

+

+    // 计算偏移量(block_id从1开始)

+    offset = (block_id - 1) * mtd_info.erasesize;

+

+    // 定位到块位置

+    if (lseek(fd, offset, SEEK_SET) == -1) 

+    {

+        LOGE("lseek block error:%s\n", strerror(errno));

+        close(fd);

+        return -1;

+    }

+

+    // 读取块

+    bytes_read = read(fd, data, mtd_info.erasesize);

+    if (bytes_read != mtd_info.erasesize) 

+    {

+        LOGE("Read block fail:%s\n", strerror(errno));

+        close(fd);

+        return -1;

+    }

+

+    *len = bytes_read;

+    close(fd);

+    return 0;

+}

+

+/**

+ * @brief 向指定的flash页面写入数据并进行备份

+ * @param block_id 块ID(从1开始)

+ * @param data 要写入的数据

+ * @param len 要写入的数据长度

+ * @return GSW_HAL_SUCCESS 或 GSW_HAL_FAIL

+ */

+int mbtk_oem_write_data_ext(unsigned int block_id, void *data, unsigned int len) 

+{

+    int fd_main;

+    int fd_backup;

+    struct mtd_info_user mtd_info;

+    off_t offset_main;

+    off_t offset_backup;

+    ssize_t bytes_written;

+    unsigned int max_block_id;

+    struct erase_info_user erase_info; 

+    // 输入参数验证

+    if (!data) 

+    {

+        printf("invalid data is NULL\n");

+        return -2;

+    }

+

+    // 首先打开主设备以获取MTD信息

+    fd_main = open(FLASH_DEVICE, O_RDWR);

+    if (fd_main == -1) 

+    {

+        printf("open flash error %s\n", strerror(errno));

+        return -1;

+    }

+

+    // 获取MTD设备信息

+    if (ioctl(fd_main, MEMGETINFO, &mtd_info) < 0)

+    {

+        printf("get mtd block info error %s\n", strerror(errno));

+        close(fd_main);

+        return -1;

+    }

+

+    // 计算最大块ID

+    max_block_id = mtd_info.size / mtd_info.erasesize;

+

+    // 验证block_id和len

+    if (block_id < 1 || block_id > max_block_id)

+    {

+        LOGE("invalid block_id: %u (max:%u)\n", block_id, max_block_id);

+        close(fd_main);

+        return -2;

+    }

+

+    if (len > mtd_info.erasesize)

+    {

+        LOGE("invalid len: %u (max: %u)\n", len, mtd_info.erasesize);

+        close(fd_main);

+        return -2;

+    }

+

+    // 打开备份设备

+    fd_backup = open(BACKUP_DEVICE, O_RDWR);

+    if (fd_backup == -1) 

+    {

+        LOGE("open bak device fail %s\n", strerror(errno));

+        close(fd_main);

+        return -1;

+    }

+

+    // 计算偏移量

+    offset_main = (block_id - 1) * mtd_info.erasesize;

+    offset_backup = (block_id - 1) * mtd_info.erasesize;

+

+    // 准备erase_info结构体

+    erase_info.start = offset_main; // 设置主设备的起始位置

+    erase_info.length = mtd_info.erasesize; // 设置擦除长度

+

+    // 首先写入备份

+    if (ioctl(fd_backup, MEMERASE, &erase_info) < 0) 

+    {

+        LOGE("MEMERASE backup block faile:%s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+

+    if (lseek(fd_backup, offset_backup, SEEK_SET) == -1) 

+    {

+        LOGE("lseek backup device failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+

+    bytes_written = write(fd_backup, data, len);

+    if (bytes_written != len) 

+    {

+        LOGE("write to backup flahs  failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+    

+    erase_info.start = offset_main; 

+    erase_info.length = mtd_info.erasesize; 

+

+    // 然后写入主flash

+    if (ioctl(fd_main, MEMERASE, &erase_info) < 0) 

+    {

+        LOGE("MEMERASE main flash failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+

+    if (lseek(fd_main, offset_main, SEEK_SET) == -1) 

+    {

+        LOGE("lseek main flash failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+

+    bytes_written = write(fd_main, data, len);

+    if (bytes_written != len) 

+    {

+        LOGE(" write to main flash failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+    

+    // 确保数据已写入flash

+    fsync(fd_main);

+    fsync(fd_backup);

+

+    close(fd_main);

+    close(fd_backup);

+    return 0;

+}

+