📄 spiutil.c
字号:
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 + -