联想拯救者 R720 键盘矩阵逆向

联想拯救者R720 键盘矩阵逆向

朋友托我帮他的R720笔记本改装成KVM.于是便有了此文.

键盘介绍

主流键盘基本上都是矩阵键盘.这种方式比较节省IO.这块R720也不例外.
R720的键盘一共有96个键,用矩阵键盘的方式,理论上需要(6+16=22)个IO.(其实还是挺多的)
为了避免鬼键,实际的接线比理想情况下复杂.
而且相较于很多DIY机械键盘的直来直去线路:
常见
R720这块键盘的内部Wiring就显得很乱了:
R720
刚测出结果的时候,总感觉自己一定是弄错了什么地方.直到后来搜到了一款名叫Framework Laptop的笔记本,有着类似的KeyMap才放下心来.

KeyMap测绘

搜到一篇教人把笔记本改装为KVM的文章,文章里面提到了矩阵键盘驱动控制模块Monkey.
我一看这不和ATMEGA32U4差不多吗,应该是同一个系列的产品,淘宝上这东西卖50.这不是要了我的命吗.
自从去年单片机涨价后,Atmel的产品到现在也没恢复过去的价格,觉得自己现在要是买了就是纯纯大冤种.
况且完全可以自己做一个类似的东西,当时手上有这么多IO的板子就一个Raspberry Pi Pico,而QMK也支持了Pico,于是先借助Pico对KeyMap进行测绘.
得到如下结果

Excel

你问我怎么知道Row Pin和Col Pin的,这不是巧了吗,Google一下找到了同模具笔记本的原理图(网站).
顺便还知道了触摸板引脚定义,后面直接开启QMK的PS/2鼠标支持顺便把触摸板一起驱动了.
![32P-0.8mm-FPC](https://github.com/chaosgoo/blog_pic/blob/master/oss_backup/blog_pic/r720hacking/KB_FPC_Pin_Define.jpg?raw=true

Schematic

得到Key Map后,就可以开始画板子的工作了.
迫于当时无法使用Pico编译出支持PS/2 Mouse的固件,所以把主控换成了常见的ATMEGA32U4.
换主控后,IO开始紧缺了,不过没关系.可以使用拓展IO的芯片来应付这种情况.
看了一眼QMK仓库里面的方案,大部分都是使用的输出IO拓展来解决问题.
非常不巧的是,这块键盘的扫描方向和常规键盘相反,所以不出意外的话我就要出意外了.
于是购入74HC595对输出IO进行拓展并完美的踩了坑.重新检查才意识到我得使用74HC165拓展输入IO才行.

拖拉好久并且又踩到了PS/2 Mouse必须使用指定的IO驱动等好几个坑,最终绘制出下面使用74HC165原理图的方案(沉痛浪费很多次JLC免费打板机会.)

![原理图](https://github.com/chaosgoo/blog_pic/blob/master/oss_backup/blog_pic/r720hacking/photo_2022-12-10_20-49-26.jpg?raw=true

QMK Pin Map

参考测绘出的Key Map,再借助网页工具得到最终QMK固件所需的KeyMap
为了让多媒体键工作正常,于是设置了两层Key Map.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_pa(
KC_PMNS, KC_PSLS, KC_P0, KC_LALT, KC_SPC, KC_Z, KC_B, KC_N, KC_DOWN, KC_LSFT, KC_PAST, KC_LCTL, KC_UP, KC_ENT, KC_F8,
KC_C, KC_Q, KC_RALT, KC_X, KC_V, KC_M, KC_DOT, KC_RSFT, KC_COMM, KC_RCTL, KC_SLSH, KC_QUOT,
KC_PPLS, KC_P9, MO(1), KC_E, KC_F2, KC_G, KC_H, KC_BSLS, KC_F7, KC_P8, KC_MINS, KC_RGHT,
KC_P2, KC_LGUI, KC_TAB, KC_F4, KC_F1, KC_T, KC_Y, KC_O, KC_F6, KC_F9, KC_F12, KC_PSLS,
KC_P3, KC_P7, KC_GRV, KC_CAPS, KC_S, KC_5, KC_6, KC_F10, KC_F5, KC_0, KC_EQL, KC_DEL,
KC_PDOT, KC_1, KC_3, KC_2, KC_4, KC_7, KC_9, KC_8, KC_P, KC_BSPC, KC_P4,
KC_P1, KC_F3, KC_W, KC_R, KC_U, KC_F11, KC_I, KC_LEFT, KC_LBRC, KC_RBRC, KC_P5,
KC_NUM, KC_A, KC_ESC, KC_F, KC_J, KC_L, KC_K, KC_APP, KC_SCLN, KC_D, KC_P6),

LAYOUT_pa(
KC_PAUS, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_MPRV, KC_TRNS, KC_TRNS, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_END,
KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_INS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};

实物

实物

遗憾

背光的电压是5V,但是我没有适配.我已经过了那个喜欢背光的年纪了.

More

笔记本主板的那个叫啥BoardView也下载到了,再对着这玩意人肉Convert(测量,然后手动绘制)一下就得到了DWG图.
知道了精确的开孔,再画板子就方便固定了

![Draw Outline](https://github.com/chaosgoo/blog_pic/blob/master/oss_backup/blog_pic/r720hacking/outline_drawing.jpg?raw=true

参考资料

老旧笔记本改造成便携KVM
Framework Laptop Key Matrix
QMK Firmware
Laptop Bios & Schematics