[键盘] 在 Mac OSX 上编译 GH60 RevCHN Firmware

楼主: dm4 (dm4)   2015-03-18 13:02:39
版上有在 Windows / Linux 上刷 GH60 的教学,前几天自己在 Mac 上
试了一段时间,来分享一下在 Mac OSX 上编译和刷 GH60 RevCHN 的韧体的心得
这篇主要是在 Mac OSX 上,用 keyboard-layout-editor + tkg 生出 layout 的 .c 档
再用 kairyu/tmk_keyboard_custom 编译,刷上 GH60
同步发表在 http://blog.dm4.tw/blog/2015/03/17/build-gh60-revchn-on-mac/
### 参考资料
- http://www.v2ex.com/t/161887
- https://www.ptt.cc/bbs/Key_Mou_Pad/M.1426361327.A.EEB.html
- https://www.ptt.cc/bbs/Key_Mou_Pad/M.1390542876.A.073.html
- https://github.com/tmk/tmk_keyboard
- https://github.com/kairyu/tmk_keyboard_custom
- http://www.keyboard-layout-editor.com/
- http://www.enjoyclick.org/tkg/
### 步骤
根据 http://www.v2ex.com/t/161887 首先要先用 brew 装 crosspack 和
dfu-programmer ,不过因为时间过太久,有点忘记详细的安装指令,
crosspack 需要 `brew tap` 的样子。
装完之后可以来载 source ,因为 tmk/tmk_keyboard 不支援 RevCHN ,
所以要用 tmk_keyboard_custom
```
git clone https://github.com/kairyu/tmk_keyboard_custom.git
```
需要在 `config.h` 加上设定,来切换成 GH60 RevCHN
```
cd keyboard/gh60
vim config.h
```
在档案里加上(如果你不确定加在哪,加到 `#define CONFIG_H` 下面就可以了)
```
#define GH60_REV_CHN
```
本来以为这样就可以了,没想到一直刷失败,后来看了 http://www.v2ex.com/t/161887
和 https://www.ptt.cc/bbs/Key_Mou_Pad/M.1426361327.A.EEB.html 两篇,发现
应该是要清空 EEPROM 的问题(可是我硬件知识不足,根本不知道那是什么啊啊啊)
文章里提到的解法是“在插入 usb 前,按住 backspace 与 space ”,不过我有找到
Makefie 里有个设定,删掉(注解掉)也是可以的,和大家分享一下:
```
vim Makefile
```
把下面这行删掉
```
KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom
```
接下来就插上键盘, OSX 应该会抓到一只 GH60 ,可以用
`system_profiler SPUSBDataType` 指令检查一下
```
(master) [~/workspace/tmk_keyboard_custom/keyboard/gh60] system_profiler SPUSBDataType
...
GH60:
Product ID: 0x6060
Vendor ID: 0xfeed
Version: 0.01
Speed: Up to 12 Mb/sec
Manufacturer: geekhack
Location ID: 0x14100000 / 15
Current Available (mA): 500
Current Required (mA): 100
```
按一下背面的按钮会进入 dfu 模式,这时候 OSX 应该会抓到一个 Atmel 的设备
```
(master) [~/workspace/tmk_keyboard_custom/keyboard/gh60] system_profiler SPUSBDataType
...
ATm32U4DFU:
Product ID: 0x2ff4
Vendor ID: 0x03eb (Atmel Corporation)
Version: 0.00
Serial Number: 1.0.0
Speed: Up to 12 Mb/sec
Manufacturer: ATMEL
Location ID: 0x14100000 / 16
Current Available (mA): 500
Current Required (mA): Unknown (Device has not been configured)
```
然后就可以直接试刷默认的 poker layout 看看
```
make dfu
```
如果成功,在一堆 `avr-gcc` 的编译讯之后,会看到
```
dfu-programmer atmega32u4 erase
Checking memory from 0x0 to 0x6FFF... Not blank at 0x1.
Erasing flash... Success
Checking memory from 0x0 to 0x6FFF... Empty.
dfu-programmer atmega32u4 flash gh60_lufa.hex
Checking memory from 0x0 to 0x69FF... Empty.
0% 100% Programming 0x6A00 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
0% 100% Reading 0x7000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
Validating... Success
0x6A00 bytes written into 0x7000 bytes memory (94.64%).
dfu-programmer atmega32u4 reset
```
这样子最基本的 layout 就成功了,如果不确定是不是真的有刷进去,
可以改一下 `keymap_poker.c` 里的 layout 看是不是真的刷进去了
(例如把 `Q` 改成 `X` 之类的)
再来就可以自订 layout 了,本来想很硬派的直接写 c code ,不过觉得
code 里很难排版,最后还是用 keyboard-layout-editor (KLE) 和
TMK Keymap Generator (TKG) 来生成 c code ,我用的 layout 是:
- Layer 0 (Default)
- http://www.keyboard-layout-editor.com/#/layouts/cc85b037963edc17fe98f84e970e3ca4
- Layer 1 (Fn1 层)
- http://www.keyboard-layout-editor.com/#/layouts/243985ccfe04859cdb078166f60cb781
- Layer 2 (Fn0 层)
- http://www.keyboard-layout-editor.com/#/layouts/e9453e67d6a099406e002812aaca8687
然后在 TKG 上的设定为:
- Keyboard
- GH60 (RevCHN)
- Layer Mode
- Normal
- Number of Layers
- 3
- Fn0
- Layer action > Momentary layer 2
- Fn1
- Layer action > Toggle layer 1
这里要注意,我把 Fn0 层放在 layer 2 ,是因为 key mapping 会从高层读到低层,
如果把 Fn1 层换到 layer 2 , Fn0 换到 layer 1 ,这样子在切到 Fn1 层之后,
按著 Fn0 也没办法切到 Fn0 层(同样的问题在
https://www.ptt.cc/bbs/Key_Mou_Pad/M.1390542876.A.073.html 也有解释)
接着就在 TKG 下载 `.c` 档,把载下来的 `keymap.c` 放到资料夹下并改名
,就可以准备刷了
```
mv ~/Downloads/keymap.c ./keymap_tkg.c
make KEYMAP=tkg dfu
```
这时候如果你看到以下的 error 的话
```
keymap_tkg.c:29:78: error: macro "KEYMAP_TKG" requires 62 arguments, but only 61 given
LCTL,LALT,LGUI, SPC, FN0, RGUI,RALT,RCTL),
```
是因为 TKG 生 `.c` 档的时候好像有 bug ,载下来的档案,里面的
```
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 MINS,EQL, BSPC, \
```
`0` 和 `MINS` 中间少了 `,` ,所以改成
```
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \
```
再编一次应该就 ok 了
### 后记
有一些 Fn action 现在还没摸熟,看起来可以送 key / macro 的样子,看到
https://github.com/kairyu/tmk_keyboard_custom/blob/master/keyboard/hhkb/keymap_hasu.c
有一些 function / macro 的用法还没研究。
另外虽然编起来了,不过因为底层不熟,还不太清楚架构,希望研究一下之后可以
把它和蓝牙发射器接起来,之前的 #1J7o5CLS 这篇是尝试接上 Arduino 会有点
latency ,不知道如果直接让 GH60 送讯号给蓝牙模组会不会比较好。
不过……我现在连 GH60 多的 pin 在哪里都不知道 XDDD
要成功用 UART 送 HID report 给蓝牙模组看来还有得努力
作者: kira3628800 (kira10!)   2015-03-18 13:20:00
五体投地
作者: kivx (天无二日吾独照)   2015-03-18 13:23:00
赶快推!(不然会被发现我看不懂)
作者: natsugo (无銭优雅)   2015-03-18 13:26:00
看不懂但我还是来推一个XD
作者: kira3628800 (kira10!)   2015-03-18 13:29:00
希望楼主弄懂XD想上小红点+蓝芽模组XDD
作者: agong8664 (阿贡)   2015-03-18 13:30:00
快推~~
作者: hyun5566 (╭。☆炫雅56☆。╮ )   2015-03-18 13:56:00
有神人快推
作者: afuu (平凡)   2015-03-18 14:25:00
推强者~
作者: kitehero (恶Python仄Py狼)   2015-03-18 15:12:00
赶快推!(不然会被发现我连Mac都没)
作者: kkkkkkq (kkkkkkq)   2015-03-18 15:23:00
蓝芽模组可以挑4.0的作吗?我就不用做了XD
作者: iceeric2 (Stargazer)   2015-03-18 16:20:00
@@ 完全看不懂
作者: seanwu (海恩)   2015-03-18 16:52:00
推!
作者: hidog (.....)   2015-03-18 19:51:00
太强了 @@
作者: amy79968 (neverdie)   2015-03-18 23:37:00
有神快推
作者: revorea (追寻安身之地)   2015-03-18 23:37:00
有帮上忙真是太好了,我抱着没人鸟的心态发教学的orz
楼主: dm4 (dm4)   2015-03-19 19:23:00
十分感谢楼上的教学 <(_ _)> 帮了很大的忙
作者: meisheep (梅希普)   2015-03-20 14:49:00
都markdown了,可以在github或logdown弄个好读版XD
楼主: dm4 (dm4)   2015-03-20 16:03:00
其实是从我 octopress 搬过来改成 ptt 好读版 XD
作者: kira3628800 (kira10!)   2015-03-22 15:31:00
照做中

Links booklink

Contact Us: admin [ a t ] ucptt.com