diff options
Diffstat (limited to 'core/comm')
| -rw-r--r-- | core/comm/HardwareSerial.cpp | 97 | ||||
| -rw-r--r-- | core/comm/HardwareSerial.h | 48 | ||||
| -rw-r--r-- | core/comm/HardwareUsb.cpp | 96 | ||||
| -rw-r--r-- | core/comm/HardwareUsb.h | 48 | 
4 files changed, 289 insertions, 0 deletions
diff --git a/core/comm/HardwareSerial.cpp b/core/comm/HardwareSerial.cpp new file mode 100644 index 0000000..04d8d18 --- /dev/null +++ b/core/comm/HardwareSerial.cpp @@ -0,0 +1,97 @@ +/* ***************************************************************************** + *  This program is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  This program 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 General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program.  If not, see <http://www.gnu.org/licenses/>. + * + *  Created: 12/19/09 05:15:24 EST + *  Copyright (c) 2009 Perry L. Hung. All rights reserved. + * + * ****************************************************************************/ + +/** + *  @file HardwareSerial.cpp + * + *  @brief Wiring-like serial api + */ + +#include "wiring.h" +#include "HardwareSerial.h" +#include "usart.h" +#include "gpio.h" +#include "timers.h" + +#define USART1_TX_PORT             GPIOA_BASE +#define USART1_TX_PIN              9 +#define USART1_RX_PORT             GPIOA_BASE +#define USART1_RX_PIN              10 + +#define USART2_TX_PORT             GPIOA_BASE +#define USART2_TX_PIN              2 +#define USART2_RX_PORT             GPIOA_BASE +#define USART2_RX_PIN              3 + +#define USART3_TX_PORT             GPIOB_BASE +#define USART3_TX_PIN              10 +#define USART3_RX_PORT             GPIOB_BASE +#define USART3_RX_PIN              11 + +HardwareSerial::HardwareSerial(uint8_t usartNum) { +    ASSERT(usartNum == 1 || +           usartNum == 2 || +           usartNum == 3); +    this->usartNum = usartNum; +} + +uint8_t HardwareSerial::read(void) { +    return usart_getc(usartNum); +} + +uint32 HardwareSerial::available(void) { + +    return usart_data_available(usartNum); +} + +void HardwareSerial::write(unsigned char ch) { +    usart_putc(usartNum, ch); +} + +void HardwareSerial::begin(uint32_t baud) { +    ASSERT(!(baud > USART_MAX_BAUD)); + +    /* Set appropriate pin modes  */ +    switch (usartNum) { +    case 1: +        gpio_set_mode(USART1_TX_PORT, USART1_TX_PIN, GPIO_MODE_AF_OUTPUT_PP); +        gpio_set_mode(USART1_RX_PORT, USART1_RX_PIN, GPIO_MODE_INPUT_FLOATING); +        /* Turn off any pwm  */ +        timers_disable_channel(1, 2); +        break; +    case 2: +        gpio_set_mode(USART2_TX_PORT, USART2_TX_PIN, GPIO_MODE_AF_OUTPUT_PP); +        gpio_set_mode(USART2_RX_PORT, USART2_RX_PIN, GPIO_MODE_INPUT_FLOATING); +        /* Turn off any pwm  */ +        timers_disable_channel(2, 3); +        break; +    case 3: +        gpio_set_mode(USART3_TX_PORT, USART3_TX_PIN, GPIO_MODE_AF_OUTPUT_PP); +        gpio_set_mode(USART3_RX_PORT, USART3_RX_PIN, GPIO_MODE_INPUT_FLOATING); +        break; +    default: +        ASSERT(0); +    } + +    usart_init(usartNum, baud); +} + +HardwareSerial Serial1(1); +HardwareSerial Serial2(2); +HardwareSerial Serial3(3); diff --git a/core/comm/HardwareSerial.h b/core/comm/HardwareSerial.h new file mode 100644 index 0000000..a3913f9 --- /dev/null +++ b/core/comm/HardwareSerial.h @@ -0,0 +1,48 @@ +/* ***************************************************************************** + *  This program is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  This program 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 General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program.  If not, see <http://www.gnu.org/licenses/>. + * + *  Created: 12/19/09 05:45:37 EST + *  Copyright (c) 2009 Perry L. Hung. All rights reserved. + * + * ****************************************************************************/ + +/** + *  @file HardwareSerial.h + * + *  @brief  + */ + +#ifndef _HARDWARESERIAL_H_ +#define _HARDWARESERIAL_H_ + +#include "Print.h" + +class HardwareSerial : public Print { +    private: +        uint8 usartNum; +    public: +        HardwareSerial(uint8_t); +        void begin(uint32_t); +        uint32 available(void); +        uint8_t read(void); +        void flush(void); +        virtual void write(unsigned char); +        using Print::write; +}; + +extern HardwareSerial Serial1; +extern HardwareSerial Serial2; +extern HardwareSerial Serial3; +#endif + diff --git a/core/comm/HardwareUsb.cpp b/core/comm/HardwareUsb.cpp new file mode 100644 index 0000000..269a68f --- /dev/null +++ b/core/comm/HardwareUsb.cpp @@ -0,0 +1,96 @@ +/* ***************************************************************************** + *  This program is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  This program 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 General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * ****************************************************************************/ + +/** + *  @file HardwareUsb.cpp + * + *  @brief Wiring like serial api to USB virtual COM + */ + +#include "wiring.h" +#include "HardwareUsb.h" +#include "bootVect.h" +#include "usb.h" + +HardwareUsb::HardwareUsb(void) { +  mapleVectTable = (BootVectTable*)(BOOTLOADER_VECT_TABLE); +  mapleVectTable->serial_tx_cb = usb_tx_cb; +  mapleVectTable->serial_rx_cb = usb_rx_cb; +  mapleVectTable->usb_local_obj_ptr = this; +  rx_buffer_offset_in = 0; +  rx_buffer_offset_out = 0; +} + +uint8_t HardwareUsb::read(void) { +  uint8_t outVal = rx_buffer[rx_buffer_offset_out++]; + +#if 1 +  if (rx_buffer_offset_out == rx_buffer_offset_in) { +    flush(); +  } +#endif + +  return outVal; +} + +uint8_t HardwareUsb::available(void) { +  ASSERT(rx_buffer_offset_out >= 0); +  //  return rx_buffer_offset+1; +  //  return usb_serialGetRecvLen(); +  return rx_buffer_offset_in - rx_buffer_offset_out; +} + +void HardwareUsb::flush(void) { +  rx_buffer_offset_in = 0; +  rx_buffer_offset_out = 0; +} + +void HardwareUsb::write(unsigned char ch) { +  usb_serialWriteChar(ch); +} + +void HardwareUsb::begin(void) { +  /* placeholder for usb<->uart linking */ +} + +void HardwareUsb::usb_rx_cb(void) { +   BootVectTable *vectTable = (BootVectTable*)(BOOTLOADER_VECT_TABLE); +   HardwareUsb *thisPtr = (HardwareUsb*) vectTable->usb_local_obj_ptr; + +   uint8_t numBytes = usb_serialGetRecvLen(); + +#if 0 +   /* ONE-SHOT-TO-READ Version (buffer cleared on next recv interrupt */ +   usb_copyRecvBuffer(thisPtr->rx_buffer,numBytes); +   thisPtr->rx_buffer_offset_in = numBytes; +   thisPtr->rx_buffer_offset_out = 0; +#else  +  /* FIFO DISCARD OVERFLOW VERSION */ +  if ((thisPtr->rx_buffer_offset_in + numBytes) > (USB_SERIAL_BUF_SIZE)) { +    numBytes = USB_SERIAL_BUF_SIZE - thisPtr->rx_buffer_offset_in; +  } + +  if (numBytes > 0) { +    ASSERT(thisPtr->rx_buffer_offset_in <= USB_SERIAL_BUF_SIZE); +    usb_copyRecvBuffer(&(thisPtr->rx_buffer[thisPtr->rx_buffer_offset_in]),numBytes); +    thisPtr->rx_buffer_offset_in += numBytes; +  } +#endif +} + +void HardwareUsb::usb_tx_cb(void) { +  /* placeholder for when serial dumps exceed buflen */ +} diff --git a/core/comm/HardwareUsb.h b/core/comm/HardwareUsb.h new file mode 100644 index 0000000..b8733c1 --- /dev/null +++ b/core/comm/HardwareUsb.h @@ -0,0 +1,48 @@ +/* ***************************************************************************** + *  This program is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  This program 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 General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * ****************************************************************************/ + +/** + *  @file HardwareUsb.h + * + *  @brief Wiring like serial api to USB virtual COM + */ + +#ifndef _HARDWAREUSB_H_ +#define _HARDWAREUSB_H_ + +#include "Print.h" +#include "bootVect.h" +#include "usb.h" + +class HardwareUsb : public Print { +    private: +        BootVectTable* mapleVectTable; +	static void usb_rx_cb(void); +	static void usb_tx_cb(void); +	unsigned char rx_buffer[USB_SERIAL_BUF_SIZE]; +	int8_t rx_buffer_offset_out; +	int8_t rx_buffer_offset_in; +    public: +        HardwareUsb(void); +	void begin(); +	uint8_t available(void); +	uint8_t read(void); +	void flush(void); +	virtual void write(unsigned char); +	using Print::write; +}; + +#endif //_HARDWAREUSB_H  | 
