Home | History | Annotate | Line # | Download | only in common
      1  1.2  tsutsui /*	$NetBSD: cons_zs.c,v 1.2 2008/05/14 13:29:28 tsutsui Exp $	*/
      2  1.1  tsutsui 
      3  1.1  tsutsui /*-
      4  1.2  tsutsui  * Copyright (c) 2005 Izumi Tsutsui.  All rights reserved.
      5  1.1  tsutsui  *
      6  1.1  tsutsui  * Redistribution and use in source and binary forms, with or without
      7  1.1  tsutsui  * modification, are permitted provided that the following conditions
      8  1.1  tsutsui  * are met:
      9  1.1  tsutsui  * 1. Redistributions of source code must retain the above copyright
     10  1.1  tsutsui  *    notice, this list of conditions and the following disclaimer.
     11  1.1  tsutsui  * 2. Redistributions in binary form must reproduce the above copyright
     12  1.1  tsutsui  *    notice, this list of conditions and the following disclaimer in the
     13  1.1  tsutsui  *    documentation and/or other materials provided with the distribution.
     14  1.1  tsutsui  *
     15  1.1  tsutsui  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16  1.1  tsutsui  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17  1.1  tsutsui  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18  1.1  tsutsui  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19  1.1  tsutsui  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     20  1.1  tsutsui  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     21  1.1  tsutsui  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     22  1.1  tsutsui  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  1.1  tsutsui  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     24  1.1  tsutsui  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  1.1  tsutsui  */
     26  1.1  tsutsui 
     27  1.1  tsutsui #include <sys/param.h>
     28  1.1  tsutsui #include <sys/systm.h>
     29  1.1  tsutsui 
     30  1.1  tsutsui #include <lib/libsa/stand.h>
     31  1.1  tsutsui #include <lib/libkern/libkern.h>
     32  1.1  tsutsui 
     33  1.1  tsutsui #include <dev/ic/z8530reg.h>
     34  1.1  tsutsui 
     35  1.1  tsutsui #include <machine/sbd.h>
     36  1.1  tsutsui 
     37  1.1  tsutsui #include "console.h"
     38  1.1  tsutsui 
     39  1.1  tsutsui 
     40  1.1  tsutsui struct zs zs;
     41  1.1  tsutsui 
     42  1.1  tsutsui static void zs_init(void);
     43  1.1  tsutsui static int zs_cngetc(void);
     44  1.1  tsutsui static int zs_cnscan(void);
     45  1.1  tsutsui static void zs_cnputc(int, int, int);
     46  1.1  tsutsui 
     47  1.1  tsutsui #define	ZS_CONSDEFSPEED	9600
     48  1.1  tsutsui 
     49  1.1  tsutsui void
     50  1.1  tsutsui zs_set_addr(uint32_t csr, uint32_t data, int clock)
     51  1.1  tsutsui {
     52  1.1  tsutsui 
     53  1.1  tsutsui 	zs.csr  = (volatile uint8_t *)csr;
     54  1.1  tsutsui 	zs.data = (volatile uint8_t *)data;
     55  1.1  tsutsui 	zs.clock = clock;
     56  1.1  tsutsui 
     57  1.1  tsutsui 	cons.init = zs_init;
     58  1.1  tsutsui 	cons.getc = zs_cngetc;
     59  1.1  tsutsui 	cons.scan = zs_cnscan;
     60  1.1  tsutsui 	cons.putc = zs_cnputc;
     61  1.1  tsutsui }
     62  1.1  tsutsui 
     63  1.1  tsutsui #define	ZS_WRITE_REG(zs, reg, val)	\
     64  1.1  tsutsui 	do {				\
     65  1.1  tsutsui 		*zs.csr = reg;		\
     66  1.1  tsutsui 		*zs.csr = val;		\
     67  1.1  tsutsui 	} while (/* CONSTCOND */ 0)
     68  1.1  tsutsui 
     69  1.1  tsutsui static void
     70  1.1  tsutsui zs_init(void)
     71  1.1  tsutsui {
     72  1.1  tsutsui 
     73  1.1  tsutsui 	ZS_WRITE_REG(zs,  9, 0);
     74  1.1  tsutsui 	ZS_WRITE_REG(zs,  9, ZSWR9_HARD_RESET);
     75  1.1  tsutsui 
     76  1.1  tsutsui 	ZS_WRITE_REG(zs,  4, ZSWR4_CLK_X16 | ZSWR4_ONESB | ZSWR4_EVENP);
     77  1.1  tsutsui 	ZS_WRITE_REG(zs, 10, 0x00);
     78  1.1  tsutsui 	ZS_WRITE_REG(zs,  3, ZSWR3_RX_8);
     79  1.1  tsutsui 	ZS_WRITE_REG(zs,  5, ZSWR5_TX_8 | ZSWR5_DTR | ZSWR5_RTS);
     80  1.1  tsutsui 
     81  1.1  tsutsui 	ZS_WRITE_REG(zs,  6, 0x00);
     82  1.1  tsutsui 	ZS_WRITE_REG(zs,  7, 0x00);
     83  1.1  tsutsui 
     84  1.1  tsutsui 	ZS_WRITE_REG(zs, 14, ZSWR14_BAUD_FROM_PCLK);
     85  1.1  tsutsui 	ZS_WRITE_REG(zs, 11, ZSWR11_RXCLK_BAUD | ZSWR11_TXCLK_BAUD);
     86  1.1  tsutsui 	ZS_WRITE_REG(zs, 12, BPS_TO_TCONST(zs.clock / 16, ZS_CONSDEFSPEED));
     87  1.1  tsutsui 	ZS_WRITE_REG(zs, 13, 0);
     88  1.1  tsutsui 
     89  1.1  tsutsui 	ZS_WRITE_REG(zs, 14, ZSWR14_BAUD_FROM_PCLK | ZSWR14_BAUD_ENA);
     90  1.1  tsutsui 	ZS_WRITE_REG(zs, 15, 0x00);
     91  1.1  tsutsui 
     92  1.1  tsutsui 	*zs.csr = ZSWR0_RESET_STATUS;
     93  1.1  tsutsui 	*zs.csr = ZSWR0_RESET_STATUS;
     94  1.1  tsutsui 
     95  1.1  tsutsui 	ZS_WRITE_REG(zs,  3, ZSWR3_RX_8 | ZSWR3_RX_ENABLE);
     96  1.1  tsutsui 	ZS_WRITE_REG(zs,  5,
     97  1.1  tsutsui 	    ZSWR5_TX_8 | ZSWR5_DTR | ZSWR5_RTS | ZSWR5_TX_ENABLE);
     98  1.1  tsutsui }
     99  1.1  tsutsui 
    100  1.1  tsutsui static int
    101  1.1  tsutsui zs_cngetc(void)
    102  1.1  tsutsui {
    103  1.1  tsutsui 	int csr, data;
    104  1.1  tsutsui 
    105  1.1  tsutsui 	do {
    106  1.1  tsutsui 		csr = *zs.csr;
    107  1.1  tsutsui 	} while ((csr & ZSRR0_RX_READY) == 0);
    108  1.1  tsutsui 
    109  1.1  tsutsui 	data = *zs.data;
    110  1.1  tsutsui 
    111  1.1  tsutsui 	return data;
    112  1.1  tsutsui }
    113  1.1  tsutsui 
    114  1.1  tsutsui int
    115  1.1  tsutsui zs_cnscan(void)
    116  1.1  tsutsui {
    117  1.1  tsutsui 	int csr, data;
    118  1.1  tsutsui 
    119  1.1  tsutsui 	csr = *zs.csr;
    120  1.1  tsutsui 	if ((csr & ZSRR0_RX_READY) == 0)
    121  1.1  tsutsui 		return -1;
    122  1.1  tsutsui 
    123  1.1  tsutsui 	data = *zs.data;
    124  1.1  tsutsui 
    125  1.1  tsutsui 	return data;
    126  1.1  tsutsui }
    127  1.1  tsutsui 
    128  1.1  tsutsui static void
    129  1.1  tsutsui zs_cnputc(int x, int y, int c)
    130  1.1  tsutsui {
    131  1.1  tsutsui 	int csr;
    132  1.1  tsutsui 
    133  1.1  tsutsui 	do {
    134  1.1  tsutsui 		csr = *zs.csr;
    135  1.1  tsutsui 	} while ((csr & ZSRR0_TX_READY) == 0);
    136  1.1  tsutsui 
    137  1.1  tsutsui 	*zs.data = c;
    138  1.1  tsutsui }
    139