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

📄 spiutil.c

📁 marvell8385 GSPI开发驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
			len &= ~1;
		} else {
			////NKDbgPrintfW(TEXT ("."));
		}

		//dlimage[0] = CMD_RDWRPORT_REG;
		for(j=0;j<(len/2);++j) {
			dlimage[j] = firmware[index++];
			dlimage[j] |= (firmware[index++] << 8);
		}
        ////NKDbgPrintfW(TEXT ("before download, Tick: %d\n"), GetTickCount());
		gspi_write_data_direct(dlimage, CMD_RDWRPORT_REG, len);
		////NKDbgPrintfW(TEXT ("After download, Tick: %d\r\n"), GetTickCount());
		gspi_write_reg(HOST_INT_STATUS_REG, 0x0000);
		gspi_write_reg(CARD_INT_CAUSE_REG, CIC_CmdDnLdOvr);
	}

	////NKDbgPrintfW(TEXT ("Firmware Image of Size %d bytes downloaded, cnt %d\n", firmwarelen, cnt));
	dwTick2 = GetTickCount();
	//NKDbgPrintfW(TEXT ("Downloading performance : Tick1 =%d,Tick2=%d,Diff=%d,Total = %d bits/sec\r\n"), dwTick1,dwTick2,dwTick2-dwTick1,(firmwarelen*1000*8)/(dwTick2-dwTick1));
	//NKDbgPrintfW(TEXT("Firmware Image of Size %d bytes downloaded, cnt %d\r\n!!"),firmwarelen,cnt);

	ret = 0;

	return ret;
}

IF_FW_STATUS spi_IsFirmwareLoaded(
    IN PMRVDRV_ADAPTER pAdapter
)
{
//	int i;
	u32 scr4;

    if((pAdapter->PSMode != Ndis802_11PowerModeCAM) &&
		  (pAdapter->psState  != PS_STATE_FULL_POWER) )
    {
	   // NKDbgPrintfW(TEXT("Card is in PS Mode: Returning code FW_STATUS_UNINITIALIZED\n"));
	    return FW_STATUS_UNINITIALIZED;

    }

    gspi_read_reg32(SCRATCH_4_REG, &scr4);

    if(scr4 == FIRMWARE_DNLD_OK) 
	{
	   // NKDbgPrintfW(TEXT ("Firmware download successful !!!\n"));
	    return FW_STATUS_INITIALIZED;
    }

    return FW_STATUS_UNINITIALIZED;
}


