fixup the uart tx isr.
This commit is contained in:
parent
1460eac9cd
commit
e278ec0242
27
lib/uart1.c
27
lib/uart1.c
|
@ -36,7 +36,7 @@
|
||||||
#include <mc1322x.h>
|
#include <mc1322x.h>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
|
||||||
volatile char u1_tx_buf[1024];
|
volatile char u1_tx_buf[64];
|
||||||
volatile uint32_t u1_head, u1_tail;
|
volatile uint32_t u1_head, u1_tail;
|
||||||
|
|
||||||
void uart1_isr(void) {
|
void uart1_isr(void) {
|
||||||
|
@ -50,20 +50,25 @@ void uart1_isr(void) {
|
||||||
if (u1_tail >= sizeof(u1_tx_buf))
|
if (u1_tail >= sizeof(u1_tx_buf))
|
||||||
u1_tail = 0;
|
u1_tail = 0;
|
||||||
}
|
}
|
||||||
enable_irq(UART1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uart1_putc(char c) {
|
void uart1_putc(char c) {
|
||||||
uint32_t h = u1_head;
|
/* disable UART1 since */
|
||||||
h = u1_head + 1;
|
/* UART1 isr modifies u1_head and u1_tail */
|
||||||
if (h >= sizeof(u1_tx_buf))
|
disable_irq(UART1);
|
||||||
h = 0;
|
|
||||||
if (h == u1_tail) /* drop chars when no room */
|
|
||||||
return;
|
|
||||||
u1_tx_buf[u1_head] = c;
|
|
||||||
u1_head = h;
|
|
||||||
|
|
||||||
uart1_isr();
|
if( (u1_head == u1_tail) &&
|
||||||
|
(*UART1_UTXCON != 0)) {
|
||||||
|
*UART1_UDATA = c;
|
||||||
|
} else {
|
||||||
|
u1_tx_buf[u1_head] = c;
|
||||||
|
u1_head += 1;
|
||||||
|
if (u1_head >= sizeof(u1_tx_buf))
|
||||||
|
u1_head = 0;
|
||||||
|
if (u1_head == u1_tail) /* drop chars when no room */
|
||||||
|
return;
|
||||||
|
enable_irq(UART1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t uart1_getc(void) {
|
uint8_t uart1_getc(void) {
|
||||||
|
|
|
@ -59,10 +59,14 @@ void uart1_init(uint16_t inc, uint16_t mod, uint8_t samp) {
|
||||||
if(samp == UCON_SAMP_16X)
|
if(samp == UCON_SAMP_16X)
|
||||||
set_bit(*UART1_UCON,UCON_SAMP);
|
set_bit(*UART1_UCON,UCON_SAMP);
|
||||||
*GPIO_FUNC_SEL0 = ( (0x01 << (14*2)) | (0x01 << (15*2)) ); /* set GPIO15-14 to UART (UART1 TX and RX)*/
|
*GPIO_FUNC_SEL0 = ( (0x01 << (14*2)) | (0x01 << (15*2)) ); /* set GPIO15-14 to UART (UART1 TX and RX)*/
|
||||||
|
|
||||||
/* interrupt when 28 bytes are free */
|
/* interrupt when there are this number or more bytes free in the TX buffer*/
|
||||||
*UART1_UTXCON = 28;
|
*UART1_UTXCON = 16;
|
||||||
|
|
||||||
u1_head = 0; u1_tail = 0;
|
u1_head = 0; u1_tail = 0;
|
||||||
|
|
||||||
|
/* tx and rx interrupts are enabled in the UART by default */
|
||||||
|
/* see status register bits 13 and 14 */
|
||||||
|
/* enable UART1 interrupts in the interrupt controller */
|
||||||
enable_irq(UART1);
|
enable_irq(UART1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue