2 * (C) Copyright 2003, Li-Pro.Net <www.li-pro.net>
3 * Stephan Linz <linz@li-pro.net>
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25 * NIOS PIO based seven segment led support functions
31 #ifdef CONFIG_SEVENSEG
33 #define SEVENDEG_MASK_DP ((SEVENSEG_DIGIT_DP << 8) | SEVENSEG_DIGIT_DP)
35 #ifdef SEVENSEG_WRONLY /* emulate read access */
36 #if (SEVENSEG_ACTIVE == 0)
37 static unsigned int sevenseg_portval = ~0;
39 static unsigned int sevenseg_portval = 0;
43 static int sevenseg_init_done = 0;
45 static inline void __sevenseg_set_masked (unsigned int mask, int value)
47 nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE;
49 #ifdef SEVENSEG_WRONLY /* emulate read access */
51 #if (SEVENSEG_ACTIVE == 0)
53 sevenseg_portval &= ~mask;
55 sevenseg_portval |= mask;
58 sevenseg_portval |= mask;
60 sevenseg_portval &= ~mask;
63 piop->data = sevenseg_portval;
65 #else /* !SEVENSEG_WRONLY */
67 #if (SEVENSEG_ACTIVE == 0)
79 #endif /* SEVENSEG_WRONLY */
82 static inline void __sevenseg_toggle_masked (unsigned int mask)
84 nios_pio_t *piop = (nios_pio_t*)SEVENSEG_BASE;
86 #ifdef SEVENSEG_WRONLY /* emulate read access */
88 sevenseg_portval ^= mask;
89 piop->data = sevenseg_portval;
91 #else /* !SEVENSEG_WRONLY */
95 #endif /* SEVENSEG_WRONLY */
98 static inline void __sevenseg_set (unsigned int value)
100 nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE;
102 #ifdef SEVENSEG_WRONLY /* emulate read access */
104 #if (SEVENSEG_ACTIVE == 0)
105 sevenseg_portval = (sevenseg_portval & SEVENDEG_MASK_DP)
106 | ((~value) & (~SEVENDEG_MASK_DP));
108 sevenseg_portval = (sevenseg_portval & SEVENDEG_MASK_DP)
112 piop->data = sevenseg_portval;
114 #else /* !SEVENSEG_WRONLY */
116 #if (SEVENSEG_ACTIVE == 0)
117 piop->data = (piop->data & SEVENDEG_MASK_DP)
118 | ((~value) & (~SEVENDEG_MASK_DP));
120 piop->data = (piop->data & SEVENDEG_MASK_DP)
124 #endif /* SEVENSEG_WRONLY */
127 static inline void __sevenseg_init (void)
129 nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE;
133 #ifndef SEVENSEG_WRONLY /* setup direction */
135 piop->direction |= mask;
137 #endif /* SEVENSEG_WRONLY */
141 void sevenseg_set(int value)
143 unsigned char digits[] = {
162 if (!sevenseg_init_done) {
164 sevenseg_init_done++;
167 switch (value & SEVENSEG_MASK_CTRL) {
171 (digits[((value & SEVENSEG_MASK_VAL) >> 4)] << 8) |
172 digits[((value & SEVENSEG_MASK_VAL) & 0xf)] ) );
174 break; /* paranoia */
178 __sevenseg_set_masked(SEVENDEG_MASK_DP, 0);
180 break; /* paranoia */
182 case SEVENSEG_SET_DPL:
183 __sevenseg_set_masked(SEVENSEG_DIGIT_DP, 1);
185 break; /* paranoia */
187 case SEVENSEG_SET_DPH:
188 __sevenseg_set_masked((SEVENSEG_DIGIT_DP << 8), 1);
190 break; /* paranoia */
192 case SEVENSEG_RES_DPL:
193 __sevenseg_set_masked(SEVENSEG_DIGIT_DP, 0);
195 break; /* paranoia */
197 case SEVENSEG_RES_DPH:
198 __sevenseg_set_masked((SEVENSEG_DIGIT_DP << 8), 0);
200 break; /* paranoia */
202 case SEVENSEG_TOG_DPL:
203 __sevenseg_toggle_masked(SEVENSEG_DIGIT_DP);
205 break; /* paranoia */
207 case SEVENSEG_TOG_DPH:
208 __sevenseg_toggle_masked((SEVENSEG_DIGIT_DP << 8));
210 break; /* paranoia */
220 #endif /* CONFIG_SEVENSEG */