Beispiel #1
0
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;
}
Beispiel #2
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;
	}
}
Beispiel #3
0
/*
 *  シリアル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;
	}
}