static void harakiri(uint32_t index) { #ifdef HARAKIRI_ENABLED extern uint16_t __stage_0_config__; const uint16_t *stage0conf_addr = (uint16_t *)&__stage_0_config__; flash_err_t rv; FUTURE_HOOK_1(harakiri_0, &index); if (index % sizeof(uint16_t) != 0) return; if (index > 0x4000) return; index >>= 1; // XXX must not be run XiP!!! rv = _flash_init(); /* call that first to close flash if it's opened */ if (0 != stage0conf_addr[index-1]) return; if (0 == stage0conf_addr[index]) return; if (FLASH_ERR_OK != rv) { # ifdef LOG_REPORT_BEFORE_BOARD_INIT_ALLOWED log_report(LOG_GLOBAL, "harakiri FAILING?!\n"); # endif } rv = _flash_write((void *)&stage0conf_addr[index], "\x00\x00", 2); # ifdef LOG_REPORT_BEFORE_BOARD_INIT_ALLOWED log_report_fmt(LOG_GLOBAL, "harakiri @%08x: %s\n", &stage0conf_addr[index], rv == FLASH_ERR_OK ? "SUCCESS" : "FAILURE"); # endif #endif /* HARAKIRI_ENABLED */ }
/** * @brief 打开FLASH文件,主要是初始化SWPA_FILEHEADER结构体 * * * @param [in] filename : FLASH设备上文件名 * @param [in] mode 文件打开模式 * - "r" 读方式打开 * - "w" 写方式打开 * - "r+" 读写方式打开 * - "w+" 读写方式打开 * @retval 文件描述符(int型) : 成功;实际上就是SWPA_FILEHEADER结构体指针 * @retval SWPAR_FAIL : 打开失败 * @retval SWPAR_INVALIDARG : 参数非法 * @retval SWPAR_OUTOFMEMORY : 参数内存不够 */ int swpa_flash_file_open( const char *filename, const char *mode ) { int ret = 0; SWPA_FILEHEADER * pheader = NULL; FLASH_FILE_INFO * pinfo = NULL; int dev_id = 0; char segname[64] = {0}; int i; //参数有效性检查 SWPA_FILE_CHECK(NULL != filename); //filename指针非空 SWPA_FILE_CHECK(0 != swpa_strcmp(filename, ""));//filename非空字符串 SWPA_FILE_CHECK(NULL != mode); //mode指针非空 SWPA_FILE_CHECK(0 != swpa_strcmp(mode, "")); //mode非空字符串 //打印参数 SWPA_FILE_PRINT("filename=%s\n", filename); SWPA_FILE_PRINT("mode=%s\n", mode); //获取设备ID swpa_sscanf(filename, "%d/%s", &dev_id, segname); if (0 == dev_id) { dev_id = DEVID_SPI_FLASH_DM6467; } else if (1 == dev_id) { dev_id = DEVID_SPI_FLASH_DM368; } else { return SWPAR_INVALIDARG; } if (SWPAR_OK != _flash_init(dev_id)) { ret = SWPAR_FAIL; SWPA_FILE_PRINT("Err: failed to init flash! [%d]\n", ret); return ret; } pheader = (SWPA_FILEHEADER *)swpa_mem_alloc(sizeof(*pheader)); if (NULL == pheader) { ret = SWPAR_OUTOFMEMORY; SWPA_FILE_PRINT("Err: No enough memory for pheader! [%d]\n", ret); return ret; } swpa_memset(pheader, 0, sizeof(*pheader)); ret = swpa_file_create_rwlock(pheader, filename); if (SWPAR_OK != ret) { SWPA_FILE_PRINT("Err: swpa_file_create_rwlock() failed! [%d]\n", ret); ret = SWPAR_FAIL; goto _ERR_HANDLING; } pinfo = (FLASH_FILE_INFO *)swpa_mem_alloc(sizeof(*pinfo)); if (NULL == pinfo) { ret = SWPAR_OUTOFMEMORY; SWPA_FILE_PRINT("Err: No enough memory for pinfo! [%d]\n", ret); goto _ERR_HANDLING; } ret = swpa_file_parse_mode(pheader, mode); if (SWPAR_OK != ret) { SWPA_FILE_PRINT("Err: swpa_file_parse_mode() failed! [%d]\n", ret); goto _ERR_HANDLING; } for (i=0; i<FLASH_SEG_NUM; i++) { if (0==swpa_strncmp(_flash_seg_info[i].name, segname, swpa_strlen(_flash_seg_info[i].name)) && dev_id == _flash_seg_info[i].dev_id) { if (SWPA_FILE_IS_APPEND_MODE(pheader) || SWPA_FILE_IS_WRITE_MODE(pheader)) { if (!(PERMISSION_WRITE ^ _flash_seg_info[i].permission)) { ret = SWPAR_INVALIDARG; SWPA_FILE_PRINT("Err: this file is not permitted to write! [%d]\n", ret); goto _ERR_HANDLING; } } pinfo->addr = _flash_seg_info[i].addr; pinfo->len = _flash_get_file_size(dev_id, i); pinfo->offset = (SWPA_FILE_IS_APPEND_MODE(pheader)) ? pinfo->len : 0; //0; pinfo->dev_id = dev_id; pinfo->seg_len = _flash_seg_info[i].len; pinfo->file_id = i; break; } } //没有找到对应的段名,报错返回 if (FLASH_SEG_NUM <= i) { ret = SWPAR_INVALIDARG; SWPA_FILE_PRINT("Err: %s not found! [%d]\n", filename, ret); goto _ERR_HANDLING; } pheader->device_param = (int)pinfo; pheader->file_open = swpa_flash_file_open; pheader->file_close = swpa_flash_file_close; pheader->file_seek = swpa_flash_file_seek; pheader->file_eof = swpa_flash_file_eof; pheader->file_tell = swpa_flash_file_tell; pheader->file_ioctl = swpa_flash_file_ioctl; pheader->file_read = swpa_flash_file_read; pheader->file_write = swpa_flash_file_write; return (int)pheader; //错误处理并返回 _ERR_HANDLING: if (0 != pheader->rwlock) { swpa_mutex_delete(&pheader->rwlock); pheader->rwlock = 0; } if (NULL != pheader) { swpa_mem_free(pheader); pheader = NULL; } if (NULL != pinfo) { swpa_mem_free(pinfo); pinfo = NULL; } return ret; }