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

📄 sdmmc_load.c

📁 针对Intel Xscale PXA255的WinCE boot loader源代码包!极具参考价值!
💻 C
📖 第 1 页 / 共 2 页
字号:
		return(FALSE);
	}
	else
	{
		//RETAILMSG(0, (TEXT("v_pGPIOReg=0x%x, v_pDriverGlobals=0x%x\r\n"), v_pGPIOReg, v_pDriverGlobals));
		return(TRUE);
	}
}

/************************************************************************************************************
* Function: SML_PowerHandler
* 
* Purpose:  Power Handler for the loader. Currently we dont need to do anything here, so these are just stubs.
*  
* Returns:  void
*
************************************************************************************************************/


void WINAPI SML_PowerHandler(
	BOOL	bOff    // @parm TRUE, the system is powering off; FALSE, the system is powering up.
	)
{
    if (bOff) 
	{
		SML_PowerDown();
	}
    else 
	{
		SML_PowerUp();
	}

}

/************************************************************************************************************
* Function: SDMMCDetectThread
* 
* Purpose:  This function is the main thread that looks for the card insertion interrupt from the FPGA. It runs 
*			indefinately and is responsible for loading the driver when it sees the interrupt and unloads the 
*			driver when it sees the card removal. Currently we are polling for the levels because of the inherent 
*			problem in the FPGA not able to deliver a card removal interrupt. This code will change when this 
*			issue is resolved.  
*  
* Returns:  void
*
************************************************************************************************************/

static DWORD WINAPI
SDMMCDetectThread(LPVOID pArgument)
{
//	HANDLE hDevice = NULL;
	int i = 0;
	int iStatusIn[5] = {0,0,0,0,0};
	int iStatusOut[5] = {0,0,0,0,0};
	int iSumIn = 0;
	int iSumOut = 0;

	SDMMC_InitializeAddresses();


	InitializeHardware();
	RETAILMSG(0, (TEXT("InitializeHardware done.\r\n")));	

	
	gSDMMCIntrEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("SDMMC"));

	if (!(InterruptInitialize(SYSINTR_SDMMC, gSDMMCIntrEvent, NULL, 0))) 
	{
		RETAILMSG(0, (TEXT("SDMMC IntrInit Failed\r\n")));
 		return FALSE;		
	}

	Sleep (1000);		// Same as CF driver, wait for 1 sencond to avoid data abort.
	
	
	while(1)
	 {
	 	
		
		Sleep(20);
		
		
		
		if(((v_pGPIOReg->GPLR_x & GPIO_25)) && (SDMMC_DETECT==1))	// hzh
	
		{
			RETAILMSG(0, (TEXT("card is removed\r\n")));
			SDMMC_DETECT = 0;
			
			
			DeactivateDevice( hDevice);
			DoDeleteHandleValue(szRegKey);
			InterruptDone(SYSINTR_SD_INSERT);
			
			v_pGPIOReg->GAFR0_x &= ~(GPIO_8_AF1_MMCCS0 | GPIO_8_AF3);
			v_pGPIOReg->GPDR_x &= ~GPIO_8;
			//RETAILMSG (1, (TEXT("---------------+Finish process remove Card()--------------\r\n")));

		} 		
		
		if( (SDMMC_DETECT==0) && ((v_pGPIOReg->GPLR_x & GPIO_25) == 0))	// hzh
		{		

			SDMMC_DETECT = 1;
			RETAILMSG(0, (TEXT("card is detected\r\n")));
			
			v_pGPIOReg->GAFR0_x |= GPIO_8_AF1_MMCCS0;	// set alternate function for gpio  MMCCLK
			
		
			DoRegSetup(szRegKey);
			hDevice = ActivateDevice( szRegKey, 0);
			DoSetHandleValue( szRegKey, hDevice);
			
			v_pDriverGlobals->misc.SDMMCHandle=hDevice;
			//RETAILMSG(0,(TEXT("SDMMC handle=0x%x\r\n"), hDevice));

			InterruptDone(SYSINTR_SD_INSERT);
			//RETAILMSG (1, (TEXT("---------------+Finish processing insert Card--------------\r\n")));

		}
		else
		{
			
			RETAILMSG(0, (TEXT("===================Done!=================\r\n")));
			InterruptDone(SYSINTR_SD_INSERT);
			//<-- End
		}	
		

		//RETAILMSG(0, (TEXT("Wait next SD card interrupt event...\r\n")));
		WaitForSingleObject(hSDEvent, INFINITE); //normally: 
		// End.
		 
	 } 
}

/************************************************************************************************************
* Function: SML_Init
* 
* Purpose:  performs some initialisation. spawns the main loader thread. 
*  
* Returns:  void
*
************************************************************************************************************/

