FLASH分区---FAT分区添加操作

news/2024/12/13 14:22:34

1、板卡配置
注意:使用fat文件系统的时候,必须download进去一个fat系统的镜像 fat.img 0xee0000
注意:需要打开fat宏定义(涉及到底层,必须开,否则无法创建文件)

在这里插入图片描述

2、板卡.c 配置
修改分区大小、增加分区
0xee0000 = 16m - 128k - 1m

在这里插入图片描述

fat分区需要使用norflash_sfc_dev_ops的文件操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、download.bat文件修改
<1>限制ui 文件系统大小
fat_comm.exe -pad-backup2 -force-align-fat -out new_res.bin -image-size 16 -filelist JL sidebar watch -remove-empty -remove-bpb -mark-bad-after 0xee0000 -key %CHIPKEY% -address 0
·res_nor(0 - 0xee0000) res_test(0xee0000 - 0xfe0000) ui_vm(0xfe0000-0x1000000)
·-key %CHIPKEY%:(0 - 0xee0000)此区域加密,代码需要和download.bat文件对应

<2>外部文件烧录到外挂flash(img镜像文件)
packres.exe -n res -o res.bin new_res.bin 0 fat.img 0xee0000 -normal

4、norflash_sfc.c配置
1、norflash/norflash_sfc.c
在这里插入图片描述

说明:如果不需要驱动自己处理擦除,可以把宏FLASH_CACHE_ENABLE清零,或者把
norflash_sfc_dev_read()里面调用的fat_sfc_norflash_read()的实参cache填0,
norflash_sfc_dev_write()同理

4、测试demo
外挂flash读写测试代码

/*读写测试代码,放到app_main函数运行*/
/*open设备分区
/*读写的offset偏移地址从0地址开始*/
#define TEST_BUF_SIZE   512
void flash_test(void)
{static void *fd;fd = dev_open("res_test", NULL);if (!fd) {printf("dev open err  \n");}printf("flash_test........");u8 *buf = malloc(TEST_BUF_SIZE);memset(buf, 0, TEST_BUF_SIZE);printf("read  data test start *******************\n ");dev_bulk_read(fd, buf,0,TEST_BUF_SIZE);put_buf(buf,TEST_BUF_SIZE);//write test dev_ioctl(fd, IOCTL_ERASE_SECTOR, 0);memset(buf, 0, TEST_BUF_SIZE);for( int i = 0; i < TEST_BUF_SIZE; i++ ) {buf[i] = i;}dev_bulk_write(fd, buf, 0,TEST_BUF_SIZE);printf("write  data test start >>>>>>>>>>>>>>>>>\n ");dev_bulk_read(fd, buf,0,TEST_BUF_SIZE);put_buf(buf,TEST_BUF_SIZE);free(buf);

}

block擦除测试代码
/block擦除测试代码,按64k擦除,放到app_main函数运行/
/*open设备分区

/*读写的offset偏移地址从0地址开始*/#define TEST_BUF_SIZE   256*1024
void flash_block_test(void)
{static void *fd;fd = dev_open("res_test", NULL);if (!fd) {printf("dev open err  \n");}//IOCTL_ERASE_BLOCKfor( int i = 64*1024; i <= 4*64*1024; i= i + 64*1024) {printf("IOCTL_ERASE_BLOCK %d*****************\n ",i);dev_ioctl(fd, IOCTL_ERASE_BLOCK, i);}printf("flash_test........");u8 *buf = malloc(TEST_BUF_SIZE);memset(buf, 0x02, TEST_BUF_SIZE);dev_bulk_write(fd, buf, 0,TEST_BUF_SIZE);put_buf(buf + 256*1023,128);printf("write  data test ok *******************\n ");printf("read  data test start *******************\n ");dev_bulk_read(fd, buf,256*1023,128);printf("buf[0] = %p  buf[1] = %p buf = %p  buf+4 = %p",buf[0],&buf[1],buf, (buf + 4));put_buf(buf + 256*1023,128);//IOCTL_ERASE_BLOCKfor( int i = 64*1024; i <= 4*64*1024; i= i + 64*1024) {printf("IOCTL_ERASE_BLOCK %d*****************\n ",i);dev_ioctl(fd, IOCTL_ERASE_BLOCK, i);}printf("IOCTL_ERASE_SECTOR  4096 start  >>>>>>>>>>>>>>>>>\n ");memset(buf, 0x58, TEST_BUF_SIZE);dev_bulk_write(fd, buf, 256*1023,256);dev_bulk_read(fd, buf,0,TEST_BUF_SIZE);put_buf(buf + 256*1023,256);dev_close(fd);free(buf);
}

