Exemple #1
0
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 */
}
Exemple #2
0
/**
* @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;
	
}