BOOL WINAPI SML_Init()
{
	//RETAILMSG(0, (TEXT("Entering Init.\r\n")));



	hSDEvent = CreateEvent(
					NULL,   // No Security
					FALSE,  // Not manual reset
					FALSE,  // Not initially signalled
					NULL    // No name
					);
					
	if(! hSDEvent)
	{
		//RETAILMSG( 1, (TEXT("SML_Init: CreateEvent hSDEvent failed, error = %x\r\n"), GetLastError()));
		return FALSE;
	}
//	//RETAILMSG( 1, (TEXT("SML_Init:	SYSINTR_SD_INSERT=%d, hSDEvent=%d\r\n"),SYSINTR_SD_INSERT,hSDEvent));

	InterruptDone(SYSINTR_SD_INSERT);
//	//RETAILMSG( 1, (TEXT("MMC_Init:	InterruptDone\r\n")));
	InterruptDisable(SYSINTR_SD_INSERT);
//	//RETAILMSG( 1, (TEXT("MMC_Init:	InterruptDisable\r\n")));

	if (!InterruptInitialize(SYSINTR_SD_INSERT, hSDEvent, NULL, 0))
	{
		//RETAILMSG( 1, (TEXT("SML_Init: InterruptInitialize SYSINTR_SD_INSERT failed!!!\r\n")));
		return FALSE;
	}
	//RETAILMSG(0, (TEXT("SDLoader InterruptInitialize done.\r\n")));	

// End.

    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
	
	gSDMMCDetectThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SDMMCDetectThread, NULL, 0, NULL);
		
	if ( gSDMMCDetectThread == NULL ) 
	{
        RETAILMSG(0, (TEXT("Fatal Error!  Failed to create MMC card detect thread.\r\n")));
        return (FALSE);
	}
		
	RETAILMSG(0, (TEXT("create MMC card detect thread(0x%x) successfull.\r\n"), gSDMMCDetectThread));
 	return TRUE;
	
}


BOOL WINAPI SML_DllEntry( HANDLE  hInstDll,
						  DWORD   dwReason,
						  LPVOID  lpvReserved
						)
{
    switch ( dwReason ) 
	{
		case DLL_PROCESS_ATTACH:
								DEBUGREGISTER((HINSTANCE) hInstDll);
								//RETAILMSG(0, (TEXT("SDMMCLoader : DLL_PROCESS_ATTACH\r\n")));
								break;

		case DLL_PROCESS_DETACH:
								// should be signaling thread here
								//RETAILMSG(0, (TEXT("SDMMCLoader : DLL_PROCESS_DETACH\r\n")));
								break;
    }

    return (TRUE);
}

// The following functions are all stubbed out. They are not required but are provided for the sake 
// of code completion.

DWORD SML_Open (DWORD dwData, DWORD dwAccess, DWORD dwShareMode) 
{
	return (4);
}

BOOL  SML_Close(DWORD dwData) 
{
	SDMMC_FreeAddresses();	
	return (TRUE);
}

DWORD SML_Read (DWORD dwData,  LPVOID pBuf, DWORD Len) 
{
	return (0);
}

DWORD SML_Write(DWORD dwData, LPCVOID pBuf, DWORD Len) 
{
	return (0);
}

DWORD SML_Seek (DWORD dwData, long pos, DWORD type) 
{
	return (DWORD)-1;
}


VOID  SML_PowerUp  (VOID) 
{
	
	SetInterruptEvent(SYSINTR_SD_INSERT);
	//RETAILMSG (1, (TEXT("SMLoader Power up end...\r\n")));
}

BOOL  SML_PowerDown(VOID) 
{
	
	RETAILMSG (1, (TEXT("SMLoader Power down end...\r\n")));
	return (TRUE);
}

BOOL  SML_Deinit(DWORD dwData) 
{
	return (TRUE);
}

BOOL  SML_IOControl(DWORD p1, DWORD p2, PBYTE p3, DWORD p4, PBYTE p5, 
                    DWORD p6, PDWORD p7) 
{
	return (TRUE);
}

void InitializeHardware()
{
	//RETAILMSG (1, (TEXT("---------------+InitializeHardware()--------------\r\n")));
	v_pGPIOReg->GAFR1_x &= ~GPIO_25_AF3;  	// GPIO25 set as GPIO pin, hzh
	v_pGPIOReg->GAFR1_z &= ~GPIO_80_AF3;  	// GPIO80 set as GPIO pin, hzh
	v_pGPIOReg->GPDR_x &= ~GPIO_25;  	// GPIO25 set as input for #CD, hzh
	v_pGPIOReg->GPDR_z &= ~GPIO_80;  	// GPIO80 set as input for WP, hzh
	
		
	v_pGPIOReg->GEDR_x |= GPIO_25;  // hzh
	//RETAILMSG (1, (TEXT("----------------v_pGPIOReg->GPDR_x:0x%x--------------\r\n"),v_pGPIOReg->GPDR_x));
	//RETAILMSG (1, (TEXT("----------------InitializeHardware()--------------\r\n")));
	return;
}

void FromSuspend()
{
	SetEvent(hSDEvent);
}

⌨️ 快捷键说明

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