FLASH算法对接
概述
FLASH算法用于下载用户镜像文件到调试目标的RAM空间,然后将需要烧写的数据放到FLASH算法中的缓冲区中,由算法负责将数据烧写到NV空间中,而算法本身是运用在调试目标RAM中的可执行程序。
算法工程创建
利用CDK创建SOC工程,在弹出新建SOC工程的窗口中选择C语言,Project Type选择Flash即可快速创建。
2、建立自己的芯片组件
3、CPU类型选择
4、链接脚本中的地址空间定义
5、printf功能移植
算法接口实现
在创建的工程里找到driver.c文件,可以发现该文件里报告如下算法接口
@brief Flash编程初始化接口,运行Flash程序,开始编程之前会执行该接口;
@return 返回0表示成功,否则失败;
int flashInit()
@brief Flash编程结束接口,CDK在Flash操作结束之后,会默认执行此接口;
@return 返回0表示成功,否则失败;
int flashUnInit()
@brief 获取Flash ID接口;
@param flashID 返回flash ID;
@return 返回0表示成功,否则失败;
int flashID(unsigned int* flashID)
@brief Flash烧写接口;
@param dst 烧写目标地址;
@param src 烧写源数据地址;
@param length 烧写源数据长度;
@return 返回0表示成功,否则失败;
int flashProgram(char* dst, char *src, int length)
@brief Flash数据读取接口;当该Flash不是直接可读的Flash属性时,CDK会调用该接口读取数据;
@param dst 读取目标地址;
@param src 数据保存地址;
@param length 读取数据长度;
@return 返回0表示成功,否则失败;
int flashRead(char* dst, char* src, int length)
@brief Flash擦除接口;用于擦除指定空间的数据;
@param dst 待擦除目标地址;该地址始终是后续FlashDev.c文件中描述的PageSize对齐的地址;
@param length 待擦除数据长度;该长度始终是后续FlashDev.c文件中描述的PageSize的倍数;
@return 返回0表示成功,否则失败;
int flashErase(char* dst, int length)
@brief Flash整片擦除接口;
@return 返回0表示成功,否则失败;
int flashChipErase()
FLASH信息描述表
在创建的工程里找到FlashDev.c文件,在该文件里实现FLASH的基本信息。
struct FlashDevice const FlashDevices INDEVSECTION = {
FLASH_DRV_VERS, // 系统保留,用户无需修改
"mydemo", // Flash 设备名称
"ck803", // CPU型号,需要使用小写字母
0x123456, // Flash ID号
"NorFlash", // Flash类型
512*1024, // 系统保留
1, // 用于表征该Flash是否直接可读;1表示直接可读,0表示需要使用drive.c文件中的flashRead接口完成读操作
1, // 表示后续Flash区间的描述块个数
// Specify Size and Address of Sectors
{ {0x0, 0x80000, 0x2000} } // Flash区间描述块
};
Flash区间描述块用于描述每个Flash的空间范围以及其中每个sector大小;
struct Device {
unsigned long Start; // Flash起始地址
unsigned long Length; // Flash长度
unsigned long PageSize; // 每个sector长度
};
FLASH算法可执行文件
在创建的工程文件main.c里包含的是算法的控制逻辑,无需改动。编译通过后,可以生成FLASH算法可执行文件。
FLASH算法使用
对FLASH算法的使用可以通过CDK和FLASH PROGRAMMER。
- 如果通过CDK,可以通过主菜单选择Flash->Flash Management,弹窗中点击ADD按钮选择生成的算法文件,最后完成算法的添加。
- 如果通过FLASH PROGRAMMER,可以通过点击主菜单Advance, 在弹出的窗口里点击Browse按钮完成对flash算法文件的选择,最后完成算法的添加。
注意:用CDK编译生成的FLASH算法可执行文件在LINUX下也可以通用。