/* Utility routines */ static inline int get_baud(struct bf535_serial *info) { unsigned long result = 115200; unsigned short int baud_lo, baud_hi; int i, idx = info->hub2; ACCESS_LATCH(idx) /* change access to divisor latch */ baud_lo = UART_DLL(idx); baud_hi = UART_DLH(idx); for (i=0; i<BAUD_TABLE_SIZE ; i++){ if ( baud_lo == hw_baud_table[i].dl_low && baud_hi == hw_baud_table[i].dl_high) { result = baud_table[i]; break; } } return result; }
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; }
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 */ uint16_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)) { uint16_t dll, dlh; printf("\n[SERIAL ERROR]\n"); ACCESS_LATCH(); dll = bfin_read(&pUART->dll); dlh = bfin_read(&pUART->dlh); ACCESS_PORT_IER(); printf("\tDLL=0x%x DLH=0x%x\n", dll, dlh); 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; }