178 lines
4.9 KiB
C
178 lines
4.9 KiB
C
#include "includes.h"
|
|
#include "boot.h"
|
|
#include "asm/sfc_norflash_api.h"
|
|
#include "cfg_private.h"
|
|
|
|
FILE *cfg_private_open(const char *path, const char *mode)
|
|
{
|
|
return fopen(path, mode);
|
|
}
|
|
|
|
int cfg_private_read(FILE *file, void *buf, u32 len)
|
|
{
|
|
return fread(file, buf, len);
|
|
}
|
|
|
|
void cfg_private_erase(u32 addr, u32 len)
|
|
{
|
|
u32 erase_total_size = len;
|
|
u32 erase_addr = addr;
|
|
u32 erase_size = 4096;
|
|
u32 erase_cmd = IOCTL_ERASE_SECTOR;
|
|
//flash不同支持的最小擦除单位不同(page/sector)
|
|
//boot_info.vm.align == 1: 最小擦除单位page;
|
|
//boot_info.vm.align != 1: 最小擦除单位sector;
|
|
if (boot_info.vm.align == 1) {
|
|
erase_size = 256;
|
|
erase_cmd = IOCTL_ERASE_PAGE;
|
|
}
|
|
while (erase_total_size) {
|
|
//擦除区域操作
|
|
norflash_ioctl(NULL, erase_cmd, erase_addr);
|
|
erase_addr += erase_size;
|
|
erase_total_size -= erase_size;
|
|
}
|
|
}
|
|
|
|
int cfg_private_check(char *buf, int len)
|
|
{
|
|
for (int i = 0; i < len; i++) {
|
|
if (buf[i] != 0xff) {
|
|
return 0;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int cfg_private_write(FILE *file, void *buf, u32 len)
|
|
{
|
|
int align_size = 4096;
|
|
if (boot_info.vm.align == 1) {
|
|
align_size = 256;
|
|
}
|
|
struct vfs_attr attrs = {0};
|
|
fget_attrs(file, &attrs);
|
|
attrs.sclust = sdfile_cpu_addr2flash_addr(attrs.sclust);
|
|
u32 fptr = fpos(file);
|
|
r_printf(">>>[test]:addr = %d, fsize = %d, fptr = %d, w_len = %d\n", attrs.sclust, attrs.fsize, fptr, len);
|
|
if (len + fptr > attrs.fsize) {
|
|
r_printf(">>>[test]:error, write over!!!!!!!!\n");
|
|
return -1;
|
|
}
|
|
char *buf_temp = (char *)malloc(align_size);
|
|
int res = len;
|
|
|
|
for (int wlen = 0; len > 0;) {
|
|
u32 align_addr = (attrs.sclust + fptr) / align_size * align_size;
|
|
u32 w_pos = attrs.sclust + fptr - align_addr;
|
|
wlen = align_size - w_pos;
|
|
if (wlen > len) {
|
|
wlen = len;
|
|
}
|
|
norflash_read(NULL, (void *)buf_temp, align_size, align_addr);
|
|
if (0 == cfg_private_check(buf_temp, align_size)) {
|
|
cfg_private_erase(align_addr, align_size);
|
|
}
|
|
memcpy(buf_temp + w_pos, buf, wlen);
|
|
norflash_write(NULL, (void *)buf_temp, align_size, align_addr);
|
|
fptr += wlen;
|
|
len -= wlen;
|
|
}
|
|
__exit:
|
|
free(buf_temp);
|
|
fseek(file, fptr, SEEK_SET);
|
|
return res;
|
|
}
|
|
|
|
int cfg_private_delete_file(FILE *file)
|
|
{
|
|
int align_size = 4096;
|
|
if (boot_info.vm.align == 1) {
|
|
align_size = 256;
|
|
}
|
|
struct vfs_attr attrs = {0};
|
|
fget_attrs(file, &attrs);
|
|
attrs.sclust = sdfile_cpu_addr2flash_addr(attrs.sclust);
|
|
int len = attrs.fsize;
|
|
char *buf_temp = (char *)malloc(align_size);
|
|
u32 fptr = 0;
|
|
|
|
for (int wlen = 0; len > 0;) {
|
|
u32 align_addr = (attrs.sclust + fptr) / align_size * align_size;
|
|
u32 w_pos = attrs.sclust + fptr - align_addr;
|
|
wlen = align_size - w_pos;
|
|
if (wlen > len) {
|
|
wlen = len;
|
|
}
|
|
norflash_read(NULL, (void *)buf_temp, align_size, align_addr);
|
|
if (0 == cfg_private_check(buf_temp, align_size)) {
|
|
cfg_private_erase(align_addr, align_size);
|
|
}
|
|
memset(buf_temp + w_pos, 0xff, wlen);
|
|
norflash_write(NULL, (void *)buf_temp, align_size, align_addr);
|
|
fptr += wlen;
|
|
len -= wlen;
|
|
}
|
|
free(buf_temp);
|
|
fclose(file);
|
|
return 0;
|
|
}
|
|
|
|
int cfg_private_close(FILE *file)
|
|
{
|
|
return fclose(file);
|
|
}
|
|
|
|
int cfg_private_seek(FILE *file, int offset, int fromwhere)
|
|
{
|
|
return fseek(file, offset, fromwhere);
|
|
}
|
|
|
|
void cfg_private_test_demo(void)
|
|
{
|
|
#include "cfg_private.h"
|
|
#define N 256
|
|
char test_buf[N] = {0};
|
|
char r_buf[512] = {0};
|
|
for (int i = 0; i < N; i++) {
|
|
test_buf[i] = i & 0xff;
|
|
}
|
|
|
|
char path[64] = "mnt/sdfile/app/FATFSI/cfg/eq_cfg_hw.bin";
|
|
FILE *fp = cfg_private_open(path, "w+");
|
|
if (!fp) {
|
|
r_printf(">>>[test]:open fail!!!!!\n");
|
|
while (1);
|
|
}
|
|
/* cfg_private_delete_file(fp); */
|
|
/* fp = cfg_private_open(path, "w+"); */
|
|
cfg_private_read(fp, r_buf, 512);
|
|
put_buf(r_buf, 512);
|
|
cfg_private_seek(fp, 0, SEEK_SET);
|
|
|
|
cfg_private_write(fp, test_buf, N);
|
|
cfg_private_close(fp);
|
|
fp = cfg_private_open(path, "r");
|
|
cfg_private_read(fp, r_buf, 512);
|
|
put_buf(r_buf, 512);
|
|
y_printf("\n >>>[test]:func = %s,line= %d\n", __FUNCTION__, __LINE__);
|
|
|
|
FILE *file = cfg_private_open("mnt/sdfile/app/FATFSI", "w+");
|
|
if (!file) {
|
|
r_printf(">>>[test]:open fail!!!!!\n");
|
|
while (1);
|
|
}
|
|
struct vfs_attr attrs = {0};
|
|
fget_attrs(file, &attrs);
|
|
y_printf(">>>[test]:in part addr = %d, fsize = %d\n", attrs.sclust, attrs.fsize);
|
|
char *part = zalloc(attrs.fsize);
|
|
cfg_private_delete_file(file);
|
|
file = cfg_private_open("mnt/sdfile/app/FATFSI", "w+");
|
|
cfg_private_read(file, part, attrs.fsize);
|
|
put_buf(part, attrs.fsize);
|
|
free(part);
|
|
while (1);
|
|
}
|
|
|
|
|