static int uart_getc(uint32_t uart_base) { uint16_t uart_rbr_val; /* wait for data ! */ while (!uart_tstc(uart_base)) continue; /* grab the new byte */ uart_rbr_val = bfin_read(&pUART->rbr); #ifdef CONFIG_DEBUG_SERIAL /* grab & clear the LSR */ uart_lsr_t uart_lsr_val = uart_lsr_read(uart_base); cached_lsr[cache_count] = uart_lsr_val; cached_rbr[cache_count] = uart_rbr_val; cache_count = (cache_count + 1) % ARRAY_SIZE(cached_lsr); if (uart_lsr_val & (OE|PE|FE|BI)) { printf("\n[SERIAL ERROR]\n"); do { --cache_count; printf("\t%3zu: RBR=0x%02x LSR=0x%02x\n", cache_count, cached_rbr[cache_count], cached_lsr[cache_count]); } while (cache_count > 0); return -1; } #endif uart_lsr_clear(uart_base); return uart_rbr_val; }
/* Symbol for common u-boot code to call. */ int serial_init(void) { serial_initialize(); serial_setbrg(); uart_lsr_clear(); #ifdef CONFIG_DEBUG_SERIAL cache_count = 0; memset(cached_lsr, 0x00, sizeof(cached_lsr)); memset(cached_rbr, 0x00, sizeof(cached_rbr)); #endif return 0; }
int serial_getc(void) { uint16_t uart_rbr_val; /* wait for data ! */ while (!serial_tstc()) continue; /* grab the new byte */ uart_rbr_val = *pUART_RBR; #ifdef CONFIG_DEBUG_SERIAL /* grab & clear the LSR */ uint16_t uart_lsr_val = uart_lsr_read(); cached_lsr[cache_count] = uart_lsr_val; cached_rbr[cache_count] = uart_rbr_val; cache_count = (cache_count + 1) % ARRAY_SIZE(cached_lsr); if (uart_lsr_val & (OE|PE|FE|BI)) { uint16_t dll, dlh; printf("\n[SERIAL ERROR]\n"); ACCESS_LATCH(); dll = *pUART_DLL; dlh = *pUART_DLH; ACCESS_PORT_IER(); printf("\tDLL=0x%x DLH=0x%x\n", dll, dlh); do { --cache_count; printf("\t%3i: RBR=0x%02x LSR=0x%02x\n", cache_count, cached_rbr[cache_count], cached_lsr[cache_count]); } while (cache_count > 0); return -1; } #endif uart_lsr_clear(); return uart_rbr_val; }