前言
本文简单介绍如何应用st usb hid(mouse)例程生成一个可以输入和输出任何长度小于等于64字节的移植过程。
问题描述:
hid的在usb的运用中是非常广泛的,但是很多应用并不是简单的鼠标或者键盘操作,而是客户自定义的一些应用,所以report的定义往往跟鼠标或者键盘并不相同,因而客户常常基于st的hid的例程进行修改。那么如何基于我们的例程生成一个可以输入输出任何长度小于等于64字节的例程?这里示范一下,抛砖引玉。
代码修改:
第一步:
我们在usbd_hid_core.c中,找到配置描述进行修改。首先增加一个out 端点。同时将hid_in_packet 和hid_out_packet长度修改为0x40。
0x07, /* blength: endpoint descriptorsize *///dum
usb_endpoint_descriptor_type, /*bdescriptortype: */ /* endpoint descriptor type */
hid_out_ep, /* bendpointaddress: */ /*endpoint address (out) */
0x03, /* bmattributes: interruptendpoint */
hid_out_packet, /* wmaxpacketsize: 64bytes max */
0x00,
0x01, /* binterval: polling interval(20 ms) */
/* 41 */
第二步:
修改报告描述符:请注意这两个report count 和report size 的设定。
const uint8_thid_mouse_reportdesc[hid_mouse_report_desc_size] =
{
0x05, 0x8c, /* usage_page (vendorpage: 0xff00) */
0x09, 0x06, /* usage (demo kit) */
0xa1, 0x01, /* collection(application) */
/* 6 */
0x09, 0x06, /* usage (led 1) */
0x15, 0x00, /* logical_minimum (0) */
0x26, 0x00,0xff, /* logical_maximum(1) */
0x75, 0x08, /* report_size (8) */
0x95, 0x40, /* report_count (64) */
0x91, 0x82, /* output(data,var,abs,vol) */
/* 18 */
0x09, 0x06, /* usage (adc in) */
0x15, 0x00, /* logical_minimum (0) */
0x26, 0x00,0xff, /* logical_maximum(255) */
0x75, 0x08, /* report_size (8) */
0x95, 0x40, /* report_count (64) */
0x81, 0x82, /* input(data,var,abs,vol) */
/* 31 */
0xc0 /* end_collection */
}; /* customhid_reportdescriptor */
第三步:
修改hid class 初始化代码:
注意这里两个地方:
1, usb fifo的分配定义。
2, usb endpoint的使能,以及准备接收数据。
static uint8_t usbd_hid_init (void*pdev,
uint8_t cfgidx)
{
dcd_pma_config(pdev ,hid_in_ep,usb_sng_buf,hid_in_tx_address);
dcd_pma_config(pdev ,hid_out_ep,usb_sng_buf,hid_out_rx_address);
/* open ep in */
dcd_ep_open(pdev,
hid_in_ep,
hid_in_packet,
usb_ep_int);
/* open ep out */
dcd_ep_open(pdev,
hid_out_ep,
hid_out_packet,
usb_ep_int);
dcd_ep_preparerx(pdev,hid_out_ep,report_buf,hid_out_packet);
prevxferdone=1;
return usbd_ok;
}
第四步:
修改发送函数,注意不能一直往usb fifo里面填充数据,一定要等上一次传输完成再填充。
usbd_hid_sendreport(&usb_device_dev, send_buffer,hid_in_packet);
最后我们一起来看看效果,可以清楚的看到mcu每毫秒都会发送64个字节的数据到主机。
结论:
这个例程只是基于stm32f0系列的mcu进行的修改,你只要按照这四步很容易地移植到其它系列mcu上。
stm32/stm8
意法半导体/st/stm
电测工程师千万不能错过的经典电子元器件测试小技巧
Windows2000下并口数据采集的驱动设计和实现
FTTx与xDSL共同建设宽带提速工程
plc控制柜生产厂家有哪些_plc控制柜十大生产厂家排行
LTC1705:两步电压转换减小了笔记本电脑电源的尺寸和热量
基于STM32 HID例程生成不小于64字节传输的移植过程
希捷明年将推出采用HAMR新技术的18TB硬盘
51单片机解码PPM波的设计
一文看懂自动驾驶商业化落地场景
马克思发生器原理图
CTA进网检验要求修订原则和变更说明 SAR新国标在2024年正式实施
高速公路收费站对讲系统的功能特点及应用
虚拟机Linux系统连接ARM开发板的方法
智能无线方案助力解决智能工厂问题
在智能制造中人工智能功不可没
万高边缘侧主控芯片获浙江数字经济“五新”优秀案例奖
为什么单片机内部RAM这么少?
“海尔物联网净水机新品上市发布会”在武汉正式启动
博世集团与cellcentric签订了长期协议为其供应集成功率电子
dfrobotMCP3424 18位AD转换模块介绍