完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好!
本人使用ek-lm3s3748的Demo板, 想要实现自定义USBHID设备, 本人根据DEMO板的实例u***_dev_keyboard和u***_dev_mouse为参考代码, 做了一些更改, 主要改动在描述符和一些处理代码, 现在的现象是: PC机发送IN请求, ek-lm3s3748没有反映, 即当PC发送IN请求时, 无法将数据发送到PC机. 由于是从u***_dev_keyboard和u***_dev_mouse代码上更改的, 如果PC机发送IN请求时, ek-lm3s3748板上有按键按下, 则可以将数据上传到PC, 我不期望使用此功能来实现, 因为可能会造成数据传输不同步的问题. 下面是我的回调函数, 请各位大侠指点一二, 小弟先谢过了: static unsigned long HIDCustomRxHandler( void *pvCBData, unsigned long ulEvent, unsigned long ulMsgData, void *pvMsgData) [ tHIDCustomHIDInstance *psInst; tUSBDHIDCustomDevice *psDevice; // 入口参数检测. // 确定指针非空. ASSERT(pvCBData); // 获取实例数据指针. psDevice = (tUSBDHIDCustomDevice *)pvCBData; psInst = psDevice->psPrivateHIDCustomData; // 发送哪个事件? switch (ulEvent) [ // 主机已连接到我们, 并且配置设备. case USB_EVENT_CONNECTED: [ psInst->ucUSBConfigured = true; // 调用回调函数, 将信息传递到客户端. // 调用客户端自己的回调函数, 此处是CustomHIDHandler()回调函数. psDevice->pfnCallback(psDevice->pvCBData, USB_EVENT_CONNECTED, 0, (void *)0); break; ] // 主机断开了我们. case USB_EVENT_DISCONNECTED: [ psInst->ucUSBConfigured = false; // 调用回调函数, 将信息传递到客户端. // 调用客户端自己的回调函数, 此处是CustomHIDHandler()回调函数. psDevice->pfnCallback(psDevice->pvCBData, USB_EVENT_DISCONNECTED, 0, (void *)0); break; ] // 主机查询特定的报告描述符, 并且HID驱动程序申请发送最新的版本. case USBD_HID_EVENT_IDLE_TIMEOUT: case USBD_HID_EVENT_GET_REPORT: [ // 我们只支持单个输入报告描述符, 所以在此情况下, 我们不需要检查ulMsgValue参数. // 设置pvMsgData中的报告描述符的指针, 并返回报告描述符的字节长度. *(unsigned char **)pvMsgData = psInst->pucReport; //给IN报告描述符 return (CUSTOMHID_IN_REPORT_SIZE); ] // 设备驱动程序类已完成报告描述符发送到主机, 通过响应Get_Report请求. case USBD_HID_EVENT_REPORT_SENT: [ // 此处什么也不做. break; ] // 此事件表明主机Set_Report请求已发送到设备,并请求设备提供可以写入报告的缓冲区. // 此事件在主机Set_Report请求的响应中发送. 自定义HID设备有输出报告描述符, 所以我们不返回一个空指针和零长度, 不停止此请求. case USBD_HID_EVENT_GET_REPORT_BUFFER: //SET_REPORT [ // 返回OUT报告描述符的长度 if((unsigned long)pvMsgData == CUSTOMHID_OUT_REPORT_SIZE ) [ return ((unsigned long)psInst->pucDataBuffer); ] else [ return (0); ] ] // 此事件表明主机发送一个输出或功能报告描述符, 并且该报告描述符存储在之 // 前使用USBD_HID_EVENT_GET_REPORT_BUFFER回调函数提供的缓冲区中. case USBD_HID_EVENT_SET_REPORT: [ // 如果键盘指示灯改变, 告知应用程序. // if(psInst->ucLEDStates != psInst->pucDataBuffer[0]) [ // 传递信息到客户端. // 调用客户端自己的回调函数, 此处是CustomHIDHandler()回调函数. psDevice->pfnCallback( psDevice->pvCBData, USBD_HID_CUSTOM_EVENT_SET_DATA, psInst->pucDataBuffer[0], (void *)0 ); ] break; ] // 主机要求我们设置引导或报告协议(并非如此它让你知道此特殊的自定义HID). case USBD_HID_EVENT_SET_PROTOCOL: [ psInst->ucProtocol = ulMsgData; break; ] // 主机是要求我们告诉它我们目前使用哪个协议, 引导或请求. case USBD_HID_EVENT_GET_PROTOCOL: [ return (psInst->ucProtocol); ] // 传递ERROR, SUSPEND和RESUME到客户端未变. case USB_EVENT_ERROR: case USB_EVENT_SUSPEND: case USB_EVENT_RESUME: [ // 调用回调函数, 将信息传递到客户端. // 调用客户端自己的回调函数, 此处是CustomHIDHandler()回调函数. return(psDevice->pfnCallback(psDevice->pvCBData, ulEvent, ulMsgData, pvMsgData)); ] // 忽略其它事件. default: [ break; ] ] return (0); ] unsigned long CustomHIDHandler(void *pvCBData, unsigned long ulEvent, unsigned long ulMsgData, void *pvMsgData) [ tHIDCustomHIDInstance *psInst; tUSBDHIDCustomDevice *psDevice; //入口参数检测. //确定指针非空. ASSERT(pvCBData); //获取实例数据指针. psDevice = (tUSBDHIDCustomDevice *)pvCBData; psInst = psDevice->psPrivateHIDCustomData; //确定哪个事件? switch(ulEvent) [ //已与主机连接, 并且设备已配置. case USB_EVENT_CONNECTED: [ DEBUG_PRINT("Host connected.n"); g_bConnected = true; g_eCustomHIDState = CUSTOMHID_STATE_IDLE; break; ] //主机已与设备断开. case USB_EVENT_DISCONNECTED: [ DEBUG_PRINT("Host disconnected.n"); g_bConnected = false; g_eCustomHIDState = CUSTOMHID_STATE_UNCONFIGURED; break; ] //报告发送到主机. 我们不释放以发送另一个. case USB_EVENT_TX_COMPLETE: [ DEBUG_PRINT("TX complete.n"); g_eCustomHIDState = CUSTOMHID_STATE_IDLE; break; ] //此事件表明主机送来一个输出或功能报告描述符, 并且, 该报告描述符现在位于我们之前 //由USBD_HID_EVENT_GET_REPORT_BUFFER回调函数提供的缓冲区中主机发送数据 case USBD_HID_CUSTOM_EVENT_SET_DATA: [ //设置数据(跑马灯). g_ucLEDStates = ~g_ucLEDStates; //设置标志以告诉主循环, LED状态改变. g_bLEDStateChanged = true; g_sCustomHIDInstance.bUSBReceived = true; break; ] //此事件表明主机送来一个输出描述符, 并且, 该报告描述符现在位于我们之前由 //USBD_HID_EVENT_GET_REPORT_BUFFER回调函数提供的缓冲区中主机已发送数据到此设备 case USBD_HID_EVENT_GET_REPORT: [ //获取数据. break; ] //我们忽略其它事件. default: [ break; ] ] return(0); ] |
|
相关推荐
3 个讨论
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
684 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
600 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1055 浏览 1 评论
741 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
525 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
163浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
127浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
127浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
123浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
170浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 09:12 , Processed in 0.810229 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号