X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=rpikern;a=blobdiff_plain;f=src%2Fserial.c;h=ba5faca3e36f0ac10ce126f294c682ad47e90eb5;hp=ddd5923da5b59d0b99ac3925237c699f01a71c1c;hb=99bdc8838f189f79ba77bfbbf41d7f1b4839ce0f;hpb=9a3655a43358c43128f6e62c8d74ff3aa81960c7 diff --git a/src/serial.c b/src/serial.c index ddd5923..ba5faca 100644 --- a/src/serial.c +++ b/src/serial.c @@ -10,12 +10,16 @@ void init_serial(int baud) { uint32_t bdiv_fp6; + mem_barrier(); REG_CR = 0; /* disable UART */ /* disable pullups for GPIO 14 & 15 */ gpio_pullups(0xc000, 0, PUD_DISABLE); + /* select alt0 function for GPIO 14 & 15 */ + /*gpio_fsel(14, FSEL_ALT0); + gpio_fsel(15, FSEL_ALT0);*/ - REG_ICR = 0; /* clear pending interrupts */ + REG_ICR = 0x7ff; /* clear pending interrupts */ /* calculate baud rate divisor */ bdiv_fp6 = (UART_CLK << 6) / (16 * baud); @@ -29,26 +33,35 @@ void init_serial(int baud) /* enable UART RX&TX */ REG_CR = CR_UARTEN | CR_TXEN | CR_RXEN; + mem_barrier(); } void ser_putchar(int c) { + if(c == '\n') ser_putchar('\r'); + + mem_barrier(); while(REG_FR & FR_TXFF); REG_DR = c & 0xff; + mem_barrier(); } int ser_getchar(void) { + mem_barrier(); while(REG_FR & FR_RXFE); return REG_DR & 0xff; } +int ser_pending(void) +{ + mem_barrier(); + return (REG_FR & FR_RXFE) == 0; +} + void ser_printstr(const char *s) { while(*s) { - if(*s == '\n') { - ser_putchar('\r'); - } ser_putchar(*s++); } }