文章目录
前言
-
1)上一篇文章介绍了 Air105 OpenOCD 驱动编写的成果,这篇文章想着记录一下中间遇到的问题,一是防止和我一样的小白踩坑(你就当真的听),二是成功不吆喝,如锦衣夜行。
-
2)ROM API 代码:
// air105_rom_falsh_api @ 0x00008010UL : #define ROM_QSPI_Init (*((void (*)(QSPI_InitTypeDef *)) (*(uint32_t *)0x8010))) #define ROM_QSPI_ReadID (*((uint32_t (*)(QSPI_CommandTypeDef *)) (*(uint32_t *)0x8014))) #define ROM_QSPI_WriteParam (*((uint8_t (*)(QSPI_CommandTypeDef *, uint16_t)) (*(uint32_t *)0x8018))) #define ROM_QSPI_EraseSector (*((uint8_t (*)(QSPI_CommandTypeDef *, uint32_t)) (*(uint32_t *)0x801C))) #define ROM_QSPI_EraseChip (*((uint8_t (*)(QSPI_CommandTypeDef *)) (*(uint32_t *)0x8020))) // This's a reasonable guess. #define ROM_QSPI_ProgramPage (*((uint8_t (*)(QSPI_CommandTypeDef *, DMA_TypeDef *, \ uint32_t, uint32_t, uint8_t *)) (*(uint32_t *)0x8024))) #define ROM_QSPI_ReleaseDeepPowerDown (*((uint8_t (*)(QSPI_CommandTypeDef *)) (*(uint32_t *)0x802C)))
1 驱动实现方式的尝试
1.1 第一次尝试
- 1)刚开始时,根据 Air001 时的经验,想通过 OpenOCD 模拟 QSPI API 的方式实现,结果烧录巨慢(几 KB 大小的文件烧录要一分多钟),且烧录后无法正常启动,放弃(第一次尝试)。
- (1)现在想来,烧录慢应该是通过 OpenOCD 模拟寄存器操作只适合偶尔简单的操作,如解锁 FLASH,读取 FLASH SIZE 寄存器等操作。而烧录代码涉及到寄存器的频繁操作;
- (2)无法正常启动应该是第一个扇区中未写入 header 所致。
1.2 第二次尝试
-
1)既然操作 QSPI 寄存器不行,就考虑 ROM API 调用的方式。本来想参考 “为国产芯片增加OpenOCD Flash驱动----以AIC8800为例” 这篇文章,写完代码测试时发现运行算法的 target_run_algorithm() 函数一直报错。
-
2)由于此时还不太明白 OpenOCD 驱动运行逻辑,因此让我一度怀疑官方的 ROM API 到底是否可用。(从这里开始走弯路。)
-
3)上面提到的代码中的主要逻辑:
struct aic8800_rom_api_call_code_t { uint16_t ldrn_r3; // 0x4b01 uint16_t blx_r3; // 0x4798 uint16_t bkpt; // 0xbe00 uint16_t nop; // 0xbf00 uint32_t api_addr; // api addr }; struct aic8800_rom_api_call_code_t aic8800_rom_api_call_

本文记录了Air105 OpenOCD驱动开发过程,包括多次驱动实现方式的尝试,解决了汇编传参、缓存、header等测试问题,实现了.elf、.hex、.bin三种文件烧录。还对烧录速度进行优化,尝试DMA和多扇区擦除,最终完成驱动开发。
最低0.47元/天 解锁文章
889

被折叠的 条评论
为什么被折叠?



