Mercurial > ecos
diff packages/services/gfx/mw/current/src/drivers/mou_mt.c @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | |
| children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/services/gfx/mw/current/src/drivers/mou_mt.c @@ -0,0 +1,165 @@ +/* + * MicroTouch touch panel driver for MicroTouch capacitive and resistive + * controllers at RS232 port. + * + * We expect the Microtouch Controller configured to 9600 Baud, 8 data bits, + * 1 stop bit, no parity + * + * Written by Holger Waechtler <hwaechtler@users.sourceforge.net> + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <termios.h> +#include "device.h" + +static int MT_Open(MOUSEDEVICE *pmd); +static void MT_Close(void); +static int MT_GetButtonInfo(void); +static void MT_GetDefaultAccel(int *pscale,int *pthresh); +static int MT_Read(MWCOORD *dx, MWCOORD *dy, MWCOORD *dz, int *bp); + +MOUSEDEVICE mousedev = { + MT_Open, + MT_Close, + MT_GetButtonInfo, + MT_GetDefaultAccel, + MT_Read, + NULL +}; + +static int mt_fd; + + +#define CMD(fd,x) \ + do { \ + write (fd, "\001" x "\r", strlen(x) + 2); \ + tcdrain(fd); \ + } while (0) + + + +/* + * Open up the mouse device. + */ +static int +MT_Open(MOUSEDEVICE *pmd) +{ + char *devname = "/dev/ttyS0"; + struct termios termios; + + if ((mt_fd = open (devname, O_RDWR | O_NONBLOCK)) < 0) { + fprintf (stderr, "error opening '%s'\n", devname); + exit (-1); + } + + tcgetattr (mt_fd, &termios); + + cfsetispeed (&termios, B9600); + cfsetospeed (&termios, B9600); + + cfmakeraw (&termios); + termios.c_cflag &= ~CBAUD; + termios.c_cflag = B9600; + termios.c_cflag |= CS8 | CREAD; + termios.c_oflag = 0; + termios.c_oflag &= ~(OCRNL | ONLRET); + + tcsetattr (mt_fd, TCSAFLUSH, &termios); + + CMD(mt_fd,"R"); + CMD(mt_fd,"AD"); + CMD(mt_fd,"PN812"); + CMD(mt_fd,"FT"); + CMD(mt_fd,"MS"); + CMD(mt_fd,"PL"); + + /* + * This is a sort of hack, but our embedded PPC was to slow to read all + * responses from the Microtouch controller. To get out of this we simply + * discard them ... + */ + usleep (250000); + tcflush (mt_fd, TCIOFLUSH); + + return 0; +} + +/* + * Close the mouse device. + */ +static void +MT_Close(void) +{ + if (mt_fd > 0) + close (mt_fd); + + mt_fd = 0; +} + +/* + * Get mouse buttons supported + */ +static int +MT_GetButtonInfo(void) +{ + return MWBUTTON_L; +} + + +/* + * doesn't makes sense for a touch panel ... + */ +static void +MT_GetDefaultAccel(int *pscale,int *pthresh) +{ + *pscale = 3; + *pthresh = 5; +} + + + +char buf [5]; +int bytes_in_buf = 0; + + +/* + * Attempt to read bytes from the mouse and interpret them. + * Returns -1 on error, 0 if either no bytes were read or not enough + * was read for a complete state, or 1 if the new state was read. + * When a new state is read, the current buttons and x and y deltas + * are returned. This routine does not block. + */ +static int +MT_Read(MWCOORD *dx, MWCOORD *dy, MWCOORD *dz, int *bp) +{ + if (bytes_in_buf == 5) { + bytes_in_buf = 0; + + *dx = ((buf[1] & 0x7f) | ((buf[2] & 0x7f) << 7)); + *dy = ((buf[3] & 0x7f) | ((buf[4] & 0x7f) << 7)); + *dx = (*dx * scrdev.xvirtres) >> 14; + *dy = scrdev.yvirtres - ((*dy * scrdev.yvirtres) >> 14); + *dz = 1; + + if (!(buf[0] & (1 << 6))) + *bp = 0; + else + *bp = MWBUTTON_L; + + return 2; + } + + if (read (mt_fd, buf + bytes_in_buf, 1) == 1) + bytes_in_buf++; + + if ((buf[bytes_in_buf-1] & 0x80) != 0) { + buf [0] = buf [bytes_in_buf-1]; + bytes_in_buf = 1; + } + + return 0; +} +
