W802 外置 FLASH 添加新的型号

发布于 2024-03-20 15: 31: 51

W802 使用的是外置 FLASH, 市面上 FLASH 型号众多, SDK 中只设置了几个验证过的 FLASH 型号, 所以当使用新的型号时, 就需要修改 SDK 中 FLASH 的驱动来适配, 本文将介绍具体的修改方法.
首先需要下载 FLASH 的芯片手册以及 W800 SDK, 本文以优存 UC25HQ64 为例介绍. 涉及到的 SDK 文件有 wm_internal_flash. h, wm_internal_fls. c, wm_flash_map. h, gcc_csky. ld, . config, aft_build_project. sh 文件.
第一步, 在 wm_internal_flash. h 里的 enum TYPE_FLASH_ID 里增加新的 FLASH ID, 比如 SPIFLASH_MID_UC = 0xB3, 这里定义的是 FLASH 的 MID, 在 FLASH 的手册中找到 MID 的定义, 如下图, FLASH 驱动里不同的接口操作都是以 MID 来识别 FLASH 的, 所以这步要设置正确.
1. png

2. png

第二步修改 wm_internal_fls. c 里面的接口, 这里涉及的接口有 6 个, 分别是 tls_fls_read_unique_id_internal, tls_fls_init, tls_fls_otp_lock, flashlock, flashunlock 以及新增一个接口 tls_fls_qspi_enable. 分别说明如下.
tls_fls_read_unique_id_internal 用于读取 FLASH 的 UUID, 每一个 flash 芯片都有一个唯一的 ID, 该接口里根据 MID, 来设置 dumy_bytes 和 uni_bytes 两个变量的值, 其他的不需要修改. 在手册里找到 4BH 命令可以看到返回的结果里有 4 个 dummy bytes 和 128bit ID, 所以这里可以在 dumy_bytes = 4; uni_bytes = 16; 这组 case 里加入新增的 SPIFLASH_MID_UC 即可.
3. png

4. png

修改 tls_fls_init 接口, 这个接口里改动是在设置 OTP erasesize 的大小. 在手册找到 44H 命令, flash 有三个 1024-byte 的 Security Registers, 每次擦除一个寄存器大小, 所以擦除大小等于 1024. 在 case SPIFLASH_MID_GD: 后面增加 case SPIFLASH_MID_UC: 即可.
5. png

6. png

修改 tls_fls_otp_lock 接口, 这个接口修改的是 FLASH 状态寄存器里的 LB 位, 这里的区别是调用 writeLbBit_for_1wreg 还是
writeLbBit_for_2wreg 以及参数, writeLbBit_for_1wreg 是用 01H 命令连续写两个字节的 SR, writeLbBit_for_2wreg 是用 31H 命令写 SR 的 15~8bit, 参数的含义是 LB 的 bit 位数以及在 SR 中的位置, 查看 FLASH 的状态寄存器里 LB 的位置, 以及 01H 命令, 实现方式为 writeLbBit_for_1wreg ( (7 11) ) ; 所以只需要在 case SPIFLASH_MID_TSINGTENG_1MB_4MB 后面加上 case SPIFLASH_MID_UC: 即可.
7. png

8. png

9. png

修改 flashlock 和 flashunlock 接口, 这两个个接口修改的是 FLASH SR 的 BP 位, 区别在于调用 writeBpBit_for_1wreg 和 writeBpBit_for_2wreg, 参数都是一样的, writeBpBit_for_1wreg 是用 01H 命令写两个字节, writeBpBit_for_2wreg 是用 01H 和 31H 分别写 SR 的低 8bit 和高 8bit, 上面提到 01H 是支持两个字节的, 所以在 case SPIFLASH_MID_TSINGTENG: 后面加上 case SPIFLASH_MID_UC: 即可.
10. png

11. png

增加 tls_fls_qspi_enable 接口, 为了加快代码的执行速度, 可以把 FLASH 的访问切换到 QSPI 四线模式, 如果驱动中没有这个接口就需要增加, 如果有, 只需要修改增加新的 FLASH 的 ID, 该接口修改的是 FLASH 的 SR 的 QE 位, QE 在 SR 的 bit9, 所以直接用 31H 命令发送, 如下.

void tls_fls_qspi_enable (void) 
{
    uint8_t rid; 
    uint32_t status = 0; 
    
    rid = readRID () ; 
    switch (rid) 
    {
        case SPIFLASH_MID_UC: 
        case SPIFLASH_MID_WINBOND: 
            M32 (HR_FLASH_CMD_ADDR)  = 0x0C035; 
            M32 (HR_FLASH_CMD_START)  = CMD_START_Msk; 
            status =  read_first_value ()  & 0xFF; 
            if ( (status &  (1    1) )  == 0) 
            {
                /*Write Enable*/
                M32 (HR_FLASH_CMD_ADDR)  = 0x6; 
                M32 (HR_FLASH_CMD_START)  = CMD_START_Msk; 

                M32 (RSA_BASE_ADDRESS)    = status |  (1    1) ; 
                M32 (HR_FLASH_CMD_ADDR)   = 0x0A031; 
                M32 (HR_FLASH_CMD_START)  = CMD_START_Msk; 
            }
            break; 
        default: 
            break; 
    }
    M32 (HR_FLASH_CR)  = 0x0D; 
}

修改完上面的这些接口后, 已经可以使用了, 在 mian. c 里的 UserMain 调用新增的接口 tls_fls_qspi_enable 来使能四线模式.
16. png

根据 FLASH 的使用情况, 有可能目前的划分方式不合适, 比如运行固件很大, 就需要修改, 在 wm_flash_map. h 里修改 CODE_RUN_START_ADDR 和 USER_ADDR_START 这两个宏定义, CODE_RUN_START_ADDR 是固件运行区的起始地址, USER_ADDR_START 是用户自定义参数保存的位置. 如果修改了 CODE_RUN_START_ADDR, 比如从 0x80D0000UL 向后移动到了 0x8200000, 那么在 ld/w800/gcc_csky. ld 文件里也要从 0x08010400 改为 0x8200400, 长度根据实际划分情况改动. tools/w800/. config 文件里 CONFIG_W800_IMAGE_HEADER 从 80D0000 改为 0x8200000, CONFIG_W800_RUN_ADDRESS 从 80D0400 改为 0x8200400. tools/w800/utilites/aft_build_project. sh 里的 run_img_header 从 80d0000 改为 0x8200000, run_img_pos 从 80d0400 改为 0x8200400. 如下图所示.
12. png

13. png

14. png

15. png

到此修改完毕.

2 条评论

发布
问题