Bonjour, Voilà j'ai développé un driver série pour un pda à l'aide de platform Builder (le code est mis plus bas). Le problème est que lors du "build" j'ai des erreurs. Quelqu'un peut-îl m'aider?? merci d'avance et meilleures salutations
// constante de récupération du code du IOCTL 'PUTC' #define IOCTL_PUTC CTL_CODE(FILE_DEVICE_UNKNOWN,2048, METHOD_BUFFERED, FILE_ANY_ACCESS) // constante de récupération du code du IOCTL 'GETC' #define IOCTL_GETC CTL_CODE(FILE_DEVICE_UNKNOWN,2049, METHOD_BUFFERED, FILE_ANY_ACCESS) // constante de récupération du code du IOCTL 'GET_RX_STATUS' #define IOCTL_GET_RX_STATUS CTL_CODE(FILE_DEVICE_UNKNOWN,2050,METHOD_BUFFERED, FILE_ANY_ACCESS)
// initialisation du statut du driver WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x80); WRITE_PORT_UCHAR(IoPortBase+comDivisorLow,0x0C); WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh, 0x00); WRITE_PORT_UCHAR(IoPortBase+comFIFOControl, 0x00); WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x03); WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x00); WRITE_PORT_UCHAR(IoPortBase+comModemControl,0x03);
return dwRet; }
// fonction de désinitialisation du driver BOOL MSD_Deinit(DWORD hDeviceContext) { // affichage d'un message de deboggage montrant que l'on est entré dans la fonction de desinitialisation RETAILMSG(1,(TEXT("SERIAL: MSD_Deinit\n" )));
return TRUE; }
// fonction d'ouverture de flux vers le driver DWORD MSD_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { // adresse du port série PUCHAR IoPortBase;
// vidage du buffer de reception si necessaire while ((READ_PORT_UCHAR(IoPortBase + comLineStatus) & LS_RX_DATA_READY) == 1) { // tant qu'il y a un caractère, on le lit READ_PORT_UCHAR(IoPortBase + comRxBuffer); }
return dwRet; }
// fonction de fermeture du flux ouvert vers le driver BOOL MSD_Close(DWORD hOpenContext) { // affichage d'un message de deboggage montrant que l'on est entré dans la fonction de fermeture du driver RETAILMSG(1,(TEXT("SERIAL: MSD_Close\n" )));
return TRUE; }
// fonction d'appel aux contrôles fournis par le driver BOOL MSD_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { // adresse du port série PUCHAR IoPortBase;
switch((int)hOpenContext) { case 100: IoPortBase = ((PUCHAR)0x03F8); break; case 200: IoPortBase = ((PUCHAR)0x02F8); break; default: IoPortBase = ((PUCHAR)0x03F8); break; }
// en fonction de ce que l'on demande au driver switch(dwCode) { // si l'on veut écrire un caractère case IOCTL_PUTC: // on attend tant qu'il n'y a rien à lire while(!(READ_PORT_UCHAR(IoPortBase + comLineStatus)& LS_THR_EMPTY));
// on ecrit à l'adresse pBufIn ce qui vient d'être lu WRITE_PORT_UCHAR(IoPortBase + comTxBuffer, *pBufIn);
break;
// si l'on veut lire un caractère case IOCTL_GETC: // ecriture du caractère à envoyer à l'adresse pBufOut *pBufOut = READ_PORT_UCHAR(IoPortBase + comRxBuffer); *pdwActualOut = 1; break;
// si l'on veut lire le statut du driver case IOCTL_GET_RX_STATUS: // écriture du statut du driver à l'adresse pBufOut *pBufOut=(READ_PORT_UCHAR(IoPortBase + comLineStatus) & LS_RX_DATA_READY); *pdwActualOut = 1; break; } //fin du switch
return TRUE; }
// fonction de traitement d'extinction void MSD_PowerDown(DWORD hDeviceContext) {
// affichage d'un message de deboggage montrant que l'on est entré dans la fonction d'extinction RETAILMSG(1,(TEXT("SERIAL: MSD_PowerDown\n" ))); }
// fonction de traitement de demarrage void MSD_PowerUp(DWORD hDeviceContext) { // affichage d'un message de deboggage montrant que l'on est entré dans la fonction de demarrage RETAILMSG(1,(TEXT("SERIAL: MSD_PowerUp\n" ))); }
// fonction de traitement de lecture de message DWORD MSD_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) { // valeur de retour DWORD dwRet = 0; // affichage d'un message de deboggage montrant que l'on est entré dans la fonction de lecture RETAILMSG(1,(TEXT("SERIAL: MSD_Read\n" ))); return dwRet; }
// fonction de traitement d'écriture de message DWORD MSD_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes) { // valeur de retour DWORD dwRet = 0; // affichage d'un message de deboggage montrant que l'on est entré dans la fonction d'écriture RETAILMSG(1,(TEXT("SERIAL: MSD_Write\n" ))); return dwRet; }
// fonction de position DWORD MSD_Seek(DWORD hOpenContext, long Amount, DWORD Type) { // valeur de retour DWORD dwRet = 0; // affichage d'un message de deboggage montrant que l'on est entré dans la fonction de recherche RETAILMSG(1,(TEXT("SERIAL: MSD_Seek\n" ))); return dwRet; }
Marsh Posté le 21-03-2007 à 13:11:10
Bonjour,
Voilà j'ai développé un driver série pour un pda à l'aide de platform Builder (le code est mis plus bas). Le problème est que lors du "build" j'ai des erreurs. Quelqu'un peut-îl m'aider?? merci d'avance et meilleures salutations
Steve
Voici le log et le code plus bas :
LOG :
--------------------Configuration: Emulator: x86_Release--------------------
Starting Build: set WINCEREL=1&&build
==============
BUILD: [Thrd:Sequence:Type ] Message
BUILD: [00:0000000000:PROGC ] Checking for \WINCE500\sdk\bin\i386\srccheck.exe.
BUILD: [00:0000000001:PROGC ] SrcCheck exit code: 0 (dec).
BUILD: [00:0000000002:PROGC ] Compile and Link for x86.
BUILD: [00:0000000003:PROGC ] Loading C:\WINCE500\PBWorkspaces\monpremierOS\my_serial_driver\Build.dat.
BUILD: [00:0000000004:PROGC ] Done.
BUILD: [00:0000000005:PROGC ] Computing include file dependencies:
BUILD: [00:0000000006:PROGC ] Checking for SDK include directory: C:\WINCE500\sdk\ce\inc.
BUILD: [00:0000000007:PROGC ] Scan \WINCE500\PBWorkspaces\monpremierOS\my_serial_driver\
BUILD: [00:0000000010:PROGC ] Linking \WINCE500\PBWorkspaces\monpremierOS\my_serial_driver\ directory.
BUILD: [01:0000000017:ERRORE] NMAKE : U1073: don't know how to make 'C:\WINCE500\PBWorkspaces\monpremierOS\WINCE500\Emulator_x86\cesysgen\sdk\lib\x86\retail\coredll.lib;'
BUILD: [01:0000000019:ERRORE] NMAKE.EXE -i -c BUILDMSG=Stop. LINKONLY=1 NOPASS0=1 MAKEDLL=1 failed - rc = 2
BUILD: [00:0000000020:PROGC ] Files Warnings Errors
BUILD: [00:0000000021:PROGC ] Midl 0 0 0
BUILD: [00:0000000022:PROGC ] Resource 0 0 0
BUILD: [00:0000000023:PROGC ] Message 0 0 0
BUILD: [00:0000000024:PROGC ] Precomp Header 0 0 0
BUILD: [00:0000000025:PROGC ] C/Cpp/Cxx 0 0 0
BUILD: [00:0000000026:PROGC ] Assembler 0 0 0
BUILD: [00:0000000027:PROGC ] Static Libraries 0 0 0
BUILD: [00:0000000028:PROGC ] Dll's 0 0 0
BUILD: [00:0000000029:PROGC ] Exe's 0 0 0
BUILD: [00:0000000030:PROGC ] Resx 0 0 0
BUILD: [00:0000000031:PROGC ] Csharp Targets 0 0 0
BUILD: [00:0000000032:PROGC ] Other 0 0 2
BUILD: [00:0000000033:PROGC ]
BUILD: [00:0000000034:PROGC ] Total 0 0 2
BUILD: [00:0000000035:PROGC ]
BUILD: [00:0000000036:PROGC ] 0 Warnings, 2 Errors
Build for Windows CE (Release) (Built on Apr 22 2004 10:38:01)
File names: Build.log Build.wrn Build.err Build.dat
monpremierOS - 2 error(s), 0 warning(s)
Et voici le code :
#include "stdafx.h"
#include <windows.h>
#include <wdm.h>
// constante de récupération du code du IOCTL 'PUTC'
#define IOCTL_PUTC CTL_CODE(FILE_DEVICE_UNKNOWN,2048, METHOD_BUFFERED, FILE_ANY_ACCESS)
// constante de récupération du code du IOCTL 'GETC'
#define IOCTL_GETC CTL_CODE(FILE_DEVICE_UNKNOWN,2049, METHOD_BUFFERED, FILE_ANY_ACCESS)
// constante de récupération du code du IOCTL 'GET_RX_STATUS'
#define IOCTL_GET_RX_STATUS CTL_CODE(FILE_DEVICE_UNKNOWN,2050,METHOD_BUFFERED, FILE_ANY_ACCESS)
// constantes servant à initialiser les statuts du driver
#define comLineControl 3
#define comDivisorLow 0
#define comDivisorHigh 1
#define comFIFOControl 2
#define comIntEnable 1
#define comModemControl 4
#define comLineStatus 5
#define comTxBuffer 0
#define comRxBuffer 0
// constantes d'erreur
#define LS_TSR_EMPTY 0x40
#define LS_THR_EMPTY 0x20
#define LS_RX_BREAK 0x10
#define LS_RX_FRAMING_ERR 0x08
#define LS_RX_PARITY_ERR 0x04
#define LS_RX_OVERRRUN 0x02
#define LS_RX_DATA_READY 0x01
#define LS_RX_ERRORS (LS_RX_FRAMING_ERR | LS_RX_PARITY_ERR | LS_RX_OVERRRUN)
// entrée de la dll
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
// fonction d'initialisation du driver
DWORD MSD_Init(DWORD dwContext)
{
// adresse du port série
PUCHAR IoPortBase;
// valeur de retour
DWORD dwRet;
switch((int)dwContext)
{
case 1:
IoPortBase = ((PUCHAR)0x03F8);
dwRet = 1;
RETAILMSG(1,(TEXT("SERIAL: MSD_Init MSD1\n" )));
break;
case 2:
IoPortBase = ((PUCHAR)0x02F8);
dwRet = 2;
RETAILMSG(1,(TEXT("SERIAL: MSD_Init MSD2\n" )));
break;
default:
IoPortBase = ((PUCHAR)0x03F8);
dwRet = 1;
RETAILMSG(1,(TEXT("SERIAL: MSD_Init MSD1 (default)\n" )));
break;
}
// initialisation du statut du driver
WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x80);
WRITE_PORT_UCHAR(IoPortBase+comDivisorLow,0x0C);
WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh, 0x00);
WRITE_PORT_UCHAR(IoPortBase+comFIFOControl, 0x00);
WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x03);
WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x00);
WRITE_PORT_UCHAR(IoPortBase+comModemControl,0x03);
return dwRet;
}
// fonction de désinitialisation du driver
BOOL MSD_Deinit(DWORD hDeviceContext)
{
// affichage d'un message de deboggage montrant que l'on est entré dans la fonction de desinitialisation
RETAILMSG(1,(TEXT("SERIAL: MSD_Deinit\n" )));
return TRUE;
}
// fonction d'ouverture de flux vers le driver
DWORD MSD_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
// adresse du port série
PUCHAR IoPortBase;
// valeur de retour
DWORD dwRet;
switch((int)hDeviceContext)
{
case 1:
IoPortBase = ((PUCHAR)0x03F8);
dwRet = 100;
RETAILMSG(1,(TEXT("SERIAL: MSD_Open MSD1\n" )));
break;
case 2:
IoPortBase = ((PUCHAR)0x02F8);
dwRet = 200;
RETAILMSG(1,(TEXT("SERIAL: MSD_Open MSD2\n" )));
break;
default:
IoPortBase = ((PUCHAR)0x03F8);
dwRet = 100;
RETAILMSG(1,(TEXT("SERIAL: MSD_Open MSD1 (default)\n" )));
break;
}
// vidage du buffer de reception si necessaire
while ((READ_PORT_UCHAR(IoPortBase + comLineStatus) & LS_RX_DATA_READY) == 1)
{
// tant qu'il y a un caractère, on le lit
READ_PORT_UCHAR(IoPortBase + comRxBuffer);
}
return dwRet;
}
// fonction de fermeture du flux ouvert vers le driver
BOOL MSD_Close(DWORD hOpenContext)
{
// affichage d'un message de deboggage montrant que l'on est entré dans la fonction de fermeture du driver
RETAILMSG(1,(TEXT("SERIAL: MSD_Close\n" )));
return TRUE;
}
// fonction d'appel aux contrôles fournis par le driver
BOOL MSD_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
// adresse du port série
PUCHAR IoPortBase;
switch((int)hOpenContext)
{
case 100:
IoPortBase = ((PUCHAR)0x03F8);
break;
case 200:
IoPortBase = ((PUCHAR)0x02F8);
break;
default:
IoPortBase = ((PUCHAR)0x03F8);
break;
}
// en fonction de ce que l'on demande au driver
switch(dwCode)
{
// si l'on veut écrire un caractère
case IOCTL_PUTC:
// on attend tant qu'il n'y a rien à lire
while(!(READ_PORT_UCHAR(IoPortBase + comLineStatus)& LS_THR_EMPTY));
// on ecrit à l'adresse pBufIn ce qui vient d'être lu
WRITE_PORT_UCHAR(IoPortBase + comTxBuffer, *pBufIn);
break;
// si l'on veut lire un caractère
case IOCTL_GETC:
// ecriture du caractère à envoyer à l'adresse pBufOut
*pBufOut = READ_PORT_UCHAR(IoPortBase + comRxBuffer);
*pdwActualOut = 1;
break;
// si l'on veut lire le statut du driver
case IOCTL_GET_RX_STATUS:
// écriture du statut du driver à l'adresse pBufOut
*pBufOut=(READ_PORT_UCHAR(IoPortBase + comLineStatus) & LS_RX_DATA_READY);
*pdwActualOut = 1;
break;
} //fin du switch
return TRUE;
}
// fonction de traitement d'extinction
void MSD_PowerDown(DWORD hDeviceContext)
{
// affichage d'un message de deboggage montrant que l'on est entré dans la fonction d'extinction
RETAILMSG(1,(TEXT("SERIAL: MSD_PowerDown\n" )));
}
// fonction de traitement de demarrage
void MSD_PowerUp(DWORD hDeviceContext)
{
// affichage d'un message de deboggage montrant que l'on est entré dans la fonction de demarrage
RETAILMSG(1,(TEXT("SERIAL: MSD_PowerUp\n" )));
}
// fonction de traitement de lecture de message
DWORD MSD_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
// valeur de retour
DWORD dwRet = 0;
// affichage d'un message de deboggage montrant que l'on est entré dans la fonction de lecture
RETAILMSG(1,(TEXT("SERIAL: MSD_Read\n" )));
return dwRet;
}
// fonction de traitement d'écriture de message
DWORD MSD_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
// valeur de retour
DWORD dwRet = 0;
// affichage d'un message de deboggage montrant que l'on est entré dans la fonction d'écriture
RETAILMSG(1,(TEXT("SERIAL: MSD_Write\n" )));
return dwRet;
}
// fonction de position
DWORD MSD_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
// valeur de retour
DWORD dwRet = 0;
// affichage d'un message de deboggage montrant que l'on est entré dans la fonction de recherche
RETAILMSG(1,(TEXT("SERIAL: MSD_Seek\n" )));
return dwRet;
}