diff options
author | root <root@lamia.panaceas.james.local> | 2016-08-20 20:55:43 +0100 |
---|---|---|
committer | root <root@lamia.panaceas.james.local> | 2016-08-20 20:55:43 +0100 |
commit | e696ed2427fe036a0dcfe50f209e22a9f273d100 (patch) | |
tree | 837ac9421102a7b83a4d55b72e22fce5f6033214 /app/cdc.c | |
parent | b063a2da3024a2e3175e1ba9b0a87cb6c7470765 (diff) | |
download | candlestick-e696ed2427fe036a0dcfe50f209e22a9f273d100.tar.gz candlestick-e696ed2427fe036a0dcfe50f209e22a9f273d100.tar.bz2 candlestick-e696ed2427fe036a0dcfe50f209e22a9f273d100.zip |
working calls
Diffstat (limited to 'app/cdc.c')
-rw-r--r-- | app/cdc.c | 154 |
1 files changed, 0 insertions, 154 deletions
diff --git a/app/cdc.c b/app/cdc.c deleted file mode 100644 index 4088b6c..0000000 --- a/app/cdc.c +++ /dev/null @@ -1,154 +0,0 @@ -#include "project.h" - -static const struct usb_endpoint_descriptor comm_endp[] = { - { - .bLength = USB_DT_ENDPOINT_SIZE, - .bDescriptorType = USB_DT_ENDPOINT, - .bEndpointAddress = 0x83, - .bmAttributes = USB_ENDPOINT_ATTR_INTERRUPT, - .wMaxPacketSize = 16, - .bInterval = 255, - } -}; - -static const struct usb_endpoint_descriptor data_endp[] = { - { - .bLength = USB_DT_ENDPOINT_SIZE, - .bDescriptorType = USB_DT_ENDPOINT, - .bEndpointAddress = 0x01, - .bmAttributes = USB_ENDPOINT_ATTR_BULK, - .wMaxPacketSize = 64, - .bInterval = 1, - }, - { - .bLength = USB_DT_ENDPOINT_SIZE, - .bDescriptorType = USB_DT_ENDPOINT, - .bEndpointAddress = 0x82, - .bmAttributes = USB_ENDPOINT_ATTR_BULK, - .wMaxPacketSize = 64, - .bInterval = 1, - } -}; - -static const struct { - struct usb_cdc_header_descriptor header; - struct usb_cdc_call_management_descriptor call_mgmt; - struct usb_cdc_acm_descriptor acm; - struct usb_cdc_union_descriptor cdc_union; -} __attribute__((packed)) cdcacm_functional_descriptors = { - .header = { - .bFunctionLength = sizeof(struct usb_cdc_header_descriptor), - .bDescriptorType = CS_INTERFACE, - .bDescriptorSubtype = USB_CDC_TYPE_HEADER, - .bcdCDC = 0x0110, - }, - .call_mgmt = { - .bFunctionLength = - sizeof(struct usb_cdc_call_management_descriptor), - .bDescriptorType = CS_INTERFACE, - .bDescriptorSubtype = USB_CDC_TYPE_CALL_MANAGEMENT, - .bmCapabilities = 0, - .bDataInterface = 1, - }, - .acm = { - .bFunctionLength = sizeof(struct usb_cdc_acm_descriptor), - .bDescriptorType = CS_INTERFACE, - .bDescriptorSubtype = USB_CDC_TYPE_ACM, - .bmCapabilities = 0, - }, - .cdc_union = { - .bFunctionLength = sizeof(struct usb_cdc_union_descriptor), - .bDescriptorType = CS_INTERFACE, - .bDescriptorSubtype = USB_CDC_TYPE_UNION, - .bControlInterface = 0, - .bSubordinateInterface0 = 1, - } -}; - -const struct usb_interface_descriptor comm_iface[] = { - { - .bLength = USB_DT_INTERFACE_SIZE, - .bDescriptorType = USB_DT_INTERFACE, - .bInterfaceNumber = 0, - .bAlternateSetting = 0, - .bNumEndpoints = 1, - .bInterfaceClass = USB_CLASS_CDC, - .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM, - .bInterfaceProtocol = USB_CDC_PROTOCOL_AT, - .iInterface = 0, - .endpoint = comm_endp, - .extra = &cdcacm_functional_descriptors, - .extralen = sizeof(cdcacm_functional_descriptors) - } -}; - -const struct usb_interface_descriptor data_iface[] = { - { - .bLength = USB_DT_INTERFACE_SIZE, - .bDescriptorType = USB_DT_INTERFACE, - .bInterfaceNumber = 1, - .bAlternateSetting = 0, - .bNumEndpoints = 2, - .bInterfaceClass = USB_CLASS_DATA, - .bInterfaceSubClass = 0, - .bInterfaceProtocol = 0, - .iInterface = 0, - .endpoint = data_endp, - } -}; - - -int cdcacm_control_request(usbd_device *usbd_dev, - struct usb_setup_data *req, - uint8_t **buf, - uint16_t *len, - int (**complete)(usbd_device *usbd_dev, - struct usb_setup_data *req)) -{ - (void)complete; - (void)buf; - (void)usbd_dev; - - switch(req->bRequest) { - case USB_CDC_REQ_SET_CONTROL_LINE_STATE: { - /* - * This Linux cdc_acm driver requires this to be implemented - * even though it's optional in the CDC spec, and we don't - * advertise it in the ACM functional descriptor. - */ - char local_buf[10]; - struct usb_cdc_notification *notif = (void *)local_buf; - - /* We echo signals back to host as notification. */ - notif->bmRequestType = 0xA1; - notif->bNotification = USB_CDC_NOTIFY_SERIAL_STATE; - notif->wValue = 0; - notif->wIndex = 0; - notif->wLength = 2; - local_buf[8] = req->wValue & 3; - local_buf[9] = 0; - // usbd_ep_write_packet(0x83, buf, 10); - return 1; - } - case USB_CDC_REQ_SET_LINE_CODING: - if(*len < sizeof(struct usb_cdc_line_coding)) { - return 0; - } - return 1; - } - return 0; -} - -void cdcacm_data_rx_cb(usbd_device *usbd_dev, uint8_t ep) -{ - (void)ep; - char buf[64]; - int len = usbd_ep_read_packet(usbd_dev, 0x01, buf, 64); - - - if (len) { - buf[0]^=32; - usbd_ep_write_packet(usbd_dev, 0x82, buf, len); - buf[len] = 0; - } -} |