]>
git.ipfire.org Git - people/ms/u-boot.git/blob - board/altera/common/sevenseg.c
c53cec16e64feaaf7df2ad73c5fbbdb7b0d0b3ff
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 */