]> mj.ucw.cz Git - home-hw.git/blobdiff - Src/usbdev.c
Converting I2C to DMA
[home-hw.git] / Src / usbdev.c
index 3e6e76a3bec050b4b4c03265def7d3a73c22c21d..4834592fbfd1b5c3c8b2897fa2978fef6bf5987c 100644 (file)
@@ -3,6 +3,9 @@
 
 #include "util.h"
 #include "usb.h"
+#include "app.h"
+
+#include <string.h>
 
 /*** Descriptors ***/
 
@@ -65,7 +68,7 @@ static const byte desc_config[] = {
   // End-point descriptor
   7,                           // bLength
   USB_DESC_TYPE_ENDPOINT,      // bDescriptorType
-  0x81,                                // bEndpointAddress
+  0x82,                                // bEndpointAddress
   USB_EP_TYPE_BULK,            // bmAttributes
   0x40, 0x00,                  // wMaxPacketSize
   0x00,                                // bInterval: unused
@@ -88,6 +91,10 @@ static const byte desc_languages[] = {
 
 /*** Callbacks ***/
 
+byte rx_packet[64];
+byte tx_packet[64];
+volatile byte rx_packet_state, tx_packet_state;
+
 void usb_dev_reset(struct usb *usb)
 {
   usb->desc_device = desc_device;
@@ -102,10 +109,15 @@ void usb_dev_reset(struct usb *usb)
 
 void usb_dev_configure(struct usb *usb)
 {
+  usb_ep_open(usb, 0x01, USB_EP_TYPE_BULK, 64);
+  usb_ep_open(usb, 0x82, USB_EP_TYPE_BULK, 64);
+  usb_ep_receive(usb, 0x01, rx_packet, 64);
 }
 
 void usb_dev_unconfigure(struct usb *usb)
 {
+  usb_ep_close(usb, 0x01);
+  usb_ep_close(usb, 0x82);
 }
 
 bool usb_dev_setup_hook(struct usb *usb, struct setup_request *setup)
@@ -123,8 +135,17 @@ void usb_dev_ctl_send_done(struct usb *usb)
 
 void usb_dev_recv_done(struct usb *usb, byte epnum)
 {
+  if (epnum == 0x01)
+    {
+      u32 len = usb_ep_received_size(usb, 0x01);
+      if (len >= 8 && !rx_packet_state)
+       rx_packet_state = 1;
+      else
+       usb_ep_receive(usb, 0x01, rx_packet, 64);
+    }
 }
 
 void usb_dev_send_done(struct usb *usb, byte epnum)
 {
+  tx_packet_state = 0;
 }