//+dzj for reboot Card func
IF_FW_STATUS spi_IsFirmwareLoaded_reboot(
    IN PMRVDRV_ADAPTER pAdapter
)
{
    u32 scr4;

    gspi_read_reg32(SCRATCH_4_REG, &scr4);

    if(scr4 == FIRMWARE_DNLD_OK) 
	{
	   // NKDbgPrintfW(TEXT ("Firmware download successful !!!\n"));
	    return FW_STATUS_INITIALIZED;
    }

    return FW_STATUS_UNINITIALIZED;
}
///////////////////////////////////////////////////////////////////
//  spi_IsFirmwareLoaded - check if FW has been loaded/initialized
//  Input:  Adapter - Adapter context
//
//  Output:
//  Returns:  return SPI_FW_STATUS
//  Notes:
///////////////////////////////////////////////////////////////////
#if (USE_DEVIRQ == 0)
///extern int		g_fmDnRdy;
#endif ///USE_DEVIRQ
IF_FW_STATUS spi_FirmwareDownload(
    IN PMRVDRV_ADAPTER Adapter
)
{

    UINT    blockCount = 0;
    UINT    sizeOfHelper;
    UINT    sizeSend = 0;
    ULONG   firmwareDelay = 0;
#define FWDELAY 200             // cycles should give us about 10 seconds
#define FWBLOCK_DELAY  5000     // cycles for fw block delay.

#ifdef MRV_CHIP_8385PN
  #define fmimage fmimage_B0
#endif

#ifdef MRV_CHIP_8385H
  #define fmimage fmimage_B0
#endif

#ifdef MRV_CHIP_8686PN   //dralee_1209
  #define fmimage fmimage_B0
#endif
    ULONG                   loopCount;

// Move from Linux
    int             			ixStatus;
    IF_FW_STATUS		retStatus = FW_STATUS_UNINITIALIZED;
    u16				hicr;

    // disable interrupt before firmware download
    sbi_disable_host_int();

//Download helper file
    sizeOfHelper = sizeof(helperimage);
	////NKDbgPrintfW(TEXT("INIT - Helper, Helper size = %d bytes, packet cnt = %d bytes\n",  sizeOfHelper, SPI_FW_DOWNLOAD_PKTCNT ));
	//NKDbgPrintfW(TEXT("INIT - Helper, Helper size = %d bytes, packet cnt = %d bytes\r\n"),sizeOfHelper, SPI_FW_DOWNLOAD_PKTCNT);
//    MessageBox(NULL, TEXT("Download Helper Now"), TEXT("SD25"), MB_OK);
       ixStatus= sbi_prog_firmware_image(helperimage, sizeof(helperimage));
	if (ixStatus < 0) {
		NKDbgPrintfW(TEXT ("Bootloader Helper in invalid state[1]!\n"));
		goto end;
	} else {
		NKDbgPrintfW(TEXT ("Download Helper Img success!\n"));
	}
	NdisMSleep(FMDN_DELAY);

    // Download Firmware
    ixStatus = sbi_download_wlan_fw_image(fmimage,sizeof(fmimage));
    if (ixStatus < 0) {
		NKDbgPrintfW(TEXT ("Bootloader Helper in invalid state[2]!\n"));
		goto end;
    } else {
		NKDbgPrintfW(TEXT ("Download Firmware Image success!\n"));
	}
	NdisMSleep(FMDN_DELAY*10);


    // Check Firmware
    loopCount = PKT_WAIT_TIME;

    while ( loopCount != 0 )
    {
        if ( spi_IsFirmwareLoaded(Adapter) != FW_STATUS_INITIALIZED )
        {
            // FW not ready
            loopCount--;
            NdisStallExecution(10); // stall for 10 us
        }
        else
        {
            // FW ready!
            //NKDbgPrintfW(TEXT("FW started SUCCESSFULLY\n"));
	     retStatus = FW_STATUS_INITIALIZED;
            break;
        }
    }

end:
    sbi_enable_host_int();
	#if (USE_DEVIRQ == 0)
	///g_fmDnRdy = TRUE;
	#endif ///USE_DEVIRQ
    gspi_read_reg16(HOST_INT_STATUS_REG, &hicr);
    gspi_write_reg(HOST_INT_STATUS_REG, ~hicr);
    gspi_read_reg16(HOST_INT_STATUS_REG, &hicr);
    gspi_read_reg16(HOST_INT_CAUSE_REG, &hicr);
	if (retStatus == FW_STATUS_INITIALIZED) {
		NKDbgPrintfW(TEXT("==> FW started SUCCESSFULLY\n"));
	} else {
		NKDbgPrintfW(TEXT("==> FW downlod failed\n"));
	}

#if OMAP730_SPI
if(bInterruptInitialize == FALSE)	
	 Omap_interrupt_initialize(pOmaSpiHwInfo);
#endif 
	
    return retStatus;
}


