首先声明,目前虽然可以实现使用 openocd 烧录文件到 RA4M2,但是速度特别慢,具体原因稍后会说道.
这个补丁我是在前人的基础上修改来到,因为根据前人补丁的内容,理论上来说是可以实现烧写的,但是我调试了很长时间之后发现在执行 target_run_algorithm 时候出错了(使用的山寨 jlink).然后使用 cmsis-dap 虽然函数 target_run_algorithm 不报错了,但是分析还是没有正常执行这段代码在芯片端.所以不得已,才使用了傻瓜的方法,直接使用 target_write/read_u32/u8/16 这些接口函数操作 RA4M2,实现写 code flash.
我修改的部分主要有两处:
__attribute__ ((unused)) static int __rv40f_flash_write(struct target *target, unsigned int count, uint16_t *wa_start, uint16_t *wa_end, uint32_t dst_addr)
{
unsigned int i = 0;
__attribute__ ((unused)) uint32_t value = 0;
uint8_t reg8 = 0;
__attribute__ ((unused)) uint16_t reg16 = 0;
uint32_t reg32 = 0;
int retval;
target_write_u32(target, FACI_FSADDR, (uint32_t)dst_addr);
target_write_u8(target, FACI_CMD_AREA, 0XE8);
target_write_u8(target, FACI_CMD_AREA, count);
for (; i < count; i++)
{
reg16 = *(wa_start+i);
target_write_u16(target, FACI_CMD_AREA, reg16);
do
{
retval = target_read_u32(target, FACI_FSTATR, ®32);
usleep(1000);
} while(reg32 & 0X400);
}
target_write_u8(target, FACI_CMD_AREA, 0XD0);
retval = target_read_u32(target, FACI_FSTATR, ®32);
if (reg32 & 0X8000)
{
retval = target_read_u8(target, FACI_FASTAT, ®8);
}
return retval;
}
- 替换 target_run_algorithm 函数为 __rv40f_flash_write,选择直接远程控制 RA4M2,而不是让这段程序运行在 RA4M2,所以就导致速度特别慢.实际烧写还是用 pyocd 快一点.
|