今天在写LVGL时发现新注册的Keypad输入设备不响应,最后定位到发现连static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)回调函数都没进去,那肯定是注册不成功,验证输入设备底层驱动程序是没问题的,由于之前注册了一个Button输入设备能正常工作,而我是先注册Keypad再注册Button的,代码沿用了LVGL的官方文件,只有一个输入设备驱动结构体static lv_indev_drv_t indev_drv;猜测由于他们共用了同一个输入设备驱动结构体导致后面注册的Button把前面注册的Keypad给覆盖了,原错误代码如下:
void lv_port_indev_init(void)
{
static lv_indev_drv_t indev_drv;
/*------------------
* Keypad
* -----------------*/
/*Initialize your keypad or keyboard if you have*/
keypad_init();
/*Register a keypad input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_KEYPAD;
indev_drv.read_cb = keypad_read;
indev_keypad = lv_indev_drv_register(&indev_drv);
/*------------------
* Button
* -----------------*/
/*Initialize your button if you have*/
button_init();
/*Register a button input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_BUTTON;
indev_drv.read_cb = button_read;
indev_button = lv_indev_drv_register(&indev_drv);
/*Assign buttons to points on the screen*/
static const lv_point_t btn_points[button_num] = {
{25, 230}, /*Button 0 -> x:10; y:10*/
};
lv_indev_set_button_points(indev_button, btn_points);
}
于是乎我就给每一个输入设备都创建一个独立的输入设备驱动结构体,发现更改后多种输入设备都能够正常工作,新代码如下:
void lv_port_indev_init(void)
{
static lv_indev_drv_t indev_button_drv; //每一个输入设备需要有独立的输入设备驱动结构体
static lv_indev_drv_t indev_keypad_drv;
/*------------------
* Keypad
* -----------------*/
/*Initialize your keypad or keyboard if you have*/
keypad_init();
/*Register a keypad input device*/
lv_indev_drv_init(&indev_keypad_drv);
indev_keypad_drv.type = LV_INDEV_TYPE_KEYPAD;
indev_keypad_drv.read_cb = keypad_read;
indev_keypad = lv_indev_drv_register(&indev_keypad_drv);
/*------------------
* Button
* -----------------*/
/*Initialize your button if you have*/
button_init();
/*Register a button input device*/
lv_indev_drv_init(&indev_button_drv);
indev_button_drv.type = LV_INDEV_TYPE_BUTTON;
indev_button_drv.read_cb = button_read;
indev_button = lv_indev_drv_register(&indev_button_drv);
/*Assign buttons to points on the screen*/
static const lv_point_t btn_points[button_num] = {
{25, 230}, /*Button 0 -> x:10; y:10*/
};
lv_indev_set_button_points(indev_button, btn_points);
}