blob: 6129bc106454e9c7995a22cc4142052fe5c1ba38 [file] [log] [blame]
b.liu3a41a312024-02-28 09:57:39 +08001/*
2* mbtk_mtd.c
3*
4* MBTK mtd partition utils API.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------- -------------------------------------------------------
132024/2/26 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_mtd.h"
22#include "mbtk_log.h"
23#include "mbtk_str.h"
24
25static mbtk_partition_info_t partition_list[MBTK_PARTITION_NUM_MAX];
26static bool partition_inited = FALSE;
27
28mbtk_partition_info_t* mbtk_partition_get()
29{
30 if(partition_inited) {
31 return partition_list;
32 }
33
34 memset(partition_list, 0x0, sizeof(partition_list));
35 FILE *fp = fopen("/proc/mtd", "r");
36 if(fp == NULL) {
37 LOGE("fopen(/proc/mtd) fail:%d", errno);
38 return NULL;
39 }
40
41 char buff[64];
42 int index = 0;
43 char size_str[16];
44 char name[32];
b.liuf678f992024-05-08 15:23:10 +080045 char erase_size_str[16];
b.liu3a41a312024-02-28 09:57:39 +080046 memset(buff, 0x0, 64);
47 while(fgets(buff, 64, fp)) {
48 if(str_startwith(buff, "mtd")) {
49 memset(size_str, 0x0, 16);
b.liuf678f992024-05-08 15:23:10 +080050 memset(erase_size_str, 0x0, sizeof(erase_size_str));
b.liu3a41a312024-02-28 09:57:39 +080051 memset(name, 0x0, 32);
b.liuf678f992024-05-08 15:23:10 +080052 if(4 == sscanf(buff, "%s %s %s %s", partition_list[index].dev, size_str, erase_size_str, name)) {
b.liu3a41a312024-02-28 09:57:39 +080053 if(name[0] == '\"' && name[strlen(name) - 1] == '\"') {
54 memcpy(partition_list[index].name, name + 1, strlen(name) - 2); // No copy ""
55 } else {
56 LOGE("partition(%s) name error.", buff);
57 return NULL;
58 }
59
60 if(partition_list[index].dev[strlen(partition_list[index].dev) - 1] == ':') {
61 partition_list[index].dev[strlen(partition_list[index].dev) - 1] = '\0';
62 }
63
64 partition_list[index].partition_size = (uint32)strtoul(size_str, NULL, 16);
b.liuf678f992024-05-08 15:23:10 +080065 partition_list[index].erase_size = (uint32)strtoul(erase_size_str, NULL, 16);
b.liu3a41a312024-02-28 09:57:39 +080066 if(index > 0) {
67 partition_list[index].partition_start = partition_list[index - 1].partition_start + partition_list[index - 1].partition_size;
68 }
69 partition_list[index].used = TRUE;
70 } else {
71 LOGE("sscanf(%s) fail:%d", buff, errno);
72 return NULL;
73 }
74 index++;
75 }
76 memset(buff, 0x0, 64);
77 }
78 fclose(fp);
79
80 int i = 0;
81 while(i < MBTK_PARTITION_NUM_MAX) {
82 if(partition_list[i].used) {
83 LOGD("%s(%s) : %08x %08x", partition_list[i].name, partition_list[i].dev,
84 partition_list[i].partition_start, partition_list[i].partition_size);
85 }
86 i++;
87 }
88
89 partition_inited = TRUE;
90 return partition_list;
91}
92
b.liuf678f992024-05-08 15:23:10 +080093int mbtk_partition_get_by_name(char *partition_name, mbtk_partition_info_t *info)
94{
95 FILE *fp = fopen("/proc/mtd", "r");
96 if(fp == NULL) {
97 LOGE("fopen(/proc/mtd) fail:%d", errno);
98 return -1;
99 }
100
101 char buff[64];
102 char size_str[16];
103 char erase_size_str[16];
104 char name[32];
105 memset(buff, 0x0, sizeof(buff));
106 while(fgets(buff, sizeof(buff), fp)) {
107 if(strstr(buff, partition_name)) {
108 memset(size_str, 0x0, sizeof(size_str));
109 memset(erase_size_str, 0x0, sizeof(erase_size_str));
110 memset(name, 0x0, sizeof(name));
111 memcpy(info->dev, "/dev/", 5);
112 if(4 == sscanf(buff, "%s %s %s %s", info->dev + 5, size_str, erase_size_str, name)) {
113 if(name[0] == '\"' && name[strlen(name) - 1] == '\"') {
114 memcpy(info->name, name + 1, strlen(name) - 2); // No copy ""
115 } else {
116 LOGE("partition(%s) name error.", buff);
117 return -1;
118 }
119
120 if(info->dev[strlen(info->dev) - 1] == ':') {
121 info->dev[strlen(info->dev) - 1] = '\0';
122 }
123
124 info->partition_size = (uint32)strtoul(size_str, NULL, 16);
125 info->erase_size = (uint32)strtoul(erase_size_str, NULL, 16);
126 //info->partition_start += info->partition_size;
127 break;
128 } else {
129 LOGE("sscanf(%s) fail:%d", buff, errno);
130 return -1;
131 }
132 }
133 memset(buff, 0x0, sizeof(buff));
134 }
135 fclose(fp);
136
137 return 0;
138}
139
b.liu3a41a312024-02-28 09:57:39 +0800140