⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -