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的,所以这步要设置正确。
第二步修改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即可。
修改tls_fls_init接口,这个接口里改动是在设置OTP erasesize的大小。在手册找到44H命令,flash有三个1024-byte的Security Registers,每次擦除一个寄存器大小,所以擦除大小等于1024。在case SPIFLASH_MID_GD:后面增加case SPIFLASH_MID_UC:即可。
修改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:即可。
修改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:即可。
增加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来使能四线模式。
根据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。如下图所示。
到此修改完毕。
大佬yyds。
Cool guy! :)
Hot topic for us.