diff options
| author | hathach <[email protected]> | 2012-11-28 11:53:23 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2012-11-28 11:53:23 +0700 |
| commit | 851f5bfd06c837626ddf06f1c326970763d07010 (patch) | |
| tree | f8d2b65856ef7d9eb6e0f9ffd8e67ec0c46789f7 /tinyusb/common | |
| parent | a5eecb40555d5053393dd3d0916fa63bfa9a6b18 (diff) | |
make keyboard device work with lpc1347
Diffstat (limited to 'tinyusb/common')
| -rw-r--r-- | tinyusb/common/common.h | 2 | ||||
| -rw-r--r-- | tinyusb/common/fifo.c | 212 | ||||
| -rw-r--r-- | tinyusb/common/fifo.h | 76 |
3 files changed, 289 insertions, 1 deletions
diff --git a/tinyusb/common/common.h b/tinyusb/common/common.h index de87ca1a8..1405b7605 100644 --- a/tinyusb/common/common.h +++ b/tinyusb/common/common.h @@ -51,7 +51,7 @@ #include "errors.h" //#if ( defined CFG_PRINTF_UART || defined CFG_PRINTF_USBCDC || defined CFG_PRINTF_DEBUG ) -#if 1 +#if 1 // TODO refractor ASSERT #define PRINTF_LOCATION(mess) printf("Assert: %s at line %d: %s\n", __func__, __LINE__, mess) #else #define PRINTF_LOCATION(mess) diff --git a/tinyusb/common/fifo.c b/tinyusb/common/fifo.c new file mode 100644 index 000000000..1a8d3cce5 --- /dev/null +++ b/tinyusb/common/fifo.c @@ -0,0 +1,212 @@ +/* + * fifo.c + * + * Created on: Nov 27, 2012 + * Author: hathach ([email protected]) + */ + +/* + * Software License Agreement (BSD License) + * Copyright (c) 2012, hathach ([email protected]) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the tiny usb stack. + */ + +#include "fifo.h" + +/**************************************************************************/ +/*! + @brief Disables the IRQ specified in the FIFO's 'irq' field + to prevent reads/write issues with interrupts + + @param[in] f + Pointer to the FIFO that should be protected +*/ +/**************************************************************************/ +static inline void mutex_lock (fifo_t* f) +{ + if (f->irq > 0) + NVIC_DisableIRQ(f->irq); +} + +/**************************************************************************/ +/*! + @brief Re-enables the IRQ specified in the FIFO's 'irq' field + + @param[in] f + Pointer to the FIFO that should be protected +*/ +/**************************************************************************/ +static inline void mutex_unlock (fifo_t* f) +{ + if (f->irq > 0) + NVIC_EnableIRQ(f->irq); +} + +/**************************************************************************/ +/*! + @brief Initialises the FIFO buffer + + @param[in] f + Pointer to the fifo_t object to intiialize + @param[in] buffer + Pointer to the buffer's location in memory + @param[in] size + The buffer size in bytes + @param[in] overwritable + Set to TRUE is the FIFO is overwritable when the FIFO + is full (the first element will be overwritten) + @param[in] irq + The IRQ number to disable for MUTEX protection. + Set the -1 if not required. +*/ +/**************************************************************************/ +void fifo_init(fifo_t* f, uint8_t* buffer, uint16_t size, bool overwritable, IRQn_Type irq) +{ + f->buf = buffer; + f->size = size; + f->rd_ptr = f->wr_ptr = f->len = 0; + f->overwritable = overwritable; + f->irq = irq; +} + +/**************************************************************************/ +/*! + @brief Read one byte out of the RX buffer. + + This function will return the byte located at the array index of the + read pointer, and then increment the read pointer index. If the read + pointer exceeds the maximum buffer size, it will roll over to zero. + + @param[in] f + Pointer to the FIFO buffer to manipulate + @param[in] data + Pointer to the place holder for data read from the buffer + + @returns TRUE if the queue is not empty +*/ +/**************************************************************************/ +bool fifo_read(fifo_t* f, uint8_t *data) +{ + if (fifo_isEmpty(f)) + return false; + + mutex_lock(f); + + *data = f->buf[f->rd_ptr]; + f->rd_ptr = (f->rd_ptr + 1) % f->size; + f->len--; + + mutex_unlock(f); + + return true; +} + +/**************************************************************************/ +/*! + @brief Read a byte array from FIFO + + @param[in] f + Pointer to the FIFO buffer to manipulate + @param[in] rx + Pointer to the place holder for data read from the buffer + @param[in] maxlen + The maximum number of bytes to read from the FIFO + + @returns The actual number of bytes read from the FIFO + */ +/**************************************************************************/ +uint16_t fifo_readArray(fifo_t* f, uint8_t* rx, uint16_t maxlen) +{ + uint16_t len = 0; + + while ( len < maxlen && fifo_read(f, rx) ) + { + len++; + rx++; + } + + return len; +} + +/**************************************************************************/ +/*! + @brief Write one byte into the RX buffer. + + This function will write one byte into the array index specified by + the write pointer and increment the write index. If the write index + exceeds the max buffer size, then it will roll over to zero. + + @param[in] f + Pointer to the FIFO buffer to manipulate + @param[in] data + The byte to add to the FIFO + + @returns TRUE if the data was written to the FIFO (overwrittable + FIFO will always return TRUE) +*/ +/**************************************************************************/ +bool fifo_write(fifo_t* f, uint8_t data) +{ + if ( fifo_isFull(f) && f->overwritable == false) + return false; + + mutex_lock(f); + + f->buf[f->wr_ptr] = data; + f->wr_ptr = (f->wr_ptr + 1) % f->size; + + if (fifo_isFull(f)) + { + f->rd_ptr = f->wr_ptr; // keep the full state (rd == wr && len = size) + }else + { + f->len++; + } + + mutex_unlock(f); + + return true; +} + +/**************************************************************************/ +/*! + @brief Clear the fifo read and write pointers and set length to zero + + @param[in] f + Pointer to the FIFO buffer to manipulate +*/ +/**************************************************************************/ +void fifo_clear(fifo_t *f) +{ + mutex_lock(f); + + f->rd_ptr = 0; + f->wr_ptr = 0; + f->len = 0; + + mutex_unlock(f); +} diff --git a/tinyusb/common/fifo.h b/tinyusb/common/fifo.h new file mode 100644 index 000000000..1019c8bde --- /dev/null +++ b/tinyusb/common/fifo.h @@ -0,0 +1,76 @@ +/* + * fifo.h + * + * Created on: Nov 27, 2012 + * Author: hathach ([email protected]) + */ + +/* + * Software License Agreement (BSD License) + * Copyright (c) 2012, hathach ([email protected]) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the tiny usb stack. + */ + +#ifndef _TUSB_FIFO_H_ +#define _TUSB_FIFO_H_ + +#include "common/common.h" + +/* ToDo: Describe each field in fifo_t */ +typedef struct _fifo_t +{ + uint8_t* buf; + uint16_t size; + volatile uint16_t len; + volatile uint16_t wr_ptr; + volatile uint16_t rd_ptr; + bool overwritable; + IRQn_Type irq; +} fifo_t; + +void fifo_init(fifo_t* f, uint8_t* buffer, uint16_t size, bool overwritable, IRQn_Type irq); +bool fifo_write(fifo_t* f, uint8_t data); +bool fifo_read(fifo_t* f, uint8_t *data); +uint16_t fifo_readArray(fifo_t* f, uint8_t * rx, uint16_t maxlen); +void fifo_clear(fifo_t*); + +static inline bool fifo_isEmpty(fifo_t* f) +{ + return (f->len == 0); +} + +static inline bool fifo_isFull(fifo_t* f) +{ + return (f->len == f->size); +} + +static inline uint16_t fifo_getLength(fifo_t* f) +{ + return f->len; +} + +#endif /* _TUSB_FIFO_H_ */ |
