51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
|
#include <common.h>
|
||
|
#include <board/cogent/dipsw.h>
|
||
|
|
||
|
unsigned char
|
||
|
dipsw_raw(void)
|
||
|
{
|
||
|
return cma_mb_reg_read(&((cma_mb_dipsw *)CMA_MB_DIPSW_BASE)->dip_val);
|
||
|
}
|
||
|
|
||
|
unsigned char
|
||
|
dipsw_cooked(void)
|
||
|
{
|
||
|
unsigned char val1, val2, mask1, mask2;
|
||
|
|
||
|
val1 = dipsw_raw();
|
||
|
|
||
|
/*
|
||
|
* we want to mirror the bits because the low bit is switch 1 and high
|
||
|
* bit is switch 8 and also invert them because 1=off and 0=on, according
|
||
|
* to manual.
|
||
|
*
|
||
|
* this makes the value more intuitive i.e.
|
||
|
* - left most, or high, or top, bit is left most switch (1);
|
||
|
* - right most, or low, or bottom, bit is right most switch (8)
|
||
|
* - a set bit means "on" and a clear bit means "off"
|
||
|
*/
|
||
|
|
||
|
val2 = 0;
|
||
|
for (mask1 = 1 << 7, mask2 = 1; mask1 > 0; mask1 >>= 1, mask2 <<= 1)
|
||
|
if ((val1 & mask1) == 0)
|
||
|
val2 |= mask2;
|
||
|
|
||
|
return (val2);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
dipsw_init(void)
|
||
|
{
|
||
|
unsigned char val, mask;
|
||
|
|
||
|
val = dipsw_cooked();
|
||
|
|
||
|
printf("|");
|
||
|
for (mask = 1 << 7; mask > 0; mask >>= 1)
|
||
|
if (val & mask)
|
||
|
printf("on |");
|
||
|
else
|
||
|
printf("off|");
|
||
|
printf("\n");
|
||
|
}
|