Lilliput 7" touchscreen LCD
John Hay
jhay at icomtek.csir.co.za
Tue Jun 15 00:47:51 PDT 2004
On Fri, Jun 11, 2004 at 02:43:19PM -0600, Nick Rogness wrote:
> On Fri, 11 Jun 2004, John Hay wrote:
>
> > On Thu, Jun 10, 2004 at 05:53:15PM -0600, Nick Rogness wrote:
> > >
> > > Does anyone know if there exists a driver for the Lilliput 7" touchscreen
> > > LCD for FreeBSD? Drivers exist for Linux, Mac, & Win.
> > >
> > > People appear to be using a USB touchkit driver from eGalax, Inc:
> > >
> > > http://www.egalax.com.tw/Download.htm
> > >
> > > It is a usb device, so just wondering if anyone has anything written for
> > > this or could provide information where to find it.
> >
> > Interesting, I just bought one myself. :-) There is a NetBSD driver for
> > it, uep(4). I had a quick look at it and one "issue" I have with it, is
> > that they push the data into their wscons driver, so we will have to do
> > something else there. I did thought of making the data available to the
> > moused daemon, but I'm not sure if that is doable because mice normally
> > work in relative values, while the touch screen work with absolute
> > values.
> >
> > I see that their Linux drivers ship with source, so maybe one can use
> > their X driver and make our kernel driver such that the two can work
> > together?
>
> That would be ideal. I have the source for the Linux driver
> available (which includes the x86driver, Linux usb driver, and
> userland apps) at:
>
> http://www.rapidnet.com/~nick/lilliput/touchkit.tgz
>
> I REALLY want to get a usb driver written for this thing. Too bad
> I know jack squat about the usb stack in FreeBSD. I guess it's
> time to do some serious learning.
>
> Any pointers would be helpful. I could use some help if you or
> anyone is interested and doesn't mind answering stupid questions.
Ok, I wrote a little program using the ugen device just to see how to
access the device. Actually if you are not interested in sending
anything to the device, you can just open /dev/ugen0.1 and read the
touch values.
I'll look at modifying the NetBSD uep(4) device driver later this week
so that one can just open /dev/uep0 and read and write to it. That
should make it useable to the linux/X driver I think.
I'm just a little slow because of flu at the moment. :-/
John
--
John Hay -- John.Hay at icomtek.csir.co.za / jhay at FreeBSD.org
##################### tstouch.c ######################
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/uio.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <dev/usb/usb.h>
int
main(int argc, char **argv)
{
unsigned char txb[4], rxb[100];
int fd, wrfd, ret, x, y;
usb_device_descriptor_t usbdd;
struct usb_ctl_request req;
wrfd = open("/dev/ugen0", O_RDWR);
if (wrfd == -1) {
printf("Oops(1), could not open ugen0\n");
return 1;
}
ret = ioctl(wrfd, USB_GET_DEVICE_DESC, &usbdd);
if (ret == -1) {
printf("ioctl error\n");
return 1;
}
printf("idVendor 0x%X\n", UGETW(usbdd.idVendor));
printf("idProduct 0x%X\n", UGETW(usbdd.idProduct));
fd = open("/dev/ugen0.1", O_RDONLY);
if (fd == -1) {
printf("Oops(1), could not open ugen0.1\n");
return 1;
}
txb[0] = 0x0a;
txb[1] = 0x01;
txb[2] = 'A';
req.ucr_request.bmRequestType = UT_WRITE_VENDOR_DEVICE;
req.ucr_request.bRequest = 0;
USETW(req.ucr_request.wValue, 0);
USETW(req.ucr_request.wIndex, 0);
USETW(req.ucr_request.wLength, 3);
req.ucr_data = txb;
ret = ioctl(wrfd, USB_DO_REQUEST, &req);
if (ret != 0) {
printf("Oops ioctl returned %d\n", ret);
return 1;
}
ret = read(fd, rxb, 3);
if (ret != 3) {
printf("Oops(3) only read %d bytes\n", ret);
return 1;
}
printf("Check Active %2X %2X %c\n", rxb[0], rxb[1], rxb[2]);
usleep(5000);
txb[0] = 0x0a;
txb[1] = 0x01;
txb[2] = 'D';
req.ucr_request.bmRequestType = UT_WRITE_VENDOR_DEVICE;
req.ucr_request.bRequest = 0;
USETW(req.ucr_request.wValue, 0);
USETW(req.ucr_request.wIndex, 0);
USETW(req.ucr_request.wLength, 3);
req.ucr_data = txb;
ret = ioctl(wrfd, USB_DO_REQUEST, &req);
if (ret != 0) {
printf("Oops ioctl returned %d\n", ret);
return 1;
}
ret = read(fd, rxb, 2);
if (ret != 2) {
printf("Oops(3) only read %d bytes\n", ret);
return 1;
}
ret = read(fd, &rxb[2], rxb[1]);
if (ret < 2) {
printf("Oops(3) only read %d bytes\n", ret);
return 1;
}
rxb[2 + rxb[1]] = '\0';
printf("Firmware %2X %2X %c %s\n", rxb[0], rxb[1], rxb[2], &rxb[3]);
usleep(5000);
txb[0] = 0x0a;
txb[1] = 0x01;
txb[2] = 'E';
req.ucr_request.bmRequestType = UT_WRITE_VENDOR_DEVICE;
req.ucr_request.bRequest = 0;
USETW(req.ucr_request.wValue, 0);
USETW(req.ucr_request.wIndex, 0);
USETW(req.ucr_request.wLength, 3);
req.ucr_data = txb;
ret = ioctl(wrfd, USB_DO_REQUEST, &req);
if (ret != 0) {
printf("Oops ioctl returned %d\n", ret);
return 1;
}
ret = read(fd, rxb, 2);
if (ret != 2) {
printf("Oops(3) only read %d bytes\n", ret);
return 1;
}
ret = read(fd, &rxb[2], rxb[1]);
if (ret < 2) {
printf("Oops(3) only read %d bytes\n", ret);
return 1;
}
rxb[2 + rxb[1]] = '\0';
printf("Type %2X %2X %c %s\n", rxb[0], rxb[1], rxb[2], &rxb[3]);
while(1) {
ret = read(fd, rxb, 5);
if (ret != 5) {
printf("out of sync\n");
}
if ((rxb[0] & 0xfe) != 0x80) {
printf("out of sync, start %2X\n", rxb[0]);
return 1;
}
x = rxb[2];
x |= rxb[1] << 7;
y = rxb[4];
y |= rxb[3] << 7;
printf("X %4d, Y %4d, %s\n", x, y, rxb[0] & 1 ? "down" : "up");
}
return 0;
}
More information about the freebsd-hardware
mailing list