📄 pxa-gspi.c
字号:
/// Input:
/// pHC - Hard context
/// Output:
/// None
/// Return:
/// None
void ssp_init_hw(PSSP_HARDWARE_CONTEXT pHC)
{
/*
PHYSICAL_ADDRESS Bulverde_GPIO_Base = {BULVERDE_BASE_REG_PA_GPIO};
PHYSICAL_ADDRESS Bulverde_SSP_Base = {SSPREG_PHY_BASE};
PHYSICAL_ADDRESS Bulverde_CLKMGR_Base = {BULVERDE_BASE_REG_PA_CLKMGR};
PHYSICAL_ADDRESS Bulverde_DMA_Base = {BULVERDE_BASE_REG_PA_DMAC};
PHYSICAL_ADDRESS Bulverde_PA_OTS_Base = {BULVERDE_BASE_REG_PA_OST};
PHYSICAL_ADDRESS Bulverde_ICR_Base = {BULVERDE_BASE_REG_PA_INTC};
*/
PHYSICAL_ADDRESS PhysicalAddress;
//unsigned long pa;
RETAILMSG(1, (TEXT("ssp_init_hw() 070703 new_dev_second\r\n")));
PhysicalAddress.HighPart = 0;
//PhysicalAddress.LowPart = 0x2002C000;//GPIO5_BASE;
PhysicalAddress.LowPart = GpioBaseAddr[WIFI_CS_num]; //wifi CS;
pHC->pGPIORegs_CS= (PGPIO_REGS)MmMapIoSpace(PhysicalAddress, sizeof(GPIO_REGS), FALSE);
if (!pHC->pGPIORegs_CS) {
RETAILMSG(1, (TEXT("Error in allocating CS GPIO register\n")));
goto funcFinal;
}
if(WIFI_INT_num == WIFI_CS_num)
{
pHC->pGPIORegs_INT = pHC->pGPIORegs_CS;
}
else
{
PhysicalAddress.HighPart = 0;
PhysicalAddress.LowPart = GpioBaseAddr[WIFI_INT_num]; //wifi INT;
pHC->pGPIORegs_INT= (PGPIO_REGS)MmMapIoSpace(PhysicalAddress, sizeof(GPIO_REGS), FALSE);
if (!pHC->pGPIORegs_INT)
{
RETAILMSG(1, (TEXT("Error in allocating INT GPIO register\n")));
goto funcFinal;
}
}
PhysicalAddress.HighPart = 0;
PhysicalAddress.LowPart = 0x20034000;//SSP_BASE;
pHC->pSSPRegs = (PSSP_REGS)MmMapIoSpace(PhysicalAddress, sizeof(SSP_REGS), FALSE);
if (!pHC->pSSPRegs) {
RETAILMSG(1, (TEXT("Error in allocating SSP register\n")));
goto funcFinal;
}
RETAILMSG(1, (TEXT("ssp_init_hw::pHC->pGPIORegs_INT = 0x%x, pHC->pGPIORegs_CS = 0x%x\r\n"), pHC->pGPIORegs_INT, pHC->pGPIORegs_CS));
NdisMSleep(10);
// Configure the CS signal high to disable wifi
pHC->pGPIORegs_CS->GPIODir |= (1<<WIFI_CS_pin);
pHC->pGPIORegs_CS->Padding1[254] |= (1<<WIFI_CS_pin);
// Configure the SSP
//pHC->pSSPRegs->SSPCR0 = 0x0F07; // SCR[7:0] = f, moto mode, SPI 0,0 , 8-bits/ts
pHC->pSSPRegs->SSPCR0 = 0x000F; // SCR[7:0] = f, moto mode, SPI 0,0 , 16-bits/ts
//pHC->pSSPRegs->SSPCR0 = 0x020F; // SCR[7:0] = f, moto mode, SPI 0,0 , 16-bits/ts
pHC->pSSPRegs->SSPIMSC = 0x0000; // interrupt is mask
//pHC->pSSPRegs->SSPCPSR = 0x0004; //0x0002; // pre-scale : CPSDVSR=20
pHC->pSSPRegs->SSPCPSR = 0x0002; //0x0002; // pre-scale : CPSDVSR=20
pHC->pSSPRegs->SSPDMACR = 0x0000; // disable Tx&Rx DMA
//pHC->pSSPRegs->SSPCR1 = 0x0000; // disable SSP
pHC->pSSPRegs->SSPCR1 = 0x0002; // enable SSP
/*
//pHC->iodata = (PBYTE) HalAllocateCommonBuffer(&Adapter, PXA_SSP_IODATA_SIZE, &PA, FALSE);
pHC->iodata = (PBYTE)AllocPhysMem(PXA_SSP_IODATA_SIZE, PAGE_READWRITE, 0, 0, &pa);
if (pHC->iodata)
{
pHC->phys_addr = (PBYTE)pa;
}
*/
intr_init(pHC);
RETAILMSG(1, (TEXT("intr_init() End !\r\n")));
dma_init(pHC);
funcFinal:
return;
}
DWORD pxa_gspi_register_isr(DWORD ssphc, void* Adapter, ISRFUNC isrFunc)
{
PSSP_HARDWARE_CONTEXT pHC = (PSSP_HARDWARE_CONTEXT)ssphc;
DWORD result = -1;
if ((pHC == NULL) || (Adapter == NULL) || (isrFunc == NULL)) {
goto funcFinal;
}
pHC->isrContext = (HANDLE) Adapter;
pHC->isrFunc = isrFunc;
result = 0;
funcFinal:
return result;
}
///////////////////////////////////////////////////////////////////////////////
/// SSP_Init - the init entry point
/// Input:
/// dwContext - the context for this init
/// Output:
/// Return: instance context
/// - Returns a DWORD which will be passed to Open & Deinit or NULL if
/// unable to initialize the device
///////////////////////////////////////////////////////////////////////////////
DWORD pxa_gspi_Init(void)
{
PSSP_HARDWARE_CONTEXT pHC = NULL;
int i=0;
// HKEY hKeyDevice;
// LPCTSTR pszActiveKey;
//yz_add
HANDLE wifi_share_event;
wifi_share_event = CreateEvent(NULL, FALSE, FALSE, _T("wifi"));
if(wifi_share_event == NULL)
{
RETAILMSG(1, (TEXT("wifi_share_event Create Error\r\n")));
return 0;
}
ENTERFUNC();
#if (USE_DMA == 1)
GSPIMSG(1, (TEXT("GSPI - Using DMA mode\n")));
#else
GSPIMSG(1, (TEXT("GSPI - Using CPU mode 1.0\r\n")));
#endif ///USE_DMA
pHC = LocalAlloc(LPTR, sizeof(SSP_HARDWARE_CONTEXT));
if (pHC == NULL) {
GSPIMSG(ERRMSG, (TEXT("Allocate SSP_HARDWARE_CONTEXT FAILED")));
goto funcFinal;
}
///Initialize the member of SSP_HARDWARE_CONTEXT
InitializeCriticalSection(&(pHC->SSPCrit));
///Load the setting
///pszActiveKey = (LPCTSTR)dwContext;
///hKeyDevice = OpenDeviceKey(pszActiveKey);
///LoadRegistrySettings(hKeyDevice, pHC);
///RegCloseKey(hKeyDevice);
//yz_add for low power-consume
//WaitForSingleObject(wifi_share_event, INFINITE);
GSPIMSG(1, (TEXT("WIFI Event come!\r\n")));
ssp_init_hw(pHC);
GSPIMSG(1, (TEXT("ssp_init_hw() End\r\n")));
if(!(pHC->waitqueue = CreateEvent( NULL, FALSE, FALSE,NULL))) {
GSPIMSG(ERRMSG, (TEXT("Init CreateEvent FAILED")));
goto funcFinal;
}
///crlo:verion-check ++
///GSPI8385: (0004, 0013)
///GSPI8686: (000b, 0010)
{
WORD regval;
#if defined (GSPI8385)
const WORD chipid = 0x0004;
#elif defined (GSPI8686)
const WORD chipid = 0x000b;
#else
const WORD chipid = 0x000;
#endif ///GSPI$(CHIPID)
///ssp_read_register((DWORD)pHC, ®val, 0x00);
///GSPIMSG(1, (TEXT("Reg(0x00)= 0x%04x\r\n"), regval));
//yz_add for test
ssp_read_register((DWORD)pHC, ®val, 0x00);
GSPIMSG(1, (TEXT("Reg(0x00)= 0x%04x\r\n"), regval));
//while(1)
//yz_end
ssp_read_register((DWORD)pHC, ®val, 0x02);
GSPIMSG(1, (TEXT("Reg(0x02)= 0x%04x\r\n"), regval));
///================================================
if (chipid != regval){
GSPIMSG(1, (TEXT("Chip(exp, val)= (%04xh), %04xh)\n"), chipid, regval));
pxa_gspi_Deinit((DWORD)pHC);
pHC = NULL;
goto funcFinal;
}
}
///crlo:verion-check --
pHC->DriverShutdown = FALSE;
///Testing....
/*{
set_GPIO_signal(pHC->pGPIORegs, SSP_SFRM,SIG_DOWN);
udelay(pHC->pOSTRegs, 10);
set_GPIO_signal(pHC->pGPIORegs, SSP_SFRM,SIG_UP);
}*/
#if 0
for(i = 0; i<1; i++)
{
WORD regval;
///Initialization => Setting
/// DelayMode = 1, by unit of CLK
/// SBM = 0x02, 16bit address, 16bit data
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x0;
ssp_read_register((DWORD)pHC, ®val, 0x70);
GSPIMSG(1, (TEXT("Reg(0x70)= 0x%02x\r\n"), regval));
}
#endif
#if 0
{
WORD regval;
///Initialization => Setting
/// DelayMode = 1, by unit of CLK
/// SBM = 0x02, 16bit address, 16bit data
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x0;
ssp_read_register((DWORD)pHC, ®val, 0x70);
GSPIMSG(1, (TEXT("Reg(0x70)= 0x%02x\r\n"), regval));
}
{
int i;
unsigned char aa[512];
for (i=0 ; i<512 ; i++) {
aa[i] = i;
}
ssp_write_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2);
memset(aa, 0, 512);
ssp_read_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2, MVL_DEF_DRP);
for (i=0 ; i<512/16 ; i++) {
GSPIMSG(1, (TEXT("%02x %02x %02x %02x %02x %02x %02x %02x - %02x %02x %02x %02x %02x %02x %02x %02x \n"),
aa[i*16+0], aa[i*16+1], aa[i*16+2], aa[i*16+3],
aa[i*16+4], aa[i*16+5], aa[i*16+6], aa[i*16+7],
aa[i*16+8], aa[i*16+9], aa[i*16+10], aa[i*16+11],
aa[i*16+12], aa[i*16+13], aa[i*16+14], aa[i*16+15]));
}
for (i=0 ; i<64 ; i++) {
aa[i] = i;
}
ssp_write_data_direct((DWORD)pHC, (WORD*)aa, 0x18, 64/2);
memset(aa, 0, 512);
ssp_read_data_direct((DWORD)pHC, (WORD*)aa, 0x18, 64/2, MVL_DEF_DRP);
for (i=0 ; i<64/16 ; i++) {
GSPIMSG(1, (TEXT("%02x %02x %02x %02x %02x %02x %02x %02x - %02x %02x %02x %02x %02x %02x %02x %02x \n"),
aa[i*16+0], aa[i*16+1], aa[i*16+2], aa[i*16+3],
aa[i*16+4], aa[i*16+5], aa[i*16+6], aa[i*16+7],
aa[i*16+8], aa[i*16+9], aa[i*16+10], aa[i*16+11],
aa[i*16+12], aa[i*16+13], aa[i*16+14], aa[i*16+15]));
}
}
{
WORD regval;
/* regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
regval = 0x06;
ssp_write_register((DWORD)pHC, 0x70, ®val);
*/
///Set the dummy CLK = 0 or 0x10 ==> not work
///regval = 0x00100010;
///ssp_write_register((DWORD)pHC, 0x6c, ®val);
///Reading register 0x00, expect 0x0013
ssp_read_register((DWORD)pHC, 0x00, ®val);
GSPIMSG(1, (TEXT("Reg(0)=%04xh, exp: 0x0013\n"), regval));
///Reading register 0x02, expect 0x0004
ssp_read_register((DWORD)pHC, 0x02, ®val);
GSPIMSG(1, (TEXT("Reg(2)=%04xh, exp: 0x0004\n"), regval));
regval = 0xabcd;
ssp_write_register((DWORD)pHC, 0x38, ®val);
ssp_read_register((DWORD)pHC, 0x38, ®val);
GSPIMSG(1, (TEXT("Reg(38)=%xh\n"), regval));
/*
ssp_read_register((DWORD)pHC, 0x10, ®val);
GSPIMSG(1, (TEXT("Reg(0x10)=%04xh\n"), regval));
ssp_read_register((DWORD)pHC, 0x14, ®val);
GSPIMSG(1, (TEXT("Reg(0x14)=%04xh\n"), regval));
ssp_read_register((DWORD)pHC, 0x1c, ®val);
GSPIMSG(1, (TEXT("Reg(0x1c)=%04xh\n"), regval));
ssp_read_register((DWORD)pHC, 0x20, ®val);
GSPIMSG(1, (TEXT("Reg(0x20)=%04xh\n"), regval));
*/
{
int i;
char aa[512];
for (i=0 ; i<512 ; i++) {
aa[i] = i;
}
/* for (i=0 ; i<512/2 ; i++) {
ssp_write_register((DWORD)pHC, 0x24, (WORD*)(&aa[i*2]));
}*/
ssp_write_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2);
memset(aa, 0, 512);
/* for (i=0 ; i<512/2 ; i++) {
ssp_read_register((DWORD)pHC, 0x24, (WORD*)(&aa[i*2]));
}*/
ssp_read_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2, MVL_DEF_DRP);
{
for (i=0 ; i<512 ; i++) {
aa[i] = 511-i;
}
ssp_write_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2);
memset(aa, 0, 512);
ssp_read_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2, MVL_DEF_DRP);
for (i=0 ; i<512 ; i++) {
aa[i] = i;
}
ssp_write_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2);
memset(aa, 0, 512);
ssp_read_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2, MVL_DEF_DRP);
for (i=0 ; i<512 ; i++) {
aa[i] = 511-i;
}
ssp_write_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2);
memset(aa, 0, 512);
ssp_read_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2, MVL_DEF_DRP);
for (i=0 ; i<512 ; i++) {
aa[i] = i;
}
ssp_write_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2);
memset(aa, 0, 512);
ssp_read_data_direct((DWORD)pHC, (WORD*)aa, 0x24, 512/2, MVL_DEF_DRP);
}
for (i=0 ; i<64 ; i++) {
aa[i] = i;
}
/* for (i=0 ; i<64/2 ; i++) {
ssp_write_register((DWORD)pHC, 0x18, (WORD*)(&aa[i*2]));
}*/
ssp_write_data_direct((DWORD)pHC, (WORD*)aa, 0x18, 64/2);
memset(aa, 0, 512);
/* for (i=0 ; i<64/2 ; i++) {
ssp_read_register((DWORD)pHC, 0x18, (WORD*)(&aa[i*2]));
}*/
ssp_read_data_direct((DWORD)pHC, (WORD*)aa, 0x18, 64/2, MVL_DEF_DRP);
memset(aa, 0, 512);
}
}
#endif ///0
{/*
GSPIMSG(1,(TEXT("Start TimingTest")));
{
int lp;
for (lp=0 ; lp<MAX_WAITus ; lp++) { ///Trial period (1s)
udelay(pHC->pOSTRegs, 1);
///NdisMSleep(1);
}
///Add one more delay at the end. Otherwise, the firmware download will failed.
/// (Don't know why)
udelay(pHC->pOSTRegs, 50); ///Trial value
///NdisMSleep(5);
GSPIMSG(1,(TEXT("End TimingTest")));
}
*/}
///Testing....
funcFinal:
GSPIMSG(PROGFLOW, (TEXT("SSP: %s returning 0x%x\r\n"), TEXT(__FUNCTION__), pHC));
return (DWORD)pHC;
}
///////////////////////////////////////////////////////////////////////////////
/// SSP_Deinit - the I/O control entry point
/// Input:
/// hDC - the context returned from SSP_Init
/// Output:
/// Return: TRUE
/// Notes: not used
///////////////////////////////////////////////////////////////////////////////
BOOL pxa_gspi_Deinit(DWORD hDC)
{
BOOL result = TRUE;
PSSP_HARDWARE_CONTEXT pHC = (PSSP_HARDWARE_CONTEXT)hDC;
//int i;
ENTERFUNC();
if (pHC == NULL) {
GSPIMSG(ERRMSG, (TEXT("Allocate SSP_HARDWARE_CONTEXT FAILED")));
result = FALSE;
goto funcFinal;
}
pHC->DriverShutdown = TRUE;
if (pHC->hIntrHandle == NULL) {
SetEvent(pHC->hIntrHandle);
pHC->hIntrHandle = NULL;
}
#if (USE_DMA == 1) && (USE_DMAIRQ == 1)
if(NULL != pHC->hBusAcceHND) {
CloseBusAccessHandle(pHC->hBusAcceHND);
pHC->hBusAcceHND = NULL;
}
#endif /// (USE_DMA == 1) && (USE_DMAIRQ == 1)
//yz_mask
//for (i=0 ; i<MAXDMA_PARAM ; i++) {
//clrInterrupt(&pHC->DMAIntrInfo[i]);
//}
//yz_mask_end
/*
if (pHC->hDMAIntrHandle == NULL) {
SetEvent(pHC->hDMAIntrHandle);
pHC->hDMAIntrHandle = NULL;
}
if (pHC->hGIIsr) {
FreeIntChainHandler(pHC->hGIIsr);
pHC->hGIIsr = NULL;
}
///Clean up the handler
if (pHC->hDMAIntrHandle) {
CloseHandle(pHC->hDMAIntrHandle);
pHC->hDMAIntrHandle = NULL;
}
if (pHC->hDMAIntrHandle) {
CloseHandle(pHC->hDMAIntrHandle);
pHC->hDMAIntrHandle = NULL;
}*/
///Delete the synchronization semphore
if (pHC->waitqueue) {
CloseHandle(pHC->waitqueue);
pHC->waitqueue = NULL;
}
DeleteCriticalSection(&(pHC->SSPCrit));
if (LocalFree(pHC)) {
result = FALSE;
}
funcFinal:
GSPIMSG(PROGFLOW, (TEXT("Exit %s (%xh) \n"), TEXT(__FUNCTION__), result));
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -