|
有进展了!!!!
RESULT HID_Data_Setup(u8 RequestNo) { u8 *(*CopyRoutine)(u16 length); CopyRoutine = NULL; if (pInformation->USBbmRequestType == CLASS_REQUEST|INTERFACE_RECIPIENT && RequestNo == SET_REPORT) CopyRoutine = My_Data_Request;
if (CopyRoutine == NULL) return USB_UNSUPPORT;
pInformation->Ctrl_Info.CopyData = CopyRoutine; pInformation->Ctrl_Info.Usb_wOffset = 0; pInformation->Usb_wLength = (*CopyRoutine)(0);
return USB_SUCCESS; } // End of HID_Data_Setup()
u8 My_Buffer[10]; u8 *My_Data_Request(u16 length) { if (length == 0) return (u8*)10; // 假定你的REPORT长度和Buffer长度为10
return My_Buffer; }
-------------------------------------------------------------------------------- 上面介绍的CopyRoutine用于把多次传输的数据包合并到一个完整的缓冲区中,因此只有到STATUS阶段才能够指导一次SETUP传输是否结束,所以用户程序需要在回调函数Process_Status_IN中处理从SET_REPORT接收到的数据。因为所有的回调函数都是USB中断处理的一部分,所以更好的办法是在Process_Status_IN中设置一个标记,然后在用户主程序中判断这个标记并做处理。
-------------------------------------------------------------------------------- 注意,STM32的USB库设计成以回调函数处理用户命令请求,包含类命令请求,是为了能够清晰地区分库程序和用户程序,使这两者不会混在一起,这样的好处是非常明显的,当USB库需要更新升级时,只需替换掉相应的程序模块,而不必修改用户已经完成的程序。
香主,上面的Process_Status_IN,在USB_PROC.C里是不是对应 /******************************************************************************* * Function Name : Joystick_Status_In. * Description : Joystick status IN routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void Joystick_Status_In(void) {}
/******************************************************************************* * Function Name : Joystick_Status_Out * Description : Joystick status OUT routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void Joystick_Status_Out (void) {}
两个函数?
香主,我很菜的,如果问题很简单的话请不要笑话我呀! 嘿嘿...... |
|