ArduinoCore-samd/bootloaders/metroM4/sam_ba_cdc.c
2018-08-30 14:51:09 -04:00

98 lines
2.6 KiB
C

/*
Copyright (c) 2015 Arduino LLC. All right reserved.
Copyright (c) 2015 Atmel Corporation/Thibaut VIARD. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "sam_ba_cdc.h"
#include "board_driver_usb.h"
usb_cdc_line_coding_t line_coding=
{
115200, // baudrate
0, // 1 Stop Bit
0, // None Parity
8 // 8 Data bits
};
#define pCdc (&sam_ba_cdc)
int cdc_putc(/*P_USB_CDC pCdc,*/ int value)
{
/* Send single byte on USB CDC */
USB_Write(pCdc->pUsb, (const char *)&value, 1, USB_EP_IN);
return 1;
}
int cdc_getc(/*P_USB_CDC pCdc*/void)
{
uint8_t rx_char;
/* Read singly byte on USB CDC */
USB_Read(pCdc->pUsb, (char *)&rx_char, 1);
return (int)rx_char;
}
bool cdc_is_rx_ready(/*P_USB_CDC pCdc*/void)
{
/* Check whether the device is configured */
if ( !USB_IsConfigured(pCdc) )
return 0;
/* Return transfer complete 0 flag status */
return (pCdc->pUsb->DEVICE.DeviceEndpoint[USB_EP_OUT].EPINTFLAG.bit.TRCPT0);
}
uint32_t cdc_write_buf(/*P_USB_CDC pCdc,*/ void const* data, uint32_t length)
{
/* Send the specified number of bytes on USB CDC */
USB_Write(pCdc->pUsb, (const char *)data, length, USB_EP_IN);
return length;
}
uint32_t cdc_read_buf(/*P_USB_CDC pCdc,*/ void* data, uint32_t length)
{
/* Check whether the device is configured */
if ( !USB_IsConfigured(pCdc) )
return 0;
/* Read from USB CDC */
return USB_Read(pCdc->pUsb, (char *)data, length);
}
uint32_t cdc_read_buf_xmd(/*P_USB_CDC pCdc,*/ void* data, uint32_t length)
{
/* Check whether the device is configured */
if ( !USB_IsConfigured(pCdc) )
return 0;
/* Blocking read till specified number of bytes is received */
// XXX: USB_Read_blocking is not reliable
// return USB_Read_blocking(pCdc, (char *)data, length);
char *dst = (char *)data;
uint32_t remaining = length;
while (remaining)
{
uint32_t readed = USB_Read(pCdc->pUsb, (char *)dst, remaining);
remaining -= readed;
dst += readed;
}
return length;
}