【GD32450I-EVAL】USB触摸屏驱动
[复制链接]
最近在为了提高搬砖效率,自己弄了两个便携屏幕,三个屏幕齐刷刷地摆在面前,结果观看的效率是提高了,可找鼠标的时间反而长了,为了解决这个问题,突然想到了可以用单片机模拟一个触摸屏,往屏幕中间一点,鼠标不久回去了吗?
(一)USB
GD32F4系列支持HS、FS以及向下兼容,但最高速的HS需要额外增加器件,EVAL板上就有一颗SMSC的3300。触摸屏设备只是很简单的外设,不需要用到那么高速的HS,而且就算要使用,也只需要改一个宏定义就行,GD官方已经开发者捣鼓了个相当便捷的USB库。
触摸屏设备和鼠标键盘类似,都是走HID协议的,但设备报告描述符有区别。官方没有为我们提供触摸屏设备的例程,但有一个键盘例程,实际上键盘和鼠标的HID是捆绑在一起的,先以这个例程创建工程。
(二)创建工程
使用例程:HID_Keyboard
例程不知道为何打开之后会找不到器件,即便安装了addon也一样,所以只能退求其次,按照以下目录创建工程:
增加头文件路径:
.\Application;.\CMSIS\Include;.\Lib\Include;.\Utilities;.\USB\Include
增加宏定义:
USE_STDPERIPH_DRIVER,USE_USBFS,GD32F450
如果想试试HS,可以把 USE_USBFS 改为 USE_USBHS
下载运行后,点击按键会分别键入abc三个字母
(三)修改HID为触摸屏驱动
1-把原本的 hid_report_desc 结构体注释掉,使用触摸屏的结构体:
__ALIGN_BEGIN static uint8_t hid_report_desc[USB_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
//第一个触控点配置
//其实第一个点和第二个点配置基本差不多,主要是在上报数据的时候的第一字节需要注意
//上报数据的第一个字节
//bit7: confidence触摸是否可信 1可信 0不可信(对于安卓不起作用 电脑起作用)
//bit6-bit2: 触控identifice身份指明是哪一个手的触控 注意上报多点触控的时候要不一样!!!
//bit1: Range数据范围 一般为1
//bit0: 按键状态 1按下 0松开
0x05, 0x0d, // USAGE_PAGE (Digitizers)
0x09, 0x04, // USAGE (Touch Screen)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x22, // USAGE (Finger)
0xa1, 0x00, // COLLECTION (Physical)
0x09, 0x42, // USAGE (Tip Switch)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x32, // Usage (In Range)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
0x09, 0x51, // Usage (Contact Identifier)
0x75, 0x05, // Report Size (5)
0x95, 0x01, // Report Count (1)
0x16, 0x00, 0x00, // Logical Minimum (0)
0x26, 0x10, 0x00, // Logical Maximum (16)
0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
0x09, 0x47, // Usage (Confidence)
0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x30, // Usage (X)
0x75, 0x10, // Report Size (16)
0x95, 0x01, // Report Count (1)
0x55, 0x0D, // Unit Exponent (-3)
0x65, 0x33, // Unit (Eng Lin: in^3)
0x35, 0x00, // Physical Minimum (0)
0x46, 0x60, 0x17, // Physical Maximum (5984)
0x26, 0xFF, 0x0F, // Logical Maximum (4095)
0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
0x09, 0x31, // Usage (Y)
0x75, 0x10, // Report Size (16)
0x95, 0x01, // Report Count (1)
0x55, 0x0D, // Unit Exponent (-3)
0x65, 0x33, // Unit (Eng Lin: in^3)
0x35, 0x00, // Physical Minimum (0)
0x46, 0x26, 0x0E, // Physical Maximum (3622)
0x26, 0xFF, 0x0F, // Logical Maximum (4095)
0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
0xC0, // End Collection
0xC0 // End Collection
};
2-宏定义 USB_HID_REPORT_DESC_SIZE 定义长度,改为0x64
#define USB_HID_REPORT_DESC_SIZE 0x64
3-创建一个全局变量:
uint8_t usb_touch_send_buf[5]={0x83,0x40,0x40,0x40,0x40};
这用来保存触摸位置:详见USB HID触摸屏设备描述符介绍
第1字节:触摸1 标志字节(详见后面描述)
第2字节:触摸1 x坐标的低八位
第3字节:触摸1 x坐标的高八位
第4字节:触摸1 y坐标的低八位
第5字节:触摸1 y坐标的高八位
bit7: confidence触摸是否可信 1可信 0不可信(对于安卓不起作用 电脑起作用)
bit6-bit2: 触控identifice身份指明是哪一个手的触控 注意上报多点触控的时候要不一样!!!
bit1: Range数据范围 一般为1
bit0: 按键状态 1按下 0松开
4-修改主循环按键判断
if (prev_transfer_complete)
{
switch (key_state())
{
case CHAR_A:
key_buffer[2] = 0x04U;
usb_touch_send_buf[2] = 0x4;
usb_touch_send_buf[4] = 0x4;
break;
case CHAR_B:
key_buffer[2] = 0x05U;
usb_touch_send_buf[2] = 0x8;
usb_touch_send_buf[4] = 0x8;
break;
case CHAR_C:
key_buffer[2] = 0x06U;
usb_touch_send_buf[2] = 0xC;
usb_touch_send_buf[4] = 0xC;
break;
default:
key_buffer[2] = 0x00U;
break;
}
if (key_buffer[2] != 0U)
{
usb_touch_send_buf[0] = 0x83;
usbd_hid_report_send(&usbhs_core_dev, usb_touch_send_buf, 5U);
usb_touch_send_buf[0] = 0x87;
usbd_hid_report_send(&usbhs_core_dev, usb_touch_send_buf, 5U);
while (key_state() == 0)
{
}
}
}
点击后鼠标会消失,在我的系统环境下,如果点击右半边屏幕,移动鼠标之后会从点击处出现,而左半屏幕不行。
工程:
|