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.