?? omap730_gspx.c
字號:
/******************* Paragon Wireless *****************
*
* Purpose: Omap730 SPI interface function module
*
* Author:
*
* Date: 2006/03/27 $
*
* Revision: #1.0 $
*
*******************************************************/
#include "omap730_gspx.h"
#include <ndis.h>
static GSPI_HW_INFO HwInfo;
static PGSPI_HW_INFO pHwInfo= &HwInfo;
static const GUID DEVICE_IFC_GPIO_GUID;
USHORT dummy_clk_reg = 0x05;
USHORT dummy_clk_data = 0x0e;
static NDIS_SPIN_LOCK SpiLock;
#ifdef DEBUG
DBGPARAM dpCurSettings =
{
TEXT("SychipGspx"),
{
TEXT("Init"), TEXT("Interrupt"), TEXT("Transmit"),
TEXT("Receive"), TEXT("Command"), TEXT("Function"),
TEXT("Misc"), TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined"), TEXT("Warning"),
TEXT("Error")
},
DBG_DEFAULT_DX
};
FILE *LogFile = NULL;
#endif // DEBUG
/*-----------------------------------------------------------
*
* Name: OmapSpiOpen()
*
* Description: Open Omap730 SPI
*
* Arguments: PVOID pHC
*
* Return Value: BOOL
*
*
* Notes:
--------------------------------------------------------------*/
BOOL OmapSpiOpen( PVOID pHC )
{
OMAP730_SPI_REGS *pSPIRegs = (OMAP730_SPI_REGS*) pHC;
GPIOClrBit( pHwInfo->hGPIO, GPIO_SPI_CS ); // enable spi_cs
OUTREG16(&pSPIRegs->CTRL, 0);// Stop SPI
OUTREG16(&pSPIRegs->SET1, 0);// Switch clock off
// PVT divider 1, no interrupts
OUTREG16(&pSPIRegs->SET1, SPI_SET1_MSK0|SPI_SET1_MSK1|SPI_SET1_PVT1);
SETREG16(&pSPIRegs->SET1, SPI_SET1_EN_CLK);// Switch clock on
OUTREG16(&pSPIRegs->SET2, 0x0);// Active clock is rising
return TRUE;
}
/*-----------------------------------------------------------
*
* Name: OmapSpiClose()
*
* Description:Close Omap730 SPI
*
* Arguments: PVOID pHC
*
* Return Value: BOOL
*
*
* Notes:
--------------------------------------------------------------*/
BOOL OmapSpiClose( PVOID pHC )
{
OMAP730_SPI_REGS *pSPIRegs = (OMAP730_SPI_REGS*) pHC;
OUTREG16(&pSPIRegs->CTRL, 0);// Stop SPI
GPIOSetBit( pHwInfo->hGPIO, GPIO_SPI_CS );// disable spi_cs
return TRUE;
}
/*-----------------------------------------------------------
*
* Name: OmapSpiWrite16()
*
* Description: Omap730 SPI Write
*
* Arguments: PVOID pHC,UINT16 data
*
* Return Value: BOOL
*
*
* Notes:
--------------------------------------------------------------*/
BOOL OmapSpiWrite16( PVOID pHC,UINT16 data )
{
OMAP730_SPI_REGS *pSPIRegs = (OMAP730_SPI_REGS*) pHC;
OUTREG16(&pSPIRegs->CTRL, 0);
OUTREG16(&pSPIRegs->TX_MSB, data);
OUTREG16(&pSPIRegs->CTRL, SPI_CTRL_AD0|SPI_CTRL_NB16|SPI_CTRL_WR);
while((INREG16(&pSPIRegs->STATUS) & SPI_STATUS_WE) == 0)
;
//RETAILMSG(1, (TEXT("*** OmapSpiWrite16:[%x] ***\r\n"),data));
return TRUE;
}
/*-----------------------------------------------------------
*
* Name: OmapSpiRead16()
*
* Description: Omap730 SPI Write
*
* Arguments: PVOID pHC
*
* Return Value: UINT16
*
*
* Notes:
--------------------------------------------------------------*/
UINT16 OmapSpiRead16( PVOID pHC )
{
OMAP730_SPI_REGS *pSPIRegs = (OMAP730_SPI_REGS*) pHC;
USHORT rdata;
OUTREG16(&pSPIRegs->CTRL, 0);
OUTREG16(&pSPIRegs->TX_MSB, 0x0); // dummy data
OUTREG16(&pSPIRegs->CTRL, SPI_CTRL_AD0|SPI_CTRL_NB16|SPI_CTRL_RD);
while ((INREG16(&pSPIRegs->STATUS) & SPI_STATUS_RE) == 0)
;
rdata = INREG16(&pSPIRegs->RX_LSB);
//RETAILMSG(1, (TEXT("*** SPIRead16:[%x] ***\r\n"),rdata));
return rdata;
}
/*-----------------------------------------------------------
*
* Name: Omap_gspx_init()
*
* Description: Omap730 SPI initialize
*
* Arguments: void
*
* Return Value: PVOID
*
*
* Notes:
--------------------------------------------------------------*/
PVOID Omap_gspx_init(void)
{
DWORD SysIRQ;
PHYSICAL_ADDRESS ConfigAddress = {OMAP730_CONFIG_REGS_PA};
PHYSICAL_ADDRESS PortAddress = {OMAP730_SPI_1_REGS_PA};
DEBUGMSG(ZONE_FUNC, (TEXT("+Omap_gspx_init()\n")));
NdisAllocateSpinLock(&SpiLock);
// memory map
pHwInfo->pSPIRegs = (OMAP730_SPI_REGS*)MmMapIoSpace(PortAddress, sizeof(OMAP730_SPI_REGS), FALSE );
if (!pHwInfo->pSPIRegs)
{
//DEBUGMSG(ZONE_FUNC, (_T("Omap_gspx_init:: Error allocating SPI-100K-1 register\r\n")));
goto cleanUp;
}
pHwInfo->hGPIO = GPIOOpen();// open GPIO
if(pHwInfo->hGPIO == NULL)
{
// DEBUGMSG(ZONE_FUNC, (_T("Omap_gspx_init:: Error opening the GPIO driver!\r\n")));
goto cleanUp;
}
// config SPI_CS as GPIO,output,high.
pHwInfo->pConfigRegs = (OMAP730_CONFIG_REGS*)MmMapIoSpace( ConfigAddress, sizeof(OMAP730_CONFIG_REGS), FALSE );
if(!pHwInfo->pConfigRegs)
{
//DEBUGMSG(ZONE_FUNC, (_T("Omap_gspx_init:: Error allocating OMAP config register\r\n")));
goto cleanUp;
}
pHwInfo->pConfigRegs->IO_CONFIG8 = (pHwInfo->pConfigRegs->IO_CONFIG8 & (~0xe0000000) ) | 0xc0000000;
GPIOSetMode(pHwInfo->hGPIO, GPIO_SPI_CS, GPIO_DIR_OUTPUT);
GPIOSetBit(pHwInfo->hGPIO, GPIO_SPI_CS );
// hi current charge enable
// hi-z disable USB charge
// low 100mA
// high 500mA
GPIOSetMode(pHwInfo->hGPIO, 35, GPIO_DIR_OUTPUT);
GPIOSetBit(pHwInfo->hGPIO, 35);
// config SPI_INT,input,IRQ low
GPIOSetMode(pHwInfo->hGPIO, GPIO_SPI_INT, GPIO_DIR_INPUT | GPIO_INT_HIGH_LOW);
SysIRQ = GPIOGetIrq(pHwInfo->hGPIO, GPIO_SPI_INT);
if(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &SysIRQ, sizeof(DWORD), &(pHwInfo->SysIntr), sizeof(DWORD), NULL))
{
// invalid CardDetect SYSINTR value!
// DEBUGMSG(ZONE_FUNC, (TEXT("Error obtaining SPI SYSINTR value!\n")));
pHwInfo->SysIntr = SYSINTR_UNDEFINED;
goto cleanUp;
}
// power on wlan
GPIOSetBit(pHwInfo->hGPIO, BSP_GPIO_WlanPower);
GPIOSetBit(pHwInfo->hGPIO, BSP_GPIO_WlanPowerDown);
// reset wlan spi
GPIOClrBit(pHwInfo->hGPIO, BSP_GPIO_WlanReset);
Sleep(5);
GPIOSetBit(pHwInfo->hGPIO, BSP_GPIO_WlanReset);
Sleep(5);
//pHwInfo->bDriverShutdown = FALSE;
return pHwInfo;
cleanUp:
return NULL;
}
//+dzj
/*****************************************
*
* ReTurnOn/Off the WlanCard power
*
******************************************/
void powerDownWlanCard()
{
PGSPI_HW_INFO pHwInfo= &HwInfo;
//disable the interrupt thread for Wlan driver
pHwInfo->IntsInfo.bDriverShutdown = TRUE;
//shutdown the wlan
// GPIOClrBit( pHwInfo->hGPIO, BSP_GPIO_WlanPower );
// reset wlan
GPIOClrBit(pHwInfo->hGPIO, BSP_GPIO_WlanReset);
Sleep(5);
GPIOSetBit(pHwInfo->hGPIO, BSP_GPIO_WlanReset);
Sleep(20);
GPIOClrBit( pHwInfo->hGPIO, BSP_GPIO_WlanPowerDown );
return;
}
void powerOnWlanCard()
{
PGSPI_HW_INFO pHwInfo= &HwInfo;
//turn on wlan power
// GPIOSetBit(pHwInfo->hGPIO, BSP_GPIO_WlanPower);
GPIOSetBit(pHwInfo->hGPIO, BSP_GPIO_WlanPowerDown);
// reset wlan
GPIOClrBit(pHwInfo->hGPIO, BSP_GPIO_WlanReset);
Sleep(5);
GPIOSetBit(pHwInfo->hGPIO, BSP_GPIO_WlanReset);
Sleep(20);
//enable the interrupt thread
pHwInfo->IntsInfo.bDriverShutdown = FALSE;
return;
}
void ResetWlanCard()
{
powerDownWlanCard();
Sleep(100);
powerOnWlanCard();
return;
}
/*-----------------------------------------------------------
*
* Name: Omap_gspx_deinit()
*
* Description: Omap730 SPI deinitialize
*
* Arguments: PVOID pHC
*
* Return Value: void
*
*
* Notes:
--------------------------------------------------------------*/
void Omap_gspx_deinit(PVOID pHC)
{
GSPI_HW_INFO *pDevice = (GSPI_HW_INFO*) pHC;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -