📄 flash.c
字号:
stat = (*_flash_program_buf)(addr, data, size, flash_info.block_mask, flash_info.buffer_size); stat = flash_hwr_map_error(stat);#ifdef CYGSEM_IO_FLASH_VERIFY_PROGRAM if (0 == stat) // Claims to be OK if (memcmp(addr, data, size) != 0) { stat = 0x0BAD;#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("V");#endif }#endif if (stat) { *err_addr = (void *)addr; break; }#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)(".");#endif len -= size; addr += size/sizeof(*addr); data += size/sizeof(*data); } FLASH_Disable((unsigned short*)addr, (unsigned short *)(addr+len)); HAL_FLASH_CACHES_ON(d_cache, i_cache);#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("\n");#endif return (stat);}intflash_read(void *_addr, void *_data, int len, void **err_addr){#ifdef CYGSEM_IO_FLASH_READ_INDIRECT int stat = 0; int size; typedef int code_fun(void *, void *, int, unsigned long, int); code_fun *_flash_read_buf; unsigned char *addr = (unsigned char *)_addr; unsigned char *data = (unsigned char *)_data; CYG_ADDRESS tmp; int d_cache, i_cache; if (!flash_info.init) { return FLASH_ERR_NOT_INIT; }#ifdef CYGSEM_IO_FLASH_SOFT_WRITE_PROTECT if (plf_flash_query_soft_wp(addr,len)) return FLASH_ERR_PROTECT;#endif _flash_read_buf = (code_fun*) __anonymizer(&flash_read_buf);#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("... Read from %p-%p at %p: ", (void*)data, (void*)(((CYG_ADDRESS)data)+len), (void*)addr);#endif HAL_FLASH_CACHES_OFF(d_cache, i_cache); FLASH_Enable((unsigned short*)addr, (unsigned short *)(addr+len)); while (len > 0) { size = len; if (size > flash_info.block_size) size = flash_info.block_size; tmp = (CYG_ADDRESS)addr & ~flash_info.block_mask; if (tmp) { tmp = flash_info.block_size - tmp; if (size>tmp) size = tmp; } stat = (*_flash_read_buf)(addr, data, size, flash_info.block_mask, flash_info.buffer_size); stat = flash_hwr_map_error(stat);#ifdef CYGSEM_IO_FLASH_VERIFY_PROGRAM_ if (0 == stat) // Claims to be OK if (memcmp(addr, data, size) != 0) { stat = 0x0BAD;#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("V");#endif }#endif if (stat) { *err_addr = (void *)addr; break; }#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)(".");#endif len -= size; addr += size/sizeof(*addr); data += size/sizeof(*data); } FLASH_Disable((unsigned short*)addr, (unsigned short *)(addr+len)); HAL_FLASH_CACHES_ON(d_cache, i_cache);#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("\n");#endif return (stat);#else // CYGSEM_IO_FLASH_READ_INDIRECT // Direct access to FLASH memory is possible - just move the requested bytes if (!flash_info.init) { return FLASH_ERR_NOT_INIT; } memcpy(_data, _addr, len); return FLASH_ERR_OK;#endif}#ifdef CYGHWR_IO_FLASH_BLOCK_LOCKINGintflash_lock(void *addr, int len, void **err_addr){ unsigned short *block, *end_addr; int stat = 0; typedef int code_fun(unsigned short *); code_fun *_flash_lock_block; int d_cache, i_cache; if (!flash_info.init) { return FLASH_ERR_NOT_INIT; }#ifdef CYGSEM_IO_FLASH_SOFT_WRITE_PROTECT if (plf_flash_query_soft_wp(addr,len)) return FLASH_ERR_PROTECT;#endif _flash_lock_block = (code_fun*) __anonymizer(&flash_lock_block); block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask); end_addr = (unsigned short *)((CYG_ADDRESS)addr+len); /* Check to see if end_addr overflowed */ if( (end_addr < block) && (len > 0) ){ end_addr = (unsigned short *) ((CYG_ADDRESS) flash_info.end - 1); }#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("... Lock from %p-%p: ", block, end_addr);#endif HAL_FLASH_CACHES_OFF(d_cache, i_cache); FLASH_Enable(block, end_addr); while (block < end_addr) { unsigned short *tmp_block; stat = (*_flash_lock_block)(block); stat = flash_hwr_map_error(stat); if (stat) { *err_addr = (void *)block; break; } // Check to see if block will overflow tmp_block = block + flash_info.block_size / sizeof(*block); if(tmp_block < block){ // If block address overflows, set block value to end on this loop block = end_addr; } else{ block = tmp_block; }#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)(".");#endif } FLASH_Disable(block, end_addr); HAL_FLASH_CACHES_ON(d_cache, i_cache);#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("\n");#endif return (stat);}intflash_unlock(void *addr, int len, void **err_addr){ unsigned short *block, *end_addr; int stat = 0; typedef int code_fun(unsigned short *, int, int); code_fun *_flash_unlock_block; int d_cache, i_cache; if (!flash_info.init) { return FLASH_ERR_NOT_INIT; }#ifdef CYGSEM_IO_FLASH_SOFT_WRITE_PROTECT if (plf_flash_query_soft_wp(addr,len)) return FLASH_ERR_PROTECT;#endif _flash_unlock_block = (code_fun*) __anonymizer(&flash_unlock_block); block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask); end_addr = (unsigned short *)((CYG_ADDRESS)addr+len); /* Check to see if end_addr overflowed */ if( (end_addr < block) && (len > 0) ){ end_addr = (unsigned short *) ((CYG_ADDRESS) flash_info.end - 1); }#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("... Unlock from %p-%p: ", block, end_addr);#endif HAL_FLASH_CACHES_OFF(d_cache, i_cache); FLASH_Enable(block, end_addr); while (block < end_addr) { unsigned short *tmp_block; stat = (*_flash_unlock_block)(block, flash_info.block_size, flash_info.blocks); stat = flash_hwr_map_error(stat); if (stat) { *err_addr = (void *)block; break; } tmp_block = block + flash_info.block_size / sizeof(*block); if(tmp_block < block){ // If block address overflows, set block value to end on this loop block = end_addr; } else{ block = tmp_block; }#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)(".");#endif } FLASH_Disable(block, end_addr); HAL_FLASH_CACHES_ON(d_cache, i_cache);#ifdef CYGSEM_IO_FLASH_CHATTER (*flash_info.pf)("\n");#endif return (stat);}#endifchar *flash_errmsg(int err){ switch (err) { case FLASH_ERR_OK: return "No error - operation complete"; case FLASH_ERR_ERASE_SUSPEND: return "Device is in erase suspend state"; case FLASH_ERR_PROGRAM_SUSPEND: return "Device is in program suspend state"; case FLASH_ERR_INVALID: return "Invalid FLASH address"; case FLASH_ERR_ERASE: return "Error trying to erase"; case FLASH_ERR_LOCK: return "Error trying to lock/unlock"; case FLASH_ERR_PROGRAM: return "Error trying to program"; case FLASH_ERR_PROTOCOL: return "Generic error"; case FLASH_ERR_PROTECT: return "Device/region is write-protected"; case FLASH_ERR_NOT_INIT: return "FLASH sub-system not initialized"; case FLASH_ERR_DRV_VERIFY: return "Data verify failed after operation"; case FLASH_ERR_DRV_TIMEOUT: return "Driver timed out waiting for device"; case FLASH_ERR_DRV_WRONG_PART: return "Driver does not support device"; case FLASH_ERR_LOW_VOLTAGE: return "Device reports low voltage"; default: return "Unknown error"; }}// EOF io/flash/..../flash.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -