Forum: PC-Programmierung CharDev Zugriff - ioctl()


von bbub (Gast)


Lesenswert?

Hallo,


ich möchte eine UserSpace-Lib, die auf ein Char-Dev zugreift, für ein 
embedded Linux bauen.

Ich habe in der Richtung aber wenig Erfahrung und weiß nicht, wie ich 
ioctl() richtig einbinden muss.

Laut Doku. muss ich nur die "drv_ioctl.h" einbinden und dann ioctl() 
verwenden.
1
#include "drv_ioctl.h"
2
3
int getPortSize(int fd)
4
{
5
  int size, err;
6
  err = ioctl(fd, DRV_GET_PORT_SIZE, &size);
7
  if (err == 0)
8
    return size;
9
  return -1;
10
}

Die "drv_ioctl.h" bindet wiederum keine weiteren Header ein.

1
#ifndef _DRV_IOCTL_H_
2
#define _DRV_IOCTL_H_
3
4
/* IOCTLs to retrieve information of the related drivers */
5
6
#define DRV_MAGIC      0x42
7
8
#define DRV_GET_PORT_SIZE    _IOR(DRV_MAGIC, 0, unsigned int)
9
#define DRV_IOCTL      _IOWR(DRV_MAGIC, 0x12, uint8_t[140])
10
...

Kann das überhaupt so funktionieren?
Dem Compiler jedenfalls fehlen noch Informationen.
Muss ich ioctl() noch irgendwie initiieren? Oder fehlt da eine 
Header-Datei?

1
src/devClient.c:6:2: warning: implicit declaration of function 'ioctl' [-Wimplicit-function-declaration]
2
  err = ioctl(fd, DRV_GET_PORT_SIZE, &size);
3
  ^
4
src/devClient.c:6:2: warning: implicit declaration of function '_IOR' [-Wimplicit-function-declaration]
5
In file included from src/devClient.c:279:0:
6
/opt/linux/drivers/drv_ioctl.h:22:51: error: expected expression before 'unsigned'
7
 #define DRV_GET_PORT_SIZE  _IOR(DRV_MAGIC, 0, unsigned int)
8
                                                   ^
9
src/devClient.c:6:18: note: in expansion of macro 'DRV_GET_PORT_SIZE'
10
  err = ioctl(fd, DRV_GET_PORT_SIZE, &size);
11
                  ^

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

bbub schrieb:
> Dem Compiler jedenfalls fehlen noch Informationen. Muss ich ioctl() noch
> irgendwie initiieren? Oder fehlt da eine Header-Datei?

Ja, da fehlt eine Headerdatei. Genau das bedeutet "implicit 
declaration". Durchsuche Deine Headerdateien nach dem Prototypen von 
ioctl() und binde die gefundene Datei in Deine Sourcedatei ein.
Oder lies Dir dir manpage von ioctl durch, da sollte eigentlich auch 
drinstehen, welche Headerdatei hier fällig ist.

von asdfasd (Gast)


Lesenswert?

Gib mal "man ioctl" ein.  Unter Synopsis siehst du, welche Includes 
benötigt werden (sys/ioctl.h).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.