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

📄 smf_io.c

📁 the test file for GP32 gameboy hack
💻 C
📖 第 1 页 / 共 2 页
字号:
		addr2 = (addr >> 16) & 0xff;
	}
	else
	{
		addr1 = (addr >> 9) & 0xff;
		addr2 = (addr >> 17) & 0xff;
		addr3 = (addr >> 25) & 0x7f;
	}

	SM_WRITE_EN(drv_no);
	SM_WRITE_ADDR(drv_no, addr0);
	SM_WRITE_ADDR(drv_no, addr1);
	SM_WRITE_ADDR(drv_no, addr2);

	if (s_deviceSize[drv_no] >= DI_64M)
	{
		SM_WRITE_ADDR(drv_no, addr3);
	}

	SM_WRITE_DIS(drv_no);
	SM_ALE_DIS(drv_no);

	SM_WAIT_TR(drv_no);

	SM_READ_EN(drv_no);

	for (i = 0; i < read_size; ++i, ++p_buf)
	{
		*p_buf = SM_READ_DATA(drv_no);
	}

	SM_READ_DIS(drv_no);

	SM_CHIP_DIS(drv_no);

	SM_WAIT_TR(drv_no);

	IO_RETURN(drv_no, s_smpErr);
}


/**********
 * Function: smpFlashEraseBlock
 * Remarks:
 *	- Erase 1 block
 *	- if status error occurs, it tries one more time
 **********/
SMP_EXPORT ERR_CODE smpFlashEraseBlock(udword drv_no, udword addr)
{
	udword addr1, addr2, addr3;

	s_smpErr = sm_PreIO(drv_no);
	if (s_smpErr != SM_OK)
		IO_RETURN(drv_no, s_smpErr);

	SM_CHIP_EN(drv_no);

	SM_CLE_EN(drv_no);
	SM_WRITE_EN(drv_no);
	SM_WRITE_CMD(drv_no, BLOCK_ERASE_CMD);
	SM_WRITE_DIS(drv_no);
	SM_CLE_DIS(drv_no);

	SM_ALE_EN(drv_no);
	if (s_pageSize[drv_no] == PAGE_SIZE_256)
	{
		addr1 = (addr >> 8) & 0xff;
		addr2 = (addr >> 16) & 0xff;
	}
	else
	{
		addr1 = (addr >> 9) & 0xff;
		addr2 = (addr >> 17) & 0xff;
		addr3 = (addr >> 25) & 0x7f;
	}

	SM_WRITE_EN(drv_no);
	SM_WRITE_ADDR(drv_no, addr1);
	SM_WRITE_ADDR(drv_no, addr2);

	if (s_deviceSize[drv_no] >= DI_64M)
	{
		SM_WRITE_ADDR(drv_no, addr3);
	}

	SM_WRITE_DIS(drv_no);
	SM_ALE_DIS(drv_no);

	SM_CLE_EN(drv_no);
	SM_WRITE_EN(drv_no);
	SM_WRITE_CMD(drv_no, BLOCK_ERASE_CFM_CMD);
	SM_WRITE_DIS(drv_no);
	SM_CLE_DIS(drv_no);

	s_smpErr = sm_StatusCheck(drv_no);

	SM_CHIP_DIS(drv_no);

	IO_RETURN(drv_no, s_smpErr);
}


/**********
 * Function: smpFlashReadID
 * Remarks:
 *	- Read Flash ID (manufacture & device ID)
 * Notes:
 *	- sm_PreIO() is not called in smpFlashReadID()
 *	- can be called from the same layer(IO layer) functions
 **********/
