1 /* $NetBSD: brh_7seg.c,v 1.4 2005/12/24 20:06:59 perry 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/cdefs.h> 43 __KERNEL_RCSID(0, "$NetBSD: brh_7seg.c,v 1.4 2005/12/24 20:06:59 perry Exp $"); 44 45 #include <sys/param.h> 46 #include <sys/systm.h> 47 48 #include <machine/bus.h> 49 50 #include <evbarm/adi_brh/brhreg.h> 51 #include <evbarm/adi_brh/brhvar.h> 52 53 #define WRITE(x, v) *((volatile uint8_t *) (x)) = (v) 54 55 static int snakestate; 56 57 static const uint8_t digitmap[] = { 58 /* +#####+ 59 * # # 60 * # # 61 * # # 62 * +-----+ 63 * # # 64 * # # 65 * # # 66 * +#####+ 67 */ 68 SEG_G, 69 70 /* +-----+ 71 * | # 72 * | # 73 * | # 74 * +-----+ 75 * | # 76 * | # 77 * | # 78 * +-----+ 79 */ 80 SEG_A|SEG_D|SEG_E|SEG_F|SEG_G, 81 82 /* +#####+ 83 * | # 84 * | # 85 * | # 86 * +#####+ 87 * # | 88 * # | 89 * # | 90 * +#####+ 91 */ 92 SEG_C|SEG_F, 93 94 /* +#####+ 95 * | # 96 * | # 97 * | # 98 * +#####+ 99 * | # 100 * | # 101 * | # 102 * +#####+ 103 */ 104 SEG_E|SEG_F, 105 106 /* +-----+ 107 * # # 108 * # # 109 * # # 110 * +#####+ 111 * | # 112 * | # 113 * | # 114 * +-----+ 115 */ 116 SEG_A|SEG_D|SEG_E, 117 118 /* +#####+ 119 * # | 120 * # | 121 * # | 122 * +#####+ 123 * | # 124 * | # 125 * | # 126 * +#####+ 127 */ 128 SEG_B|SEG_E, 129 130 /* +#####+ 131 * # | 132 * # | 133 * # | 134 * +#####+ 135 * # # 136 * # # 137 * # # 138 * +#####+ 139 */ 140 SEG_B, 141 142 /* +#####+ 143 * | # 144 * | # 145 * | # 146 * +-----+ 147 * | # 148 * | # 149 * | # 150 * +-----+ 151 */ 152 SEG_D|SEG_E|SEG_F, 153 154 /* +#####+ 155 * # # 156 * # # 157 * # # 158 * +#####+ 159 * # # 160 * # # 161 * # # 162 * +#####+ 163 */ 164 0, 165 166 /* +#####+ 167 * # # 168 * # # 169 * # # 170 * +#####+ 171 * | # 172 * | # 173 * | # 174 * +-----+ 175 */ 176 SEG_D|SEG_E, 177 }; 178 179 static uint8_t 180 brh_7seg_xlate(char c) 181 { 182 uint8_t rv; 183 184 if (c >= '0' && c <= '9') 185 rv = digitmap[c - '0']; 186 else if (c == '.') 187 rv = (u_int8_t) ~SEG_DP; 188 else 189 rv = 0xff; 190 191 return (rv); 192 } 193 194 void 195 brh_7seg(char a) 196 { 197 uint8_t ch; 198 199 ch = brh_7seg_xlate(a); 200 201 snakestate = 0; 202 203 WRITE(BRH_LED_VBASE, ch); 204 } 205 206 static const uint8_t snakemap[] = { 207 208 /* +#####+ 209 * | | 210 * | | 211 * | | 212 * +-----+ 213 * | | 214 * | | 215 * | | 216 * +-----+ 217 */ 218 ~SEG_A, 219 220 /* +-----+ 221 * # | 222 * # | 223 * # | 224 * +-----+ 225 * | | 226 * | | 227 * | | 228 * +-----+ 229 */ 230 ~SEG_F, 231 232 /* +-----+ 233 * | | 234 * | | 235 * | | 236 * +#####+ 237 * | | 238 * | | 239 * | | 240 * +-----+ 241 */ 242 ~SEG_G, 243 244 /* +-----+ 245 * | | 246 * | | 247 * | | 248 * +-----+ 249 * | # 250 * | # 251 * | # 252 * +-----+ 253 */ 254 ~SEG_C, 255 256 /* +-----+ 257 * | | 258 * | | 259 * | | 260 * +-----+ 261 * | | 262 * | | 263 * | | 264 * +#####+ 265 */ 266 ~SEG_D, 267 268 /* +-----+ 269 * | | 270 * | | 271 * | | 272 * +-----+ 273 * # | 274 * # | 275 * # | 276 * +-----+ 277 */ 278 ~SEG_E, 279 280 /* +-----+ 281 * | | 282 * | | 283 * | | 284 * +#####+ 285 * | | 286 * | | 287 * | | 288 * +-----+ 289 */ 290 ~SEG_G, 291 292 /* +-----+ 293 * | # 294 * | # 295 * | # 296 * +-----+ 297 * | | 298 * | | 299 * | | 300 * +-----+ 301 */ 302 ~SEG_B, 303 }; 304 305 void 306 brh_7seg_snake(void) 307 { 308 int cur = snakestate; 309 310 WRITE(BRH_LED_VBASE, snakemap[cur]); 311 312 snakestate = (cur + 1) & 7; 313 } 314