From 73619d4dbeff9f2e67e9229cabc5e601b6a35f75 Mon Sep 17 00:00:00 2001 From: John Hay Date: Fri, 28 Feb 2003 20:02:53 +0000 Subject: After nudging from the current maintainer, take over maintainership. De pkg-comment. Update to ver. 2.5.a5. Add FreeBSD support for the USB IR Lego Tower. --- lang/nqc/Makefile | 10 +- lang/nqc/distinfo | 2 +- lang/nqc/files/RCX_USBTowerPipe_fbsd.cpp | 320 +++++++++++++++++++++++++++++++ lang/nqc/files/patch-aa | 21 +- lang/nqc/pkg-comment | 1 - 5 files changed, 340 insertions(+), 14 deletions(-) create mode 100644 lang/nqc/files/RCX_USBTowerPipe_fbsd.cpp delete mode 100644 lang/nqc/pkg-comment (limited to 'lang/nqc') diff --git a/lang/nqc/Makefile b/lang/nqc/Makefile index 9830c9fd3eab..be2d3508e91f 100644 --- a/lang/nqc/Makefile +++ b/lang/nqc/Makefile @@ -6,18 +6,22 @@ # PORTNAME= nqc -PORTVERSION= 2.4.r3 +PORTVERSION= 2.5.a5 CATEGORIES= lang -MASTER_SITES= http://www.baumfamily.org/nqc/release/ +MASTER_SITES= http://www.baumfamily.org/nqc/beta/ EXTRACT_SUFX= .tgz -MAINTAINER= kbyanc@FreeBSD.org +MAINTAINER= jhay@FreeBSD.org +COMMENT= A compiler for writing programs for the Lego RCX USE_GMAKE= yes CC= ${CXX} MAN1= nqc.1 +pre-configure: + ${CP} ${FILESDIR}/RCX_USBTowerPipe_fbsd.cpp ${WRKSRC}/rcxlib/ + do-install: ${INSTALL_PROGRAM} ${WRKSRC}/bin/nqc ${PREFIX}/bin ${INSTALL_MAN} ${WRKSRC}/nqc-man-2.1r1-0.man ${PREFIX}/man/man1/nqc.1 diff --git a/lang/nqc/distinfo b/lang/nqc/distinfo index 62c03a49f299..759ef7f6a5ac 100644 --- a/lang/nqc/distinfo +++ b/lang/nqc/distinfo @@ -1 +1 @@ -MD5 (nqc-2.4.r3.tgz) = 5fc032b990dc065d523285d9ccab91b4 +MD5 (nqc-2.5.a5.tgz) = cfd711ad16d43c3cf959a932f6dc19c5 diff --git a/lang/nqc/files/RCX_USBTowerPipe_fbsd.cpp b/lang/nqc/files/RCX_USBTowerPipe_fbsd.cpp new file mode 100644 index 000000000000..fd0eaacf61aa --- /dev/null +++ b/lang/nqc/files/RCX_USBTowerPipe_fbsd.cpp @@ -0,0 +1,320 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "RCX_Pipe.h" + +#include "PDebug.h" + +#define kVendorID 1684 +#define kProductID 1 +#define kConfiguration 0 +#define kReadPipe 1 +#define kWritePipe 2 + +// these should come from a LEGO include +#define LTW_REQ_GET_PARM 1 +#define LTW_REQ_SET_PARM 2 +#define LTW_PARM_RANGE 2 +#define LTW_RANGE_SHORT 1 +#define LTW_RANGE_MEDIUM 2 + + +#define LTW_REQ_SET_TX_SPEED 0xEF +#define LTW_REQ_SET_RX_SPEED 0xF1 + +#define SPEED_COMM_BAUD_2400 8 +#define SPEED_COMM_BAUD_4800 0x10 + +#define LTW_REQ_SET_TX_CARRIER_FREQUENCY 0xF4 + +#define UInt32 uint32_t +#define UInt16 uint16_t +#define UInt8 uint8_t +#define IOReturn int + +typedef struct LTW_REQ_REPLY_HEADER { + UInt16 wNoOfBytes; // Number of bytes in the reply + UInt8 bErrCode; // Request return code + UInt8 bValue; // Request return value +} LTW_REQ_REPLY_HEADER; + +typedef LTW_REQ_REPLY_HEADER LTW_REQ_GET_SET_PARM_REPLY; + +class RCX_USBTowerPipe_fbsd : public RCX_Pipe +{ +public: + RCX_USBTowerPipe_fbsd(); + ~RCX_USBTowerPipe_fbsd() { Close(); } + + virtual RCX_Result Open(const char *name, int mode); + virtual void Close(); + + virtual int GetCapabilities() const; + virtual RCX_Result SetMode(int mode); + + virtual long Read(void *ptr, long count, long timeout_ms); + virtual long Write(const void *ptr, long count); + +private: + enum { + kReadPacketSize = 8 + }; + + IOReturn OpenDevice(short vendorID, short productID); + IOReturn OpenInterface(); + IOReturn ControlRequest(UInt8 request, UInt16 value); + IOReturn ControlRequest(UInt8 request, UInt8 loByte, UInt8 hiByte) { + return ControlRequest(request, loByte + (hiByte << 8)); + } + + int fdCntrl; + int fdRd; + int fdWr; + + char *devname; +}; + + +RCX_Pipe* RCX_NewUSBTowerPipe() +{ + return new RCX_USBTowerPipe_fbsd(); +} + + +RCX_USBTowerPipe_fbsd::RCX_USBTowerPipe_fbsd() + : fdCntrl(0), devname(0) +{ +} + + +RCX_Result RCX_USBTowerPipe_fbsd::Open(const char *name, int mode) +{ + IOReturn err; + + if (mode != kNormalIrMode) return kRCX_PipeModeError; + + err = OpenDevice(kVendorID, kProductID); + PREQUIRENOT(err, Fail_OpenDevice); + + err = OpenInterface(); + PREQUIRENOT(err, Fail_OpenInterface); + + UInt8 range; + range = (strcmp(name, "short")==0) ? LTW_RANGE_SHORT : LTW_RANGE_MEDIUM; + ControlRequest(LTW_REQ_SET_PARM, LTW_PARM_RANGE,range); + + return 0; + +Fail_OpenInterface: +Fail_OpenDevice: + Close(); + return kRCX_OpenSerialError; +} + + +void RCX_USBTowerPipe_fbsd::Close() +{ + if (devname != NULL) { + close(fdWr); + close(fdRd); + close(fdCntrl); + devname = NULL; + } +} + + +int RCX_USBTowerPipe_fbsd::GetCapabilities() const +{ + return kNormalIrMode | kFastIrMode | kFastOddParityFlag | kAbsorb55Flag; +} + + +RCX_Result RCX_USBTowerPipe_fbsd::SetMode(int mode) +{ + switch(mode) { + case kNormalIrMode: + ControlRequest(LTW_REQ_SET_TX_SPEED, SPEED_COMM_BAUD_2400); + ControlRequest(LTW_REQ_SET_RX_SPEED, SPEED_COMM_BAUD_2400); + return kRCX_OK; + case kFastIrMode: + ControlRequest(LTW_REQ_SET_PARM, LTW_PARM_RANGE, LTW_RANGE_SHORT); + ControlRequest(LTW_REQ_SET_TX_SPEED, SPEED_COMM_BAUD_4800); + ControlRequest(LTW_REQ_SET_RX_SPEED, SPEED_COMM_BAUD_4800); + ControlRequest(LTW_REQ_SET_TX_CARRIER_FREQUENCY, 38); + return kRCX_OK; + default: + return kRCX_PipeModeError; + } +} + + +#define MAX_PACKET 200 + +long RCX_USBTowerPipe_fbsd::Write(const void *ptr, long length) +{ + const unsigned char *data = (const unsigned char *)ptr; + + int total = 0; + +// printf("Write %ld\n", length); + + while(length > 0) { + IOReturn err; + int count = length; + if (count > MAX_PACKET) + count = MAX_PACKET; + err = write(fdWr, (void *)data, count); + if (err == count) + err = 0; + PREQUIRENOT(err, Fail_WritePipe); + + length -= count; + data += count; + total += count; + } + +Fail_WritePipe: +// printf("Done %d\n", total); + return total; +} + + + +long RCX_USBTowerPipe_fbsd::Read(void *data, long length, long timeout_ms) +{ + const unsigned char *rdptr = (const unsigned char *)data; + IOReturn err; + int count; + int total = 0; + struct pollfd pfd; + +// printf("Read %ld, timeout %ld\n", length, timeout_ms); + while(length > 0) { + pfd.fd = fdRd; + pfd.events = POLLIN; + err = poll(&pfd, 1, timeout_ms); + if (err == 0) + break; + if (err == -1) { + if(errno == EINTR) + continue; + else + break; + } + count = length; + if (count > MAX_PACKET) + count = MAX_PACKET; + err = read(fdRd, (void *)rdptr, count); + if (err == -1) + break; + +// printf("err %d\n", err); + if (err == 0 || err == -1) + goto Fail_ReadPipe; + + count = err; + length -= count; + rdptr += count; + total += count; + } + +Fail_ReadPipe: +// printf("Got %d\n", total); + return total; +} + + +IOReturn RCX_USBTowerPipe_fbsd::OpenDevice(short vendorID, short productID) +{ + char *dn = "/dev/ugen0"; + int err, fd; + usb_device_descriptor_t usbdd; + + fd = open(dn, O_RDWR); + if (fd == -1) + return errno; + err = ioctl(fd, USB_GET_DEVICE_DESC, &usbdd); + if (err == -1) { + perror("ioctl error"); + return errno; + } +// printf("idVendor %d\n", UGETW(usbdd.idVendor)); +// printf("idProduct %d\n", UGETW(usbdd.idProduct)); + if (UGETW(usbdd.idVendor) != kVendorID || + UGETW(usbdd.idProduct) != kProductID) { + fprintf(stderr, "This is not an USB IR Tower!\n"); + return -1; + } + + devname = dn; + fdCntrl = fd; + + return 0; +} + + +IOReturn RCX_USBTowerPipe_fbsd::OpenInterface() +{ + char *dn; + int err, iov; + + dn = (char *)malloc(strlen(devname) + 2 + 1); + strcpy(dn, devname); + strcat(dn, ".1"); + fdRd = open(dn, O_RDONLY|O_NONBLOCK); + if (fdRd == -1) { + perror(dn); + return -1; + } + iov = 1; + err = ioctl(fdRd, USB_SET_SHORT_XFER, &iov); + if (fdRd == -1) { + perror("ioctl USB_SET_SHORT_XFER"); + return -1; + } + iov = 5000; + err = ioctl(fdRd, USB_SET_TIMEOUT, &iov); + if (fdRd == -1) { + perror("ioctl USB_SET_TIMEOUT"); + return -1; + } + + strcpy(dn, devname); + strcat(dn, ".2"); + fdWr = open(dn, O_WRONLY); + iov = 5000; +// ioctl(fdWr, USB_SET_TIMEOUT, &iov); + + return 0; +} + + +IOReturn RCX_USBTowerPipe_fbsd::ControlRequest(UInt8 request, UInt16 value) +{ + IOReturn err; + struct usb_ctl_request req; + LTW_REQ_GET_SET_PARM_REPLY reply; + + req.ucr_request.bmRequestType = UT_READ_VENDOR_DEVICE; + req.ucr_request.bRequest = request; + USETW(req.ucr_request.wValue, value); + USETW(req.ucr_request.wIndex, 0); + USETW(req.ucr_request.wLength, sizeof(reply)); + req.ucr_data = &reply; + + err = ioctl(fdCntrl, USB_DO_REQUEST, &req); + + // size of actual reply in req.wLenDone + //printf("%d %d %d\n", reply.wNoOfBytes, reply.bErrCode, reply.bValue); + + return err; +} diff --git a/lang/nqc/files/patch-aa b/lang/nqc/files/patch-aa index 6f12464af46c..338eb7133622 100644 --- a/lang/nqc/files/patch-aa +++ b/lang/nqc/files/patch-aa @@ -1,5 +1,5 @@ ---- Makefile.orig Sun Mar 24 23:34:39 2002 -+++ Makefile Tue Nov 19 13:35:48 2002 +--- Makefile.orig Tue Jan 28 06:24:21 2003 ++++ Makefile Thu Jan 30 20:19:25 2003 @@ -28,20 +28,20 @@ # # Pick your C++ compiler. @@ -25,7 +25,7 @@ # Link in any necessary C++ libraries # -@@ -50,19 +50,20 @@ +@@ -50,21 +50,22 @@ # installation information @@ -51,8 +51,11 @@ -CFLAGS = -pipe -Iplatform -Ircxlib -Inqc -Icompiler -Wall -Wstrict-prototypes -Wmissing-prototypes +CFLAGS += -Iplatform -Ircxlib -Inqc -Icompiler - USBOBJ = rcxlib/RCX_USBTowerPipe_none.o +-USBOBJ = rcxlib/RCX_USBTowerPipe_none.o ++USBOBJ = rcxlib/RCX_USBTowerPipe_fbsd.o + # + # Platform specific tweaks @@ -78,9 +79,6 @@ ifeq ($TARGET),solaris) # Solaris @@ -63,7 +66,7 @@ endif endif -@@ -89,7 +87,7 @@ +@@ -88,7 +86,7 @@ # wants to redefine the default serial name # ifndef DEFAULT_SERIAL_NAME @@ -72,20 +75,20 @@ endif CFLAGS += -DDEFAULT_SERIAL_NAME='$(DEFAULT_SERIAL_NAME)' -@@ -139,10 +137,10 @@ +@@ -140,10 +138,10 @@ $(MKDIR) bin - bin/nqc : compiler/parse.cpp $(OBJ) bin + bin/nqc : compiler/parse.cpp $(OBJ) - $(CC) -o $@ $(OBJ) $(LIBS) + $(CXX) -o $@ $(OBJ) $(LIBS) - bin/mkdata : mkdata/mkdata.cpp nqc/SRecord.cpp bin + bin/mkdata : mkdata/mkdata.cpp nqc/SRecord.cpp - $(CC) -o bin/mkdata -Inqc/ -Iplatform/ mkdata/mkdata.cpp nqc/SRecord.cpp + $(CXX) -o bin/mkdata -Inqc/ -Iplatform/ mkdata/mkdata.cpp nqc/SRecord.cpp # # clean up stuff -@@ -202,7 +200,7 @@ +@@ -203,7 +201,7 @@ # general rule for compiling # .cpp.o: diff --git a/lang/nqc/pkg-comment b/lang/nqc/pkg-comment deleted file mode 100644 index 90dccf63d95e..000000000000 --- a/lang/nqc/pkg-comment +++ /dev/null @@ -1 +0,0 @@ -A compiler for writing programs for the Lego RCX -- cgit v1.2.3