1 /* $NetBSD: brh_7seg.c,v 1.1 2003/01/25 02:00:16 thorpej Exp $ */ 2 3 /* 4 * Copyright (c) 2001, 2002 Wasabi Systems, Inc. 5 * All rights reserved. 6 * 7 * Written by Jason R. Thorpe for Wasabi Systems, Inc. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed for the NetBSD Project by 20 * Wasabi Systems, Inc. 21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22 * or promote products derived from this software without specific prior 23 * written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 /* 39 * Support for the 7-segment display on the ADI Engineering BRH board. 40 */ 41 42 #include <sys/param.h> 43 #include <sys/systm.h> 44 45 #include <machine/bus.h> 46 47 #include <evbarm/adi_brh/brhreg.h> 48 #include <evbarm/adi_brh/brhvar.h> 49 50 #define WRITE(x, v) *((__volatile uint8_t *) (x)) = (v) 51 52 static int snakestate; 53 54 static const uint8_t digitmap[] = { 55 /* +#####+ 56 * # # 57 * # # 58 * # # 59 * +-----+ 60 * # # 61 * # # 62 * # # 63 * +#####+ 64 */ 65 SEG_G, 66 67 /* +-----+ 68 * | # 69 * | # 70 * | # 71 * +-----+ 72 * | # 73 * | # 74 * | # 75 * +-----+ 76 */ 77 SEG_A|SEG_D|SEG_E|SEG_F|SEG_G, 78 79 /* +#####+ 80 * | # 81 * | # 82 * | # 83 * +#####+ 84 * # | 85 * # | 86 * # | 87 * +#####+ 88 */ 89 SEG_C|SEG_F, 90 91 /* +#####+ 92 * | # 93 * | # 94 * | # 95 * +#####+ 96 * | # 97 * | # 98 * | # 99 * +#####+ 100 */ 101 SEG_E|SEG_F, 102 103 /* +-----+ 104 * # # 105 * # # 106 * # # 107 * +#####+ 108 * | # 109 * | # 110 * | # 111 * +-----+ 112 */ 113 SEG_A|SEG_D|SEG_E, 114 115 /* +#####+ 116 * # | 117 * # | 118 * # | 119 * +#####+ 120 * | # 121 * | # 122 * | # 123 * +#####+ 124 */ 125 SEG_B|SEG_E, 126 127 /* +#####+ 128 * # | 129 * # | 130 * # | 131 * +#####+ 132 * # # 133 * # # 134 * # # 135 * +#####+ 136 */ 137 SEG_B, 138 139 /* +#####+ 140 * | # 141 * | # 142 * | # 143 * +-----+ 144 * | # 145 * | # 146 * | # 147 * +-----+ 148 */ 149 SEG_D|SEG_E|SEG_F, 150 151 /* +#####+ 152 * # # 153 * # # 154 * # # 155 * +#####+ 156 * # # 157 * # # 158 * # # 159 * +#####+ 160 */ 161 0, 162 163 /* +#####+ 164 * # # 165 * # # 166 * # # 167 * +#####+ 168 * | # 169 * | # 170 * | # 171 * +-----+ 172 */ 173 SEG_D|SEG_E, 174 }; 175 176 static uint8_t 177 brh_7seg_xlate(char c) 178 { 179 uint8_t rv; 180 181 if (c >= '0' && c <= '9') 182 rv = digitmap[c - '0']; 183 else if (c == '.') 184 rv = (u_int8_t) ~SEG_DP; 185 else 186 rv = 0xff; 187 188 return (rv); 189 } 190 191 void 192 brh_7seg(char a) 193 { 194 uint8_t ch; 195 196 ch = brh_7seg_xlate(a); 197 198 snakestate = 0; 199 200 WRITE(BRH_LED_VBASE, ch); 201 } 202 203 static const uint8_t snakemap[] = { 204 205 /* +#####+ 206 * | | 207 * | | 208 * | | 209 * +-----+ 210 * | | 211 * | | 212 * | | 213 * +-----+ 214 */ 215 ~SEG_A, 216 217 /* +-----+ 218 * # | 219 * # | 220 * # | 221 * +-----+ 222 * | | 223 * | | 224 * | | 225 * +-----+ 226 */ 227 ~SEG_F, 228 229 /* +-----+ 230 * | | 231 * | | 232 * | | 233 * +#####+ 234 * | | 235 * | | 236 * | | 237 * +-----+ 238 */ 239 ~SEG_G, 240 241 /* +-----+ 242 * | | 243 * | | 244 * | | 245 * +-----+ 246 * | # 247 * | # 248 * | # 249 * +-----+ 250 */ 251 ~SEG_C, 252 253 /* +-----+ 254 * | | 255 * | | 256 * | | 257 * +-----+ 258 * | | 259 * | | 260 * | | 261 * +#####+ 262 */ 263 ~SEG_D, 264 265 /* +-----+ 266 * | | 267 * | | 268 * | | 269 * +-----+ 270 * # | 271 * # | 272 * # | 273 * +-----+ 274 */ 275 ~SEG_E, 276 277 /* +-----+ 278 * | | 279 * | | 280 * | | 281 * +#####+ 282 * | | 283 * | | 284 * | | 285 * +-----+ 286 */ 287 ~SEG_G, 288 289 /* +-----+ 290 * | # 291 * | # 292 * | # 293 * +-----+ 294 * | | 295 * | | 296 * | | 297 * +-----+ 298 */ 299 ~SEG_B, 300 }; 301 302 void 303 brh_7seg_snake(void) 304 { 305 int cur = snakestate; 306 307 WRITE(BRH_LED_VBASE, snakemap[cur]); 308 309 snakestate = (cur + 1) & 7; 310 } 311