Subversion Repositories svn.mios32

Rev

Rev 2531 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
134 tk 1
// $Id: seq_led.c 2532 2017-10-12 21:50:45Z 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 {
2532 tk 58
      pin += 256;
2399 tk 59
    }
60
  }
1336 tk 61
#else
2532 tk 62
  if( pin < 256 )
134 tk 63
    return MIOS32_DOUT_PinSet(pin, value);
1336 tk 64
#endif
134 tk 65
 
2532 tk 66
  u8 sr = (pin-256) / 8;
67
 
68
  if( sr >= (SEQ_BLM8X8_NUM*8) )
69
    return -1; // SR disabled
70
 
71
  if( seq_hwcfg_blm8x8.dout_gp_mapping == 2 && !SEQ_FILE_HW_Valid() ) {
72
    // MBSEQ V4L SRIO Board
73
    if( sr >= 4 && sr <= 7 ) {
74
      pin = (pin & 0xf8) | (7 - (pin&7));
2399 tk 75
    }
76
  }
1864 tk 77
 
2532 tk 78
  return SEQ_BLM8X8_LEDSet(sr / 8, pin % 64, value);
134 tk 79
}
80
 
81
 
82
/////////////////////////////////////////////////////////////////////////////
83
// Sets a DOUT SR (8 LEDs), differs between LEDs directly connected to DOUT SR
1864 tk 84
// (sr=0..23) and LEDS which are connected to a 8x8 matrix (sr=24..31)
134 tk 85
/////////////////////////////////////////////////////////////////////////////
86
s32 SEQ_LED_SRSet(u32 sr, u8 value)
87
{
2532 tk 88
  if( sr >= (32 + SEQ_BLM8X8_NUM*8) )
1337 tk 89
    return -1; // SR disabled
1318 tk 90
 
1336 tk 91
#ifdef MBSEQV4L
2399 tk 92
  if( sr < 8 ) {
93
    BLM_CHEAPO_DOUT_SRSet(sr, value);
94
 
95
    // extra: directly mirror to SRIO DOUT as long as SD Card not read (dirty workaround to simplify usage of V4L)
96
    if( SEQ_FILE_HW_Valid() ) {
97
      return 0;
98
    } else {
2532 tk 99
      sr += 32;
2399 tk 100
    }
101
  }
102
 
1336 tk 103
#else
2532 tk 104
  if( sr < 32 )
134 tk 105
    return MIOS32_DOUT_SRSet(sr, value);
1336 tk 106
#endif
134 tk 107
 
2532 tk 108
  sr -= 32;
2399 tk 109
 
2532 tk 110
  if( seq_hwcfg_blm8x8.dout_gp_mapping == 2 && sr >= 4 && sr <= 7 ) {
111
    // MBSEQ V4L SRIO Board
112
    value = mios32_dout_reverse_tab[value];
2399 tk 113
  }
1864 tk 114
 
2532 tk 115
  return SEQ_BLM8X8_LEDSRSet(sr / 8, sr % 8, value);
134 tk 116
}
626 tk 117
 
118
/////////////////////////////////////////////////////////////////////////////
119
// returns the value of a DOUT SR (8 LEDs), differs between LEDs directly connected to DOUT SR
1864 tk 120
// (sr=0..23) and LEDS which are connected to a 8x8 matrix (sr=24..31)
626 tk 121
/////////////////////////////////////////////////////////////////////////////
122
s32 SEQ_LED_SRGet(u32 sr)
123
{
2532 tk 124
  if( sr >= (32 + SEQ_BLM8X8_NUM*8) )
125
    return 0; // SR not available... return 0
1318 tk 126
 
1336 tk 127
#ifdef MBSEQV4L
1345 tk 128
  if( sr < 8 )
1337 tk 129
    return BLM_CHEAPO_DOUT_SRGet(sr);
1336 tk 130
#else
2532 tk 131
  if( sr < 32 )
626 tk 132
    return MIOS32_DOUT_SRGet(sr);
1336 tk 133
#endif
626 tk 134
 
2532 tk 135
  sr -= 32;
1864 tk 136
 
2532 tk 137
  u8 value = SEQ_BLM8X8_LEDSRGet(sr / 8, sr % 8);
2399 tk 138
 
2532 tk 139
  if( seq_hwcfg_blm8x8.dout_gp_mapping == 2 && sr >= 4 && sr <= 7 ) {
140
    // MBSEQ V4L SRIO Board
141
    value = mios32_dout_reverse_tab[value];
2399 tk 142
  }
143
 
2532 tk 144
  return value;
626 tk 145
}
1336 tk 146
 
147
 
148
/////////////////////////////////////////////////////////////////////////////
149
// Returns the 8bit pattern of a hexadecimal 4bit value
150
// The dot will be set if bit 7 of this value is set
151
/////////////////////////////////////////////////////////////////////////////
152
s32 SEQ_LED_DigitPatternGet(u8 value)
153
{
154
  const u8 led_digits_decoded[16] = {
155
    //    a
156
    //   ---
157
    //  !   !
158
    // f! g !b
159
    //   ---
160
    //  !   !
161
    // e!   !c
162
    //   ---
163
    //    d   h
164
    // 1 = on, 0 = off
165
    // NOTE: the dod (h) will be set automatically by the driver above when bit 7 is set
166
 
167
    //       habc defg
168
    0x7e, // 0111 1110
169
    0x30, // 0011 0000
170
    0x6d, // 0110 1101
171
    0x79, // 0111 1001
172
    0x33, // 0011 0011
173
    0x5b, // 0101 1011
174
    0x5f, // 0101 1111
175
    0x70, // 0111 0000
176
    0x7f, // 0111 1111
177
    0x7b, // 0111 1011
178
    0x77, // 0111 0111
179
    0x1f, // 0001 1111
180
    0x4e, // 0100 1110
181
    0x3d, // 0011 1101
182
    0x4f, // 0100 1111
183
    0x47, // 0100 0111
184
  };  
185
 
186
 
187
  return led_digits_decoded[value & 0xf] | (value & 0x80);
188
}