Subversion Repositories svn.mios32

Rev

Rev 2399 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
134 tk 1
// $Id: seq_led.c 2531 2017-10-11 22:55:38Z tk $
2
/*
3
 * LED Handlers
4
 *
5
 * ==========================================================================
6
 *
7
 *  Copyright (C) 2008 Thorsten Klose (tk@midibox.org)
8
 *  Licensed for personal non-commercial use only.
9
 *  All other rights reserved.
10
 *
11
 * ==========================================================================
12
 */
13
 
14
/////////////////////////////////////////////////////////////////////////////
15
// Include files
16
/////////////////////////////////////////////////////////////////////////////
17
 
18
#include <mios32.h>
19
 
20
#include "seq_led.h"
2531 tk 21
#include "seq_blm8x8.h"
2399 tk 22
#include "seq_hwcfg.h"
23
#include "seq_file_hw.h"
134 tk 24
 
1336 tk 25
#ifdef MBSEQV4L
26
#include <blm_cheapo.h>
27
#endif
134 tk 28
 
1336 tk 29
 
134 tk 30
/////////////////////////////////////////////////////////////////////////////
31
// Local variables
32
/////////////////////////////////////////////////////////////////////////////
33
 
34
 
35
/////////////////////////////////////////////////////////////////////////////
36
// Initialisation
37
/////////////////////////////////////////////////////////////////////////////
38
s32 SEQ_LED_Init(u32 mode)
39
{
40
  return 0; // no error
41
}
42
 
43
 
44
/////////////////////////////////////////////////////////////////////////////
45
// Sets a LED, differs between LEDs directly connected to DOUT pins 
1864 tk 46
// (pin = 0..191) and LEDS which are connected to a 8x8 matrix (pin = 192..255)
134 tk 47
/////////////////////////////////////////////////////////////////////////////
48
s32 SEQ_LED_PinSet(u32 pin, u32 value)
49
{
1336 tk 50
#ifdef MBSEQV4L
2399 tk 51
  if( pin < 64 ) {
52
    BLM_CHEAPO_DOUT_PinSet(pin, value);
53
 
54
    // extra: directly mirror to SRIO DOUT as long as SD Card not read (dirty workaround to simplify usage of V4L)
55
    if( SEQ_FILE_HW_Valid() ) {
56
      return 0;
57
    } else {
58
      pin += 184;
59
    }
60
  }
1336 tk 61
#else
1864 tk 62
  if( pin < 184 )
134 tk 63
    return MIOS32_DOUT_PinSet(pin, value);
1336 tk 64
#endif
134 tk 65
 
2399 tk 66
  if( pin >= 184 && pin < 248 ) {
67
    if( seq_hwcfg_blm8x8.dout_gp_mapping == 2 && !SEQ_FILE_HW_Valid() ) {
68
      // MBSEQ V4L SRIO Board
69
      if( pin >= 216 ) {
70
    pin = (pin & 0xf8) | (7 - (pin&7));
71
      }
72
    }
73
 
2531 tk 74
    return SEQ_BLM8X8_LEDSet(0, pin-184, value);
2399 tk 75
  }
1864 tk 76
 
134 tk 77
  return -1; // pin not available
78
}
79
 
80
 
