Einzelnen Beitrag anzeigen

Rads

Registriert seit: 31. Aug 2015
5 Beiträge
 
Delphi XE8 Professional
 
#1

Übersetzung von C nach Delphi (IOCTL)

  Alt 22. Dez 2015, 09:17
Morgen zusammen,

Ich musste den folgenden C-Code nach Delphi portieren, um den GPIO-Baustein anzusprechen.

C-Headerdatei:

Code:

/* Device type
#define GPIO_IOCTL_TYPE 0x9000

#define IOCTL_GPIO_WRITE \
    CTL_CODE( GPIO_IOCTL_TYPE, 0x901, METHOD_OUT_DIRECT , FILE_ANY_ACCESS)

#define IOCTL_GPIO_DIRECTION \
    CTL_CODE( GPIO_IOCTL_TYPE, 0x902, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)

#define ...


Typedef Enum
{
    CONNECT_MODE_INVALID = 0,
    CONNECT_MODE_INPUT,
    CONNECT_MODE_OUTPUT,
    CONNECT_MODE_MAXIMUM = CONNECT_MODE_OUTPUT
} GPIO_CONNECT_IO_PINS_MODE;


typedef struct
{
    ULONG pin;
    union
    {
        ULONG data_B;
        GPIO_CONNECT_IO_PINS_MODE ConnectMode;
    } ABC;
} GPIO_PIN_PARAMS, *PGPIO_PIN_PARAMS;
Ich habe das so übersetzt:
Daraus ergibt sich dann in Delphi folgendes ?
Delphi-Quellcode:

const
  GPIO_IOCTL_TYPE = $9000;
  GPIO_Device ='\\.\DEVICE';//Name
  IOCTL_GPIO_WRITE = DWORD((GPIO_IOCTL_TYPE shl 16) or (2 shl 14) or ($901 shl 2) or 0);
  IOCTL_GPIO_DIRECTION = DWORD((GPIO_IOCTL_TYPE shl 16) or (2 shl 14) or ($902 shl 2) or 0);
  //...

(* ----------------------------------------------------------- *)
Type // Typedef Enum
  _GPIO_Connect_IO_PINS_MODE = (
    CONNECT_MODE_INVALID = 0,
    CONNECT_MODE_INPUT,
    CONNECT_MODE_OUTPUT,
    CONNECT_MODE_MAXIMUM = CONNECT_MODE_OUTPUT
  );
  GPIO_Connect_IO_PINS_MODE = _GPIO_Connect_IO_PINS_MODE;
(* ----------------------------------------------------------- *)
Type
  C_Enum =(Var_Cardinal, Var_GPIO);
(* ----------------------------------------------------------- *)
Type
  PABC = ^TABC;
  TABC = Record
    case _Pin : C_Enum of
      Var_Cardinal :(data_B: Cardinal);
      Var_GPIO :(Var_ConnectMode: _GPIO_Connect_IO_PINS_MODE);
    end;
(* ----------------------------------------------------------- *)
Type // TypeDef struct
  PPGIO_PARAMS = ^TPGIO_PARAMS;
  TPGIO_PARAMS = record
    Pin : Cardinal;
    ABC : TABC;
  end;
Da der Zugriff (auf die GPIO-Schnittstelle) nicht funktioniert, wollte ich erstmal fragen ob meine Übersetzung stimmt??

Ich möchte einen Pin (z.B: 1) als Ausgang konfigurieren und ihn dann setzen:

Die Procedure sieht dann so aus:
Delphi-Quellcode:
var
  frmMain : TfrmMain;
  DeviceHandle : THandle;
  Params : TPGIO_PARAMS;
  nReturn : DWORD;


procedure TfrmMain.Button1Click(Sender: TObject);
begin
  DeviceHandle := CreateFile(Pchar(GPIO_Device), GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR
                  FILE_SHARE_WRITE, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR
                  FILE_FLAG_NO_BUFFERING, 0);

  if DeviceHandle <> INVALID_HANDLE_VALUE then
  begin
    //Konfiguration (Direction): Output
    Params.Pin := 1; //Pin 1
    Params.ABC.Var_ConnectMode := Connect_Mode_OutPut; //Pin Direction is set to Output
    DeviceIoControl(DeviceHandle, IOCTL_GPIO_DIRECTION, @Params, SizeOf(Params), Nil, 0, nReturn, nil);
    //Zugriff :Write
    Params.ABC.Data_B := 0;//255 // Hier bin ich mir nicht sicher, was ich hier eingeben muss ???
    Params.Pin := 1;
    DeviceIoControl(DeviceHandle, IOCTL_GPIO_Write, @Params, SizeOf(Params), Nil, 0, nReturn, nil);
    CloseHandle(DriveHandle);
  end
  else
  begin
    MessageDlg('Error!', mtWarning, [mbOK], 0);
  end;
end;
Der Compiler bringt keine Fehlermeldung, aber es funktioniert nicht..

Danke schonmal im Voraus für die Hilfe

Geändert von Rads (22. Dez 2015 um 09:24 Uhr)
  Mit Zitat antworten Zitat