6028|1

111

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【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)
                {
                }
            }
        }

点击后鼠标会消失,在我的系统环境下,如果点击右半边屏幕,移动鼠标之后会从点击处出现,而左半屏幕不行。

 

工程:

USB_HID触摸.zip

3.71 MB, 下载次数: 32

此帖出自GD32 MCU论坛

最新回复

想看到实物诶,触摸屏也是越来越多了。   详情 回复 发表于 2020-11-8 12:25
点赞 关注
 

回复
举报

1942

帖子

3

TA的资源

版主

沙发
 

想看到实物诶,触摸屏也是越来越多了。

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表