开发者

how to read absolute positions of tap from Cirque touchpad in linux

开发者 https://www.devze.com 2023-01-11 13:51 出处:网络
we have one of Cirque touchpads. http://www.cirque.com/downloads/docs/tsm9925.pdf now we want to read absolute position of tap from this touchpad using c\\c++ application. unfortunately company deve

we have one of Cirque touchpads. http://www.cirque.com/downloads/docs/tsm9925.pdf

now we want to read absolute position of tap from this touchpad using c\c++ application. unfortunately company developed only windows drivers but we need to read positions in the linux. we tried to use /dev/input/eventN subsystem but received only direction of finger moving and speed of finger moving.

is it possible and how can 开发者_开发知识库we do this?


From your supplied link:

For custom functionality at the product design stage, we offer software that 
allows OEMs to enable, disable or personalize advanced settings and/or 
reprogram the touch sensitive area.

I'd suggest contacting Cirque directly


Touchpads rarely report absolute positions.

Just so that you have some answer to accept ;)


This is how it works:

The Cirque Smart CAT (model GDU410 - this is an OLD model!) reports an 8 byte packet. Initially the packet looks like this:

Byte 0, bit 0: Left button
Byte 0, bit 1: Right button
Byte 0, bit 2: Side buttons (they cannot be distinguished)
Byte 1: Relative X data
Byte 2: Relative Y data
Bytes 3-7: 0

To switch to absolute mode you'll have to send the following USB control requests to the device:

unsigned char buf[8];
do {
    Usb_Control_Request(Type=0xC1, Request=0x6A, Index=0,
        Value=0, Data Length=8, Data Buffer=buf)
} while(buf[0] & 8);
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xBB, Value=1, No data)
do { ... /* C1/6A, see above */ } while(buf[0] & 8);
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xB5, Value=0x3E0, No data)
do { ... /* C1/6A */ } while(buf[0] & 8);
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xA2, Value=0xFEE, No data)
do { ... /* C1/6A */ } while(buf[0] & 8);
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xB4, Value=0xE, No data)
do { ... /* C1/6A */ } while(buf[0] & 8);
Usb_Control_Request(Type=0x41, Request=0x64, Index=0, Value=0, No data)
do { ... /* C1/6A */ } while(buf[0] & 8);

Maybe under Linux this can be done using "libusb". Although I already did some driver development under Linux I did not use "libusb", yet.

After doing this the 8-byte packets look like this:

Byte 0: Buttons, as before
Bytes 1-3: 0
Byte 4: low 8 bits of X finger position
Byte 5: bits 0-2: high 3 bits of X finger position
        bits 3-7: low 5 bits of Y finger position
Byte 6: bits 0-5: high 6 bits of Y finger position
Byte 7, low 7 (?) bits: non-zero if finger touches pad, 0 if not
        some pads report the finger pressure;
        MAYBE this is done in this field.

Finger positions:
X position: left ~0x790, right ~0x70
Y position: top ~0, bottom ~0x5B0

The device driver provided by Cirque uses the absolute position mode to perform scrolling and similar functions that depend on the absolute finger position.

0

精彩评论

暂无评论...
验证码 换一张
取 消