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; }
/* * シリアルI/Oポートのオープン */ void eSIOPort_open(CELLIDX idx) { CELLCB *p_cellcb = GET_CELLCB(idx); if (!VAR_opened) { /* * 既にオープンしている場合は、二重にオープンしない. */ /* * UARTをディスエーブル */ sil_wrw_mem(UART_CR(ATTR_baseAddress), 0U); /* * エラーフラグをクリア */ sil_wrw_mem(UART_ECR(ATTR_baseAddress), 0U); /* * FIFOを空にする */ while (uart_pl011_getready(p_cellcb)) { (void) uart_pl011_getchar(p_cellcb); } /* * ボーレートと通信規格を設定 */ sil_wrw_mem(UART_IBRD(ATTR_baseAddress), ATTR_ibrd); sil_wrw_mem(UART_FBRD(ATTR_baseAddress), ATTR_fbrd); sil_wrw_mem(UART_LCR_H(ATTR_baseAddress), ATTR_lcr_h); /* * UARTをイネーブル */ sil_wrw_mem(UART_CR(ATTR_baseAddress), UART_CR_UARTEN|UART_CR_TXE|UART_CR_RXE); VAR_opened = true; } }
/* * シリアルI/Oポートのクローズ */ void eSIOPort_close(CELLIDX idx) { CELLCB *p_cellcb = GET_CELLCB(idx); if (VAR_opened) { /* * UARTをディスエーブル */ sil_wrw_mem(UART_CR(ATTR_baseAddress), 0U); VAR_opened = false; } }