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就是在这里实现的,但是这部分代码实在有点多,互相之间又有调用,实在有点不能完全理解
如何实现不同键盘的配置
在TMK里面,大部分函数都有默认的实现,但是会加上__attribute__ ((weak))
的描述,这样,如果在键盘文件夹下有同名的函数,这个默认函数就会被覆盖掉,从而实现不同键盘都可以工作的效果,另外还有一些函数只有声明,但是没有定义,比如matrix.h
里面有matrix_get_row()
这个函数的声明,但是matrix.c
里面没有下相关的定义,是因为不同的键盘获取行列值的方式是不同的,也没有办法写一个默认的实现,所以,需要每个键盘在自己的matrix.c
下面实现自己的获取行列值的函数。