int serial_init() { mmio_w32(UART_CR(UART0), 0); mmio_w32(GPPUD, 0); delay(150); mmio_w32(GPPUDCLK0, (1 << 14) | (1 << 15)); delay(150); mmio_w32(GPPUDCLK0, (0)); mmio_w32(UART_ICR(UART0), 0x7FF); mmio_w32(UART_IBRD(UART0), 1); mmio_w32(UART_FBRD(UART0), 40); mmio_w32(UART_LCRH(UART0), (1 << 4) | (1 << 5) | (1 << 6)); mmio_w32(UART_IMSC(UART0), (1 << 1) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10)); mmio_w32(UART_CR(UART0), (1 << 0) | (1 << 8) | (1 << 9)); return 0; }
int lfb_init() { int i; uint32_t* p = (uint32_t*) &lfbio; for(i = 0; i < sizeof(lfbio); i += sizeof(uint32_t)) mmio_w32(LFBIO_BASE + i, *p++); mail_send(LFBIO_BASE, LFBIO_BOX); mail_recv(LFBIO_BOX); mbd->lfb.width = mmio_r32(LFBIO_BASE + 0); mbd->lfb.height = mmio_r32(LFBIO_BASE + 4); mbd->lfb.pitch = mmio_r32(LFBIO_BASE + 16); mbd->lfb.depth = mmio_r32(LFBIO_BASE + 20); mbd->lfb.base = mmio_r32(LFBIO_BASE + 32); mbd->lfb.size = mmio_r32(LFBIO_BASE + 36); #ifdef DEBUG memset((void*) mbd->lfb.base, 0xFF, mbd->lfb.size); #endif kprintf(LOG "lfb: %dx%dx%d at 0x%x\n", mbd->lfb.width, mbd->lfb.height, mbd->lfb.depth, mbd->lfb.base); return 0; }
void serial_send(uint8_t ch, uint8_t v) { (void) ch; mutex_lock(&serial_lock); while(mmio_r32(UART_FR(UART0)) & (1 << 5)) ; mmio_w32(UART_DR(UART0), v); mutex_unlock(&serial_lock); }