/* * Copyright (c) 2006-2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-03-09 Rbb666 The first version */ #include #include #include "gt911.h" #define DBG_TAG "lv_port_indev" #define DBG_LVL DBG_LOG #include #include "hal_data.h" #define GT911_IRQ_PIN BSP_IO_PORT_00_PIN_04 #define GT911_RST_PIN BSP_IO_PORT_08_PIN_01 static rt_device_t touch_dev; static lv_indev_t *touch_indev; struct rt_touch_data *read_data; volatile static rt_uint8_t touch_detect_flag = 0; static void touchpad_read(lv_indev_drv_t *indev, lv_indev_data_t *data) { if (touch_detect_flag != 1) return; rt_device_read(touch_dev, 0, read_data, 1); if (read_data->event == RT_TOUCH_EVENT_NONE) return; data->point.x = read_data->x_coordinate; data->point.y = read_data->y_coordinate; if (read_data->event == RT_TOUCH_EVENT_DOWN) data->state = LV_INDEV_STATE_PR; if (read_data->event == RT_TOUCH_EVENT_MOVE) data->state = LV_INDEV_STATE_PR; if (read_data->event == RT_TOUCH_EVENT_UP) data->state = LV_INDEV_STATE_REL; touch_detect_flag = 0; rt_device_control(touch_dev, RT_TOUCH_CTRL_ENABLE_INT, RT_NULL); } static rt_err_t rx_callback(rt_device_t dev, rt_size_t size) { touch_detect_flag = 1; rt_device_control(dev, RT_TOUCH_CTRL_DISABLE_INT, RT_NULL); return 0; } rt_err_t gt911_probe(rt_uint16_t x, rt_uint16_t y) { void *id; touch_dev = rt_device_find("gt911"); if (touch_dev == RT_NULL) { rt_kprintf("can't find device gt911\n"); return -1; } if (rt_device_open(touch_dev, RT_DEVICE_FLAG_INT_RX) != RT_EOK) { rt_kprintf("open device failed!"); return -1; } id = rt_malloc(sizeof(rt_uint8_t) * 8); rt_device_control(touch_dev, RT_TOUCH_CTRL_GET_ID, id); rt_uint8_t *read_id = (rt_uint8_t *)id; rt_kprintf("id = GT%d%d%d \n", read_id[0] - '0', read_id[1] - '0', read_id[2] - '0'); rt_device_control(touch_dev, RT_TOUCH_CTRL_SET_X_RANGE, &x); /* if possible you can set your x y coordinate*/ rt_device_control(touch_dev, RT_TOUCH_CTRL_SET_Y_RANGE, &y); rt_device_control(touch_dev, RT_TOUCH_CTRL_GET_INFO, id); rt_kprintf("range_x = %d \n", (*(struct rt_touch_info *)id).range_x); rt_kprintf("range_y = %d \n", (*(struct rt_touch_info *)id).range_y); rt_kprintf("point_num = %d \n", (*(struct rt_touch_info *)id).point_num); rt_free(id); rt_device_set_rx_indicate(touch_dev, rx_callback); read_data = (struct rt_touch_data *)rt_calloc(1, sizeof(struct rt_touch_data)); if (!read_data) { return -RT_ENOMEM; } return RT_EOK; } #define RST_PIN "p801" #define INT_PIN "p004" rt_err_t rt_hw_gt911_register(void) { struct rt_touch_config cfg; rt_base_t int_pin = rt_pin_get(INT_PIN); rt_base_t rst_pin = rt_pin_get(RST_PIN); cfg.dev_name = "i2c1"; cfg.irq_pin.pin = int_pin; cfg.irq_pin.mode = PIN_MODE_INPUT_PULLDOWN; cfg.user_data = &rst_pin; rt_hw_gt911_init("gt911", &cfg); gt911_probe(480, 272); return RT_EOK; } void lv_port_indev_init(void) { static lv_indev_drv_t indev_drv; /* Descriptor of a input device driver */ lv_indev_drv_init(&indev_drv); /* Basic initialization */ indev_drv.type = LV_INDEV_TYPE_POINTER; /* Touch pad is a pointer-like device */ indev_drv.read_cb = touchpad_read; /* Set your driver function */ /* Register the driver in LVGL and save the created input device object */ touch_indev = lv_indev_drv_register(&indev_drv); /* Register touch device */ rt_err_t res = rt_hw_gt911_register(); RT_ASSERT(res == RT_EOK); }