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

📄 omap730_gspx.c

📁 marvell8385 GSPI开发驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************* 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 + -