//+dzj change for reboot card
IF_FW_STATUS spi_FirmwareDownload_reboot(
    IN PMRVDRV_ADAPTER Adapter
)
{

    UINT    blockCount = 0;
    UINT    sizeOfHelper;
    UINT    sizeSend = 0;
    ULONG   firmwareDelay = 0;
#define FWDELAY 200             // cycles should give us about 10 seconds
#define FWBLOCK_DELAY  5000     // cycles for fw block delay.

#ifdef MRV_CHIP_8385PN
    #define fmimage fmimage_B0
#endif

#ifdef MRV_CHIP_8385H
    #define fmimage fmimage_B0
#endif

#ifdef MRV_CHIP_8686PN   //dralee_1209
    #define fmimage fmimage_B0
#endif
    ULONG                   loopCount;

// Move from Linux
    int             			ixStatus;
    IF_FW_STATUS		retStatus = FW_STATUS_UNINITIALIZED;
    u16				hicr;

    // disable interrupt before firmware download
    sbi_disable_host_int();

//Download helper file
    sizeOfHelper = sizeof(helperimage);

    ixStatus= sbi_prog_firmware_image(helperimage, sizeof(helperimage));
    if (ixStatus < 0) {
    NKDbgPrintfW(TEXT ("Bootloader Helper in invalid state[1]!\n"));
    goto end;
    } else {
    NKDbgPrintfW(TEXT ("Download Helper Img success!\n"));
    }
    NdisMSleep(FMDN_DELAY);

    // Download Firmware
    ixStatus = sbi_download_wlan_fw_image(fmimage,sizeof(fmimage));
    if (ixStatus < 0) {
    NKDbgPrintfW(TEXT ("Bootloader Helper in invalid state[2]!\n"));
    goto end;
    } else {
    NKDbgPrintfW(TEXT ("Download Firmware Image success!\n"));
    }
    NdisMSleep(FMDN_DELAY*10);


    // Check Firmware
    loopCount = PKT_WAIT_TIME;

    while ( loopCount != 0 )
    {
        if ( spi_IsFirmwareLoaded(Adapter) != FW_STATUS_INITIALIZED )
        {
            // FW not ready
            loopCount--;
            NdisStallExecution(10); // stall for 10 us
        }
        else
        {
            // FW ready!
            //NKDbgPrintfW(TEXT("FW started SUCCESSFULLY\n"));
         retStatus = FW_STATUS_INITIALIZED;
            break;
        }
    }

end:
    sbi_enable_host_int();

    gspi_read_reg16(HOST_INT_STATUS_REG, &hicr);
    gspi_write_reg(HOST_INT_STATUS_REG, ~hicr);
    gspi_read_reg16(HOST_INT_STATUS_REG, &hicr);
    gspi_read_reg16(HOST_INT_CAUSE_REG, &hicr);
    if (retStatus == FW_STATUS_INITIALIZED) {
    	NKDbgPrintfW(TEXT("==> FW started SUCCESSFULLY\n"));
    } else {
    	NKDbgPrintfW(TEXT("==> FW downlod failed\n"));
    }
	
    return retStatus;
}
///////////////////////////////////////////////////////////////////
//  SPIDownloadPkt - download a SPI paket to FW
//  Input:  Adapter - Adapter context
//          DownloadPkt - Pkt to be downloaded
//  Output:
//  Returns:  SPI_API_STATUS code
//  Notes:
///////////////////////////////////////////////////////////////////
SD_API_STATUS SPIDownloadPkt(
    IN PMRVDRV_ADAPTER   Adapter,
    IN PSDIO_TX_PKT      pDownloadPkt
)
{

    SD_API_STATUS           status;          // intermediate status
    u16				     writeReg;
    u8				     intType;
    u16				     nb;

    //NKDbgPrintfW(TEXT("d"));

   // NdisAcquireSpinLock(&SpiLock);

    intType = pDownloadPkt->Type ? CIC_CmdDnLdOvr : CIC_TxDnLdOvr;
    writeReg = (pDownloadPkt->Type) ? CMD_RDWRPORT_REG : DATA_RDWRPORT_REG;

    nb = pDownloadPkt->Len;
    //if(nb & 0x0001)
	//nb += 1;

    /* If the bytes written is not a multiple of four then make it
    a multiple of four as the RWPORT is 4 byte aligned from
    the host */
/*
    if(!(nb % 4))
	gspi_write_data_direct((u8 *)(pDownloadPkt->Buf.CmdBuf), writeReg, (nb/2)+1);
    else
	gspi_write_data_direct((u8 *)(pDownloadPkt->Buf.CmdBuf), writeReg, (nb/2)+2);
*/
    ////NKDbgPrintfW(TEXT("%s\n"),TEXT("SPIDownloadPkt"));
    //if (pDownloadPkt->Buf.TxDataBuf.Wcb.PktLen < 100) {
/*
    if (pDownloadPkt->Type == SPI_DATA_PKT) {
        //tt //NKDbgPrintfW(TEXT("DndPkt len = %d\n"),pDownloadPkt->Buf.TxDataBuf.Wcb.PktLen);
	nb += 2; //tt
        ////NKDbgPrintfW(TEXT("WcbPktLen = %d, nb=%d\n"),pDownloadPkt->Buf.TxDataBuf.Wcb.PktLen, nb); //tt
        //HexDump (0xffff,"DndPkt:",pDownloadPkt->Buf.TxDataBuf.Pkt,pDownloadPkt->Buf.TxDataBuf.Wcb.PktLen);
    }
*/
    //gspi_write_data_direct((u8 *)(pDownloadPkt), writeReg, nb);
    gspi_write_data_direct((u16 *)(pDownloadPkt->Buf.CmdBuf), writeReg, nb);	
    gspi_write_reg(CARD_INT_CAUSE_REG, intType);

    // record the first 32 bytes in case if the buffer needs to be resent
    //NdisMoveMemory(Adapter->LastFWBuffer, pDownloadPkt, 32);
    status = 0;

   // NdisReleaseSpinLock(&SpiLock);

    return status;
}


int sbi_card_to_host(u32 type, u8 *payload)
{
	int 	ret=0;
	u16	len;
	u16	intType=0, readReg;

	// NdisAcquireSpinLock(&SpiLock);

	intType = type ? CIC_CmdUpLdOvr : CIC_RxUpLdOvr;
	readReg = type ? CMD_RDWRPORT_REG : DATA_RDWRPORT_REG;

	gspi_read_reg16((type) ? SCRATCH_2_REG : SCRATCH_1_REG, &len);

       if ( intType == MVMS_DAT ) {
	          //lykao, 052405, begin
	         if ( len > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE )
	         {
	            len=MRVDRV_ETH_RX_PACKET_BUFFER_SIZE;
	         }

	         if ( len < sizeof(RxPD)+14 )
	         {
	           len = sizeof(RxPD)+14;
	         }
      }

	if(len & 0x0001)
		len += 1;


    ////NKDbgPrintfW(TEXT("sbi_card_to_host len = %x \n"),len);
/*
	if(!(len % 4))
		gspi_read_data_direct(payload, readReg, (len/2)+1);
	else
		gspi_read_data_direct(payload, readReg, (len/2)+2);
*/
    gspi_read_data_direct(payload, readReg, (len));
	gspi_write_reg(CARD_INT_CAUSE_REG, intType);

	// NdisReleaseSpinLock(&SpiLock);

	return (len);
}


/******************************************************************************
 *
 * Name: EnableInterrupt()
 *
 *
 * Description:
 *    This routine enables interrupts
 *
 *  Arguments:
 *
 *  Return Value:
 *
 *  Notes:
 *
 *****************************************************************************/

VOID
EnableInterrupt(PMRVDRV_ADAPTER Adapter)
{


#if 0 //chenglong
    UCHAR   ucInterrupt;
/*
#ifdef PWARE_SDIO_INTR_MODIFICATIONS

	// There seems to be some problem with the doc in interrupt
	// mask register description. Mask 0 should unmask (enable)
	// the interrupt & mask 1 should mask (disable) the interrupt

	// The old code used 1 to enable and 0 to disable the mask;
	// thus, it might not be working. May be, for that reason
	// this fn was made a dummy (just returning without doining
	// anything)

    ucInterrupt = 0;

#else // old code follows

    return;

    // write 1 to enable interrupt
    ucInterrupt = 1;

#endif // PWARE_SDIO_INTR_MODIFICATIONS
 */
    // unmask interrupt
	u16 hicr;
	gspi_write_reg(HOST_INT_STATUS_MASK_REG, 0x1f);

	gspi_read_reg16(HOST_INT_CTRL_REG, &hicr);
	gspi_write_reg(HOST_INT_CTRL_REG, hicr & ~(0x01e0));

#endif

    sbi_enable_host_int();

}


/******************************************************************************
 *
 * Name: DisableInterrupt()
 *
 *
 * Description:
 *    This routine disables interrupts
 *
 *  Arguments:
 *      DriverObject - Pointer to driver object created by the system.
 *
 *  Return Value:
 *
 *  Notes:
 *
 *****************************************************************************/

VOID
DisableInterrupt(
     IN PMRVDRV_ADAPTER Adapter
)
{

#if 0 //chenglong
    UCHAR   ucInterrupt;

/*#ifdef PWARE_SDIO_INTR_MODIFICATIONS

	// There seems to be some problem with the doc in interrupt
	// mask register description. Mask 0 should unmask (enable)
	// the interrupt & mask 1 should mask (disable) the interrupt

	// The old code used 1 to enable and 0 to disable the mask;
	// thus, it might not be working. May be, for that reason
	// this fn was made a dummy (just returning without doining
	// anything)

    ucInterrupt = 1;

#else // old code follows

    return;

    // write 0 to disable interrupt
    ucInterrupt = 0;

#endif // PWARE_SDIO_INTR_MODIFICATIONS*/
      gspi_write_reg(HOST_INT_STATUS_MASK_REG, 0x00);

#endif
    sbi_disable_host_int();
      return;

}


IF_API_STATUS spi_GetLengthOfDataBlock( PMRVDRV_ADAPTER Adapter, USHORT *pLength )
{
	gspi_read_reg16(SCRATCH_1_REG, pLength);
	return IF_SUCCESS;
}


IF_API_STATUS sbi_exit_deep_sleep(void)
{
	/* set Wakeup bit */
	return gspi_write_reg(HOST_INT_CTRL_REG, HIC_DEFAULT_VALUE | HIC_WakeUp);
}

//+dzj
IF_API_STATUS sbi_exit_deep_sleep_clean(void)
{
	/* clean Wakeup bit */
	return gspi_write_reg(HOST_INT_CTRL_REG, HIC_DEFAULT_VALUE);
}
#if PXA270_SPI
int gspi_read_intstatue()
{
	return ssp_read_intstate(ssphc);
}
#endif ///PXA270_SPI

#endif // IF_SPI

⌨️ 快捷键说明

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