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