81
/////////////////////////////////////////////////////////////////////////////
82
// Sets a DOUT SR (8 LEDs), differs between LEDs directly connected to DOUT SR
1864 tk 83
// (sr=0..23) and LEDS which are connected to a 8x8 matrix (sr=24..31)
134 tk 84
/////////////////////////////////////////////////////////////////////////////
85
s32 SEQ_LED_SRSet(u32 sr, u8 value)
86
{
1337 tk 87
  if( sr >= 128 )
88
    return -1; // SR disabled
1318 tk 89
 
1336 tk 90
#ifdef MBSEQV4L
2399 tk 91
  if( sr < 8 ) {
92
    BLM_CHEAPO_DOUT_SRSet(sr, value);
93
 
94
    // extra: directly mirror to SRIO DOUT as long as SD Card not read (dirty workaround to simplify usage of V4L)
95
    if( SEQ_FILE_HW_Valid() ) {
96
      return 0;
97
    } else {
98
      sr += 23;
99
    }
100
  }
101
 
1336 tk 102
#else
1864 tk 103
  if( sr < 23 )
134 tk 104
    return MIOS32_DOUT_SRSet(sr, value);
1336 tk 105
#endif
134 tk 106
 
2399 tk 107
  if( sr >= 23 && sr < 31 ) {
108
    if( seq_hwcfg_blm8x8.dout_gp_mapping == 2 && sr >= 27 ) {
109
      // MBSEQ V4L SRIO Board
110
      value = mios32_dout_reverse_tab[value];
111
    }
112
 
2531 tk 113
    return SEQ_BLM8X8_LEDSRSet(0, sr-23, value);
2399 tk 114
  }
1864 tk 115
 
134 tk 116
  return -1; // SR not available
117
}
626 tk 118
 
119
/////////////////////////////////////////////////////////////////////////////
120
// returns the value of a DOUT SR (8 LEDs), differs between LEDs directly connected to DOUT SR
1864 tk 121
// (sr=0..23) and LEDS which are connected to a 8x8 matrix (sr=24..31)
626 tk 122
/////////////////////////////////////////////////////////////////////////////
123
s32 SEQ_LED_SRGet(u32 sr)
124
{
1337 tk 125
  if( sr >= 128 )
126
    return 0; // SR disabled
1318 tk 127
 
1336 tk 128
#ifdef MBSEQV4L
1345 tk 129
  if( sr < 8 )
1337 tk 130
    return BLM_CHEAPO_DOUT_SRGet(sr);
1336 tk 131
#else
1864 tk 132
  if( sr < 23 )
626 tk 133
    return MIOS32_DOUT_SRGet(sr);
1336 tk 134
#endif
626 tk 135
 
2399 tk 136
  if( sr >= 23 && sr < 31 ) {
2531 tk 137
    u8 value = SEQ_BLM8X8_LEDSRGet(0, sr-23);
1864 tk 138
 
2399 tk 139
    if( seq_hwcfg_blm8x8.dout_gp_mapping == 2 && sr >= 27 ) {
140
      // MBSEQ V4L SRIO Board
141
      value = mios32_dout_reverse_tab[value];
142
    }
143
 
144
    return value;
145
  }
146
 
626 tk 147
  return 0; // SR not available... return 0
148
}
1336 tk 149
 
150
 
151
/////////////////////////////////////////////////////////////////////////////
152
// Returns the 8bit pattern of a hexadecimal 4bit value
153
// The dot will be set if bit 7 of this value is set
154
/////////////////////////////////////////////////////////////////////////////
155
s32 SEQ_LED_DigitPatternGet(u8 value)
156
{
157
  const u8 led_digits_decoded[16] = {
158
    //    a
159
    //   ---
160
    //  !   !
161
    // f! g !b
162
    //   ---
163
    //  !   !
164
    // e!   !c
165
    //   ---
166
    //    d   h
167
    // 1 = on, 0 = off
168
    // NOTE: the dod (h) will be set automatically by the driver above when bit 7 is set
169
 
170
    //       habc defg
171
    0x7e, // 0111 1110
172
    0x30, // 0011 0000
173
    0x6d, // 0110 1101
174
    0x79, // 0111 1001
175
    0x33, // 0011 0011
176
    0x5b, // 0101 1011
177
    0x5f, // 0101 1111
178
    0x70, // 0111 0000
179
    0x7f, // 0111 1111
180
    0x7b, // 0111 1011
181
    0x77, // 0111 0111
182
    0x1f, // 0001 1111
183
    0x4e, // 0100 1110
184
    0x3d, // 0011 1101
185
    0x4f, // 0100 1111
186
    0x47, // 0100 0111
187
  };  
188
 
189
 
190
  return led_digits_decoded[value & 0xf] | (value & 0x80);
191
}