You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
3.0 KiB
155 lines
3.0 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2020. All rights reserved.
|
|
* Description: common module
|
|
* Author: Hisilicon
|
|
* Create: 2020-10-15
|
|
*/
|
|
|
|
#include "uapi_flash.h"
|
|
#include "nand.h"
|
|
#include "flash_ext.h"
|
|
#include "securec.h"
|
|
|
|
/* change length to string */
|
|
td_char *int_to_size(td_u64 size)
|
|
{
|
|
td_s32 ix;
|
|
td_u64 temp_size = size;
|
|
static td_char buffer[20]; /* 20 - buffer size */
|
|
const td_char *fmt[] = {" ", "K", "M", "G", "T", "T"};
|
|
|
|
for (ix = 0; (ix < 5) && ((temp_size & 0x3FF) == 0) && (temp_size != 0); ix++) { /* 5 - left shift bits */
|
|
temp_size = (temp_size >> 10); /* 10 - right shift bits */
|
|
}
|
|
|
|
if (snprintf_s(buffer, sizeof(buffer), sizeof(buffer) - 1, "%u%s", (td_u32)temp_size, fmt[ix]) == -1) {
|
|
dbg_out("Failed to snprintf_s.\n");
|
|
return NULL;
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
|
|
/*
|
|
* Modified for CONNAX CA.
|
|
* When /dev path has no excute permission, stat call will fail.
|
|
* Try parse /proc/mtd to get max partition number.
|
|
*/
|
|
td_s32 get_max_partition(td_void)
|
|
{
|
|
FILE *fd = NULL;
|
|
#define MAX_PROC_LINE_SZ 1024
|
|
td_char bf[MAX_PROC_LINE_SZ];
|
|
td_s32 nr = 0;
|
|
|
|
fd = fopen(PROC_MTD_FILE, "r");
|
|
if (fd == NULL) {
|
|
dbg_out("Fail to open %s!\n", PROC_MTD_FILE);
|
|
return -1;
|
|
}
|
|
|
|
/* skip first prompt line */
|
|
if (!fgets(bf, MAX_PROC_LINE_SZ, fd)) {
|
|
(td_void)fclose(fd);
|
|
return -1;
|
|
}
|
|
|
|
while (fgets(bf, MAX_PROC_LINE_SZ, fd) != 0) {
|
|
nr++;
|
|
}
|
|
|
|
(td_void)fclose(fd);
|
|
dbg_out("max partition nr %d\n", nr);
|
|
|
|
/* keep the way before do */
|
|
return nr - 1;
|
|
}
|
|
|
|
td_s32 offshift(td_ulong n)
|
|
{
|
|
td_s32 shift = -1;
|
|
td_ulong num = n;
|
|
while (num != 0) {
|
|
num = num >> 1;
|
|
shift++;
|
|
}
|
|
return shift;
|
|
}
|
|
|
|
td_char *skip_space(td_char *line)
|
|
{
|
|
td_char *p = NULL;
|
|
|
|
if (line == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
p = line;
|
|
while (*p == ' ' || *p == '\t') {
|
|
p++;
|
|
}
|
|
|
|
return p;
|
|
}
|
|
|
|
td_char *skip_word(td_char *line)
|
|
{
|
|
td_char *p = NULL;
|
|
|
|
if (line == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
p = line;
|
|
while (*p != '\t' && *p != ' ' && *p != '\n' && *p != 0) {
|
|
p++;
|
|
}
|
|
|
|
return p;
|
|
}
|
|
|
|
td_char *get_word(td_char *line, td_char *value)
|
|
{
|
|
td_char *p = NULL;
|
|
td_char *word = value;
|
|
|
|
if ((line == NULL) || (value == NULL)) {
|
|
return NULL;
|
|
}
|
|
|
|
p = line;
|
|
p = skip_space(p);
|
|
while (*p != '\t' && *p != ' ' && *p != '\n' && *p != 0) {
|
|
*word++ = *p++;
|
|
}
|
|
|
|
*word = 0;
|
|
return p;
|
|
}
|
|
|
|
td_s32 get_bootargs(td_u8 *bootargs, td_u16 length)
|
|
{
|
|
FILE *pf = NULL;
|
|
|
|
if (bootargs == NULL) {
|
|
dbg_out("Pointer is null.\n");
|
|
return -1;
|
|
}
|
|
|
|
pf = fopen("/proc/cmdline", "r");
|
|
if (pf == NULL) {
|
|
dbg_out("Failed to open '/proc/cmdline'.\n");
|
|
return -1;
|
|
}
|
|
|
|
if (!fgets((td_char*)bootargs, length, pf)) {
|
|
dbg_out("Failed to fgets string.\n");
|
|
(td_void)fclose(pf);
|
|
return -1;
|
|
}
|
|
|
|
(td_void)fclose(pf);
|
|
return 0;
|
|
}
|
|
|