/* ################################################################### ** THIS COMPONENT MODULE IS GENERATED BY THE TOOL. DO NOT MODIFY IT. ** Filename : CDC1.c ** Project : Landungsbruecke_KDS_v2.0.0 ** Processor : MK20DN512VLL10 ** Component : FSL_USB_CDC_Device ** Version : Component 01.031, Driver 01.00, CPU db: 3.00.000 ** Compiler : GNU C Compiler ** Date/Time : 2015-01-09, 16:27, # CodeGen: 0 ** Abstract : ** ** Settings : ** Component name : CDC1 ** CPU : Kinetis K20D72 ** CDC Settings : Enabled ** .inf ClassGuid : 4D36E978-E325-11CE-BFC1-08002BE10318 ** .inf VID : 2504 ** .inf PID : 0300 ** .inf PRVDR : Freescale ** .inf MFGNAME : My Company ** .inf DESCRIPTION : Freescale CDC Device ** .inf SERVICE : Virtual Com Driver ** Bus reported device : FSL CDC DEVICE ** Bus reported vendor : FREESCALE INC. ** Send Buffer : RingBuffer ** Receive Buffer : RingBuffer ** Use Timeout : Disabled ** Contents : ** ClearRxBuffer - void CDC1_ClearRxBuffer(void); ** ClearTxBuffer - void CDC1_ClearTxBuffer(void); ** GetFreeInTxBuf - word CDC1_GetFreeInTxBuf(void); ** GetCharsInTxBuf - word CDC1_GetCharsInTxBuf(void); ** GetCharsInRxBuf - word CDC1_GetCharsInRxBuf(void); ** GetChar - byte CDC1_GetChar(CDC1_TComData *Chr); ** RecvChar - byte CDC1_RecvChar(CDC1_TComData *Chr); ** SendChar - byte CDC1_SendChar(CDC1_TComData Chr); ** SendString - byte CDC1_SendString(CDC1_TComData *Chr); ** SendBlock - byte CDC1_SendBlock(byte *data, word dataSize); ** PutBufferChecked - byte CDC1_PutBufferChecked(byte *buf, size_t bufSize); ** App_Callback - void CDC1_App_Callback(byte controller_ID, byte event_type, void *val); ** Notify_Callback - void CDC1_Notify_Callback(byte controller_ID, byte event_type, void *val); ** App_Task - byte CDC1_App_Task(byte *txBuf, size_t txBufSize); ** Init - byte CDC1_Init(void); ** ** (c) Copyright Freescale, all rights reserved, 2013 ** Ported as Processor Expert component: Erich Styger ** http: www.mcuoneclipse.com ** ###################################################################*/ /*! ** @file CDC1.c ** @version 01.00 ** @brief ** */ /*! ** @addtogroup CDC1_module CDC1 module documentation ** @{ */ /* MODULE CDC1. */ #include "CDC1.h" #include "hidef.h" /* for EnableInterrupts; macro */ #include "hal/derivative.h" /* include peripheral declarations */ #include "usb_cdc.h" /* USB CDC Class Header File */ #include /* skip the inclusion in dependency state */ #ifndef __NO_SETJMP #include #endif #include #include #define CONTROLLER_ID (0) /* ID to identify USB CONTROLLER */ #if HIGH_SPEED_DEVICE static uint_32 g_cdcBuffer[DIC_BULK_OUT_ENDP_PACKET_SIZE>>1]; #endif /* Virtual COM Application start Init Flag */ static volatile boolean start_app = FALSE; /* Virtual COM Application Carrier Activate Flag */ static volatile boolean start_transactions = FALSE; static volatile boolean transactionOngoing = FALSE; /* ** =================================================================== ** Method : CDC1_GetFreeInTxBuf (component FSL_USB_CDC_Device) ** Description : ** Returns the number of free character in the send buffer ** Parameters : None ** Returns : ** --- - Number of free character in the receive ** buffer. ** =================================================================== */ /* word CDC1_GetFreeInTxBuf(void) { *** Implemented as macro in the header file } */ /* ** =================================================================== ** Method : CDC1_GetCharsInTxBuf (component FSL_USB_CDC_Device) ** Description : ** Returns the number of character in the send buffer ** Parameters : None ** Returns : ** --- - Number of character in the receive buffer. ** =================================================================== */ /* word CDC1_GetCharsInTxBuf(void) { *** implemented as macro in the header file return (word)Tx1_NofElements(); } */ /* ** =================================================================== ** Method : CDC1_GetCharsInRxBuf (component FSL_USB_CDC_Device) ** Description : ** Returns the number of character in the receive buffer ** Parameters : None ** Returns : ** --- - Number of character in the receive buffer. ** =================================================================== */ word CDC1_GetCharsInRxBuf(void) { static uint8 txBuf[CDC1_DATA_BUFF_SIZE]; if(CDC1_App_Task(txBuf, sizeof(txBuf))!=ERR_OK) { /* call USB handler: if active, then this will empty the buffer */ } return (word)Rx1_NofElements(); } /* ** =================================================================== ** Method : CDC1_GetChar (component FSL_USB_CDC_Device) ** Description : ** Receives a character from the USB interface. Function is not ** blocking if there is no character in the input buffer. ** Parameters : ** NAME - DESCRIPTION ** * Chr - Pointer to where to store the character ** received ** Returns : ** --- - Error code, ERR_OK for success, ** ERR_RXEMPTY if nothing is in RX buffer. ** =================================================================== */ /** byte CDC1_GetChar(CDC1_TComData *Chr) { *** implemented as macro in the header file return Rx1_Get(Chr); } */ /* ** =================================================================== ** Method : CDC1_RecvChar (component FSL_USB_CDC_Device) ** Description : ** Receives a character from the USB interface. Function is ** blocking if there is no character in the input buffer. ** Parameters : ** NAME - DESCRIPTION ** * Chr - Pointer to where to store the character ** received ** Returns : ** --- - Error code, ERR_OK for success, ** ERR_RXEMPTY if nothing is in RX buffer. ** =================================================================== */ byte CDC1_RecvChar(CDC1_TComData *Chr) { while(Rx1_Get(Chr)!=ERR_OK) { /* retry receiving until success */ } return ERR_OK; } /* ** =================================================================== ** Method : CDC1_SendChar (component FSL_USB_CDC_Device) ** Description : ** Method to send a character to the USB interface. Method is ** non-blocking: If the output buffer is full, it tries to send ** it over USB. If this fails or buffer is still full, the ** character will be lost. If OnError() event is enabled, the ** error event will be called in case of error. ** Parameters : ** NAME - DESCRIPTION ** Chr - Character to send. ** Returns : ** --- - Error code. ERR_OK for success and ** ERR_FAILED otherwise. ** =================================================================== */ byte CDC1_SendChar(CDC1_TComData Chr) { static uint8 txBuf[CDC1_DATA_BUFF_SIZE]; if(Tx1_Put(Chr)==ERR_TXFULL) { /* retry once, otherwise throw it away */ if(CDC1_App_Task(txBuf, sizeof(txBuf))!=ERR_OK) { /* call USB handler: if active, then this will empty the buffer */ return ERR_TXFULL; } else { /* retry, as USB App_Task() should have sent the buffer */ return Tx1_Put(Chr); /* retry. If buffer is still full, we will lose the character */ } } return ERR_OK; } /* ** =================================================================== ** Method : CDC1_SendBlock (component FSL_USB_CDC_Device) ** Description : ** Method to send a data block to the USB interface. Method is ** non-blocking: if data cannot be sent, it will be lost. If ** OnError() event is enabled, the error event will be called ** in case of error. ** Parameters : ** NAME - DESCRIPTION ** * data - Pointer to data to send. ** dataSize - Size of data in bytes ** Returns : ** --- - Error code. ERR_OK for success and ** ERR_FAILED otherwise. ** =================================================================== */ byte CDC1_SendBlock(byte *data, word dataSize) { byte res = ERR_OK; while(dataSize > 0) { if(CDC1_SendChar(*data)!=ERR_OK) { res = ERR_TXFULL; } dataSize--; data++; } return res; } /* ** =================================================================== ** Method : CDC1_SendString (component FSL_USB_CDC_Device) ** Description : ** Method to send a string to the USB interface. Method is ** non-blocking: if string cannot be sent, it will be lost. If ** OnError() event is enabled, the error event will be called ** in case of error. ** Parameters : ** NAME - DESCRIPTION ** * Chr - Pointer to string to send. ** Returns : ** --- - Error code. ERR_OK for success and ** ERR_FAILED otherwise. ** =================================================================== */ byte CDC1_SendString(CDC1_TComData *Chr) { byte res = ERR_OK; while(*Chr != '\0') { if(CDC1_SendChar(*Chr)!=ERR_OK) { res = ERR_TXFULL; } Chr++; } return res; } /* ** =================================================================== ** Method : CDC1_App_Callback (component FSL_USB_CDC_Device) ** Description : ** Method to handle class callbacks from USB ** Parameters : ** NAME - DESCRIPTION ** controller_ID - controller ID ** event_type - value of the event ** val - gives the configuration value ** Returns : Nothing ** =================================================================== */ void CDC1_App_Callback(byte controller_ID, byte event_type, void *val) { UNUSED(controller_ID); UNUSED(val); if(event_type == USB_APP_BUS_RESET) { start_app = FALSE; } else if(event_type == USB_APP_ENUM_COMPLETE) { #if HIGH_SPEED_DEVICE /* prepare for the next receive event */ USB_Class_CDC_Interface_DIC_Recv_Data(&controller_ID, (uint_8_ptr)g_cdcBuffer, DIC_BULK_OUT_ENDP_PACKET_SIZE); #endif start_app = TRUE; } else if((event_type == USB_APP_DATA_RECEIVED)&&(start_transactions==TRUE)) { /* Copy Received Data buffer to Application Buffer */ USB_PACKET_SIZE BytesToBeCopied; APP_DATA_STRUCT *dp_rcv = (APP_DATA_STRUCT*)val; uint_8 index; BytesToBeCopied = (USB_PACKET_SIZE)((dp_rcv->data_size > CDC1_DATA_BUFF_SIZE) ? CDC1_DATA_BUFF_SIZE:dp_rcv->data_size); for(index = 0; indexdata_ptr[index])!=ERR_OK) { /* Failed to put byte into buffer. Is the buffer to small? Then increase the Rx buffer. Otherwise not much we could do here, so we are loosing byte here. */ /* Enable OnError() event so this event will be called here */ } } (void)USB_Class_CDC_Interface_DIC_Recv_Data(CONTROLLER_ID, NULL, 0); /* see http://eprints.utar.edu.my/143/1/BI-2011-0708672-1.pdf, page 131 */ } else if((event_type == USB_APP_SEND_COMPLETE)&&(start_transactions==TRUE)) { transactionOngoing = FALSE; /* Previous Send is complete. Queue next receive */ #if HIGH_SPEED_DEVICE //(void)USB_Class_CDC_Interface_DIC_Recv_Data(CONTROLLER_ID, g_cdcBuffer, 0); #else (void)USB_Class_CDC_Interface_DIC_Recv_Data(CONTROLLER_ID, NULL, 0); #endif } else if(event_type == USB_APP_ERROR) { /* detach? */ start_app = FALSE; start_transactions = FALSE; } } /* ** =================================================================== ** Method : CDC1_Notify_Callback (component FSL_USB_CDC_Device) ** Description : ** Method to handle PSTN Sub Class callbacks ** Parameters : ** NAME - DESCRIPTION ** controller_ID - controller ID ** event_type - value of the event ** val - ** Returns : Nothing ** =================================================================== */ void CDC1_Notify_Callback(byte controller_ID, byte event_type, void *val) { UNUSED(controller_ID); UNUSED(val); if(start_app == TRUE) { if(event_type == USB_APP_CDC_CARRIER_ACTIVATED) { start_transactions = TRUE; } else if(event_type == USB_APP_CDC_CARRIER_DEACTIVATED) { start_transactions = FALSE; } } start_transactions = TRUE; /* ??? see http://forums.freescale.com/t5/Freescale-MQX-trade-USB-Host/Cant-get-CDC-virtual-com-demo-to-work-with-VB2005-on-xp-sp3/m-p/92713#M302 */ } /* ** =================================================================== ** Method : CDC1_RunUsbEngine (component FSL_USB_CDC_Device) ** ** Description : ** Runs the USB polling engine ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ void CDC1_RunUsbEngine(void) { /* not needed */ } /* ** =================================================================== ** Method : CDC1_SendDataBlock (component FSL_USB_CDC_Device) ** ** Description : ** Sends a USB data block ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ byte CDC1_SendDataBlock(byte *data, word dataSize) { uint8 res = ERR_OK; transactionOngoing = TRUE; if(USB_Class_CDC_Interface_DIC_Send_Data(CONTROLLER_ID, data, dataSize)!=USB_OK) { transactionOngoing = FALSE; return ERR_FAULT; } /* wait for transaction finish */ while(transactionOngoing) { /* wait until transaction is finished */ CDC1_RunUsbEngine(); } return res; } /* ** =================================================================== ** Method : CDC1_App_Task (component FSL_USB_CDC_Device) ** Description : ** Application task to be called periodically from the main ** task. ** Parameters : ** NAME - DESCRIPTION ** * txBuf - Pointer to temporary buffer used to ** transmit data over USB. Should be equal or ** greater than the endpoint buffer size. Data ** will be sent in an asynchronous way, so ** make sure the buffer is *not* on the stack. ** This buffer must be available until the ** next transmission. ** txBufSize - Size of the buffer in bytes ** Returns : ** --- - Error code, returns ERR_OK if USB ** enumeration has been finished, error code ** otherwise. ** =================================================================== */ byte CDC1_App_Task(byte *txBuf, size_t txBufSize) { uint8 i, res; /* device is Kinetis K20D72 */ CDC1_RunUsbEngine(); /* call the periodic task function */ USB_Class_CDC_Periodic_Task(); /* check whether enumeration is complete or not */ if((start_app==TRUE) && (start_transactions==TRUE)) { if(Tx1_NofElements()!=0) { i = 0; while(iCDC1_GetFreeInTxBuf()) { /* no room at the Inn... */ res = ERR_TXFULL; } else { res = ERR_OK; while(bufSize>0 && res==ERR_OK) { res = Tx1_Put(*buf); bufSize--; buf++; } } return res; } /* ** =================================================================== ** Method : CDC1_ClearRxBuffer (component FSL_USB_CDC_Device) ** Description : ** Clears the receiver buffer content ** Parameters : None ** Returns : Nothing ** =================================================================== */ /** void CDC1_ClearRxBuffer(void) { Implemented as macro in the header file } */ /* ** =================================================================== ** Method : CDC1_ClearTxBuffer (component FSL_USB_CDC_Device) ** Description : ** Clears the transmit buffer content ** Parameters : None ** Returns : Nothing ** =================================================================== */ /** void CDC1_ClearTxBuffer(void) { Implemented as macro in the header file } */ /* END CDC1. */ /*! ** @} */ /* ** ################################################################### ** ** This file was created by Processor Expert 10.4 [05.11] ** for the Freescale Kinetis series of microcontrollers. ** ** ################################################################### */