1 /* $NetBSD: iq80321_7seg.c,v 1.2 2002/04/12 20:50:27 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 Intel IQ80321. 40 */ 41 42 #include <sys/param.h> 43 #include <sys/systm.h> 44 45 #include <machine/bus.h> 46 47 #include <evbarm/iq80321/iq80321reg.h> 48 #include <evbarm/iq80321/iq80321var.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 iq80321_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 = ~SEG_DP; 185 else 186 rv = 0xff; 187 188 return (rv); 189 } 190 191 void 192 iq80321_7seg(char a, char b) 193 { 194 uint8_t msb, lsb; 195 196 msb = iq80321_7seg_xlate(a); 197 lsb = iq80321_7seg_xlate(b); 198 199 snakestate = 0; 200 201 WRITE(IQ80321_7SEG_MSB, msb); 202 WRITE(IQ80321_7SEG_LSB, lsb); 203 } 204 205 static const uint8_t snakemap[][2] = { 206 207 /* +#####+ +#####+ 208 * | | | | 209 * | | | | 210 * | | | | 211 * +-----+ +-----+ 212 * | | | | 213 * | | | | 214 * | | | | 215 * +-----+ +-----+ 216 */ 217 { ~SEG_A & 0xff, ~SEG_A & 0xff }, 218 219 /* +-----+ +-----+ 220 * # | | # 221 * # | | # 222 * # | | # 223 * +-----+ +-----+ 224 * | | | | 225 * | | | | 226 * | | | | 227 * +-----+ +-----+ 228 */ 229 { ~SEG_F, ~SEG_B }, 230 231 /* +-----+ +-----+ 232 * | | | | 233 * | | | | 234 * | | | | 235 * +#####+ +#####+ 236 * | | | | 237 * | | | | 238 * | | | | 239 * +-----+ +-----+ 240 */ 241 { ~SEG_G, ~SEG_G }, 242 243 /* +-----+ +-----+ 244 * | | | | 245 * | | | | 246 * | | | | 247 * +-----+ +-----+ 248 * | # # | 249 * | # # | 250 * | # # | 251 * +-----+ +-----+ 252 */ 253 { ~SEG_C, ~SEG_E }, 254 255 /* +-----+ +-----+ 256 * | | | | 257 * | | | | 258 * | | | | 259 * +-----+ +-----+ 260 * | | | | 261 * | | | | 262 * | | | | 263 * +#####+ +#####+ 264 */ 265 { ~SEG_D, ~SEG_D }, 266 267 /* +-----+ +-----+ 268 * | | | | 269 * | | | | 270 * | | | | 271 * +-----+ +-----+ 272 * # | | # 273 * # | | # 274 * # | | # 275 * +-----+ +-----+ 276 */ 277 { ~SEG_E, ~SEG_C }, 278 279 /* +-----+ +-----+ 280 * | | | | 281 * | | | | 282 * | | | | 283 * +#####+ +#####+ 284 * | | | | 285 * | | | | 286 * | | | | 287 * +-----+ +-----+ 288 */ 289 { ~SEG_G, ~SEG_G }, 290 291 /* +-----+ +-----+ 292 * | # # | 293 * | # # | 294 * | # # | 295 * +-----+ +-----+ 296 * | | | | 297 * | | | | 298 * | | | | 299 * +-----+ +-----+ 300 */ 301 { ~SEG_B, ~SEG_F }, 302 }; 303 304 void 305 iq80321_7seg_snake(void) 306 { 307 int cur = snakestate; 308 309 WRITE(IQ80321_7SEG_MSB, snakemap[cur][0]); 310 WRITE(IQ80321_7SEG_LSB, snakemap[cur][1]); 311 312 snakestate = (cur + 1) & 7; 313 } 314