|  | 
 
| 本帖最后由 AK_47_1 于 2013-8-28 11:53 编辑 
 DS18b20的驱动程序用CreateFile()函数无法的开,请各位大侠指点
 
 HANDLE hGio = CreateFile(L"GIO1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
 
 if (hGio == INVALID_HANDLE_VALUE)
 {
 MessageBox(_T("Can not open GIO!"), _T("GIO"), MB_OK);
 return 0;
 }
 
 驱动程序如下:
 #include <windows.h>
 #include <ceddk.h>
 #include <tchar.h>
 #include <nkintr.h>
 #include <pm.h>
 #include <s3c2440a.h>
 #include <s3c2440a_ioport.h>
 #include <s3c2440a_base_regs.h>
 #include <s3c2440a_clkpwr.h>
 #include "pmplatform.h"
 #include "Pkfuncs.h"
 #include "BSP.h"
 #include "ioctl_cfg.h"
 //裸机头文件
 //#include "option.h"
 //#include "profile.h"
 //#include "GPIODriver.h"
 #define U32 unsigned int
 #define U16 unsigned short
 #define U8  unsigned char
 //#define   DQ_IN     v_pIOPregs->GPGCON &= 0xFFFFFFFC
 //#define   DQ_OUT    v_pIOPregs->GPGCON = (v_pIOPregs->GPGCON & 0xFFFFFFFC)|0x01
 //#define   DQ_DOWN   v_pIOPregs->GPGUP |= (1 << 0)
 //#define   DQ_UP     v_pIOPregs->GPGUP &= ~(1 << 0)
 //#define   DQ_H      v_pIOPregs->GPGDAT |= (1 << 0)
 //#define   DQ_L      v_pIOPregs->GPGDAT &= ~(1 << 0)
 //#define   DQ_STAT   v_pIOPregs->GPGDAT &= 0x1
 //定义DS18B20ROM指令
 #define    DS18B20_ReadROM        0x33    //读ROM
 #define    DS18B20_MatchROM       0x55    //匹配ROM
 #define    DS18B20_SkipROM        0xCC    //跳过ROM
 #define    DS18B20_SearchROM      0xF0    //搜索ROM
 #define    DS18B20_AlarmROM       0xEC    //报警搜索
 //定义DS18B20存储器操作命令
 #define    DS18B20_WriteSCR       0x4E    //写暂存存储器
 #define    DS18B20_ReadSCR        0xBE    //读暂存存储器
 #define    DS18B20_CopySCR        0x48    //复制暂存存储器
 #define    DS18B20_ConvertTemp    0x44    //温度变换
 #define    DS18B20_RecallEP       0xB8    //重新调出
 #define    DS18B20_ReadPower      0xB4    //读电源
 volatile S3C2440A_IOPORT_REG *v_pIOPregs;
 BOOL mInitialized;
 bool InitializeAddresses(VOID);      // Virtual allocation
 void usDelay(int time);
 BOOL DS18B20_Init(void);
 U8 DS18B20_ReadBit(void);
 U8 DS18B20_ReadByte(void);
 void DS18B20_WriteByte(U8 dat);
 U16 DS18B20_Temperature(void);
 bool InitializeAddresses(VOID)
 {
 bool RetValue = TRUE;
 /* IO Register Allocation */
 v_pIOPregs = (volatile S3C2440A_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2440A_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
 if (v_pIOPregs == NULL)
 {
 ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc faiGPIO!\r\n")));
 RetValue = FALSE;
 }
 else
 {
 if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
 {
 ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy faiGPIO!\r\n")));
 RetValue = FALSE;
 }
 }
 if (!RetValue)
 {
 if (v_pIOPregs)
 {
 VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
 }
 v_pIOPregs = NULL;
 }
 return(RetValue);
 }
 
 (数据采集部分)。。。。。
 
 BOOL WINAPI
 DllEntry(HANDLE hinstDLL,
 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 GIO_Deinit(DWORD hDeviceContext)
 {
 BOOL bRet = TRUE;
 RETAILMSG(1,(TEXT("GPIO_Control: GIO_Deinit\r\n")));
 VirtualFree((PVOID)v_pIOPregs, 0, MEM_RELEASE);
 return TRUE;
 }
 
 DWORD GIO_Init(DWORD dwContext)
 {
 RETAILMSG(1,(TEXT("GPIO Initialize ...")));
 
 InitializeAddresses();
 if (!InitializeAddresses())
 return FALSE;
 // v_pIOPregs->GPBCON  = (v_pIOPregs->GPBCON  &~(3 << 10)) | (1<< 10); // GPG0 == OUTPUT.
 // v_pIOPregs->GPBCON  = (v_pIOPregs->GPBCON  &~(3 << 12)) | (1<< 12); // GPB6 == OUTPUT.
 // v_pIOPregs->GPBCON  = (v_pIOPregs->GPBCON  &~(3 << 14)) | (1<< 14); // GPB7 == OUTPUT.
 // v_pIOPregs->GPBCON  = (v_pIOPregs->GPBCON  &~(3 << 16)) | (1<< 16); // GPB8 == OUTPUT.
 
 mInitialized = TRUE;
 RETAILMSG(1,(TEXT("OK !!!\r\n")));
 return TRUE;
 }
 BOOL GIO_IOControl(DWORD hOpenContext,
 DWORD dwCode,
 PBYTE pBufIn,
 DWORD dwLenIn,
 PBYTE pBufOut,
 DWORD dwLenOut,
 PDWORD pdwActualOut)
 {
 //switch(dwCode)
 //{
 //    case 0x01:
 //          DS18B20_Temperature(pBufOut);
 //          break;
 //
 //     case 0x02:
 //          break;
 // case IO_CTL_GPIO_1_ON:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0x1<<5);
 //  break;
 // case IO_CTL_GPIO_2_ON:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0x1<<6);
 //  break;
 // case IO_CTL_GPIO_3_ON:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0x1<<7);
 //  break;
 // case IO_CTL_GPIO_4_ON:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0x1<<8);
 //  break;
 // case IO_CTL_GPIO_ALL_ON:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0xF<<5);
 //  break;
 // case IO_CTL_GPIO_1_OFF:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0x1<<5);
 //  break;
 // case IO_CTL_GPIO_2_OFF:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0x1<<6);
 //  break;
 // case IO_CTL_GPIO_3_OFF:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0x1<<7);
 //  break;
 // case IO_CTL_GPIO_4_OFF:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0x1<<8);
 //  break;
 // case IO_CTL_GPIO_ALL_OFF:
 //  v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0xF<<5);
 //  break;
 //default:
 // break;
 //}
 
 RETAILMSG(0,(TEXT("GPIO_Control:Ioctl code = 0x%x\r\n"), dwCode));
 return TRUE;
 }
 DWORD GIO_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
 {
 // v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0xF<<5);
 RETAILMSG(1,(TEXT("GPIO_Control: GPIO_Open\r\n")));
 DS18B20_Init();
 if(DS18B20_Init())
 {
 RETAILMSG(1,(TEXT("STRINGS:GIO_Open uable to open device!\n")));
 return -1;
 }
 else
 {
 RETAILMSG(1,(TEXT("STRINGS:GIO_Open open device!\n")));
 }
 return TRUE;
 }
 BOOL GIO_Close(DWORD hOpenContext)
 {
 // v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&(0xF<<5);
 RETAILMSG(1,(TEXT("GPIO_Control: GPIO_Close\r\n")));
 return TRUE;
 }
 void GIO_PowerDown(DWORD hDeviceContext)
 {
 RETAILMSG(1,(TEXT("GPIO_Control: GPIO_PowerDown\r\n")));
 }
 void GIO_PowerUp(DWORD hDeviceContext)
 {
 RETAILMSG(1,(TEXT("GPIO_Control: GPIO_PowerUp\r\n")));
 }
 DWORD GIO_Read(DWORD hOpenContext, unsigned char* pBuffer, DWORD Count)
 {
 RETAILMSG(1,(TEXT("GPIO_Control: GPIO_Read\r\n")));
 unsigned int i;
 for(i=0;i<Count;i++)
 {
 *(unsigned char *)pBuffer=DS18B20_ReadByte();
 pBuffer+=1;
 }
 return i;
 }
 DWORD GIO_Seek(DWORD hOpenContext, long Amount, DWORD Type)
 {
 RETAILMSG(1,(TEXT("GPIO_Control: GPIO_Seek\r\n")));
 return 0;
 }
 DWORD GIO_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
 {
 RETAILMSG(1,(TEXT("GPIO_Control: GPIO_Write\r\n")));
 unsigned char data=*(unsigned char *)pSourceBytes;
 DS18B20_WriteByte(data);
 return 0;
 }
 
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册  |