Marc Santhoff wrote 19 lines
On Fr, 2015-09-18 at 18:50 -0500, Bo Berglund wrote:
> The hiwiringpi.pas file is an interface to something else written in C
> if I understood the text correctly.
> How does that work? It seems like I have to compile something in C on
> the Pi as well and it produces an *.o file. Does that act like a dll
> in Windows or like a lib file that gets linked into the final
> executable?
Yes, it does. A statically linked library (.a in contrast to a
dynamically linked library .so) is nothing more than an archive holding
a bunch of .o files. As long as the compiler creates the same type of
object file (ELF mostly) thosse are the same created when compiling
pascal files. This .o files can be linked into a pascal program.
If using dynamical linking things are different, but in general it works
the same as using dll files on Windows.
I did use object files compiled from C to use some USB functions
withstanding my translation trials vigorously. ;)
I forgot:
These C-Functions are activated in pascal files like this:
<snip>
{ ---------- low level C functions ---------- }
function domotorrequest(device : integer ; motor: integer; speed: integer):integer; cdecl; external;
{$L domotorrequest.o}
function doserialrequest(device: longint; buffer: pAnsiChar):integer; cdecl; external;
{$L doserialrequest.o}
</snip>
After that they can be used like any other function. One of the C files:
<C-code>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <dev/usb/usb.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "usb-serial.h"
int doserialrequest(int dev, char* buffer)
{
usb_device_descriptor_t devdescr;
struct usb_string_desc stringdescr;
int res;
/*int dev;*/
int i;
bzero(&devdescr, sizeof(devdescr));
res = ioctl(dev, USB_GET_DEVICE_DESC, &devdescr);
if (res < 0) {
printf("USB get_device_descriptor failed: %s\n",
strerror(errno));
exit(-1);
}
bzero(&stringdescr, sizeof(stringdescr));
stringdescr.usd_string_index = devdescr.iSerialNumber;
res = ioctl(dev, USB_GET_STRING_DESC, &stringdescr);
if (res < 0) {
printf("USB get_string_descriptor failed: %s\n",
strerror(errno));
exit(-1);
}
for (i = 0 ; i < stringdescr.usd_desc.bLength; i++ ) {
//printf("%c", (char)UGETW(stringdescr.usd_desc.bString[i]));
buffer[i] = (char)UGETW(stringdescr.usd_desc.bString[i]);
}
return i;
}
</C-code>
Marc Santhoff