display works sortof
[rpikern] / src / serial.c
index 465afc7..ba5faca 100644 (file)
@@ -10,20 +10,21 @@ 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);
+       /*gpio_fsel(14, FSEL_ALT0);
+       gpio_fsel(15, FSEL_ALT0);*/
 
        REG_ICR = 0x7ff;        /* clear pending interrupts */
 
        /* calculate baud rate divisor */
        bdiv_fp6 = (UART_CLK << 6) / (16 * baud);
-       REG_IBRD = 1;//(bdiv_fp6 >> 6) & 0xffff;        /* 16 bits integer part */
-       REG_FBRD = 40;//bdiv_fp6 & 0x3f;                /* 6 bits fractional precision */
+       REG_IBRD = (bdiv_fp6 >> 6) & 0xffff;    /* 16 bits integer part */
+       REG_FBRD = bdiv_fp6 & 0x3f;             /* 6 bits fractional precision */
 
        /* line control: fifo enable, 8n1 */
        REG_LCRH = LCRH_FIFOEN | LCRH_8BITS;
@@ -32,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++);
        }
 }