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

📄 cf_util.c

📁 marvell wifi driver CF-8385PN-NDIS-ARM4-WINCE50-5.24.17.p5-27.p11.src.zip
💻 C
📖 第 1 页 / 共 3 页
字号:
    	UINT    	blockCount = 0;
    	UINT    	sizeOfFirmware;
    	UINT    	sizeSend = 0;
    	UINT    	sizeBlockInUshort;
    	UINT    	cmdIOaddr;
    	USHORT  i, sizeBlock, *pusPtr; //  usTempUshort,
    	UCHAR   ucTempUchar;
    	// USHORT  usTemp;
    	ULONG   	firmwareDelay = 0;
    	UCHAR   *pPtr;
    
	DBGPRINT(DBG_FWDL,(">>>INIT - DownloadHelperImage \n"));
	
    	sizeOfFirmware = sizeof(helperfmimage);
    	cmdIOaddr = pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_CMD_WRITE_PORT; 

    	// set byte 4 of the helper image to 0 for CF
    	pPtr = helperfmimage + 4;
    	*pPtr = 0;    // 0 for CF

    	while (sizeSend <= sizeOfFirmware)
    	{
		blockCount++;
        	sizeBlock = 256;

        	DBGPRINT(DBG_FWDL, ("block count = %d, sizeBlock = %d\n", blockCount, sizeBlock));

		// Get number of ushorts
        	sizeBlockInUshort = (sizeBlock + 1) / 2;
        	pusPtr = (PUSHORT)(helperfmimage + ((blockCount-1) * sizeBlock));

        	// Write number of bytes to be sent
        	NdisRawWritePortUshort(
     					pCf ->ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_CMD_WRITE_LEN,
	        			sizeBlockInUshort*2);

       	 for (i=0; i<sizeBlockInUshort; i++ )
        	{
            		NdisRawWritePortUshort(cmdIOaddr,*pusPtr);
            		pusPtr++;
        	}
      
		DBGPRINT(DBG_FWDL,("Downloaded Block %d of Firmware, blockSize = %d, Total size so far= %d\n", 
							blockCount, sizeBlockInUshort*2, sizeSend));

		// Assert the Command Download Over interrupt
    		NdisRawWritePortUchar(
   					pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_STATUS,
		        		CFMACREG_HCR_HS_CmdDnLdOvr);
	    	NdisRawWritePortUshort(
   					pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_CARD_INT_CAUSE,
        				CFMACREG_HCR_CIC_CmdDnLdOvr);
              
	    	firmwareDelay = 0; 
	    	do {
	        	NdisRawReadPortUchar(
		       		pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
		        		&ucTempUchar);
            
			if( (ucTempUchar & CFMACREG_CCR_CS_CmdDnLdRdy) )
			{
				break;
			}

            		// NdisMSleep(1);   //NdisStallExecution(30);
            		NdisStallExecution(1);
            		firmwareDelay++;
       	 } while (firmwareDelay < FWBLOCK_DELAY);
        
		if ( firmwareDelay >= FWBLOCK_DELAY )
        	{
            		DBGPRINT(DBG_FWDL,("Downloading FW died on block %d\n",blockCount));
            		return NDIS_STATUS_FAILURE;
        	}

		DBGPRINT(DBG_FWDL|DBG_LOAD,("Ready for next block after less than %d ms\n", firmwareDelay*1));

        	sizeSend += sizeBlock;
    	}
	
    	NdisRawWritePortUshort( pCf ->ulMrvDrvVirtualIoBase + 
				CFMACREG_HCR_IO_CMD_WRITE_LEN, 0x00);

	// Assert the Command Download Over interrupt
       NdisRawWritePortUchar(
   				pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_STATUS,
		    		CFMACREG_HCR_HS_CmdDnLdOvr);
	NdisRawWritePortUshort(
   				pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_CARD_INT_CAUSE,
        			CFMACREG_HCR_CIC_CmdDnLdOvr);	
       
	firmwareDelay = 0; 
	do {
	        NdisRawReadPortUchar(
		       		pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
		        		&ucTempUchar);
            
		if( (ucTempUchar & CFMACREG_CCR_CS_CmdDnLdRdy) )
		{
				break;
		}
		//NdisMSleep(1);   //NdisStallExecution(30);
            	NdisStallExecution(1);
            	firmwareDelay++;
       } while (firmwareDelay < FWBLOCK_DELAY);
       
	DBGPRINT(DBG_FWDL,("Wait  for helper download ready %d ms\n", firmwareDelay*1));
       
 	NdisStallExecution(50);   //NdisMSleep(50);
	DBGPRINT(DBG_FWDL|DBG_LOAD,("<<<<INIT - DownloadHelperImage --\n"));

	return NDIS_STATUS_SUCCESS;
}

