150 lines
5.2 KiB
C
150 lines
5.2 KiB
C
|
/*******************************************************************
|
||
|
Copyright (C) 2009 FreakLabs
|
||
|
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. Neither the name of the the copyright holder nor the names of its contributors
|
||
|
may be used to endorse or promote products derived from this software
|
||
|
without specific prior written permission.
|
||
|
|
||
|
THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``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 INSTITUTE OR CONTRIBUTORS 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.
|
||
|
|
||
|
Originally written by Christopher Wang aka Akiba.
|
||
|
Please post support questions to the FreakLabs forum.
|
||
|
*******************************************************************/
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@file uart_buf.c
|
||
|
@author Christopher Wang (Freaklabs)
|
||
|
Modified by: K. Townsend (microBuilder.eu)
|
||
|
@date 19 May 2010
|
||
|
|
||
|
Original code taken from the FreakUSB Open Source USB Device Stack
|
||
|
http://freaklabs.org/index.php/FreakUSB-Open-Source-USB-Device-Stack.html
|
||
|
|
||
|
If it works well, you can thank Akiba at Freaklabs. If it fails
|
||
|
miserably, you can blame me (since parts of it it were rather
|
||
|
ungraciously modified). :-)
|
||
|
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
|
||
|
#include "uart.h"
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
Initialises the RX FIFO buffer
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
void uartRxBufferInit()
|
||
|
{
|
||
|
uart_pcb_t *pcb = uartGetPCB();
|
||
|
pcb->rxfifo.len = 0;
|
||
|
}
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
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.
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
uint8_t uartRxBufferRead()
|
||
|
{
|
||
|
uart_pcb_t *pcb = uartGetPCB();
|
||
|
uint8_t data;
|
||
|
|
||
|
data = pcb->rxfifo.buf[pcb->rxfifo.rd_ptr];
|
||
|
pcb->rxfifo.rd_ptr = (pcb->rxfifo.rd_ptr + 1) % CFG_UART_BUFSIZE;
|
||
|
pcb->rxfifo.len--;
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
Read byte array from uart
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
bool uartRxBufferReadArray(byte_t* rx, size_t* len)
|
||
|
{
|
||
|
uart_pcb_t *pcb = uartGetPCB();
|
||
|
*len = 0;
|
||
|
|
||
|
while(pcb->rxfifo.len != 0)
|
||
|
{
|
||
|
(*rx) = uartRxBufferRead();
|
||
|
(*len)++;
|
||
|
rx++;
|
||
|
}
|
||
|
|
||
|
return (*len != 0);
|
||
|
}
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
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.
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
void uartRxBufferWrite(uint8_t data)
|
||
|
{
|
||
|
uart_pcb_t *pcb = uartGetPCB();
|
||
|
|
||
|
pcb->rxfifo.buf[pcb->rxfifo.wr_ptr] = data;
|
||
|
pcb->rxfifo.wr_ptr = (pcb->rxfifo.wr_ptr + 1) % CFG_UART_BUFSIZE;
|
||
|
pcb->rxfifo.len++;
|
||
|
}
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
Clear the fifo read and write pointers and set the length to zero.
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
void uartRxBufferClearFIFO()
|
||
|
{
|
||
|
uart_pcb_t *pcb = uartGetPCB();
|
||
|
|
||
|
pcb->rxfifo.rd_ptr = 0;
|
||
|
pcb->rxfifo.wr_ptr = 0;
|
||
|
pcb->rxfifo.len = 0;
|
||
|
}
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
Check whether there is any data pending on the RX buffer.
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
uint8_t uartRxBufferDataPending()
|
||
|
{
|
||
|
uart_pcb_t *pcb = uartGetPCB();
|
||
|
|
||
|
if (pcb->rxfifo.len != 0)
|
||
|
{
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|