mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-01-18 03:52:11 +01:00
Merge remote-tracking branch 'origin/stac/usb-cdc-fixes' into next
This commit is contained in:
commit
5326d26487
@ -321,7 +321,10 @@ RESULT PIOS_USB_CDC_SetControlLineState(void)
|
||||
struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id;
|
||||
|
||||
bool valid = PIOS_USB_CDC_validate(usb_cdc_dev);
|
||||
PIOS_Assert(valid);
|
||||
if (!valid) {
|
||||
/* No CDC interface is configured */
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
|
||||
uint8_t wValue0 = pInformation->USBwValue0;
|
||||
uint8_t wValue1 = pInformation->USBwValue1;
|
||||
@ -338,14 +341,25 @@ static struct usb_cdc_line_coding line_coding = {
|
||||
.bDataBits = 8,
|
||||
};
|
||||
|
||||
RESULT PIOS_USB_CDC_SetLineCoding(void)
|
||||
uint8_t *PIOS_USB_CDC_SetLineCoding(uint16_t Length)
|
||||
{
|
||||
struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id;
|
||||
|
||||
bool valid = PIOS_USB_CDC_validate(usb_cdc_dev);
|
||||
PIOS_Assert(valid);
|
||||
if (!valid) {
|
||||
/* No CDC interface is configured */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return USB_SUCCESS;
|
||||
if (Length == 0) {
|
||||
/* Report the number of bytes we're prepared to consume */
|
||||
pInformation->Ctrl_Info.Usb_wLength = sizeof(line_coding);
|
||||
pInformation->Ctrl_Info.Usb_rLength = sizeof(line_coding);
|
||||
return NULL;
|
||||
} else {
|
||||
/* Give out a pointer to the data struct */
|
||||
return ((uint8_t *) &line_coding);
|
||||
}
|
||||
}
|
||||
|
||||
const uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length)
|
||||
@ -353,7 +367,10 @@ const uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length)
|
||||
struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id;
|
||||
|
||||
bool valid = PIOS_USB_CDC_validate(usb_cdc_dev);
|
||||
PIOS_Assert(valid);
|
||||
if (!valid) {
|
||||
/* No CDC interface is configured */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (Length == 0) {
|
||||
pInformation->Ctrl_Info.Usb_wLength = sizeof(line_coding);
|
||||
|
@ -293,13 +293,16 @@ static void PIOS_USBHOOK_Status_Out(void)
|
||||
* Output : None.
|
||||
* Return : USB_UNSUPPORT or USB_SUCCESS.
|
||||
*******************************************************************************/
|
||||
extern uint8_t *PIOS_USB_CDC_SetLineCoding(uint16_t Length);
|
||||
extern const uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length);
|
||||
|
||||
static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo)
|
||||
{
|
||||
const uint8_t *(*CopyRoutine) (uint16_t);
|
||||
uint8_t *(*CopyOutRoutine) (uint16_t);
|
||||
const uint8_t *(*CopyInRoutine) (uint16_t);
|
||||
|
||||
CopyRoutine = NULL;
|
||||
CopyInRoutine = NULL;
|
||||
CopyOutRoutine = NULL;
|
||||
|
||||
switch (Type_Recipient) {
|
||||
case (STANDARD_REQUEST | INTERFACE_RECIPIENT):
|
||||
@ -313,10 +316,10 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo)
|
||||
case GET_DESCRIPTOR:
|
||||
switch (pInformation->USBwValue1) {
|
||||
case USB_DESC_TYPE_REPORT:
|
||||
CopyRoutine = PIOS_USBHOOK_GetReportDescriptor;
|
||||
CopyInRoutine = PIOS_USBHOOK_GetReportDescriptor;
|
||||
break;
|
||||
case USB_DESC_TYPE_HID:
|
||||
CopyRoutine = PIOS_USBHOOK_GetHIDDescriptor;
|
||||
CopyInRoutine = PIOS_USBHOOK_GetHIDDescriptor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -332,7 +335,7 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo)
|
||||
#endif
|
||||
switch (RequestNo) {
|
||||
case USB_HID_REQ_GET_PROTOCOL:
|
||||
CopyRoutine = PIOS_USBHOOK_GetProtocolValue;
|
||||
CopyInRoutine = PIOS_USBHOOK_GetProtocolValue;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -340,8 +343,11 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo)
|
||||
#if defined(PIOS_INCLUDE_USB_CDC)
|
||||
case 0: /* CDC Call Control Interface */
|
||||
switch (RequestNo) {
|
||||
case USB_CDC_REQ_SET_LINE_CODING:
|
||||
CopyOutRoutine = PIOS_USB_CDC_SetLineCoding;
|
||||
break;
|
||||
case USB_CDC_REQ_GET_LINE_CODING:
|
||||
//CopyRoutine = PIOS_USB_CDC_GetLineCoding;
|
||||
CopyInRoutine = PIOS_USB_CDC_GetLineCoding;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -359,13 +365,27 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo)
|
||||
break;
|
||||
}
|
||||
|
||||
if (CopyRoutine == NULL) {
|
||||
/* No registered copy routine */
|
||||
if ((CopyInRoutine == NULL) && (CopyOutRoutine == NULL)) {
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
|
||||
pInformation->Ctrl_Info.CopyDataIn = CopyRoutine;
|
||||
pInformation->Ctrl_Info.Usb_wOffset = 0;
|
||||
(*CopyRoutine) (0);
|
||||
/* Registered copy in AND copy out routine */
|
||||
if ((CopyInRoutine != NULL) && (CopyOutRoutine != NULL)) {
|
||||
/* This should never happen */
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
|
||||
if (CopyInRoutine != NULL) {
|
||||
pInformation->Ctrl_Info.CopyDataIn = CopyInRoutine;
|
||||
pInformation->Ctrl_Info.Usb_wOffset = 0;
|
||||
(*CopyInRoutine) (0);
|
||||
} else if (CopyOutRoutine != NULL) {
|
||||
pInformation->Ctrl_Info.CopyDataOut = CopyOutRoutine;
|
||||
pInformation->Ctrl_Info.Usb_rOffset = 0;
|
||||
(*CopyOutRoutine) (0);
|
||||
}
|
||||
|
||||
return USB_SUCCESS;
|
||||
}
|
||||
|
||||
@ -377,7 +397,6 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo)
|
||||
* Return : USB_UNSUPPORT or USB_SUCCESS.
|
||||
*******************************************************************************/
|
||||
extern RESULT PIOS_USB_CDC_SetControlLineState(void);
|
||||
extern RESULT PIOS_USB_CDC_SetLineCoding(void);
|
||||
|
||||
static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo)
|
||||
{
|
||||
@ -400,9 +419,6 @@ static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo)
|
||||
#if defined(PIOS_INCLUDE_USB_CDC)
|
||||
case 0: /* CDC Call Control Interface */
|
||||
switch (RequestNo) {
|
||||
case USB_CDC_REQ_SET_LINE_CODING:
|
||||
return PIOS_USB_CDC_SetLineCoding();
|
||||
break;
|
||||
case USB_CDC_REQ_SET_CONTROL_LINE_STATE:
|
||||
return PIOS_USB_CDC_SetControlLineState();
|
||||
break;
|
||||
|
@ -267,7 +267,7 @@ enum usb_cdc_requests {
|
||||
USB_CDC_REQ_SET_LINE_CODING = 0x20,
|
||||
USB_CDC_REQ_GET_LINE_CODING = 0x21,
|
||||
|
||||
USB_CDC_REQ_SET_CONTROL_LINE_STATE = 0x23,
|
||||
USB_CDC_REQ_SET_CONTROL_LINE_STATE = 0x22,
|
||||
};
|
||||
|
||||
struct usb_cdc_header_func_desc {
|
||||
|
Loading…
x
Reference in New Issue
Block a user