首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

编撰的SPI驱动不能加载~求指点~

2012-12-31 
编写的SPI驱动不能加载~~~~~~求指点~~~~~用的是ok6410的板子,用DM测试激活驱动时,显示加载失败,Error ID 1

编写的SPI驱动不能加载~~~~~~求指点~~~~~
用的是ok6410的板子,用DM测试激活驱动时,显示加载失败,Error ID 1;求高人指点呀!!编撰的SPI驱动不能加载~求指点~
#include <windows.h>
#include <nkintr.h>
#include <ceddk.h>    //For DMA Buffer Alloc
#include <memory.h>
#include <s3c6410_gpio.h>
#include <s3c6410.h>    // for 6410
#include <DrvLib.h>
#include "SPI.h"
#include "oal_intr.h"
#define  SPI_CH1_BASE           0x7F00C000
#define  IOP_BASE                  0x7F008000
#define  S3C6410_BASE_REG_PA_SPIO  0x7F00B000

volatile  S3C6410_GPIO_REG *s3c6410IOP = (S3C6410_GPIO_REG *)IOP_BASE;
volatile  S3C6410_SPI_REG   *pSPIregs = (S3C6410_SPI_REG *)SPI_CH1_BASE;

void Virtual_Alloc()
{

    // GPIO Virtual alloc
s3c6410IOP = (volatile  S3C6410_GPIO_REG *) VirtualAlloc(0,sizeof( S3C6410_GPIO_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s3c6410IOP == NULL) 
{
RETAILMSG(1,(TEXT("For s3c6410IOP: VirtualAlloc faiADF!\r\n")));
}
else 
{
if(!VirtualCopy((PVOID)s3c6410IOP,(PVOID)(S3C6410_BASE_REG_PA_GPIO),sizeof( S3C6410_GPIO_REG),PAGE_READWRITE | PAGE_NOCACHE ))
{
RETAILMSG(1,(TEXT("For s3c6410IOP: VirtualCopy faiADF!\r\n")));
}
}

//SPI Virtual alloc
pSPIregs=(volatile S3C6410_SPI_REG *) VirtualAlloc(0, sizeof( S3C6410_SPI_REG),MEM_RESERVE, PAGE_NOACCESS);
if(pSPIregs==NULL)
{
RETAILMSG(1,(TEXT("For pSPIregs: VirtualAlloc failed!\r\n")));
}
else 
{
if(!VirtualCopy((PVOID)pSPIregs,(PVOID)(S3C6410_BASE_REG_PA_SPIO),sizeof( S3C6410_SPI_REG),PAGE_READWRITE | PAGE_NOCACHE ))
{}
}

}


BOOL WINAPI  
DllEntry(HANDLEhinstDLL, 
DWORD dwReason, 
LPVOID /* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}

return TRUE;
}

bool SPI_Init()
{
s3c6410IOP->GPCCON  = (s3c6410IOP->GPCCON &~(0xF<<28)) | (0x1<<29);//GPC7 == SPI CS1
s3c6410IOP->GPCCON  = (s3c6410IOP->GPCCON &~(0xF<<24)) | (0x1<<25);//GPC6 == SPI MOSI1
s3c6410IOP->GPCCON  = (s3c6410IOP->GPCCON &~(0xF<<20)) | (0x1<<21);//GPC5 == SPI CLK1
s3c6410IOP->GPCCON  = (s3c6410IOP->GPCCON &~(0xF<<16)) | (0x1<<17);//GPC4 == SPI MISO1


pSPIregs->CH_CFG = pSPIregs->CH_CFG | (0x1<<5)| (0x1<<3);//reset and set format as   CPOL=1, CPHA=0     
pSPIregs->CLK_CFG = (pSPIregs->CLK_CFG | 0x7FF) &~(0x7FB);//PCLK 6.6MHz and division rate is ten 


pSPIregs->MODE_CFG = (pSPIregs->MODE_CFG | 0x3FFF) &~0xDFF9;//set MODE_CFG  

return TRUE;
}

void SPI_Write(DWORD hOpenContext, LPVOID pdata, DWORD NumberOfBytes)         
{   
DWORD wdata;
wdata = (DWORD)pdata;

pSPIregs->CH_CFG = pSPIregs->CH_CFG | (0x1);//open TX
pSPIregs->PACKET_COUNT=pSPIregs->PACKET_COUNT | (0x1<<16);//enable packet_count
    
pSPIregs->SPI_TX_DATA = wdata;//write data to external device
pSPIregs->SLAVE_SEL= pSPIregs->SLAVE_SEL &~0x1;//enable CS
pSPIregs->CLK_CFG = pSPIregs->CLK_CFG | (0x1<<8);//open clock


do {
  pSPIregs->SLAVE_SEL = pSPIregs->SLAVE_SEL | 0x1;//disable CS and clock is colsed by packet_count
      pSPIregs->CH_CFG = pSPIregs->CH_CFG &~(0x1);//close TX

   } 
while (((pSPIregs->SPI_STATUS>>6)&0x7F) == 0);
}

DWORD SPI_Read(DWORD hOpenContext,LPVOID pBuffer, DWORD Count)
{
DWORD Ptr;

pSPIregs->CH_CFG = pSPIregs->CH_CFG | (0x10);//open RX
pSPIregs->PACKET_COUNT=pSPIregs->PACKET_COUNT | (0x1<<16);//enable packet_count
  
    Ptr = pSPIregs->SPI_RX_DATA;//receive data from external device
pSPIregs->SLAVE_SEL = pSPIregs->SLAVE_SEL &~0x1;//enable CS
pSPIregs->CLK_CFG = pSPIregs->CLK_CFG | (0x1<<8);//open clock


do {
   pSPIregs->CLK_CFG = pSPIregs->CLK_CFG &~(0x1<<8);//close clock
       pSPIregs->SLAVE_SEL = pSPIregs->SLAVE_SEL | 0x1;//disable CS
       pSPIregs->CH_CFG = pSPIregs->CH_CFG &~(0x10);//close RX

   }
while ((pSPIregs->SPI_STATUS>>13&0x7F) == 0);

memcpy(pBuffer,(LPVOID)&Ptr,2);
return  1;
}

[解决办法]
这种问题,你先搭个框架,配上注册表,能加载再往添加代码,
别急于求成一步到位,除非你经验很足
[解决办法]
加载失败是因为 函数不正确,
你先看一下流接口驱动需要的那些函数吧;
先不用实现,搭建框架,让系统能正常加载
[解决办法]
注册表怎么配置的,还有source文件 def文件是怎么写的
[解决办法]
加载失败就说明是CreateFile有问题吧。你的这个驱动没写完吧,加一个SPI_Open()函数里面调用Virtual_Alloc(),就是做地址映射吧,现在你的Virtual_Alloc()根本不会执行。
你先按这个做一下,看看还有什么问题
[解决办法]
如果你附加的代码是全部代码的话,那肯定是没有创建主线程,每个驱动都要搞个至少一个线程运行

热点排行