TXTABLE: Support backup table
Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
This commit is contained in:
parent
ca08f069a7
commit
0a52dfaa66
@ -26,8 +26,22 @@ config TXTABLE_PARTITION
|
|||||||
if TXTABLE_PARTITION
|
if TXTABLE_PARTITION
|
||||||
|
|
||||||
config TXTABLE_PARTITION_MAX_NUM
|
config TXTABLE_PARTITION_MAX_NUM
|
||||||
int "Max num of TXTABLE partition"
|
int "Max num of TXTABLE partition(s)"
|
||||||
default 16
|
default 16
|
||||||
|
---help---
|
||||||
|
Include one pseudo partition named "txtable"
|
||||||
|
|
||||||
|
config TXTABLE_DEFAULT_PARTITION
|
||||||
|
int "Enable default txtable"
|
||||||
|
default 0
|
||||||
|
---help---
|
||||||
|
0: Disable
|
||||||
|
1: Enable
|
||||||
|
|
||||||
|
config TXTABLE_DEFAULT_PARTITION_PATH
|
||||||
|
string "Path of default txtable in device"
|
||||||
|
default "/etc/txtable.txt"
|
||||||
|
depends on TXTABLE_DEFAULT_PARTITION != 0
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -22,9 +22,10 @@
|
|||||||
* Included Files
|
* Included Files
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#include <nuttx/kmalloc.h>
|
#include <nuttx/kmalloc.h>
|
||||||
|
|
||||||
@ -34,7 +35,12 @@
|
|||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef CONFIG_TXTABLE_DEFAULT_PARTITION_PATH
|
||||||
|
# define CONFIG_TXTABLE_DEFAULT_PARTITION_PATH ""
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TXTABLE_MAGIC "TXTABLE0"
|
#define TXTABLE_MAGIC "TXTABLE0"
|
||||||
|
#define TXTABLE_LENGTH (state->erasesize + 1)
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
@ -73,7 +79,7 @@ int parse_txtable_partition(FAR struct partition_state_s *state,
|
|||||||
|
|
||||||
part = kmm_malloc(CONFIG_TXTABLE_PARTITION_MAX_NUM *
|
part = kmm_malloc(CONFIG_TXTABLE_PARTITION_MAX_NUM *
|
||||||
sizeof(struct partition_s) +
|
sizeof(struct partition_s) +
|
||||||
state->erasesize);
|
TXTABLE_LENGTH);
|
||||||
if (part == NULL)
|
if (part == NULL)
|
||||||
{
|
{
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -82,29 +88,64 @@ int parse_txtable_partition(FAR struct partition_state_s *state,
|
|||||||
memset(part, 0, CONFIG_TXTABLE_PARTITION_MAX_NUM *
|
memset(part, 0, CONFIG_TXTABLE_PARTITION_MAX_NUM *
|
||||||
sizeof(struct partition_s));
|
sizeof(struct partition_s));
|
||||||
|
|
||||||
token = (FAR char *)(part + CONFIG_TXTABLE_PARTITION_MAX_NUM);
|
|
||||||
|
|
||||||
/* TXTABLE locate in the last erase block */
|
/* TXTABLE locate in the last erase block */
|
||||||
|
|
||||||
blkpererase = state->erasesize / state->blocksize;
|
blkpererase = state->erasesize / state->blocksize;
|
||||||
lasteraseblk = state->nblocks - blkpererase;
|
lasteraseblk = state->nblocks - blkpererase;
|
||||||
|
|
||||||
ret = read_partition_block(state, token, lasteraseblk, blkpererase);
|
for (i = 0; i <= CONFIG_TXTABLE_DEFAULT_PARTITION; i++)
|
||||||
|
{
|
||||||
|
token = (FAR char *)(part + CONFIG_TXTABLE_PARTITION_MAX_NUM);
|
||||||
|
|
||||||
|
memset(token, 0, TXTABLE_LENGTH);
|
||||||
|
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
ret = read_partition_block(state, token, lasteraseblk,
|
||||||
|
blkpererase);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct file f;
|
||||||
|
|
||||||
|
ret = file_open(&f, CONFIG_TXTABLE_DEFAULT_PARTITION_PATH,
|
||||||
|
O_RDONLY);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = file_read(&f, token, state->erasesize);
|
||||||
|
file_close(&f);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parsing data of partition table */
|
||||||
|
|
||||||
|
token = strtok_r(token, "\n", &save_ptr);
|
||||||
|
if (strncmp(token, TXTABLE_MAGIC, strlen(TXTABLE_MAGIC)) != 0)
|
||||||
|
{
|
||||||
|
save_ptr = NULL;
|
||||||
|
ret = -EFTYPE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parsing data of partition table */
|
for (i = 0; i < CONFIG_TXTABLE_PARTITION_MAX_NUM - 1; i++)
|
||||||
|
|
||||||
token = strtok_r(token, "\n", &save_ptr);
|
|
||||||
if (strncmp(token, TXTABLE_MAGIC, strlen(TXTABLE_MAGIC)) != 0)
|
|
||||||
{
|
|
||||||
ret = -EFTYPE;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_TXTABLE_PARTITION_MAX_NUM; i++)
|
|
||||||
{
|
{
|
||||||
token = strtok_r(NULL, "\n", &save_ptr);
|
token = strtok_r(NULL, "\n", &save_ptr);
|
||||||
if (token == NULL || !isalnum(token[0]))
|
if (token == NULL || !isalnum(token[0]))
|
||||||
@ -165,6 +206,16 @@ int parse_txtable_partition(FAR struct partition_state_s *state,
|
|||||||
handler(&part[j], arg);
|
handler(&part[j], arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Pseudo partition for the last eraseblock */
|
||||||
|
|
||||||
|
strlcpy(part[j].name, "txtable", sizeof(part[j].name));
|
||||||
|
part[j].index = j;
|
||||||
|
part[j].firstblock = lasteraseblk;
|
||||||
|
part[j].nblocks = blkpererase;
|
||||||
|
part[j].blocksize = state->blocksize;
|
||||||
|
|
||||||
|
handler(&part[j], arg);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
kmm_free(part);
|
kmm_free(part);
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user