SMP_EXPORT ERR_CODE smpFlashReadID(udword drv_no, ubyte* p_buf, udword read_size)
{
	udword i;

	s_smpErr = sm_PreIO(drv_no);
	if (s_smpErr != SM_OK)
		IO_RETURN(drv_no, s_smpErr);

	if (read_size < 2)
		IO_RETURN(drv_no, ERR_INVALID_PARAM);

	SM_CHIP_EN(drv_no);

	SM_CLE_EN(drv_no);
	SM_WRITE_EN(drv_no);
	SM_WRITE_CMD(drv_no, READ_ID_CMD);
	SM_WRITE_DIS(drv_no);
	SM_CLE_DIS(drv_no);

	SM_ALE_EN(drv_no);
	SM_WRITE_EN(drv_no);
	SM_WRITE_ADDR(drv_no, 0);
	SM_WRITE_DIS(drv_no);
	SM_ALE_DIS(drv_no);

	SM_READ_EN(drv_no);

	for (i = 0; i < read_size; ++i, ++p_buf)
	{
		*p_buf = SM_READ_DATA(drv_no);
	}

	SM_READ_DIS(drv_no);

	SM_CHIP_DIS(drv_no);

	IO_RETURN(drv_no, SM_OK);
}


/**********
 * Function: smpCheckDevice
 * Return value: SM_OK if card is inserted
 * Remarks:
 *	- Check if the SmardMedia card is inserted
 **********/
SMP_EXPORT ERR_CODE smpCheckDevice(udword drv_no)
{
	s_smpErr = sm_PreIO(drv_no);
	if (s_smpErr != SM_OK)
		IO_RETURN(drv_no, s_smpErr);

	s_smpErr = sm_CheckDevice(drv_no);

	IO_RETURN(drv_no, s_smpErr);
}


/**********
 * Function: SMPCBCardInserted
 * Remarks:
 *	- callback function that is called when the card is inserted
 *	- must call the callback function of higher layer
 **********/
SMP_EXPORT void SMPCBCardInserted(udword drv_no)
{
	s_cardInserted[drv_no] = TRUE;
	SMLCBCardInserted(drv_no);
}


/**********
 * Function: SMPCBCardEjected
 * Remarks:
 *	- callback function that is called when the card is ejected
 *	- must call the callback function of higher layer
 **********/
SMP_EXPORT void SMPCBCardEjected(udword drv_no)
{
	s_cardInserted[drv_no] = FALSE;
	s_ioFlag[drv_no] = NOT_INITIALIZED;
	SMLCBCardEjected(drv_no);
}


/**********
 * Local Function definitions
 **********/


/**********
 * Function: sm_IOInitDefaultValue
 * Remarks:
 *	- called when the file system is initialized
 **********/
void sm_IOInitDefaultValue(void)
{
	udword i;

	for (i = 0; i < MAX_DRIVE; ++i)
	{
		s_smpErr = sm_CheckDevice(i);
		if (s_smpErr == SM_OK)
			s_cardInserted[i] = TRUE;
		else
			s_cardInserted[i] = FALSE;

		s_ioFlag[i] = NOT_INITIALIZED;
	}
}


/**********
 * Function: sm_IOInit
 * Remarks:
 *	- called when the udIOFlag is not initialized and IO API is called
 **********/
ERR_CODE sm_IOInit(udword drv_no)
{
	ubyte temp_buf[2];
	udword i, j, k;

	s_ioFlag[drv_no] = NOT_INITIALIZED;

	SM_WP_DIS();

	SM_CHIP_EN(drv_no);

	SM_CLE_EN(drv_no);
	SM_WRITE_EN(drv_no);
	SM_WRITE_CMD(drv_no, READ_ID_CMD);
	SM_WRITE_DIS(drv_no);
	SM_CLE_DIS(drv_no);

	SM_ALE_EN(drv_no);
	SM_WRITE_EN(drv_no);
	SM_WRITE_ADDR(drv_no, 0);
	SM_WRITE_DIS(drv_no);
	SM_ALE_DIS(drv_no);

	SM_READ_EN(drv_no);
	temp_buf[0] = SM_READ_DATA(drv_no);
	temp_buf[1] = SM_READ_DATA(drv_no);
	SM_READ_DIS(drv_no);

	SM_CHIP_DIS(drv_no);

	/* search manufacture code table */
	for (i = 0; i < MAX_MI_NUM; ++i)
	{
		if (temp_buf[0] == g_mCode[i])
			break;
	}
	if (i >= MAX_MI_NUM)
		return ERR_CARD_NOT_DETECTED;


	/* search device code table */
	for (j = 0; j < MAX_DI_NUM; ++j)
	{
		for (k = 0; k < MAX_VI_NUM; ++k)
		{
			if (temp_buf[1] == g_dCode[i][j][k])
				break;
		}

		if (k < MAX_VI_NUM)
			break;
	}
	if (j >= MAX_DI_NUM)
		return ERR_CARD_NOT_DETECTED;

	s_deviceSize[drv_no] = j;

	if (j <= DI_2M)
		s_pageSize[drv_no] = PAGE_SIZE_256;
	else
		s_pageSize[drv_no] = PAGE_SIZE_512;

	s_ioFlag[drv_no] = INITIALIZED;
	return SM_OK;
}


