TMK/QMK代码解读(自学小记)

恩,最近不是在自己做键盘么,TMK/QMK算是最常用的键盘库了,就想看看别人是怎么写的,但是这个代码的量实在太大了, 不记下来怕是永远的读不完。。。就写到这里,当做自己的笔记吧,顺便如果有人将来也想自己基于他们写代码的话,也可以有一个中文的代码解读的地方。。。

TMK/QMK

这两个的核心代码是基本一样的,最初其实都是TMK,不过后来TMK不怎么更新了,又有了QMK,你自己看的话其实TMK里面有一个TMK_core。不过QMK里面的TMK_core和TMK还是不完全一样,QMK增加了很多很多的功能,而且有更详细的文档,还有图形化配置的网页。但是多出来的这些功能不一定会用的到,也会增加不稳定性。我基本上还是主要看TMK部分的代码

大致框架

converter、keyboard和orphan下面存放的都是各种工程文件,converter是转换器、keyboard是键盘、orphan不知道是什么,readme里面写的意思应该是不再被支持的项目。
tmk_core里面的doc是文档,tool感觉是一些框架的文件。protocol是各种框架,lufa、vusb什么的
主要的代码都在tmk_core/common下面的各种文件里面,因为TMK支持了太多的东西,所以可以看到这种各种的#ifdef。并且支持很多中HID的框架(在里面称为protocol),所以会有很多个main函数,我们以lufa为准找到入口。

入口

在main函数里面先是执行了keyboard_init()在里面做了timer_init()matrix_init()。主要是初始化了GPIO的输出输出用于扫描矩阵和LED。然后主循环里面不停的调用keyboard_task()

keyboard.h/keyboard.c

这里面的keyboard_task()是主要的循环,里面主要是判断矩阵是否发生了变化,如果变化了就调用action_exec(e)这个函数来进行处理

action.h/action.c

这里面就是处理各种按下的事件,和特殊的按键功能什么的。比如tap dance就是在这里实现的,但是这部分代码实在有点多,互相之间又有调用,实在有点不能完全理解

大概有这么多文件。。。

2023年7月27日 UPDATE:
我把macro宏取消了以后,主要的调用是四层:

  1. keyboardr直接调用action_exec
  2. action_exec调用action_tapping_process和process_record_via
  3. action_tapping_process调用process_tapping
  4. process_tapping调用process_action
  5. process_action根据不同的keycode做出响应

如何实现不同键盘的配置

在TMK里面,大部分函数都有默认的实现,但是会加上__attribute__ ((weak))的描述,这样,如果在键盘文件夹下有同名的函数,这个默认函数就会被覆盖掉,从而实现不同键盘都可以工作的效果,另外还有一些函数只有声明,但是没有定义,比如matrix.h里面有matrix_get_row()这个函数的声明,但是matrix.c里面没有下相关的定义,是因为不同的键盘获取行列值的方式是不同的,也没有办法写一个默认的实现,所以,需要每个键盘在自己的matrix.c下面实现自己的获取行列值的函数。

2023年1月31日 UPDATE:

向主机发送报告的代码在report.h这里,决定发送内容的代码在host里面,比如这个函数host_keyboard_send。调用host的是action_util

NKRO是全键无冲的意思

2023年2月7日 UPDATE:

编译过程,我一直好奇keyboardl里面的config.h这个是如何被TMK引用的,找了半天原来是在makefile里面,首先是keyboard的mk里面调用了这个

然后在rules.mk里面有这个

然后keyboard的mk里面调用了这个rules.mk

2023年2月9日 UPDATE:

TMK里面有两个定义,keymaps和actionmaps,网上不太容易找到相关资料,我个人的理解是,keymaps特指keyboard的按键定义,一定是一个一个按键,‘a’、‘b’、‘1’、‘!’这些。actionmaps不仅包含这些,还包含比如鼠标移动这些action

actionmap.c、keymap.c、unimap.c这几个文件里面都有action_for_key()的实现,TMK的文档里是这么描述的

TMK的文档

我理解是最早用的是keymap,后来发现8位不够用了,就用了actionmap,然后给editor用的是一种特殊的叫unimap的东西。所以这几个函数前面都有若函数的声明,我还不确定是怎么做的切换,但是看起来keymap是一个遗留的为了兼容的操作。

2023年5月25日 UPDATE:

tap dance是一个QMK支持的功能,他允许你在短时间内多次按下时触发不同的按键,具体可以看这里https://thomasbaart.nl/2018/12/13/qmk-basics-tap-dance/

你可能感兴趣的:(TMK/QMK代码解读(自学小记))