42 #define USB_PULLUP_PORT 1
43 #define USB_PULLUP_PIN 0
45 #define USBCTRL_USB_EN (1 << 0)
46 #define USBCTRL_PLL_EN (1 << 1)
47 #define USBCTRL_PLL_LOCKED (1 << 7)
49 #define USBIIE_EP0IE (1 << 0)
50 #define USBIIE_INEPxIE(x) (1 << x)
52 #define USBOIE_OUEPxIE(x) (1 << x)
54 #define USBCSxH_ISO (1 << 6)
56 #define USBCS0_CLR_SETUP_END (1 << 7)
57 #define USBCS0_CLR_OUTPKT_RDY (1 << 6)
58 #define USBCS0_SEND_STALL (1 << 5)
59 #define USBCS0_SETUP_END (1 << 4)
60 #define USBCS0_DATA_END (1 << 3)
61 #define USBCS0_SENT_STALL (1 << 2)
62 #define USBCS0_INPKT_RDY (1 << 1)
63 #define USBCS0_OUTPKT_RDY (1 << 0)
65 #define USBCSIL_SENT_STALL (1 << 5)
66 #define USBCSIL_SEND_STALL (1 << 4)
67 #define USBCSIL_FLUSH_PACKET (1 << 3)
68 #define USBCSIL_UNDERRUN (1 << 2)
69 #define USBCSIL_PKT_PRESENT (1 << 1)
70 #define USBCSIL_INPKT_RDY (1 << 0)
72 #define USBCSOL_SENT_STALL (1 << 6)
73 #define USBCSOL_SEND_STALL (1 << 5)
74 #define USBCSOL_OVERRUN (1 << 2)
75 #define USBCSOL_OUTPKT_RDY (1 << 0)
81 #error Control endpoint size too big
85 #error Endpoint 1 size too big
89 #error Endpoint 2 size too big
92 #if USB_EP3_SIZE > 128
93 #error Endpoint 3 size too big
96 #if USB_EP4_SIZE > 256
97 #error Endpoint 4 size too big
100 #if USB_EP5_SIZE > 512
101 #error Endpoint 5 size too big
105 static const uint16_t ep_xfer_size[] = {
118 static uint8_t ep0status;
120 typedef struct _USBEndpoint USBEndpoint;
121 struct _USBEndpoint {
126 struct process *event_process;
131 #define USB_EP_FLAGS_TYPE_MASK 0x03
132 #define USB_EP_FLAGS_TYPE_BULK 0x00
133 #define USB_EP_FLAGS_TYPE_CONTROL 0x01
134 #define USB_EP_FLAGS_TYPE_ISO 0x02
135 #define USB_EP_FLAGS_TYPE_INTERRUPT 0x03
137 #define USB_EP_FLAGS_ENABLED 0x04
139 #define EP_TYPE(ep) ((ep)->flags & USB_EP_FLAGS_TYPE_MASK)
140 #define IS_EP_TYPE(ep, type) (EP_TYPE(ep) == (type))
141 #define IS_CONTROL_EP(ep) IS_EP_TYPE(ep, USB_EP_FLAGS_TYPE_CONTROL)
142 #define IS_BULK_EP(ep) IS_EP_TYPE(ep, USB_EP_FLAGS_TYPE_BULK)
143 #define IS_INTERRUPT_EP(ep) IS_EP_TYPE(ep, USB_EP_FLAGS_TYPE_INTERRUPT)
144 #define IS_ISO_EP(ep) IS_EP_TYPE(ep, USB_EP_FLAGS_TYPE_ISO)
147 #define USB_WRITE_BLOCK 0x01
148 #define USB_READ_BLOCK 0x01
152 #define USB_WRITE_NOTIFY 0x02
153 #define USB_READ_NOTIFY 0x02
156 #define USB_READ_FAIL 0x4
160 #define EP_INDEX(addr) ((addr) & 0x7f)
163 #define EP_STRUCT(addr) &usb_endpoints[EP_INDEX(addr)];
166 #define EP_HW_NUM(addr) ((addr) & 0x7f)
168 #define usb_irq_disable(flag) cc253x_p2_irq_disable(flag)
169 #define usb_irq_enable(flag) cc253x_p2_irq_enable(flag)
171 static uint8_t usb_irq(
void);
172 static void usb_arch_epin_irq(uint8_t ep_hw);
173 static void usb_arch_epout_irq(uint8_t ep_hw);
174 static void usb_arch_ep0_irq(
void);
176 static struct cc253x_p2_handler usb_irq_handler = {
NULL, usb_irq };
178 static USBEndpoint usb_endpoints[USB_MAX_ENDPOINTS];
179 struct process *event_process = 0;
180 volatile static unsigned int events = 0;
182 static uint8_t ep0_tx(
void);
183 static uint8_t ep_tx(uint8_t ep_hw);
186 notify_process(
unsigned int e)
195 notify_ep_process(USBEndpoint * ep,
unsigned int e)
198 if(ep->event_process) {
205 usb_set_ep_event_process(
unsigned char addr,
struct process *p)
207 USBEndpoint *ep = EP_STRUCT(addr);
209 ep->event_process = p;
214 usb_arch_set_global_event_process(
struct process *p)
220 usb_arch_get_global_events(
void)
223 volatile unsigned int e;
225 usb_irq_disable(flag);
228 usb_irq_enable(flag);
234 usb_get_ep_events(uint8_t addr)
236 volatile unsigned int e;
238 USBEndpoint *ep = EP_STRUCT(addr);
240 usb_irq_disable(flag);
243 usb_irq_enable(flag);
248 #ifndef DMA_USB_CHANNEL
249 #error You must set DMA_USB_CHANNEL to a valid dma channel.
252 read_hw_buffer_dma(uint8_t tl, uint8_t th, uint8_t __xdata * xptr,
255 dma_conf[DMA_USB_CHANNEL].src_h = ((uint16_t) xptr) >> 8;
256 dma_conf[DMA_USB_CHANNEL].src_l = ((uint16_t) xptr) & 0xFF;
257 dma_conf[DMA_USB_CHANNEL].dst_h = th;
258 dma_conf[DMA_USB_CHANNEL].dst_l = tl;
261 dma_conf[DMA_USB_CHANNEL].len_h = len >> 8;
262 dma_conf[DMA_USB_CHANNEL].len_l = len & 0xFF;
263 dma_conf[DMA_USB_CHANNEL].wtt = DMA_T_NONE | DMA_BLOCK;
265 dma_conf[DMA_USB_CHANNEL].inc_prio =
266 DMA_SRC_INC_NO | DMA_DST_INC_1 | DMA_PRIO_HIGH;
268 DMA_ARM(DMA_USB_CHANNEL);
270 while(!(DMAARM & (1 << DMA_USB_CHANNEL)));
272 DMA_TRIGGER(DMA_USB_CHANNEL);
276 while(DMAARM & (1 << DMA_USB_CHANNEL));
278 DMAIRQ = ~(1 << DMA_USB_CHANNEL);
281 write_hw_buffer_dma(uint8_t __xdata * xptr, uint8_t fl, uint8_t fh,
284 dma_conf[DMA_USB_CHANNEL].src_h = fh;
285 dma_conf[DMA_USB_CHANNEL].src_l = fl;
286 dma_conf[DMA_USB_CHANNEL].dst_h = ((uint16_t) xptr) >> 8;
287 dma_conf[DMA_USB_CHANNEL].dst_l = ((uint16_t) xptr) & 0xFF;
290 dma_conf[DMA_USB_CHANNEL].len_h = len >> 8;
291 dma_conf[DMA_USB_CHANNEL].len_l = len & 0xFF;
292 dma_conf[DMA_USB_CHANNEL].wtt = DMA_T_NONE | DMA_BLOCK;
294 dma_conf[DMA_USB_CHANNEL].inc_prio =
295 DMA_SRC_INC_1 | DMA_DST_INC_NO | DMA_PRIO_HIGH;
297 DMA_ARM(DMA_USB_CHANNEL);
299 while(!(DMAARM & (1 << DMA_USB_CHANNEL)));
301 DMA_TRIGGER(DMA_USB_CHANNEL);
303 while(DMAARM & (1 << DMA_USB_CHANNEL));
306 DMAIRQ = ~(1 << DMA_USB_CHANNEL);
311 read_hw_buffer(uint8_t * to, uint8_t hw_ep,
unsigned int len)
313 __xdata uint8_t *from = &USBF0 + (hw_ep << 1);
318 if(len > 8 && ((uint8_t *) & to)[2] == 0x0 ) {
319 read_hw_buffer_dma(((uint8_t *) & to)[0], ((uint8_t *) & to)[1], from,
330 write_hw_buffer(uint8_t hw_ep, uint8_t * from,
unsigned int len)
332 __xdata uint8_t *to = &USBF0 + (hw_ep << 1);
336 if(len > 8 && ((uint8_t *) & from)[2] == 0x0 ) {
337 write_hw_buffer_dma(to, ((uint8_t *) & from)[0], ((uint8_t *) & from)[1],
352 for(e = 0; e < USB_MAX_ENDPOINTS; e++) {
353 if(usb_endpoints[e].flags & USB_EP_FLAGS_ENABLED) {
354 USBBuffer *buffer = usb_endpoints[e].buffer;
356 usb_endpoints[e].flags = 0;
357 usb_disable_endpoint(e);
359 buffer->flags &= ~USB_BUFFER_SUBMITTED;
360 buffer = buffer->next;
364 usb_arch_setup_control_endpoint(0);
374 USBCTRL = USBCTRL_USB_EN | USBCTRL_PLL_EN;
377 while(!(USBCTRL & USBCTRL_PLL_LOCKED));
380 PORT_SET(USB_PULLUP_PORT, USB_PULLUP_PIN);
381 PORT_DIR_OUTPUT(USB_PULLUP_PORT, USB_PULLUP_PIN);
383 for(i = 0; i < USB_MAX_ENDPOINTS; i++) {
384 usb_endpoints[i].flags = 0;
385 usb_endpoints[i].event_process = 0;
395 cc253x_p2_register_handler(&usb_irq_handler);
397 cc253x_p2_irq_force_enable();
401 usb_submit_recv_buffer(uint8_t addr, USBBuffer * buffer)
405 USBEndpoint *ep = EP_STRUCT(addr);
407 if(!(ep->flags & USB_EP_FLAGS_ENABLED)) {
411 if(buffer->data ==
NULL && EP_HW_NUM(addr) == 0) {
416 if(buffer->flags & USB_BUFFER_NOTIFY) {
417 notify_ep_process(ep, USB_EP_EVENT_NOTIFICATION);
422 usb_irq_disable(flag);
426 tailp = &(*tailp)->next;
430 buffer->flags |= USB_BUFFER_SUBMITTED;
431 buffer = buffer->next;
434 USBINDEX = EP_HW_NUM(addr);
435 if(!EP_HW_NUM(ep->addr)) {
436 if(USBCS0 & USBCS0_OUTPKT_RDY) {
440 if(USBCSOL & USBCSOL_OUTPKT_RDY) {
441 usb_arch_epout_irq(EP_HW_NUM(ep->addr));
444 usb_irq_enable(flag);
448 usb_submit_xmit_buffer(uint8_t addr, USBBuffer * buffer)
453 USBEndpoint *ep = EP_STRUCT(addr);
455 if(!(ep->flags & USB_EP_FLAGS_ENABLED)) {
459 usb_irq_disable(flag);
462 if(EP_HW_NUM(addr) == 0) {
463 if(buffer->data ==
NULL) {
468 USBCS0 = USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END;
469 notify_ep_process(ep, USB_EP_EVENT_NOTIFICATION);
470 usb_irq_enable(flag);
475 USBCS0 = USBCS0_CLR_OUTPKT_RDY;
481 tailp = &(*tailp)->next;
485 buffer->flags |= USB_BUFFER_SUBMITTED | USB_BUFFER_IN;
486 buffer = buffer->next;
489 USBINDEX = EP_HW_NUM(ep->addr);
490 if(EP_HW_NUM(ep->addr)) {
491 res = ep_tx(EP_HW_NUM(ep->addr));
496 usb_irq_enable(flag);
498 if(res & USB_WRITE_NOTIFY) {
499 notify_ep_process(ep, USB_EP_EVENT_NOTIFICATION);
506 usb_arch_setup_endpoint0(
void)
508 USBIIE |= USBIIE_EP0IE;
512 usb_arch_setup_in_endpoint(uint8_t addr)
514 uint8_t ei = EP_HW_NUM(addr);
515 USBEndpoint *ep = EP_STRUCT(addr);
518 USBIIE |= USBIIE_INEPxIE(ei);
521 USBMAXI = ep->xfer_size / 8;
524 USBCSIH |= USBCSxH_ISO;
526 USBCSIH &= ~USBCSxH_ISO;
531 usb_arch_setup_out_endpoint(uint8_t addr)
533 uint8_t ei = EP_HW_NUM(addr);
534 USBEndpoint *ep = EP_STRUCT(addr);
537 USBOIE |= USBOIE_OUEPxIE(ei);
540 USBMAXO = ep->xfer_size / 8;
543 USBCSOH |= USBCSxH_ISO;
545 USBCSOH &= ~USBCSxH_ISO;
550 usb_arch_setup_endpoint(uint8_t addr)
552 uint8_t ei = EP_HW_NUM(addr);
554 USBEndpoint *ep = EP_STRUCT(addr);
557 ep->flags |= USB_EP_FLAGS_ENABLED;
561 ep->xfer_size = ep_xfer_size[ei];
563 usb_irq_disable(flag);
569 usb_arch_setup_endpoint0();
572 usb_arch_setup_in_endpoint(addr);
574 usb_arch_setup_out_endpoint(addr);
577 usb_irq_enable(flag);
581 usb_arch_setup_iso_endpoint(uint8_t addr)
583 USBEndpoint *ep = EP_STRUCT(addr);
585 ep->flags = USB_EP_FLAGS_TYPE_ISO;
587 usb_arch_setup_endpoint(addr);
591 usb_arch_setup_control_endpoint(uint8_t addr)
593 USBEndpoint *ep = EP_STRUCT(addr);
595 ep->flags = USB_EP_FLAGS_TYPE_CONTROL;
597 usb_arch_setup_endpoint(addr);
601 usb_arch_setup_bulk_endpoint(uint8_t addr)
603 USBEndpoint *ep = EP_STRUCT(addr);
605 ep->flags = USB_EP_FLAGS_TYPE_BULK;
607 usb_arch_setup_endpoint(addr);
611 usb_arch_setup_interrupt_endpoint(uint8_t addr)
613 USBEndpoint *ep = EP_STRUCT(addr);
615 ep->flags = USB_EP_FLAGS_TYPE_INTERRUPT;
617 usb_arch_setup_endpoint(addr);
621 usb_arch_disable_ep0(
void)
623 USBIIE &= ~USBIIE_EP0IE;
628 usb_arch_disable_in_endpoint(uint8_t addr)
631 USBIIE &= ~USBIIE_INEPxIE(EP_HW_NUM(addr));
638 usb_arch_disable_out_endpoint(uint8_t addr)
641 USBOIE &= ~USBOIE_OUEPxIE(EP_HW_NUM(addr));
649 usb_arch_disable_endpoint(uint8_t addr)
651 uint8_t ei = EP_HW_NUM(addr);
653 USBEndpoint *ep = EP_STRUCT(addr);
655 ep->flags &= ~USB_EP_FLAGS_ENABLED;
657 usb_irq_disable(flag);
660 usb_arch_disable_ep0();
663 usb_arch_disable_in_endpoint(addr);
665 usb_arch_disable_out_endpoint(addr);
668 usb_irq_enable(flag);
672 usb_arch_discard_all_buffers(uint8_t addr)
676 volatile USBEndpoint *ep = EP_STRUCT(addr);
678 usb_irq_disable(flag);
681 usb_irq_enable(flag);
684 buffer->flags &= ~USB_BUFFER_SUBMITTED;
685 buffer = buffer->next;
690 set_stall(uint8_t addr, uint8_t stall)
692 uint8_t ei = EP_HW_NUM(addr);
699 USBCS0 |= USBCS0_SEND_STALL | USBCS0_OUTPKT_RDY;
704 USBCSIL |= USBCSIL_SEND_STALL;
706 USBCSIL &= ~USBCSIL_SEND_STALL;
710 USBCSOL |= USBCSOL_SEND_STALL;
712 USBCSOL &= ~USBCSOL_SEND_STALL;
719 usb_arch_control_stall(uint8_t addr)
721 uint8_t ei = EP_HW_NUM(addr);
724 if(ei > USB_MAX_ENDPOINTS) {
728 usb_irq_disable(flag);
732 usb_irq_enable(flag);
736 usb_arch_halt_endpoint(uint8_t addr,
int halt)
738 uint8_t ei = EP_HW_NUM(addr);
740 USBEndpoint *ep = EP_STRUCT(addr);
743 if(ei > USB_MAX_ENDPOINTS) {
747 if(!(ep->flags & USB_EP_FLAGS_ENABLED)) {
751 usb_irq_disable(flag);
760 if(ep->buffer && (ep->buffer->flags & USB_BUFFER_HALT)) {
761 ep->buffer->flags &= ~USB_BUFFER_SUBMITTED;
762 if(ep->buffer->flags & USB_BUFFER_NOTIFY) {
763 notify_ep_process(ep, USB_EP_EVENT_NOTIFICATION);
765 ep->buffer = ep->buffer->next;
768 usb_arch_epout_irq(EP_HW_NUM(addr));
772 usb_irq_enable(flag);
776 usb_arch_set_configuration(uint8_t usb_configuration_value)
782 usb_arch_get_ep_status(uint8_t addr)
784 uint8_t ei = EP_INDEX(addr);
785 USBEndpoint *ep = EP_STRUCT(addr);
787 if(ei > USB_MAX_ENDPOINTS) {
795 usb_arch_set_address(uint8_t addr)
801 usb_arch_send_pending(uint8_t addr)
805 uint8_t ei = EP_INDEX(addr);
807 usb_irq_disable(flag);
810 ret = USBCS0 & USBCS0_INPKT_RDY;
812 ret = USBCSIL & USBCSIL_INPKT_RDY;
814 usb_irq_enable(flag);
820 get_receive_capacity(USBBuffer * buffer)
822 unsigned int capacity = 0;
825 !(buffer->flags & (USB_BUFFER_IN | USB_BUFFER_SETUP | USB_BUFFER_HALT))) {
826 capacity += buffer->left;
827 buffer = buffer->next;
833 skip_buffers_until(USBBuffer * buffer,
unsigned int mask,
unsigned int flags,
836 while(buffer && !((buffer->flags & mask) == flags)) {
837 buffer->flags &= ~USB_BUFFER_SUBMITTED;
838 buffer->flags |= USB_BUFFER_FAILED;
839 if(buffer->flags & USB_BUFFER_NOTIFY) {
840 *resp |= USB_READ_NOTIFY;
842 buffer = buffer->next;
848 fill_buffers(USBBuffer * buffer, uint8_t hw_ep,
unsigned int len,
849 uint8_t short_packet)
855 if(buffer->left < len) {
863 read_hw_buffer(buffer->data, hw_ep, t);
871 buffer->flags &= ~(USB_BUFFER_SUBMITTED | USB_BUFFER_SHORT_PACKET);
872 if(buffer->flags & USB_BUFFER_NOTIFY) {
873 res |= USB_READ_NOTIFY;
875 buffer = buffer->next;
879 buffer->flags |= USB_BUFFER_SHORT_PACKET;
882 if((buffer->left == 0) || (buffer->flags & USB_BUFFER_PACKET_END)) {
883 buffer->flags &= ~USB_BUFFER_SUBMITTED;
884 if(buffer->flags & USB_BUFFER_NOTIFY) {
885 res |= USB_READ_NOTIFY;
887 buffer = buffer->next;
890 if(buffer->left && !(buffer->flags & USB_BUFFER_SHORT_END)) {
891 buffer->flags |= USB_BUFFER_FAILED;
892 res |= USB_READ_FAIL;
894 buffer->flags &= ~USB_BUFFER_SUBMITTED;
895 if(buffer->flags & USB_BUFFER_NOTIFY) {
896 res |= USB_READ_NOTIFY;
898 buffer = buffer->next;
902 usb_endpoints[hw_ep].buffer = buffer;
909 ep0_get_setup_pkt(
void)
915 skip_buffers_until(usb_endpoints[0].buffer, USB_BUFFER_SETUP,
916 USB_BUFFER_SETUP, &res);
918 usb_endpoints[0].buffer = buffer;
920 if(!buffer || buffer->left < 8) {
921 return USB_READ_BLOCK;
924 read_hw_buffer(buffer->data, 0, 8);
927 buffer->flags &= ~USB_BUFFER_SUBMITTED;
928 if(buffer->flags & USB_BUFFER_NOTIFY) {
929 res |= USB_READ_NOTIFY;
932 if(buffer->data[6] || buffer->data[7]) {
934 USBCS0 |= USBCS0_CLR_OUTPKT_RDY;
935 ep0status = buffer->data[0] & 0x80 ? EP_TX : EP_RX;
944 usb_endpoints[0].buffer = buffer->next;
950 ep0_get_data_pkt(
void)
953 uint8_t short_packet = 0;
954 USBBuffer *buffer = usb_endpoints[0].buffer;
955 uint8_t len = USBCNT0;
958 return USB_READ_BLOCK;
961 if(buffer->flags & (USB_BUFFER_SETUP | USB_BUFFER_IN)) {
964 buffer->flags |= USB_BUFFER_FAILED;
965 buffer->flags &= ~USB_BUFFER_SUBMITTED;
966 if(buffer->flags & USB_BUFFER_NOTIFY) {
967 res |= USB_READ_NOTIFY;
973 usb_endpoints[0].buffer = buffer->next;
975 USBCS0 |= USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END;
981 if(get_receive_capacity(buffer) < len) {
983 return USB_READ_BLOCK;
986 if(len < usb_endpoints[0].xfer_size) {
990 res = fill_buffers(buffer, 0, len, short_packet);
997 USBCS0 |= USBCS0_CLR_OUTPKT_RDY;
1005 USBBuffer *buffer = usb_endpoints[0].buffer;
1006 unsigned int len = usb_endpoints[0].xfer_size;
1007 uint8_t data_end = 0;
1011 if((USBCS0 & USBCS0_INPKT_RDY) || (ep0status != EP_TX)) {
1019 if(!(buffer->flags & USB_BUFFER_IN)) {
1026 if(buffer->left < len) {
1027 copy = buffer->left;
1033 buffer->left -= copy;
1034 write_hw_buffer(0, buffer->data, copy);
1035 buffer->data += copy;
1036 if(buffer->left == 0) {
1037 if(buffer->flags & USB_BUFFER_SHORT_END) {
1045 buffer->flags &= ~USB_BUFFER_SUBMITTED;
1046 if(buffer->flags & USB_BUFFER_NOTIFY) {
1047 res |= USB_WRITE_NOTIFY;
1049 buffer = buffer->next;
1059 usb_endpoints[0].buffer = buffer;
1063 if(data_end || !buffer) {
1064 ep0status = EP_IDLE;
1065 USBCS0 |= USBCS0_INPKT_RDY | USBCS0_DATA_END;
1067 USBCS0 |= USBCS0_INPKT_RDY;
1074 usb_arch_ep0_irq(
void)
1081 if(cs0 & USBCS0_SENT_STALL) {
1084 ep0status = EP_IDLE;
1086 if(cs0 & USBCS0_SETUP_END) {
1088 USBCS0 = USBCS0_CLR_SETUP_END;
1089 ep0status = EP_IDLE;
1092 if(cs0 & USBCS0_OUTPKT_RDY) {
1093 if(ep0status == EP_IDLE) {
1094 res = ep0_get_setup_pkt();
1096 res = ep0_get_data_pkt();
1099 if(res & USB_READ_NOTIFY) {
1100 notify_ep_process(&usb_endpoints[0], USB_EP_EVENT_NOTIFICATION);
1102 if(res & USB_READ_BLOCK) {
1109 if(res & USB_WRITE_NOTIFY) {
1110 notify_ep_process(&usb_endpoints[0], USB_EP_EVENT_NOTIFICATION);
1116 ep_tx(uint8_t ep_hw)
1120 USBEndpoint *ep = EP_STRUCT(ep_hw);
1122 len = ep->xfer_size;
1128 if(!ep->buffer || !(ep->buffer->flags & USB_BUFFER_IN)) {
1135 if(ep->buffer->left < len) {
1136 copy = ep->buffer->left;
1142 ep->buffer->left -= copy;
1143 write_hw_buffer(EP_INDEX(ep_hw), ep->buffer->data, copy);
1144 ep->buffer->data += copy;
1146 if(ep->buffer->left == 0) {
1147 if(ep->buffer->flags & USB_BUFFER_SHORT_END) {
1154 ep->buffer->flags &= ~USB_BUFFER_SUBMITTED;
1155 if(ep->buffer->flags & USB_BUFFER_NOTIFY) {
1156 res |= USB_WRITE_NOTIFY;
1158 ep->buffer = ep->buffer->next;
1164 USBCSIL |= USBCSIL_INPKT_RDY;
1171 ep_get_data_pkt(uint8_t ep_hw)
1175 uint8_t short_packet = 0;
1176 USBEndpoint *ep = EP_STRUCT(ep_hw);
1179 return USB_READ_BLOCK;
1182 if(ep->buffer->flags & USB_BUFFER_HALT) {
1184 if(!(USBCSOL & USBCSOL_SEND_STALL)) {
1185 USBCSOL |= USBCSOL_SEND_STALL;
1190 pkt_len = USBCNTL | (USBCNTH << 8);
1191 if(get_receive_capacity(ep->buffer) < pkt_len) {
1192 return USB_READ_BLOCK;
1195 if(pkt_len < ep->xfer_size) {
1199 res = fill_buffers(ep->buffer, ep_hw, pkt_len, short_packet);
1201 USBCSOL &= ~USBCSOL_OUTPKT_RDY;
1207 usb_arch_epout_irq(uint8_t ep_hw)
1212 USBEndpoint *ep = EP_STRUCT(ep_hw);
1218 if(csl & USBCSOL_SENT_STALL) {
1219 USBCSOL &= ~USBCSOL_SENT_STALL;
1222 if(csl & USBCSOL_OVERRUN) {
1224 USBCSOL &= ~USBCSOL_OVERRUN;
1227 if(csl & USBCSOL_OUTPKT_RDY) {
1228 res = ep_get_data_pkt(ep_hw);
1230 if(res & USB_READ_NOTIFY) {
1231 notify_ep_process(ep, USB_EP_EVENT_NOTIFICATION);
1237 usb_arch_epin_irq(uint8_t ep_hw)
1241 USBEndpoint *ep = EP_STRUCT(ep_hw);
1248 if(csl & USBCSIL_SENT_STALL) {
1249 USBCSIL &= ~USBCSIL_SENT_STALL;
1252 if(csl & USBCSIL_UNDERRUN) {
1253 USBCSIL &= ~USBCSIL_UNDERRUN;
1256 if(!(csl & USBCSIL_INPKT_RDY)) {
1258 if(res & USB_WRITE_NOTIFY) {
1259 notify_ep_process(ep, USB_EP_EVENT_NOTIFICATION);
1264 #define EPxIF(x) (1 << x)
1265 #define RSTIF (1 << 2)
1266 #define RESUMEIF (1 << 1)
1267 #define SUSPENDIF (1 << 0)
1272 uint8_t ep_in_if = USBIIF & USBIIE;
1273 uint8_t ep_out_if = USBOIF & USBOIE;
1274 uint8_t common_if = USBCIF & USBCIE;
1279 if(ep_in_if & 0x1) {
1282 for(i = 1; i < 6; i++) {
1283 if(ep_in_if & EPxIF(i)) {
1284 usb_arch_epin_irq(i);
1289 for(i = 1; i < 6; i++) {
1290 if(ep_out_if & EPxIF(i)) {
1291 usb_arch_epout_irq(i);
1295 if(common_if & RSTIF) {
1297 notify_process(USB_EVENT_RESET);
1299 if(common_if & RESUMEIF) {
1300 notify_process(USB_EVENT_RESUME);
1302 if(common_if & SUSPENDIF) {
1303 notify_process(USB_EVENT_SUSPEND);
1306 return ep_in_if || ep_out_if || common_if ? CC253x_P2_ACK : CC253x_P2_NACK;
void process_poll(struct process *p)
Request a process to be polled.
#define NULL
The null pointer.
Definitions for TI/Chipcon cc2530, cc2531 and cc2533 SFR registers.
Header file with definitions of bit masks for some cc2530 SFRs