[Lazarus] Where is hwiringPi?
Marc Santhoff
M.Santhoff at web.de
Sat Sep 19 19:00:04 CEST 2015
On Sa, 2015-09-19 at 18:53 +0200, Marc Santhoff wrote:
> 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 <M.Santhoff at web.de>
More information about the Lazarus
mailing list