OpenOCD 添加 AIR105(下)

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

前言

  • 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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值