123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435 |
- #include "usb_stack_globals.h"
- #include <string.h>
- enum stopbits {
- one = 0, oneandahalf = 1, two = 2
- };
- enum parity {
- none = 0, odd = 1, even = 2, mark = 3, space = 4
- };
- const char parity_str[] = {'N', 'O', 'E', 'M', 'S'};
- struct cdc_LineCodeing {
- unsigned long int dwDTERate;
- enum stopbits bCharFormat;
- enum parity bParityType;
- BYTE bDataBits;
- } linecodeing;
- #pragma udata usb_data
- BYTE cdc_acm_in_buffer[CDC_NOTICE_BUFFER_SIZE];
- #pragma udata usb_data3
- BYTE cdc_In_bufferA[CDC_BUFFER_SIZE];
- BYTE cdc_In_bufferB[CDC_BUFFER_SIZE];
- BYTE cdc_Out_bufferA[CDC_BUFFER_SIZE];
- BYTE cdc_Out_bufferB[CDC_BUFFER_SIZE];
- #pragma udata
- struct _cdc_ControlLineState cls;
- BYTE cdc_In_len;
- volatile BYTE cdc_Out_len;
- BYTE IsInBufferA;
- BYTE IsOutBufferA;
- BYTE *InPtr;
- BYTE *OutPtr;
- BYTE LineStateUpdated = 0;
- BYTE cdc_timeout_count = 0;
- BYTE ZLPpending = 0;
- BYTE lock = 0;
- BDentry *CDC_Outbdp, *CDC_Inbdp;
- BYTE CDCFunctionError;
- volatile BYTE cdc_trf_state;
- void initCDC(void) {
-
-
-
-
-
- linecodeing.dwDTERate = 115200;
- linecodeing.bCharFormat = one;
- linecodeing.bParityType = none;
- linecodeing.bDataBits = 8;
- cls.DTR = 0;
- cls.RTS = 0;
- usb_register_class_setup_handler(cdc_setup);
- }
- void user_configured_init(void) {
-
-
-
-
-
-
- usb_unset_in_handler(1);
- usb_unset_in_handler(2);
- usb_unset_out_handler(2);
- USB_UEP1 = USB_EP_IN;
- USB_UEP2 = USB_EP_INOUT;
-
- #if USB_PP_BUF_MODE == 0
-
- usb_bdt[USB_CALC_BD(1, USB_DIR_IN, USB_PP_EVEN)].BDCNT = 0;
- usb_bdt[USB_CALC_BD(1, USB_DIR_IN, USB_PP_EVEN)].BDADDR = cdc_acm_in_buffer;
- usb_bdt[USB_CALC_BD(1, USB_DIR_IN, USB_PP_EVEN)].BDSTAT = DTS + DTSEN;
- #else
-
- #error "PP Mode not implemented yet"
- #endif
- usb_register_class_setup_handler(cdc_setup);
- cdc_trf_state = 0;
- CDC_Outbdp = &usb_bdt[USB_CALC_BD(2, USB_DIR_OUT, USB_PP_EVEN)];
- CDC_Inbdp = &usb_bdt[USB_CALC_BD(2, USB_DIR_IN, USB_PP_EVEN)];
- IsInBufferA = 0xFF;
- InPtr = cdc_In_bufferA;
- cdc_In_len = 0;
- CDC_Inbdp->BDADDR = &cdc_In_bufferA[0];
- CDC_Inbdp->BDCNT = 0;
- CDC_Inbdp->BDSTAT = DTS + DTSEN;
- cdc_Out_len = 0;
- IsOutBufferA = 0xFF;
- OutPtr = cdc_Out_bufferA;
- CDC_Outbdp->BDCNT = CDC_BUFFER_SIZE;
- CDC_Outbdp->BDADDR = &cdc_Out_bufferA[0];
- CDC_Outbdp->BDSTAT = UOWN + DTSEN;
- }
- void cdc_setup(void) {
- BYTE *packet;
- size_t reply_len;
- packet = EP0_Outbdp->BDADDR;
- switch (packet[USB_bmRequestType] & (USB_bmRequestType_TypeMask | USB_bmRequestType_RecipientMask)) {
- case (USB_bmRequestType_Class | USB_bmRequestType_Interface):
- switch (packet[USB_bRequest]) {
-
- case CDC_SEND_ENCAPSULATED_COMMAND:
- usb_ack_dat1(0);
- break;
-
- case CDC_GET_ENCAPSULATED_RESPONSE:
-
- usb_ack_dat1(0);
- break;
- case CDC_SET_COMM_FEATURE:
- case CDC_GET_COMM_FEATURE:
- case CDC_CLEAR_COMM_FEATURE:
- usb_RequestError();
- break;
- case CDC_SET_LINE_CODING:
- usb_set_out_handler(0, cdc_set_line_coding_data);
- break;
- case CDC_GET_LINE_CODING:
-
- reply_len = *((unsigned int *) &packet[USB_wLength]);
- if (sizeof (struct cdc_LineCodeing) < reply_len) {
- reply_len = sizeof (struct cdc_LineCodeing);
- }
- memcpy(EP0_Inbdp->BDADDR, (const void *) &linecodeing, reply_len);
- usb_ack_dat1(reply_len);
- usb_set_in_handler(0, cdc_get_line_coding);
- break;
- case CDC_SET_CONTROL_LINE_STATE:
- cls = *((struct _cdc_ControlLineState *) &packet[USB_wValue]);
- usb_set_in_handler(0, cdc_set_control_line_state_status);
- usb_ack_dat1(0);
- LineStateUpdated = 1;
- break;
- case CDC_SEND_BREAK:
- default:
- usb_RequestError();
- }
- break;
- default:
- usb_RequestError();
- }
- }
- void cdc_get_line_coding(void) {
- usb_unset_in_handler(0);
- }
- void cdc_set_line_coding_data(void) {
- unsigned long dwBaud, dwBaudrem;
- memcpy(&linecodeing, (const void *) EP0_Outbdp->BDADDR, sizeof (struct cdc_LineCodeing));
- dwBaud = BAUDCLOCK_FREQ / linecodeing.dwDTERate;
- dwBaudrem = BAUDCLOCK_FREQ % linecodeing.dwDTERate;
- if (linecodeing.dwDTERate > (dwBaudrem << 1))
- dwBaud--;
- UART_BAUD_setup(dwBaud);
- usb_unset_out_handler(0);
- usb_set_in_handler(0, cdc_set_line_coding_status);
- usb_ack_dat1(0);
-
-
-
-
-
-
-
-
-
- EP0_Outbdp->BDCNT = USB_EP0_BUFFER_SIZE;
- EP0_Outbdp->BDSTAT = UOWN | DTSEN;
- }
- void cdc_set_line_coding_status(void) {
- usb_unset_in_handler(0);
- }
- void cdc_set_control_line_state_status(void) {
- usb_unset_in_handler(0);
- }
- void WaitOutReady()
- {
- while ((CDC_Outbdp->BDSTAT & UOWN));
- }
- void WaitInReady()
- {
- while ((CDC_Inbdp->BDSTAT & UOWN));
- }
- BYTE getOutReady(void) {
- return !(CDC_Outbdp->BDSTAT & UOWN);
- }
- BYTE getInReady(void) {
- return !(CDC_Inbdp->BDSTAT & UOWN);
- }
- BYTE getda_cdc(void) {
- CDCFunctionError = 0;
- WaitOutReady();
- if ((IsOutBufferA & 1)) {
- OutPtr = &cdc_Out_bufferA[0];
- CDC_Outbdp->BDADDR = &cdc_Out_bufferB[0];
- } else {
- OutPtr = &cdc_Out_bufferB[0];
- CDC_Outbdp->BDADDR = &cdc_Out_bufferA[0];
- }
- IsOutBufferA ^= 0xFF;
- cdc_Out_len = CDC_Outbdp->BDCNT;
- CDC_Outbdp->BDCNT = CDC_BUFFER_SIZE;
- CDC_Outbdp->BDSTAT = ((CDC_Outbdp->BDSTAT ^ DTS) & DTS) | UOWN | DTSEN;
- #ifndef USB_INTERRUPTS
- usb_handler();
- #endif
- return cdc_Out_len;
- }
- BYTE putda_cdc(BYTE count) {
-
-
- while ((CDC_Inbdp->BDSTAT & UOWN));
- if (IsInBufferA) {
- CDC_Inbdp->BDADDR = cdc_In_bufferA;
- InPtr = cdc_In_bufferB;
- } else {
- CDC_Inbdp->BDADDR = cdc_In_bufferB;
- InPtr = cdc_In_bufferA;
- }
- CDC_Inbdp->BDCNT = count;
- CDC_Inbdp->BDSTAT = ((CDC_Inbdp->BDSTAT ^ DTS) & DTS) | UOWN | DTSEN;
- IsInBufferA ^= 0xFF;
- #ifndef USB_INTERRUPTS
- usb_handler();
- #endif
- return 0;
- }
- void SendZLP(void) {
- putda_cdc(0);
- }
- void CDC_Flush_In_Now(void) {
- if (cdc_In_len > 0) {
- while (!getInReady());
- putda_cdc(cdc_In_len);
- if (cdc_In_len == CDC_BUFFER_SIZE) {
- ZLPpending = 1;
- } else {
- ZLPpending = 0;
- }
- cdc_In_len = 0;
- cdc_timeout_count = 0;
- }
- }
- void CDCFlushOnTimeout(void) {
- if (cdc_timeout_count >= CDC_FLUSH_MS) {
- if (cdc_In_len > 0) {
- if ((lock == 0) && getInReady()) {
- putda_cdc(cdc_In_len);
- if (cdc_In_len == CDC_BUFFER_SIZE) {
- ZLPpending = 1;
- } else {
- ZLPpending = 0;
- }
- cdc_In_len = 0;
- cdc_timeout_count = 0;
- }
- } else if (ZLPpending) {
- putda_cdc(0);
- ZLPpending = 0;
- cdc_timeout_count = 0;
- }
- } else {
- cdc_timeout_count++;
- }
- }
- void putc_cdc(BYTE c) {
- lock = 1;
- *InPtr = c;
- InPtr++;
- cdc_In_len++;
- ZLPpending = 0;
- if (cdc_In_len == CDC_BUFFER_SIZE) {
- putda_cdc(cdc_In_len);
- cdc_In_len = 0;
- ZLPpending = 1;
- }
- lock = 0;
- cdc_timeout_count = 0;
- }
- BYTE getc_cdc(void) {
- BYTE c = 0;
- if (cdc_Out_len == 0) {
- do {
- cdc_Out_len = getda_cdc();
- } while (cdc_Out_len == 0);
- }
- c = *OutPtr;
- OutPtr++;
- cdc_Out_len--;
- return c;
- }
- BYTE poll_getc_cdc(BYTE * c) {
- if (cdc_Out_len) {
- *c = *OutPtr;
- OutPtr++;
- cdc_Out_len--;
- return 1;
- }
- if (getOutReady()) {
- cdc_Out_len = getda_cdc();
- if (cdc_Out_len) {
- *c = *OutPtr;
- OutPtr++;
- cdc_Out_len--;
- return 1;
- }
- }
- return 0;
- }
- BYTE peek_getc_cdc(BYTE * c) {
- if (cdc_Out_len) {
- *c = *OutPtr;
- return 1;
- }
- if (getOutReady()) {
- cdc_Out_len = getda_cdc();
- if (cdc_Out_len) {
- *c = *OutPtr;
- return 1;
- }
- }
- return 0;
- }
|