#endif // #ifdef MRV_USE_HELPER_IMAGE

#ifdef POCKETPC_FIX

#define READ_SCRATCH_REGISTER(ucTemp)   \
{                                       \
    USHORT usTemp;                                                      \
                                                                        \
    NdisRawReadPortUshort(                                              \
	    pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_SCRATCH_PORT - 1,   \
        &usTemp);                                                       \
                                                                        \
    ucTemp = (UCHAR)(usTemp >> 8 );                                \
}

#else

#define READ_SCRATCH_REGISTER(ucTemp)   \
{                                       \
    NdisRawReadPortUchar(                                           \
	    pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_SCRATCH_PORT,   \
        &ucTemp);                                              \
}

#endif // #ifdef POCKETPC_FIX

//************************************************************************************
//* Function: 		cf_DownloadFWImageHelperMode
//*	Description:	Downloads the FW image to device over compact flash interface.
//* Returns			NDIS_STATUS_SUCCESS if all OK. NDIS_STATUS_FAILURE if any problems.
//* NOTE:			Please notice that the paramter is the mask of interrupts to disable.
//*						Routine will only disable the interrupts specified in the mask
//* Date:			
//************************************************************************************
NDIS_STATUS
cf_DownloadFWImageHelperMode(
	PCF_OBJECT pCf,
    	IN PMRVDRV_ADAPTER Adapter
)
{
    	UCHAR   	ucTemp;
    	UCHAR   	*pFW;
    	USHORT  rounded_len, len;
    	USHORT  update = 0;
    	UINT    	retry = 0;
    	ULONG   	i, j;
    	ULONG   	firmwareDelay;
    	USHORT  *pUshort;
	USHORT  usTemp;
	

	ULONG   	firmware_len = sizeof(fmimage);

    	pFW = fmimage;
		
       ///
	firmwareDelay = 0; 
       do {
		NdisRawReadPortUshort(
            			pCf ->ulMrvDrvVirtualIoBase + CFMACREG_CCR_SQ_READ_BASE_LOW,
            			&len);

        	DBGPRINT(DBG_FWDL, ("SQ_READ len = %d\n", len));

        	if (len & 0x0010) 
        		break;
        	
       } while ( firmwareDelay < FWDELAY );

	if ( firmwareDelay >= FWDELAY )
    	{
       	DBGPRINT(DBG_FWDL,("INIT - CF card start download fail!\n"));

        	return NDIS_STATUS_FAILURE;
    	}


	/// 
    	for (i=0; i<firmware_len; i+=len) 
    	{
       	NdisRawReadPortUshort(
            			pCf ->ulMrvDrvVirtualIoBase + CFMACREG_CCR_SQ_READ_BASE_LOW,
            			&len);

        	DBGPRINT(DBG_FWDL, ("Read len = %d\n", len));

        	if (len & 0x0001)
        	{	if (retry++ > 20)
                	{
                		DBGPRINT(DBG_FWDL, ("err  >= 20  %d\n", retry ));
                		return NDIS_STATUS_FAILURE;
        		}
			else 
				retry = 0;	
        	}

        	rounded_len = len + 1; // kick the transfer. (8lw's)

        	if ((retry> 0) && (i != 0))
            		i -= len;

        	// Write number of bytes to be sent
        	NdisRawWritePortUshort(
     				pCf -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_CMD_WRITE_LEN,
	        		rounded_len);

        	// Use write ushort, Pocket PC has problem with UCHAR write
        	for (j = 0; j < (ULONG)(rounded_len/2); j++)
        	{
            		pUshort = (USHORT *)(pFW+(i+j*2));

            		NdisRawWritePortUshort(
         				pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_CMD_WRITE_PORT,
	            			*pUshort);  
        	}
              DBGPRINT(DBG_FWDL, ("Phase 1 \n"));
			  
        	// Assert the Command Download Over interrupt
        	NdisRawWritePortUchar(
   				    	pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_STATUS,
		    			CFMACREG_HCR_HS_CmdDnLdOvr);
	    	NdisRawWritePortUshort(
   		    			pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_CARD_INT_CAUSE,
        				CFMACREG_HCR_CIC_CmdDnLdOvr);	
              DBGPRINT(DBG_FWDL, ("Phase 2 \n"));

        	firmwareDelay = 0; // reset loop counter
	    	do{
	       	NdisRawReadPortUchar(
		       	 	pCf ->ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
		        		&ucTemp);

			/// >>> check if we can access the Device IO port 

			//DBGPRINT(DBG_FWDL, ("Phase 2-0-1 0x%x \n", ucTemp));	

			//NdisRawReadPortUshort(
		       //	 	pCf ->ulMrvDrvVirtualIoBase + CFMACREG_CCR_PRODUCT_ID,
		       // 		&usTemp);
			
			//DBGPRINT(DBG_FWDL, ("Phase 2-0-2 0x%x \n", usTemp));	
                     /// <<<

			if ( (ucTemp & CFMACREG_CCR_CS_CmdDnLdRdy) )
				break;

                     /// >>>
			//DBGPRINT(DBG_FWDL, ("Phase 2-1 0x%x \n", ucTemp));	
			//
			//NdisRawReadPortUshort(
		       //	 	pCf ->ulMrvDrvVirtualIoBase + CFMACREG_CCR_PRODUCT_ID,
		       // 		&usTemp);
			//
			//DBGPRINT(DBG_FWDL, ("Phase 2-2 0x%x \n", usTemp));	

 

			//NdisRawWritePortUshort(
         		//		pCf->ulMrvDrvVirtualIoBase + CFMACREG_CCR_TX_FRAME_SEQ_NUM,
	            	//		0xabcd);  

			//NdisRawReadPortUshort(
		       //	 	pCf ->ulMrvDrvVirtualIoBase + CFMACREG_CCR_PRODUCT_ID,
		       //		&usTemp);
			
			//DBGPRINT(DBG_FWDL, ("Phase 2-3 0x%x \n", usTemp));	
			
			//if (usTemp == 0xabcd)
			//	break;
			 
			/// <<<		
			
			//NdisMSleep(1);   
			NdisStallExecution(1);
			//NdisMSleep(1000);
            		firmwareDelay++;
					
        	} while (firmwareDelay < FWBLOCK_DELAY);
          
		DBGPRINT(DBG_FWDL | DBG_LOAD,("Ready for next block after less than %d ms\n", firmwareDelay*1));
		
		if ( firmwareDelay >= FWBLOCK_DELAY )
        	{
            		DBGPRINT(DBG_FWDL|DBG_ERROR,("Downloading FW died on offset 0x%x\n", i));
            		return NDIS_STATUS_FAILURE;
        	}
              DBGPRINT(DBG_FWDL, ("Phase 3\n"));
    	}

    	DBGPRINT(DBG_FWDL,("Waiting for FW initialization event\n"));

    	// Wait for FW initialization finished event
    	firmwareDelay = 0; // reset loop counter
    	do {
            	NdisRawReadPortUshort(
	       		pCf ->ulMrvDrvVirtualIoBase + CFMACREG_CCR_SCRATCH_PORT - 1,
              		&usTemp);

            	ucTemp = (UCHAR)(usTemp >> 8 );
        	

        	if ( ucTemp == MRVDRV_FW_STATUS_READY )
            		break;

        	NdisMSleep(1000);   //NdisStallExecution(100);
        	//NdisStallExecution(1);
        	firmwareDelay++;
    	} while ( firmwareDelay < FWDELAY );
	
       DBGPRINT(DBG_FWDL | DBG_LOAD,("CF started in less than %d ms.\n",firmwareDelay*1000));

       if ( firmwareDelay >= FWDELAY )
    	{
       	DBGPRINT(DBG_FWDL | DBG_ERROR,("INIT - CF card failed to start!\n"));

        	return NDIS_STATUS_FAILURE;
    	}

	NdisRawReadPortUshort(
	       		pCf ->ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_INT_MASK,
           			&usTemp);

	NdisRawWritePortUshort(
    				pCf ->ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_INT_MASK, 0 );

	//NdisMSleep(100);   //NdisStallExecution(100);
	    	
    	DBGPRINT(DBG_FWDL|DBG_LOAD,("INIT - Firmware download end\n"));

    	return NDIS_STATUS_SUCCESS;
}

⌨️ 快捷键说明

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