189 lines
3.8 KiB
C
189 lines
3.8 KiB
C
![]() |
#include <stdio.h>
|
||
|
#include "Mini58Series.h"
|
||
|
#include "myUart.h"
|
||
|
|
||
|
|
||
|
#if USE_UART0
|
||
|
|
||
|
static volatile struct {
|
||
|
uint16_t tri, twi, tct;
|
||
|
uint16_t rri, rwi, rct;
|
||
|
uint8_t tbuf[UART0_TXB];
|
||
|
uint8_t rbuf[UART0_RXB];
|
||
|
} Fifo1;
|
||
|
|
||
|
|
||
|
|
||
|
void UART0_IRQHandler (void)
|
||
|
{
|
||
|
uint8_t d;
|
||
|
int i;
|
||
|
|
||
|
|
||
|
if (UART_GET_INT_FLAG(UART0,UART_INTEN_RDAIEN_Msk)) { /* RXNE is set: Rx ready */
|
||
|
d = UART_READ(UART0); /* Get received byte */
|
||
|
i = Fifo1.rct;
|
||
|
if (i < UART0_RXB) { /* Store it into the rx fifo if not full */
|
||
|
Fifo1.rct = ++i;
|
||
|
i = Fifo1.rwi;
|
||
|
Fifo1.rbuf[i] = d;
|
||
|
Fifo1.rwi = ++i % UART0_RXB;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (UART_GET_INT_FLAG(UART0,UART_INTEN_THREIEN_Msk)) { /* TXE is set: Tx ready */
|
||
|
i = Fifo1.tct;
|
||
|
if (i--) { /* There is any data in the tx fifo */
|
||
|
Fifo1.tct = (uint16_t)i;
|
||
|
i = Fifo1.tri;
|
||
|
UART_WRITE(UART0,Fifo1.tbuf[i]);
|
||
|
Fifo1.tri = ++i % UART0_TXB;
|
||
|
} else { /* No data in the tx fifo */
|
||
|
UART_DISABLE_INT(UART0,UART_INTEN_THREIEN_Msk); /* Clear TXEIE - Disable TXE irq */
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
int uart0_test (void)
|
||
|
{
|
||
|
return Fifo1.rct;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
uint8_t uart0_getc (void)
|
||
|
{
|
||
|
uint8_t d;
|
||
|
int i;
|
||
|
|
||
|
/* Wait while rx fifo is empty */
|
||
|
while (!Fifo1.rct) ;
|
||
|
|
||
|
i = Fifo1.rri; /* Get a byte from rx fifo */
|
||
|
d = Fifo1.rbuf[i];
|
||
|
Fifo1.rri = ++i % UART0_RXB;
|
||
|
NVIC_DisableIRQ(UART0_IRQn);
|
||
|
Fifo1.rct--;
|
||
|
NVIC_EnableIRQ(UART0_IRQn);
|
||
|
|
||
|
return d;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void uart0_putc (uint8_t d)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
/* Wait for tx fifo is not full */
|
||
|
while (Fifo1.tct >= UART0_TXB) ;
|
||
|
|
||
|
i = Fifo1.twi; /* Put a byte into Tx fifo */
|
||
|
Fifo1.tbuf[i] = d;
|
||
|
Fifo1.twi = ++i % UART0_TXB;
|
||
|
NVIC_DisableIRQ(UART0_IRQn);
|
||
|
Fifo1.tct++;
|
||
|
UART_ENABLE_INT(UART0,UART_INTEN_THREIEN_Msk); /* Set TXEIE - Enable TXE irq */
|
||
|
NVIC_EnableIRQ(UART0_IRQn);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void xprintf_init (uint32_t bps)
|
||
|
{
|
||
|
/* Init uart0 */
|
||
|
CLK_EnableModuleClock(UART0_MODULE);
|
||
|
#ifdef UART_USE_P46_P47
|
||
|
SYS->P4_MFP = SYS_MFP_P46_UART1_RXD | SYS_MFP_P47_UART1_TXD;
|
||
|
GPIO_ENABLE_DIGITAL_PATH(P4,(1<<6));
|
||
|
#else
|
||
|
SYS->P5_MFP = SYS_MFP_P51_UART0_RXD | SYS_MFP_P50_UART0_TXD;
|
||
|
GPIO_ENABLE_DIGITAL_PATH(P5,(1<<1));
|
||
|
#endif
|
||
|
UART_Open(UART0, bps);
|
||
|
UART_ENABLE_INT(UART0, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk /*| UART_INTEN_THREIEN_Msk*/));
|
||
|
NVIC_EnableIRQ(UART0_IRQn);
|
||
|
|
||
|
/* Clear Tx/Rx fifo */
|
||
|
Fifo1.tri = 0; Fifo1.twi = 0; Fifo1.tct = 0;
|
||
|
Fifo1.rri = 0; Fifo1.rwi = 0; Fifo1.rct = 0;
|
||
|
/* init xprintf with func */
|
||
|
xdev_out(uart0_putc);
|
||
|
xdev_in(uart0_getc);
|
||
|
}
|
||
|
|
||
|
#endif /* USE_UART0 */
|
||
|
|
||
|
#if USE_ERROUT
|
||
|
/* Error_out */
|
||
|
void Error_out (uint8_t rc)
|
||
|
{
|
||
|
const char *str =
|
||
|
"OK\0" "AD0_ERR\0" "AD1\0" "AD2\0" "AD3\0" "NO_PATH\0"
|
||
|
"INVALID_NAME\0" "DENIED\0" "EXIST\0" "INVALID_OBJECT\0" "WRITE_PROTECTED\0"
|
||
|
"INVALID_DRIVE\0" "NOT_ENABLED\0" "NO_FILE_SYSTEM\0" "MKFS_ABORTED\0" "TIMEOUT\0"
|
||
|
"LOCKED\0" "NOT_ENOUGH_CORE\0" "TOO_MANY_OPEN_FILES\0" "INVALID_PARAMETER\0";
|
||
|
uint8_t i;
|
||
|
|
||
|
for (i = 0; i != rc && *str; i++) {
|
||
|
while (*str++) ;
|
||
|
}
|
||
|
xprintf("Error=%u %s", (uint8_t)rc, str);
|
||
|
}
|
||
|
|
||
|
// wait_input
|
||
|
char Line[16]; /* Console input buffer */
|
||
|
void Uart_wait_input(void)
|
||
|
{
|
||
|
char *ptr;
|
||
|
ptr = Line;
|
||
|
switch (*ptr++) {
|
||
|
case '?' : /* Show Command List */
|
||
|
xputs(CmdList);
|
||
|
break;
|
||
|
case 'S' : /* test step */
|
||
|
case 's' :
|
||
|
switch (*ptr++) {
|
||
|
|
||
|
case '0' : /* S0 */
|
||
|
Error_out(0);
|
||
|
break;
|
||
|
case '1' : /* S1 */
|
||
|
Error_out(1);
|
||
|
break;
|
||
|
case '2' : /* S2 */
|
||
|
Error_out(2);
|
||
|
break;
|
||
|
case '3' : /* S3 */
|
||
|
Error_out(3);
|
||
|
break;
|
||
|
case '4' : /* S4 */
|
||
|
Error_out(4);
|
||
|
break;
|
||
|
case '5' : /* S5 */
|
||
|
Error_out(5);
|
||
|
break;
|
||
|
case '6' : /* S6 */
|
||
|
Error_out(6);
|
||
|
break;
|
||
|
case '7' : /* S7 */
|
||
|
Error_out(7);
|
||
|
break;
|
||
|
case '8' : /* S8 */
|
||
|
Error_out(8);
|
||
|
break;
|
||
|
case '9' : /* S9 */
|
||
|
Error_out(9);
|
||
|
break;
|
||
|
default:
|
||
|
Error_out(10);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|