fopen操作文件测试代码

/**/
void fat_nor_rw_test()
{u8*f = fopen("storage/res_test/C/3.txt","w+");if(f)
{	printf("open res_test success");}else{printf("open res_test fail");}printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");int size = flen(f);u8 *temp = zalloc(4096);fread(f,temp,size);printf("file size =%d\n",size);printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");put_buf(temp,512);u8 first = temp[0];memset(temp,first,size);fwrite(f,temp,size);put_buf(temp,512);printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");fclose(f);free(temp);
}

https://dhexx.cn/news/show-5466010.html

相关文章

uniapp的video组件截图(抓拍)功能,解决截后为黑图bug

废话不多说先上代码&#xff01;&#xff01;&#xff01;&#xff01; 点击截图按钮触发以下方法 getCapture() {let _this thislet pages getCurrentPages();let page pages[pages.length - 1];let ws page.$getAppWebview();let bitmap new plus.nativeObj.Bitmap(te…

初窥 HTTP 缓存

引言 对于前端来说, 你肯定听说过 HTTP 缓存。 当然不管你知不知道它, 对于提高网站性能和用户体验, 它都扮演着重要的角色! 它通过在客户端和服务器之间存储和重用先前获取的资源副本, 来减少网络流量和降低资源加载时间, 从而提升用户体验! 以下是 HTTP 缓存的重要性: 减少…

C++实现网格交易的例子

网格交易是一种投资策略&#xff0c;它通过在预设的价格区间内自动进行买入和卖出操作来捕捉市场的波动收益。以下是网格交易的一些详细介绍&#xff1a; 定义&#xff1a; 网格交易策略是一种围绕基准价进行的交易方法&#xff0c;每当价格下跌时&#xff0c;在触发点位执行买…

【docker】docker的起源与容器的由来、docker容器的隔离机制

Docker 的起源与容器的由来 1. 虚拟机的局限&#xff1a;容器的需求萌芽 在 Docker 出现之前&#xff0c;开发和部署软件主要依赖虚拟机&#xff08;VMs&#xff09;&#xff1a; 虚拟机通过模拟硬件运行操作系统&#xff0c;每个应用程序可以运行在自己的独立环境中。虽然虚…

云技术基础(泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…

Sofia-SIP 使用教程

Sofia-SIP 是一个开源的 SIP 协议栈&#xff0c;广泛用于 VoIP 和即时通讯应用。以下是一些基本的使用教程&#xff0c;帮助你快速上手 Sofia-SIP。 1. 安装 Sofia-SIP 首先&#xff0c;你需要安装 Sofia-SIP 库。你可以从其官方 GitHub 仓库克隆源代码并编译安装&#xff1a…

C++优选算法十六 BFS解决最短路问题

1.BFS解决最短路问题的优势与局限 BFS是一种有效的解决最短路问题的算法&#xff0c;特别适用于无权图或边权相等的图。 优势&#xff1a; BFS能够逐层遍历图中的所有节点&#xff0c;直到找到目标节点或遍历完所有可达节点。对于无权图&#xff08;即边权为1的图&#xff0…

在内网工作时,如何使用 vscode remote ssh 去连接内网服务器?

来源&#xff1a;https://stackoverflow.com/questions/56671520/how-can-i-install-vscode-server-in-linux-offline 看这个回答&#xff1a; 一般来说&#xff0c;内网会提供 vscode 安装包&#xff0c;remote-ssh 的 vsix&#xff0c;先安装好。 随后&#xff0c;保证自己…

C++设计模式:桥接模式(Bridge)

什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09;是一个用来解耦的设计模式&#xff0c;它将抽象层和实现层分离开&#xff0c;让它们可以独立变化。用最简单的话来说&#xff0c;就是让你能够改变抽象的功能和具体的实现&#xff0c;而不需要修改…

Zariski交换代数经典教材Commutative Algebra系列(pdf可复制版)

Zariski的名字估计学代数几何的人都耳熟能详&#xff0c;先是入门时期的交换代数教材&#xff0c;然后就是深入研究时期随处可见的Zariski拓扑。本帖我们分享的便是著名的Zariski交换代数教材。 Oscar Zariski & Pierre Samuel写的交换代数经典教材Commutative Algebra&am…