/**********
 * Function: sm_PreIO
 * Remarks:
 *	- called at the first of IO APIs
 **********/
ERR_CODE sm_PreIO(udword drv_no)
{
	if (s_ioFlag[drv_no] != INITIALIZED)
	{
		s_smpErr = sm_IOInit(drv_no);
		if (s_smpErr != SM_OK)
			return s_smpErr;
	}

	return SM_OK;
}


/**********
 * Function: sm_PostIO
 * Remarks:
 *	- called at the end of IO APIs
 **********/
ERR_CODE sm_PostIO(udword drv_no)
{
	return SM_OK;
}


/**********
 * Function: sm_StatusCheck
 * Remarks:
 *	- wait until the status register is ready, and read status register
 *	- called after Flash Write/Erase
 **********/
ERR_CODE sm_StatusCheck(udword drv_no)
{
	udword i;
	ubyte status;

	for (i = 0; i < WAIT_STATUS_COUNT; ++i)
	{
		SM_CLE_EN(drv_no);
		SM_WRITE_EN(drv_no);
		SM_WRITE_CMD(drv_no, READ_STATUS_CMD);
		SM_WRITE_DIS(drv_no);
		SM_CLE_DIS(drv_no);
		SM_READ_EN(drv_no);
		status = SM_READ_DATA(drv_no);
		SM_READ_DIS(drv_no);
		if (status & 0x40)
		{
			/* read one more time (it needs 5nsec after 0x40 occurs) */
			SM_CLE_EN(drv_no);
			SM_WRITE_EN(drv_no);
			SM_WRITE_CMD(drv_no, READ_STATUS_CMD);
			SM_WRITE_DIS(drv_no);
			SM_CLE_DIS(drv_no);
			SM_READ_EN(drv_no);
			status = SM_READ_DATA(drv_no);
			SM_READ_DIS(drv_no);
			break;
		}
	}

	if (i >= WAIT_STATUS_COUNT)
		return ERR_SM_TIMEOUT;

	if (status & 0x01)
		return ERR_FLASH_STATUS;

	return SM_OK;
}


/**********
 * Function: sm_CheckDevice
 * Return value: SM_OK if card is inserted
 * Remarks:
 *	- Local function that checks if the SmardMedia card is inserted
 **********/
ERR_CODE sm_CheckDevice(udword drv_no)
{
	ubyte temp_buf[2];

	SM_CHIP_EN(drv_no);

	SM_CLE_EN(drv_no);
	SM_WRITE_EN(drv_no);
	SM_WRITE_CMD(drv_no, READ_ID_CMD);
	SM_WRITE_DIS(drv_no);
	SM_CLE_DIS(drv_no);

	SM_ALE_EN(drv_no);
	SM_WRITE_EN(drv_no);
	SM_WRITE_ADDR(drv_no, 0);
	SM_WRITE_DIS(drv_no);
	SM_ALE_DIS(drv_no);

	SM_READ_EN(drv_no);
	temp_buf[0] = SM_READ_DATA(drv_no);
	temp_buf[1] = SM_READ_DATA(drv_no);
	SM_READ_DIS(drv_no);

	SM_CHIP_DIS(drv_no);

	if ((temp_buf[0] != 0xec) && (temp_buf[0] != 0x98))
		return ERR_CARD_NOT_DETECTED;

	return SM_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -