123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- * 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 <lvgl.h>
- #include <rtdevice.h>
- #include "gt911.h"
- #define DBG_TAG "lv_port_indev"
- #define DBG_LVL DBG_LOG
- #include <rtdbg.h>
- #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);
- }
|