Ik ben bezig om vanuit Kylix bepaalde hardware aan te sturen. Nu hebben we daarvoor een driver. Deze driver werkt met IOCTL code's. Het probleem is dat mijn programma met onbekende IOCTL's werkt volgens het log bestand.
Hieronder is de informatie te zien van hoe het in C ontworpen is:
Nu weet ik niet precies wat dat gpio_ops * betekent, maar het gaat om de grootte van die union. De union is 12 bytes groot.
In mijn Kylix programma doe ik het als volgt:
Maar deze IOCTL_GPIO's zijn dus volgens het systeem niet juist.
Nu wilde ik eerst de IOCTL_GPIO nummers weergegeven met een test programma in c. Alleen door mijn zeer beperkte kennis van C lukte me dat niet.
Maar ziet iemand misschien wat er fout zou kunnen gaan. (In het log bestand staat niet meer informatie. Alleen het nummer van het onbekende IOCTL_GPIO nummer).
Hieronder is de informatie te zien van hoe het in C ontworpen is:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #define MAJOR_NUM 240 typedef union { struct { unsigned int card; unsigned long mask; unsigned long data; } enable, write; struct { unsigned int card; unsigned long data; } read; } gpio_ops; #define IOCTL_GPIO_ENABLE _IOW (MAJOR_NUM, 1, gpio_ops *) #define IOCTL_GPIO_READ _IOWR(MAJOR_NUM, 2, gpio_ops *) #define IOCTL_GPIO_WRITE _IOW (MAJOR_NUM, 3, gpio_ops *) |
Nu weet ik niet precies wat dat gpio_ops * betekent, maar het gaat om de grootte van die union. De union is 12 bytes groot.
In mijn Kylix programma doe ik het als volgt:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| TEnable = packed record Card: LongInt; // C ==> int Mask: ulong; // C ==> unsigned long Data: ulong; // C ==> unsigned long end; TWrite = packed record Card: LongInt; // C ==> int Mask: ulong; // C ==> unsigned long Data: ulong; // C ==> unsigned long end; TRead = packed record Card: LongInt; // C ==> int Data: ulong; // C ==> unsigned long end; IOCTL_GPIO_ENABLE := __IOW(MAJOR_NUM, 1, Sizeof(TEnable)); IOCTL_GPIO_READ := __IOWR(MAJOR_NUM, 2, Sizeof(TRead)); IOCTL_GPIO_WRITE := __IOW(MAJOR_NUM, 3, Sizeof(TWrite)); |
Maar deze IOCTL_GPIO's zijn dus volgens het systeem niet juist.
Nu wilde ik eerst de IOCTL_GPIO nummers weergegeven met een test programma in c. Alleen door mijn zeer beperkte kennis van C lukte me dat niet.
Maar ziet iemand misschien wat er fout zou kunnen gaan. (In het log bestand staat niet meer informatie. Alleen het nummer van het onbekende IOCTL_GPIO nummer).