/****************************************************************************** Function: void putUSBUSART(char *data, BYTE length) Summary: putUSBUSART writes an array of data to the USB. Use this version, is capable of transfering 0x00 (what is typically a NULL character in any of the string transfer functions). Description: putUSBUSART writes an array of data to the USB. Use this version, is capable of transfering 0x00 (what is typically a NULL character in any of the string transfer functions). Typical Usage: <code> if(USBUSARTIsTxTrfReady()) { char data[] = {0x00, 0x01, 0x02, 0x03, 0x04}; putUSBUSART(data,5); } </code> The transfer mechanism for device-to-host(put) is more flexible than host-to-device(get). It can handle a string of data larger than the maximum size of bulk IN endpoint. A state machine is used to transfer a \long string of data over multiple USB transactions. CDCTxService() must be called periodically to keep sending blocks of data to the host. Conditions: USBUSARTIsTxTrfReady() must return TRUE. This indicates that the last transfer is complete and is ready to receive a new block of data. The string of characters pointed to by 'data' must equal to or smaller than 255 BYTEs. Input: char *data - pointer to a RAM array of data to be transfered to the host BYTE length - the number of bytes to be transfered (must be less than 255). *****************************************************************************/ void putUSBUSART(char *data, BYTE length) { /* * User should have checked that cdc_trf_state is in CDC_TX_READY state * before calling this function. * As a safety precaution, this fuction checks the state one more time * to make sure it does not override any pending transactions. * * Currently it just quits the routine without reporting any errors back * to the user. * * Bottomline: User MUST make sure that USBUSARTIsTxTrfReady()==1 * before calling this function! * Example: * if(USBUSARTIsTxTrfReady()) * putUSBUSART(pData, Length); * * IMPORTANT: Never use the following blocking while loop to wait: * while(!USBUSARTIsTxTrfReady()) * putUSBUSART(pData, Length); * * The whole firmware framework is written based on cooperative * multi-tasking and a blocking code is not acceptable. * Use a state machine instead. */ USBMaskInterrupts(); if(cdc_trf_state == CDC_TX_READY) { mUSBUSARTTxRam((BYTE*)data, length); // See cdc.h } USBUnmaskInterrupts(); }//end putUSBUSART
void putcUSBUSART(char data) { USBMaskInterrupts(); if(cdc_trf_state == CDC_TX_READY) { mUSBUSARTTxRam((BYTE*)&data, 1); // See cdc.h } USBUnmaskInterrupts(); }
void putsUSBUSART(char *data) { BYTE len; char *pData; /* * User should have checked that cdc_trf_state is in CDC_TX_READY state * before calling this function. * As a safety precaution, this fuction checks the state one more time * to make sure it does not override any pending transactions. * * Currently it just quits the routine without reporting any errors back * to the user. * * Bottomline: User MUST make sure that USBUSARTIsTxTrfReady()==1 * before calling this function! * Example: * if(USBUSARTIsTxTrfReady()) * putsUSBUSART(pData, Length); * * IMPORTANT: Never use the following blocking while loop to wait: * while(!USBUSARTIsTxTrfReady()) * putsUSBUSART(pData); * * The whole firmware framework is written based on cooperative * multi-tasking and a blocking code is not acceptable. * Use a state machine instead. */ USBMaskInterrupts(); if(cdc_trf_state != CDC_TX_READY) { USBUnmaskInterrupts(); return; } /* * While loop counts the number of BYTEs to send including the * null character. */ len = 0; pData = data; do { len++; if(len == 255) break; // Break loop once max len is reached. }while(*pData++); /* * Second piece of information (length of data to send) is ready. * Call mUSBUSARTTxRam to setup the transfer. * The actual transfer process will be handled by CDCTxService(), * which should be called once per Main Program loop. */ mUSBUSARTTxRam((BYTE*)data, len); // See cdc.h USBUnmaskInterrupts(); }//end putsUSBUSART