修复“ThinkPad Compact USB键盘”固件中的错误

2021-06-19 09:43:11

多年来,我拥有并喜欢我的USB键盘,一个“Lenovo ThinkPad Compact USBKeyboard与TrackPoint”(KU-1255)。它很小且伴随着它的托架,你甚至不需要从键盘移动你的手来移动鼠标指针。不幸的是,联想远远超出了什么是有用的:他们在硬件中滚动了鼠标滚动,但是半折叠。

键盘固件支持不同的模式,其中禁用或激活中鼠标按钮。如果它被激活,则可以使用中鼠标utton。作为一个奖励,您可以获得一个中鼠标滚动:只要是按钮,垂直托管点移动被翻译成Scrollevents。但只是垂直和真正粗糙的方式,这样你就可以才能执行线路,但不接近像素明智。

此外,在滚动触发后释放中鼠标按钮触发Middlemouse单击事件,完全破坏滚动功能。

Linux在此工作,对于这个特殊的键盘,但在Windows或FreeBSD上,您将丢失。

联想没有认识到这个问题,而是给我发了一个新的键盘,而是假设这是一个硬件问题。

开始吧!首先,我们将键盘分开,看看里面有什么:Sonix SN8F2288FG。这是一个8位微控制器,具有12k字ROM,512 BRAM和奇怪的架构。

在Lenovo的网站上,您可以下载键盘的Updater。它包含固件二进制文件。首先

在玩一点之后,我找到了固件。它与0x5a.Search ...... A..20150511115912345678175912345678175912345678175912345621sn8f2288找到它。

然后,将该固件二进制文件放入免费的SN8 Disassembler andn8.当我开始时,我必须添加一些指令并将其他一些其他指示正确添加到二进制中正确解码。要验证,我通过组装和拆卸和拆卸了与SN8 C工作室进行交叉检查。

然后,是时候在纸上打印大会,坐下来理解它。

过了一会儿,我发现了实现“功能”的地方,我不喜欢它。我也碰到了固件版本辨别我的修改过源:

--- orig /固件 - annotated-sn8cstudio.asm 2019-06-10 22:06:46.782287000 +0200 +++补丁/固件。asm 2019-06-10 22:06:54.378983000 + 0200 @@ -2188,13 +2188,16 @@ label_06d5:; < - 06d3调用iic_stop;仅应用速度因子if!middle_button_pressed(即滚动): - bts0 flag_middle_button_pression- jmp tp_skip_apply_speed +; bts0 flag_middle_button_pressed +; jmp tp_skip_apply_speed + nop + nop调用tp_apply_speed_x呼叫tp_apply_speed_y调用copy_clamp_tp_mouse_pos; tp_mouse_d? - > mouse_d? tp_skip_apply_speed:; < - 06d7- bts1 flag_middle_button_pressed +; bts1 flag_middle_button_pressed + bset 0x14.6;很酷,足够的空间适合。因此,报告了按钮3正确报告。 ret mov a,tp_mouse_dx mov temp_maybe_tp_dx,a @@ -2439,8 +2442,10 @@ bclr mouse_buttons.1 bts0 tp_mouse_buttons.1 bset mous_buttons.1- bts0 flag_thinkpad_preferred_scrolling-jmp label_0792 +; bts0 flag_thinkpad_preferred_scrolling +; JMP Label_0792 + NOP + NOP BCLR鼠标_BUTTONS.2 BTS0 TP_MOUES_BUTTONS.2 BSET MOUSE_BUTTONS.2 @@ -2462,7 +2467,8 @@ bset flag_middle_button_pressed jmp label_07b6 label_07a0:; < - 079b-bclr mouse_buttons.2 +; bclr mouse_buttons.2 + nop mov a,tp_mouse_buttons和a,#0x04 cmprs a,0x78 @@ -4701,7 + 4707,8 @@ dw 0x0017; .. DW 0x0047; .g dw 0x0060; 。(0x0030; .0+; DW 0x0030; .0+ DW 0x0033;增量版DW 0x0003; .. DW 0x0001; .. DW 0x0002; ..

那是一个容易的部分:用0x5a再次xor并将它放入同一个地方。二进制文件。十六进制编辑足够了。

不幸的是,我觉得我不能发表修补的更新程序。但这是您需要申请的斑点:

--- Orig.hex 2019-06-10 22:50:40.986155000 +0200 +++补丁.hex 2019-06-10 22:50:53.745130000 + 0200 @@ -21893,7 + 21893,7 @@ 00057dc0 0d 0a 0d 0a 0d 0a 46 69 72 6d 77 61 72 65 20 75 |固件U | 00057DD0 70 64 61 74 65 20 63 6F 6D 70 6C 65 74 65 64 0D | PDATE完成。| 00057DE0 0A 43 75 75 72 72 65 6E 74 20 46 69 72 6D 77 61 72 |电流淬火| -00057DF0 65 20 56 65 72 73 69 6F 6E 3A 20 56 33 2E 33 30 | E版本:V3.30 | + 00057DF0 65 20 56 65 72 73 69 6F 6E 3A 20 56 33 22 3 33 | E版本:V3.33 | 00057E00 0D 0A 50 6C 65 61 73 65 20 72 65 70 6C 75 67 20 | ..插件翻新| 00057E10 6B 65 79 62 6F 61 72 64 00 00 00 00 50 72 6F 74 |键盘.... PROT | 00057E20 6F 63 6F 6C 20 48 61 6E 64 73 68 61 6B 65 20 45 | OCOL握手E | @@ -24452,8 + 24452,8 @@ 00074200 74 9C 5A 54 7B 9C 0F 77 39 9C 01 9C 17 20 8E DC | T.Zt {.. W9 .... .. | 00074210 D3 9C DA 5C 88 DC FE 9C D3 9C 1F 45 FE 9C DD 9D | ...... ....... E ...... | 00074220 D3 9C 68 45 FE 9C D3 9C A5 47 5B 4E 69 45 FE 9C | .. HE ..... G [NIE .. | -00074230 D3 9C FD 9C 17 19 8F DC 17 11 74 9C 48 0C 81 DC | .......... Th .. | -00074240 54 92 6B 92 ED 9D 48 04 5A 54 68 44 6E 45 69 44 | TK..H.ZTHDNEID | +00074230 D3 9C FD 9C 17 19 8F DC 17 11 74 9C 5A 5A 5A 5A 5A | .......... T.ZZZZIZZ | +00074240 54 92 6B 92 ED 9D 4E 14 5A 54 68 44 6E 45 69 44 | TK..N.ZTHDEID | 00074250 6F 45 60 05 BD DC 6E 44 A5 47 5B 4E 6E 45 DC 38 | OEN ... ND.G [NNE.8 | 00074260 6E 53 6F 05 B5 DC 604A5 47 5B 4E 6F 45 6E 44 | NSO ... OD.G [正常| 00074270 6F 78 DC 28 4B DD 68 44 6E 44 44 6F 45 6E 05 6。(K.HDNeidoen。| @@ -24475,10 +24475,10 @@ 00074370 6C 2D 2E DD 6C 49 2F DD 6C 45 69 44 6C 49 6C 44 | L - Li / .Leidlild | 00074380 48 7E DC 20 5A 54 6C 45 A5 77 6A 49 4E 0F D9 DD | H〜。Ztle.Wjin ... | 00074390 49 10 49 19 DF DD 49 18 49 11 2D DD 5A 54 76 1A | II..II-.ZTV。| -000743A0 1F 0A 76 12 76 1B 1F 0B 76 13 4E 0F C8 DD 76 18 | ..VV..Vn..D。| + 000743A0 1F 0A 76 12 76 1B 1F 0B 76 13 5A 5A 5A 5A 76 18 | ..VV...V.ZZZV。| 000743B01F 08 76 10 76 44 77 5D CD DD 49 18 C0 DD 76 44 | ..V .vdw] .. i ... VD | 000743C0 77 45 49 10 4E 0F FA DD 48 1C 76 08 48 14 4 EC DD | WEI.N ... HVH .. | -000743D0 76 18 1F 44 5E 70 22 5D FD DD 49 1C EC DD 1F 44 | v..d ^ p"] .. i .... d | + 000743d0 5a 5a 1f 44 5e 70 22 5d fd dd 49 1c Ec Dd 1f 44 | zz.d ^ P"] .. I .... D | 000743E0 5E 70 22 45 49 14 22 00 E9 DD 5A 77 72 45 5E 77 | ^ P" ei。" ... zwre ^ w | 000743F0 73 45 48 14 EC DD 72 71 73 71 48 1C 5A 54 68 44 | SEH ... RQSQH.ZTHD | 00074400 DC 2A 94 DD 49 10 74 0D 9C DD 68 44 74 49 68 0D |。* ..它......hdtih。| @@ -24728,7 +247287 @@ 00075340 5C 74 37 75 2D 35 04 D5 0B 74 2F 45 7A 77 CD 75 | \ T7U-5 .. .t / ezw.u | 00075350 13 D6 1A 77 CD 75 1C DA 48 5A 5B 5A 5A 5A 58 5A | ... W.U..HZ [ZZZXZ | 00075360 5A 5A 5A 5A 5A 5A 52 5A B5 5A 4D 5A 1D 5A 3A 5A | ZZZZZZZ.ZMZ.Z:Z | -00075370 6A 5A 59 5A 5A 5A 58 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5“5”5A 5A 5A 5A 5A 5A | JZYZ [Zxzzz [Zszxz | +00075370 69 5A 59 5A 5B 5A 58 5A 5A 5A 5A 5A 53 5A 58 5A | IZYZ [Zxzzz [Zszxz | 00075380 61 5A 5A 5A 58 5A 5B 5A 5A 5A 5A 5A 68 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A | AZZZXZ [ZZZ.ZHZSZ | 00075390 5E 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A | ^ ZZZZ [ZYZ [ZZZ | 000753A0 53 5A 7B 5A 5A 5A 5A 5A 5A 5A 5A 5A 78 5A 0B 5A | SZ {ZZZ [ZZZ1 |