在事件系统的基础上注册一个事件handler来处理各项事件。
假设要编写一个custom_driver.c:
1 // 引入事件系统头文件 2 #include "../keyboard/keyboard_evt.h" 3 4 // 编写事件处理函数 5 static void custom_driver_event_handler(enum user_event event, void* arg) 6 { 7 // code... 8 } 9 10 // 注册事件 11 EVENT_HANDLER(custom_driver_event_handler);
然后在 driver.mk 内添加编译控制命令
事件说明:
详细见events.h。 默认的所有事件的arg都不是一个指针,而是一个枚举。需要使用的时候请将这个参数强制转换为枚举。若需要自定义事件,请自行在驱动模块内定义事件的event(ID)和参数类型。
自定义FN处理过程
1 #include "../keyboard/keyboard_fn.h" 2 3 void custom_fn_handler(keyrecord_t* record, uint8_t id, uint8_t opt) { 4 // TMK Fn正常处理流程 5 } 6 7 FN_HANDLER(custom_fn_handler);
添加额外的ADC测量通道
1 #include "../keyboard/adc_convert.h" 2 3 static struct adc_channel_config custom_adc_channel = { 4 .adc_start = &adc_on_start, // 测量开始事件 5 .adc_finish = &adc_result_handler, // 测量结果handler 6 .period = 2000, // 测量周期,ms 7 .config = &channel_config, // 通道配置 8 }; 9 10 ADC_CONVERT_CHANNEL(custom_adc_channel);
在配置存储中注册一个条目
#include "../keyboard/data_storage.h" // 注册一个名为item的,长度为4的存储区 CONFIG_SECTION(item, 4); void write_item() { // 数据操作 memcpy(item.data, src, item.len); // 写入存储区 storage_write(1 << STORAGE_CONFIG); }
注册一个自定义的HID配置项目
#include "../protocol/hid_configuration.h" #include "../keyboard/data_storage.h" CONFIG_SECTION(item, 4); // 注册存储区 HID_CONFIG(0x20, item); // 注册配置项目,ID为0x20
注册一个新的通讯方式
1 #include "keyboard_host_driver.h" 2 3 static struct host_driver custom_driver = { 4 .keyboard_leds = &get_keyboard_led, // 获取LED值 5 .queue_empty = &queue_empty, // 发送队列是否为空 6 .send_packet = &custom_driver_send, // 发送数据包 7 .driver_working = &custom_driver_working, // 当前驱动是否工作 8 }; 9 10 // 以优先级3注册此驱动。 11 // 数字越小则优先级越高,会优先判断优先级高的驱动是否在工作并使用其通讯。 12 KEYBOARD_HOST_DRIVER(3, custom_driver);