1 1.1 kiyohara /* $NetBSD: scif.c,v 1.1 2011/03/03 05:59:37 kiyohara Exp $ */ 2 1.1 kiyohara /* 3 1.1 kiyohara * Copyright (c) 2011 KIYOHARA Takashi 4 1.1 kiyohara * All rights reserved. 5 1.1 kiyohara * 6 1.1 kiyohara * Redistribution and use in source and binary forms, with or without 7 1.1 kiyohara * modification, are permitted provided that the following conditions 8 1.1 kiyohara * are met: 9 1.1 kiyohara * 1. Redistributions of source code must retain the above copyright 10 1.1 kiyohara * notice, this list of conditions and the following disclaimer. 11 1.1 kiyohara * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 kiyohara * notice, this list of conditions and the following disclaimer in the 13 1.1 kiyohara * documentation and/or other materials provided with the distribution. 14 1.1 kiyohara * 15 1.1 kiyohara * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 kiyohara * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 1.1 kiyohara * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 1.1 kiyohara * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 19 1.1 kiyohara * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 1.1 kiyohara * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 1.1 kiyohara * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 1.1 kiyohara * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 23 1.1 kiyohara * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24 1.1 kiyohara * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 1.1 kiyohara * POSSIBILITY OF SUCH DAMAGE. 26 1.1 kiyohara */ 27 1.1 kiyohara 28 1.1 kiyohara #ifdef CONS_SCIF 29 1.1 kiyohara 30 1.1 kiyohara #include <lib/libsa/stand.h> 31 1.1 kiyohara #include <lib/libkern/libkern.h> 32 1.1 kiyohara 33 1.1 kiyohara #include <sh3/scifreg.h> 34 1.1 kiyohara 35 1.1 kiyohara #include <machine/cpu.h> 36 1.1 kiyohara 37 1.1 kiyohara #include "boot.h" 38 1.1 kiyohara #include "scif.h" 39 1.1 kiyohara 40 1.1 kiyohara #define BOOT_PCLOCK 40000000 41 1.1 kiyohara 42 1.1 kiyohara #if defined(SH3) && defined(SH4) 43 1.1 kiyohara #error "mmeye port don't support SH3,SH4 common boot." 44 1.1 kiyohara #elif defined(SH3) 45 1.1 kiyohara #error "don't support SH3 common boot." 46 1.1 kiyohara #elif defined(SH4) 47 1.1 kiyohara #define CPU_IS_SH4 1 48 1.1 kiyohara #endif 49 1.1 kiyohara 50 1.1 kiyohara void * 51 1.1 kiyohara scif_init(int speed) 52 1.1 kiyohara { 53 1.1 kiyohara 54 1.1 kiyohara #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ 55 1.1 kiyohara 56 1.1 kiyohara /* Initialize SCR */ 57 1.1 kiyohara SHREG_SCSCR2 = 0x00; 58 1.1 kiyohara 59 1.1 kiyohara SHREG_SCFCR2 = SCFCR2_TFRST | SCFCR2_RFRST; 60 1.1 kiyohara 61 1.1 kiyohara /* Serial Mode Register */ 62 1.1 kiyohara SHREG_SCSMR2 = 0x00; /* 8bit,NonParity,Even,1Stop */ 63 1.1 kiyohara 64 1.1 kiyohara /* Bit Rate Register */ 65 1.1 kiyohara SHREG_SCBRR2 = divrnd(BOOT_PCLOCK, 32 * speed) - 1; 66 1.1 kiyohara 67 1.1 kiyohara /* 68 1.1 kiyohara * wait 2m Sec, because Send/Recv must begin 1 bit period after 69 1.1 kiyohara * BRR is set. 70 1.1 kiyohara */ 71 1.1 kiyohara delay(2000); 72 1.1 kiyohara 73 1.1 kiyohara SHREG_SCFCR2 = FIFO_RCV_TRIGGER_14 | FIFO_XMT_TRIGGER_1; 74 1.1 kiyohara 75 1.1 kiyohara /* Send permission, Receive permission ON */ 76 1.1 kiyohara SHREG_SCSCR2 = SCSCR2_TE | SCSCR2_RE; 77 1.1 kiyohara 78 1.1 kiyohara /* Serial Status Register */ 79 1.1 kiyohara SHREG_SCSSR2 = (SHREG_SCSSR2 & SCSSR2_TDFE); /* Clear Status */ 80 1.1 kiyohara 81 1.1 kiyohara return NULL; 82 1.1 kiyohara } 83 1.1 kiyohara 84 1.1 kiyohara void 85 1.1 kiyohara scif_putc(int c) 86 1.1 kiyohara { 87 1.1 kiyohara 88 1.1 kiyohara /* wait for ready */ 89 1.1 kiyohara while ((SHREG_SCFDR2 & SCFDR2_TXCNT) == SCFDR2_TXF_FULL) 90 1.1 kiyohara continue; 91 1.1 kiyohara 92 1.1 kiyohara /* write send data to send register */ 93 1.1 kiyohara SHREG_SCFTDR2 = c; 94 1.1 kiyohara 95 1.1 kiyohara /* clear ready flag */ 96 1.1 kiyohara SHREG_SCSSR2 = (SHREG_SCSSR2 & ~(SCSSR2_TDFE | SCSSR2_TEND)); 97 1.1 kiyohara } 98 1.1 kiyohara 99 1.1 kiyohara int 100 1.1 kiyohara scif_getc(void) 101 1.1 kiyohara { 102 1.1 kiyohara unsigned char c, err_c; 103 1.1 kiyohara #ifdef SH4 104 1.1 kiyohara unsigned short err_c2 = 0; 105 1.1 kiyohara #endif 106 1.1 kiyohara 107 1.1 kiyohara for (;;) { 108 1.1 kiyohara /* wait for ready */ 109 1.1 kiyohara while ((SHREG_SCFDR2 & SCFDR2_RECVCNT) == 0) 110 1.1 kiyohara continue; 111 1.1 kiyohara 112 1.1 kiyohara c = SHREG_SCFRDR2; 113 1.1 kiyohara err_c = SHREG_SCSSR2; 114 1.1 kiyohara SHREG_SCSSR2 = (SHREG_SCSSR2 & 115 1.1 kiyohara ~(SCSSR2_ER | SCSSR2_BRK | SCSSR2_RDF | SCSSR2_DR)); 116 1.1 kiyohara #ifdef SH4 117 1.1 kiyohara if (CPU_IS_SH4) { 118 1.1 kiyohara err_c2 = SHREG_SCLSR2; 119 1.1 kiyohara SHREG_SCLSR2 = (SHREG_SCLSR2 & ~SCLSR2_ORER); 120 1.1 kiyohara } 121 1.1 kiyohara #endif 122 1.1 kiyohara if ((err_c & 123 1.1 kiyohara (SCSSR2_ER | SCSSR2_BRK | SCSSR2_FER | SCSSR2_PER)) == 0) { 124 1.1 kiyohara #ifdef SH4 125 1.1 kiyohara if (CPU_IS_SH4 && ((err_c2 & SCLSR2_ORER) == 0)) 126 1.1 kiyohara #endif 127 1.1 kiyohara return c; 128 1.1 kiyohara } 129 1.1 kiyohara } 130 1.1 kiyohara } 131 1.1 kiyohara 132 1.1 kiyohara int 133 1.1 kiyohara scif_scankbd(void) 134 1.1 kiyohara { 135 1.1 kiyohara unsigned char c, err_c; 136 1.1 kiyohara #ifdef SH4 137 1.1 kiyohara unsigned short err_c2 = 0; 138 1.1 kiyohara #endif 139 1.1 kiyohara 140 1.1 kiyohara for (;;) { 141 1.1 kiyohara /* wait for ready */ 142 1.1 kiyohara if ((SHREG_SCFDR2 & SCFDR2_RECVCNT) == 0) 143 1.1 kiyohara return -1; 144 1.1 kiyohara 145 1.1 kiyohara c = SHREG_SCFRDR2; 146 1.1 kiyohara err_c = SHREG_SCSSR2; 147 1.1 kiyohara SHREG_SCSSR2 = (SHREG_SCSSR2 & 148 1.1 kiyohara ~(SCSSR2_ER | SCSSR2_BRK | SCSSR2_RDF | SCSSR2_DR)); 149 1.1 kiyohara #ifdef SH4 150 1.1 kiyohara if (CPU_IS_SH4) { 151 1.1 kiyohara err_c2 = SHREG_SCLSR2; 152 1.1 kiyohara SHREG_SCLSR2 = (SHREG_SCLSR2 & ~SCLSR2_ORER); 153 1.1 kiyohara } 154 1.1 kiyohara #endif 155 1.1 kiyohara if ((err_c & 156 1.1 kiyohara (SCSSR2_ER | SCSSR2_BRK | SCSSR2_FER | SCSSR2_PER)) == 0) { 157 1.1 kiyohara #ifdef SH4 158 1.1 kiyohara if (CPU_IS_SH4 && ((err_c2 & SCLSR2_ORER) == 0)) 159 1.1 kiyohara #endif 160 1.1 kiyohara return c; 161 1.1 kiyohara } 162 1.1 kiyohara } 163 1.1 kiyohara } 164 1.1 kiyohara #endif /* CONS_SCIF */ 165