Board pinout TPM754
---------------------------------
1 BUTTON2 P3.2(27)
2 BUTTON1 P3.1(26)
3 BUTTON0 P3.0(25)
4 TP_CLK INT0(24)
5 VCC
6 GND
7 EX.CKL INT1(4)
8 TP_DATA TXD(2)
9 EX.DATA RXD(1)
10 RST RST(5)
Board pinout TPM754
---------------------------------
1 RST RST(5)
2 EX.DATA RXD(1)
3 TP_DATA TXD(2)
4 VCC
5 TP_CLK INT0(24)
6 EX.CKL INT1(4)
7 GND
8 BUTTON0 P3.0(25)
9 BUTTON1 P3.1(26)
10 BUTTON2 P3.2(27)
I salvaged a Lenovo Trackpoint device from an X60/X61 laptop keyboard in order to use it as a USB pointing device.
This is my prototype.
It is connected to PC via ps/2-usb converter.
I use it on Xorg and have no problem.
I undertood that trackpoint should be in the correct place :)Show Image(http://geekhack.org/attachment.php?attachmentid=8213&stc=1&d=1267915779)
What was the donor source of the trackpoint, thinkpad keyboard? Any details/diagram of how you wired it up would be appreciated.
Yes. I got the trackpoint unit from Thinkpad keyboard.
Ugly soldering and wiring under the hood.
It needs only push switches, 2 pullup resisters and PS/2 cable.
..
Check out this IBM Ergonomics page...
and I like this idea 'two'....http://www.almaden.ibm.com/cs/user/tp/thand.html :smile:
...and Hasu...thank you for posting that circuit diagram...was myself curious as to how you could make a salvaged TP work...
.........
Spec57
I punted and just got my hands on some older T40 and T42 keyboards. These have Trackpoint assemblies that use the older style 28-pin controller IC. I'll post some more details soon. The keyboards that I got were part of a lot that had been plundered for their key caps, but unfortunately a lot of them had the square post for the Trackpoint nub removed also, which is kind of puzzling. For anyone interested, the Trackpoint sensor is a set of resistive strain gauges printed directly onto a very thin PC board. There is a thin post that is epoxied to the center of a cross structure routed into the board. The black post that you see when you remove the red cap is actually another shim that fits around the thinner post that is epoxied on. If anyone knows of a source for this shim cap piece I'd love to know. (Longshot, I know). Anyway I've taken some pics, but I haven't had time to post them anywhere yet, but I will soon.I know the shim cap you're talking about. I take my trackpoint cap off to clean it pretty often, figure mild cleansing a bit more often is the way to go. If you let finger gunk build up... Well, not only is it nasty, but suspect finger oil/acid speeds breakdown and "smoothing" of the textured surface. And the textured surface doesn't really lend itself to cleaning without damaging the texture. Man I hate seeing an old cap that looks like it's never been cleaned, especially if the owner wants me to use their keyboard for some reason, ewww!
The older ones were one piece.
Looks like something the Mayans worshipped in Mel Gibson's Apocalypto.
Or, maybe, thinking a bit more creatively, the older style Dells caps pictured here (http://geekhack.org/showpost.php?p=162906&postcount=10) would fit without the shim? I don't have any to try, not even sure you can get them still, again just thinking out loud.
I just tried the cap from a Dell Latitude D600 and it is too loose. Good idea though. Out of 10 keyboards only 3 still had the shim, and 3 of them had the stick ripped clean off.Fabricating that seems daunting. I mean, you could make a mold and go into production but hardly seems worth it for a handful. Years ago I had a buddy who fabricated all sort of things about of metal by cutting and bending it, maybe you could cut and bend some thin tin to make a small cap that would work. Or, if you can get some plastic or metal of the right thinkness, just cut out 4 side pieces and a top then just glue them on to the top of the stick, a permanent version of the removable cap. I don't think you'd need that circular base, the earlier sticks don't have them, am I wrong? The material would have to be durable and the right glue would be critical. Better than letting them go to waste, and you can experiment with the one you tore down.
The shim pictured in your post is exactly the part I'm talking about.
I tore one of the assemblies down that had the stick ripped off. I attached photos of the front and back of the actual strain gauge board. On the front side you can see the epoxy residue at the center of the cross-shaped section of the board where the stick was attached, and on the back you can see the black resistive elements that make up the sensor array.
The pinouts of my new TP devices are the same as what hasu's first diagram shows. I might experiment a little with gluing my own sticks onto the sensor board or fabbing shims like TexasFlood suggests. I don't think I have suitable glue on hand so it may be a while until I get to it. In the meantime I have some that will work.
do you have a picture of it also showing the pins?Somehow images failed to embed properly. There they are: https://dump.*****eese.net/files/ewyguty/photo_2016.03.06_15.45.09.92.jpg https://dump.*****eese.net/files/uxucahe/photo_2016.03.06_15.46.18.33.jpg
isn't it maybe similar to any of the ones I've posted above maybe? :)
The link is not working. :(Quote from: dnewcome;160313I salvaged a Lenovo Trackpoint device from an X60/X61 laptop keyboard in order to use it as a USB pointing device.
Depending on what you want to do you could just feed it into a ps2 to usb converter (TP units are usually ps2). You will lose driver support though.
Wiki (http://geekhack.org/showwiki.php?title=PS2-to-USB+adapters)
Bus 001 Device 054: ID 17ef:6009 Lenovo ThinkPad Keyboard with TrackPoint
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x17ef Lenovo
idProduct 0x6009 ThinkPad Keyboard with TrackPoint
bcdDevice 1.22
iManufacturer 1 Lite-On Technology Corp.
iProduct 2 ThinkPad USB Keyboard with TrackPoint
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 59
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 65
Report Descriptor: (length is 65)
Item(Global): Usage Page, data= [ 0x01 ] 1
Generic Desktop Controls
Item(Local ): Usage, data= [ 0x06 ] 6
Keyboard
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Global): Usage Page, data= [ 0x07 ] 7
Keyboard
Item(Local ): Usage Minimum, data= [ 0xe0 ] 224
Control Left
Item(Local ): Usage Maximum, data= [ 0xe7 ] 231
GUI Right
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0x01 ] 1
Item(Global): Report Count, data= [ 0x08 ] 8
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report Count, data= [ 0x08 ] 8
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Main ): Input, data= [ 0x01 ] 1
Constant Array Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Usage Page, data= [ 0x08 ] 8
LEDs
Item(Local ): Usage Minimum, data= [ 0x01 ] 1
NumLock
Item(Local ): Usage Maximum, data= [ 0x03 ] 3
Scroll Lock
Item(Global): Report Count, data= [ 0x03 ] 3
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Main ): Output, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report Count, data= [ 0x01 ] 1
Item(Global): Report Size, data= [ 0x05 ] 5
Item(Main ): Output, data= [ 0x01 ] 1
Constant Array Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Usage Page, data= [ 0x07 ] 7
Keyboard
Item(Local ): Usage Minimum, data= [ 0x00 ] 0
No Event
Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
Item(Global): Report Count, data= [ 0x06 ] 6
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Main ): Input, data= [ 0x00 ] 0
Data Array Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 185
Report Descriptor: (length is 185)
Item(Global): Usage Page, data= [ 0x01 ] 1
Generic Desktop Controls
Item(Local ): Usage, data= [ 0x02 ] 2
Mouse
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Global): Report ID, data= [ 0x01 ] 1
Item(Local ): Usage, data= [ 0x01 ] 1
Pointer
Item(Main ): Collection, data= [ 0x00 ] 0
Physical
Item(Global): Usage Page, data= [ 0x09 ] 9
Buttons
Item(Local ): Usage Minimum, data= [ 0x01 ] 1
Button 1 (Primary)
Item(Local ): Usage Maximum, data= [ 0x03 ] 3
Button 3 (Tertiary)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0x01 ] 1
Item(Global): Report Count, data= [ 0x03 ] 3
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report Count, data= [ 0x01 ] 1
Item(Global): Report Size, data= [ 0x05 ] 5
Item(Main ): Input, data= [ 0x01 ] 1
Constant Array Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Usage Page, data= [ 0x01 ] 1
Generic Desktop Controls
Item(Local ): Usage, data= [ 0x30 ] 48
Direction-X
Item(Local ): Usage, data= [ 0x31 ] 49
Direction-Y
Item(Global): Logical Minimum, data= [ 0x81 ] 129
Item(Global): Logical Maximum, data= [ 0x7f ] 127
Item(Global): Report Count, data= [ 0x02 ] 2
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Main ): Input, data= [ 0x06 ] 6
Data Variable Relative No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Item(Main ): End Collection, data=none
Item(Global): Usage Page, data= [ 0x01 ] 1
Generic Desktop Controls
Item(Local ): Usage, data= [ 0x80 ] 128
System Control
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Global): Report ID, data= [ 0x02 ] 2
Item(Global): Usage Page, data= [ 0x01 ] 1
Generic Desktop Controls
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0x01 ] 1
Item(Global): Report Count, data= [ 0x08 ] 8
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Local ): Usage Minimum, data= [ 0x81 ] 129
System Power Down
Item(Local ): Usage Maximum, data= [ 0x88 ] 136
System Menu Exit
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Item(Global): Usage Page, data= [ 0x0c ] 12
Consumer
Item(Local ): Usage, data= [ 0x01 ] 1
Consumer Control
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Global): Report ID, data= [ 0x03 ] 3
Item(Global): Report Count, data= [ 0x08 ] 8
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0x01 ] 1
Item(Local ): Usage, data= [ 0xe9 ] 233
Volume Increment
Item(Local ): Usage, data= [ 0xea ] 234
Volume Decrement
Item(Local ): Usage, data= [ 0xe2 ] 226
Mute
Item(Local ): Usage, data= [ 0xb7 ] 183
Stop
Item(Local ): Usage, data= [ 0xcd ] 205
Play/Pause
Item(Local ): Usage, data= [ 0xb5 ] 181
Scan Next Track
Item(Local ): Usage, data= [ 0xb6 ] 182
Scan Previous Track
Item(Local ): Usage, data= [ 0x94 0x01 ] 404
AL Local Machine Browser
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Local ): Usage, data= [ 0x03 ] 3
Programmable Buttons
Item(Main ): Collection, data= [ 0x02 ] 2
Logical
Item(Global): Usage Page, data= [ 0x09 ] 9
Buttons
Item(Local ): Usage Minimum, data= [ 0x10 ] 16
(null)
Item(Local ): Usage Maximum, data= [ 0x17 ] 23
(null)
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Usage Page, data= [ 0x09 ] 9
Buttons
Item(Local ): Usage Minimum, data= [ 0x18 ] 24
(null)
Item(Local ): Usage Maximum, data= [ 0x1f ] 31
(null)
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Item(Global): Usage Page, data= [ 0x08 ] 8
LEDs
Item(Global): Report Count, data= [ 0x02 ] 2
Item(Local ): Usage, data= [ 0x09 ] 9
Mute
Item(Local ): Usage, data= [ 0x21 ] 33
Microphone
Item(Main ): Output, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report Count, data= [ 0x01 ] 1
Item(Global): Report Size, data= [ 0x06 ] 6
Item(Main ): Output, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Item(Global): Usage Page, data= [ 0x01 0xff ] 65281
(null)
Item(Local ): Usage, data= [ 0x01 ] 1
(null)
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Global): Report ID, data= [ 0x04 ] 4
Item(Global): Report Count, data= [ 0x01 ] 1
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
Item(Local ): Usage, data= [ 0x20 ] 32
(null)
Item(Main ): Feature, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Local ): Usage, data= [ 0x21 ] 33
(null)
Item(Main ): Feature, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Local ): Usage, data= [ 0x22 ] 34
(null)
Item(Main ): Feature, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Local ): Usage, data= [ 0x23 ] 35
(null)
Item(Main ): Feature, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
Device Status: 0x0000
(Bus Powered)
I've never seen the insides of it and how it is, maybe post some fotos when you have it and opened it :)
well if you want to have full trackpoint support with scrolling with middle buttone etc I think the best solution is to put use a teensy with tmk firmware on it and use that one as a ps2 to usb converter: hasu did a great job there and the ps2 mouse to usb conversion is done magnificently!
have a look at tmk on github.
tent:wq
Thank you Hasu!!
What I want is:
- a tap on the trackpoint = left button click
- change sensitivity of the trackpoint (pointer speed)
- of course, scrolling with the trackpoint when the middle button is pressed
Standard mouse driver does not allow me to do that.
Thank you Hasu!!
What I want is:
- a tap on the trackpoint = left button click
- change sensitivity of the trackpoint (pointer speed)
- of course, scrolling with the trackpoint when the middle button is pressed
Standard mouse driver does not allow me to do that.
My firmware doesn't support first two of the list. You can configure those with sending commands to TrackPoint with firmware but you will have to write code.