An input/output controller for virtual pinball machines, with plunger position tracking, accelerometer-based nudge sensing, button input encoding, and feedback device control.

Dependencies:   USBDevice mbed FastAnalogIn FastIO FastPWM SimpleDMA

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers config.h Source File

config.h

00001 // Pinscape Controller Configuration
00002 //
00003 // To customize your private configuration, simply open this file in the 
00004 // mbed on-line IDE, make your changes, save the file, and click the Compile
00005 // button at the top of the window.  That will generate a customized .bin
00006 // file that you can download onto your KL25Z board.
00007 
00008 #ifndef CONFIG_H
00009 #define CONFIG_H
00010 
00011 // ---------------------------------------------------------------------------
00012 //
00013 // Expansion Board.  If you're using the expansion board, un-comment the
00014 // line below.  This will select all of the correct defaults for the board.
00015 //
00016 // The expansion board settings are mostly automatic, so you shouldn't have
00017 // to change much else.  However, you should still look at and adjust the
00018 // following as needed:
00019 //    - TV power on delay time
00020 //    - Plunger sensor settings, if you're using a plunger
00021 //
00022 //#define EXPANSION_BOARD
00023 
00024 
00025 // --------------------------------------------------------------------------
00026 //
00027 // Enable/disable joystick functions.
00028 //
00029 // This controls whether or not we send joystick reports to the PC with the 
00030 // plunger and accelerometer readings.  By default, this is enabled.   If
00031 // you want to use two or more physical KL25Z Pinscape controllers in your
00032 // system (e.g., if you want to increase the number of output ports
00033 // available by using two or more KL25Z's), you should disable the joystick
00034 // features on the second (and third+) controller.  It's not useful to have
00035 // more than one board reporting the accelerometer readings to the host -
00036 // doing so will just add USB overhead.  This setting lets you turn off the
00037 // reports for the secondary controllers, turning the secondary boards into
00038 // output-only devices.
00039 //
00040 // Note that you can't use button inputs on a controller that has the
00041 // joystick features disabled, because the buttons are handled via the
00042 // joystick reports.  Wire all of your buttons to the primary KL25Z that
00043 // has the joystick features enabled.
00044 //
00045 // To disable the joystick features, just comment out the next line (add
00046 // two slashes at the beginning of the line).
00047 //
00048 #define ENABLE_JOYSTICK
00049 
00050 
00051 // ---------------------------------------------------------------------------
00052 //
00053 // USB device vendor ID and product ID.  These values identify the device 
00054 // to the host software on the PC.  By default, we use the same settings as
00055 // a real LedWiz so that host software will recognize us as an LedWiz.
00056 //
00057 // The standard settings *should* work without conflicts, even if you have 
00058 // a real LedWiz.  My reference system is 64-bit Windows 7 with a real LedWiz 
00059 // on unit #1 and a Pinscape controller on unit #8 (the default), and the 
00060 // two coexist happily in my system.  The LedWiz is designed specifically 
00061 // to allow multiple units in one system, using the unit number value 
00062 // (see below) to distinguish multiple units, so there should be no conflict
00063 // between Pinscape and any real LedWiz devices you have.
00064 //
00065 // However, even though conflicts *shouldn't* happen, I've had one report
00066 // from a user who experienced a Windows USB driver conflict that they could
00067 // only resolve by changing the vendor ID.  The real underlying cause is 
00068 // still a mystery, but whatever was going on, changing the vendor ID fixed 
00069 // it.  If you run into a similar problem, you can try the same fix as a
00070 // last resort.  Before doing that, though, you should try changing the 
00071 // Pinscape unit number first - it's possible that your real LedWiz is using 
00072 // unit #8, which is our default setting.
00073 //
00074 // If you must change the vendor ID for any reason, you'll sacrifice LedWiz
00075 // compatibility, which means that old programs like Future Pinball that use
00076 // the LedWiz interface directly won't be able to access the LedWiz output
00077 // controller features.  However, all is not lost.  All of the other functions
00078 // (plunger, nudge, and key input) use the joystick interface, which will 
00079 // work regardless of the ID values.  In addition, DOF R3 recognizes the
00080 // "emergency fallback" ID below, so if you use that, *all* functions
00081 // including the output controller will work in any DOF R3-enabled software,
00082 // including Visual Pinball and PinballX.  So the only loss will be that
00083 // old LedWiz-only software won't be able to control the outputs.
00084 //
00085 // The "emergency fallback" ID below is officially registerd with 
00086 // http://pid.codes, a registry for open-source USB projects, which should 
00087 // all but guarantee that this alternative ID shouldn't conflict with 
00088 // any other devices in your system.
00089 
00090 
00091 // STANDARD ID SETTINGS.  These provide full, transparent LedWiz compatibility.
00092 const uint16_t USB_VENDOR_ID = 0xFAFA;      // LedWiz vendor ID = FAFA
00093 const uint16_t USB_PRODUCT_ID = 0x00F0;     // LedWiz start of product ID range = 00F0
00094 
00095 
00096 // EMERGENCY FALLBACK ID SETTINGS.  These settings are not LedWiz-compatible,
00097 // so older LedWiz-only software won't be able to access the output controller
00098 // features.  However, DOF R3 recognizes these IDs, so DOF-aware software (Visual 
00099 // Pinball, PinballX) will have full access to all features.
00100 //
00101 //const uint16_t USB_VENDOR_ID = 0x1209;   // DOF R3-compatible vendor ID = 1209
00102 //const uint16_t USB_PRODUCT_ID = 0xEAEA;  // DOF R3-compatible product ID = EAEA
00103 
00104 
00105 // ---------------------------------------------------------------------------
00106 //
00107 // LedWiz unit number.
00108 //
00109 // Each LedWiz device has a unit number, from 1 to 16.  This lets you install
00110 // more than one LedWiz in your system: as long as each one has a different
00111 // unit number, the software on the PC can tell them apart and route commands 
00112 // to the right device.
00113 //
00114 // A real LedWiz has its unit number set at the factory.  If you don't tell
00115 // them otherwise when placing your order, they will set it to unit #1.  Most
00116 // real LedWiz units therefore are set to unit #1.  There's no provision on
00117 // a real LedWiz for users to change the unit number after it leaves the 
00118 // factory.
00119 //
00120 // For our *emulated* LedWiz, we default to unit #8 if we're the primary
00121 // Pinscape controller in the system, or unit #9 if we're set up as the
00122 // secondary controller with the joystick functions turned off.
00123 //
00124 // The reason we start at unit #8 is that we want to avoid conflicting with
00125 // any real LedWiz devices in your system.  Most real LedWiz devices are
00126 // set up as unit #1, and in the rare cases where people have two of them,
00127 // the second one is usually unit #2.  
00128 //
00129 // Note 1:  the unit number here is the *user visible* unit number that
00130 // you use on the PC side.  It's the number you specify in your DOF
00131 // configuration and so forth.  Internally, the USB reports subtract
00132 // one from this number - e.g., nominal unit #1 shows up as 0 in the USB
00133 // reports.  If you're trying to puzzle out why all of the USB reports
00134 // are all off by one from the unit number you select here, that's why.
00135 //
00136 // Note 2:  the DOF Configtool (google it) knows about the Pinscape 
00137 // controller.  There it's referred to as simply "KL25Z" rather than 
00138 // Pinscape Controller, but that's what they're talking about.  The DOF 
00139 // tool knows that it uses #8 as its default unit number, so it names the 
00140 // .ini file for this controller xxx8.ini.  If you change the unit number 
00141 // here, remember to rename the DOF-generated .ini file to match, by 
00142 // changing the "8" at the end of the filename to the new number you set 
00143 // here.
00144 const uint8_t DEFAULT_LEDWIZ_UNIT_NUMBER = 
00145 #ifdef ENABLE_JOYSTICK
00146    0x08;   // joystick enabled - assume we're the primary KL25Z, so use unit #8
00147 #else
00148    0x09;   // joystick disabled - assume we're a secondary, output-only KL25Z, so use #9
00149 #endif
00150 
00151 
00152 // --------------------------------------------------------------------------
00153 //
00154 // Accelerometer orientation.  The accelerometer feature lets Visual Pinball 
00155 // (and other pinball software) sense nudges to the cabinet, and simulate 
00156 // the effect on the ball's trajectory during play.  We report the direction
00157 // of the accelerometer readings as well as the strength, so it's important
00158 // for VP and the KL25Z to agree on the physical orientation of the
00159 // accelerometer relative to the cabinet.  The accelerometer on the KL25Z
00160 // is always mounted the same way on the board, but we still have to know
00161 // which way you mount the board in your cabinet.  We assume as default
00162 // orientation where the KL25Z is mounted flat on the bottom of your
00163 // cabinet with the USB ports pointing forward, toward the coin door.  If
00164 // it's more convenient for you to mount the board in a different direction,
00165 // you simply need to select the matching direction here.  Comment out the
00166 // ORIENTATION_PORTS_AT_FRONT line and un-comment the line that matches
00167 // your board's orientation.
00168 
00169 #define ORIENTATION_PORTS_AT_FRONT      // USB ports pointing toward front of cabinet
00170 // #define ORIENTATION_PORTS_AT_LEFT    // USB ports pointing toward left side of cab
00171 // #define ORIENTATION_PORTS_AT_RIGHT   // USB ports pointing toward right side of cab
00172 // #define ORIENTATION_PORTS_AT_REAR    // USB ports pointing toward back of cabinet
00173 
00174 
00175 
00176 // --------------------------------------------------------------------------
00177 //
00178 // Plunger CCD sensor.
00179 //
00180 // If you're NOT using the CCD sensor, comment out the next line (by adding
00181 // two slashes at the start of the line).
00182 
00183 #define ENABLE_CCD_SENSOR
00184 
00185 // Physical pixel count for your sensor.  This software has been tested with
00186 // TAOS TSL1410R (1280 pixels) and TSL1412R (1536 pixels) sensors.  It might
00187 // work with other similar sensors as well, but you'll probably have to make
00188 // some changes to the software interface to the sensor if you're using any
00189 // sensor outside of the TAOS TSL14xxR series.
00190 //
00191 // If you're not using a CCD sensor, you can ignore this.
00192 const int CCD_NPIXELS = 1280;
00193 
00194 // Number of pixels from the CCD to sample on each high-res scan.  We don't
00195 // sample every pixel from the sensor on each scan, because (a) we don't
00196 // have to, and (b) we don't want to.  We don't have to sample all of the
00197 // pixels because these sensors have much finer resolution than we need to
00198 // get good results.  On a typical pinball cabinet setup with a 1920x1080
00199 // HD TV display, the on-screen plunger travel distance is about 165 pixels,
00200 // so that's all the pixels we need to sample for pixel-accurate animation.
00201 // Even so, we still *could* sample at higher resolution, but we don't *want*
00202 // to sample more pixels than we have to,  because reading each pixel takes 
00203 // time.  The limiting factor for read speed is the sampling time for the ADC 
00204 // (analog to digital  converter); it needs about 20us per sample to get an 
00205 // accurate voltage reading.  We want to animate the on-screen plunger in 
00206 // real time, with minimal lag, so it's important that we complete each scan 
00207 // as quickly as possible.  The fewer pixels we sample, the faster we 
00208 // complete each scan.
00209 //
00210 // Happily, the time needed to read the approximately 165 pixels required
00211 // for pixel-accurate positioning on the display is short enough that we can
00212 // complete a scan within the cycle time for USB reports.  Visual Pinball
00213 // only polls for input at about 10ms intervals, so there's no benefit
00214 // to going much faster than this.  The sensor timing is such that we can
00215 // read about 165 pixels in well under 10ms.  So that's really the sweet
00216 // spot for our scans.
00217 //
00218 // Note that we distribute the sampled pixels evenly across the full range
00219 // of the sensor's pixels.  That is, we read every nth pixel, and skip the
00220 // ones in between.  That means that the sample count here has to be an even
00221 // divisor of the physical pixel count.  Empirically, reading every 8th
00222 // pixel gives us good results on both the TSL1410R and TSL1412R, so you
00223 // shouldn't need to change this if you're using one of those sensors.  If
00224 // you're using a different sensor, you should be sure to adjust this so that 
00225 // it works out to an integer result with no remainder.
00226 //
00227 const int CCD_NPIXELS_SAMPLED = CCD_NPIXELS / 8;
00228 
00229 // The KL25Z pins that the CCD sensor is physically attached to:
00230 //
00231 //  CCD_SI_PIN = the SI (sensor data input) pin
00232 //  CCD_CLOCK_PIN = the sensor clock pin
00233 //  CCD_SO_PIN = the SO (sensor data output) pin
00234 //
00235 // The SI an Clock pins are DigitalOut pins, so these can be set to just
00236 // about any gpio pins that aren't used for something else.  The SO pin must
00237 // be an AnalogIn capable pin - only a few of the KL25Z gpio pins qualify, 
00238 // so check the pinout diagram to find suitable candidates if you need to 
00239 // change this.  Note that some of the gpio pins shown in the mbed pinout
00240 // diagrams are committed to other uses by the mbed software or by the KL25Z
00241 // wiring itself, so if you do change these, be sure that the new pins you
00242 // select are really available.
00243 
00244 const PinName CCD_SI_PIN = PTE20;
00245 const PinName CCD_CLOCK_PIN = PTE21;
00246 const PinName CCD_SO_PIN = PTB0;
00247 
00248 // --------------------------------------------------------------------------
00249 //
00250 // Plunger potentiometer sensor.
00251 //
00252 // If you're using a potentiometer as the plunger sensor, un-comment the
00253 // next line (by removing the two slashes at the start of the line), and 
00254 // also comment out the ENABLE_CCD_SENSOR line above.
00255 
00256 //#define ENABLE_POT_SENSOR
00257 
00258 // The KL25Z pin that your potentiometer is attached to.  The potentiometer
00259 // requires wiring three connectins:
00260 //
00261 // - Wire the fixed resistance end of the potentiometer nearest the KNOB 
00262 //   end of the plunger to the 3.3V output from the KL25Z
00263 //
00264 // - Wire the other fixed resistance end to KL25Z Ground
00265 //
00266 // -  Wire the potentiometer wiper (the variable output terminal) to the 
00267 //    KL25Z pin identified below.  
00268 //
00269 // Note that you can change the pin selection below, but if you do, the new
00270 // pin must be AnalogIn capable.  Only a few of the KL25Z pins qualify.  Refer
00271 // to the KL25Z pinout diagram to find another AnalogIn pin if you need to
00272 // change this for any reason.  Note that the default is to use the same analog 
00273 // input that the CCD sensor would use if it were enabled, which is why you 
00274 // have to be sure to disable the CCD support in the software if you're using 
00275 // a potentiometer as the sensor.
00276 
00277 const PinName POT_PIN = PTB0;
00278 
00279 // --------------------------------------------------------------------------
00280 //
00281 // Plunger calibration button and indicator light.
00282 //
00283 // These specify the pin names of the plunger calibration button connections.
00284 // If you're not using these, you can set these to NC.  (You can even use the
00285 // button but not the LED; set the LED to NC if you're only using the button.)
00286 //
00287 // If you're using the button, wire one terminal of a momentary switch or
00288 // pushbutton to the input pin you select, and wire the other terminal to the 
00289 // KL25Z ground.  Push and hold the button for a few seconds to enter plunger 
00290 // calibration mode.
00291 // 
00292 // If you're using the LED, you'll need to build a little transistor power
00293 // booster circuit to power the LED, as described in the build guide.  The
00294 // LED gives you visual confirmation that the you've triggered calibration
00295 // mode and lets you know when the mode times out.  Note that the LED on
00296 // board the KL25Z also changes color to indicate the same information, so
00297 // if the KL25Z is positioned so that you can see it while you're doing the
00298 // calibration, you don't really need a separate button LED.  But the
00299 // separate LED is spiffy, especially if it's embedded in the pushbutton.
00300 //
00301 // Note that you can skip the pushbutton altogether and trigger calibration
00302 // from the Windows control software.  But again, the button is spiffier.
00303 
00304 // calibration button input 
00305 const PinName CAL_BUTTON_PIN = PTE29;
00306 
00307 // calibration button indicator LED
00308 const PinName CAL_BUTTON_LED = PTE23;
00309 
00310 
00311 // ---------------------------------------------------------------------------
00312 //
00313 // TV Power-On Timer.  This section lets you set up a delayed relay timer
00314 // for turning on your TV monitor(s) shortly after you turn on power to the
00315 // system.  This requires some external circuitry, which is built in to the
00316 // expansion board, or which you can build yourself - refer to the Build
00317 // Guide for the circuit plan.  
00318 //
00319 // If you're using this feature, un-comment the next line, and make any
00320 // changes to the port assignments below.  The default port assignments are
00321 // suitable for the expansion board.  Note that the TV timer is enabled
00322 // automatically if you're using the expansion board, since it's built in.
00323 //#define ENABLE_TV_TIMER
00324 
00325 #if defined(ENABLE_TV_TIMER) || defined(EXPANSION_BOARD)
00326 # define PSU2_STATUS_SENSE  PTD2    // Digital In pin to read latch status
00327 # define PSU2_STATUS_SET    PTE0    // Digital Out pin to set latch
00328 # define TV_RELAY_PIN       PTD3    // Digital Out pin to control TV switch relay
00329 
00330 // Amount of time (in seconds) to wait after system power-up before 
00331 // pulsing the TV ON switch relay.  Adjust as needed for your TV(s).
00332 // Most monitors won't respond to any buttons for the first few seconds
00333 // after they're plugged in, so we need to wait long enough to make sure
00334 // the TVs are ready to receive input before pressing the button.
00335 #define TV_DELAY_TIME    7.0
00336 
00337 #endif
00338 
00339 
00340 // --------------------------------------------------------------------------
00341 //
00342 // Pseudo "Launch Ball" button.
00343 //
00344 // Zeb of zebsboards.com came up with a clever scheme for his plunger kit
00345 // that lets the plunger simulate a Launch Ball button for tables where
00346 // the original used a Launch button instead of a plunger (e.g., Medieval 
00347 // Madness, T2, or Star Trek: The Next Generation).  The scheme uses an
00348 // LedWiz output to tell us when such a table is loaded.  On the DOF
00349 // Configtool site, this is called "ZB Launch Ball".  When this LedWiz
00350 // output is ON, it tells us that the table will ignore the analog plunger
00351 // because it doesn't have a plunger object, so the analog plunger should
00352 // send a Launch Ball button press signal when the user releases the plunger.
00353 // 
00354 // If you wish to use this feature, you need to do two things:
00355 //
00356 // First, adjust the two lines below to set the LedWiz output and joystick
00357 // button you wish to use for this feature.  The defaults below should be
00358 // fine for most people, but if you're using the Pinscape controller for
00359 // your physical button wiring, you should set the launch button to match
00360 // where you physically wired your actual Launch Ball button.  Likewise,
00361 // change the LedWiz port if you're using the one below for some actual
00362 // hardware output.  This is a virtual port that won't control any hardware;
00363 // it's just for signaling the plunger that we're in "button mode".  Note
00364 // that the numbering for the both the LedWiz port and joystick button 
00365 // start at 1 to match the DOF Configtool and VP dialog numbering.
00366 //
00367 // Second, in the DOF Configtool, make sure you have a Pinscape controller
00368 // in your cabinet configuration, then go to your Port Assignments and set
00369 // the port defined below to "ZB Launch Ball".
00370 //
00371 // Third, open the Visual Pinball editor, open the Preferences | Keys
00372 // dialog, and find the Plunger item.  Open the drop-down list under that
00373 // item and select the button number defined below.
00374 //
00375 // To disable this feature, just set ZBLaunchBallPort to 0 here.
00376 
00377 const int ZBLaunchBallPort = 32;
00378 const int LaunchBallButton = 24;
00379 
00380 // Distance necessary to push the plunger to activate the simulated 
00381 // launch ball button, in inches.  A standard pinball plunger can be 
00382 // pushed forward about 1/2".  However, the barrel spring is very
00383 // stiff, and anything more than about 1/8" requires quite a bit
00384 // of force.  Ideally the force required should be about the same as 
00385 // for any ordinary pushbutton.
00386 //
00387 // On my cabinet, empirically, a distance around 2mm (.08") seems
00388 // to work pretty well.  It's far enough that it doesn't trigger
00389 // spuriously, but short enough that it responds to a reasonably
00390 // light push.
00391 //
00392 // You might need to adjust this up or down to get the right feel.
00393 // Alternatively, if you don't like the "push" gesture at all and
00394 // would prefer to only make the plunger respond to a pull-and-release
00395 // motion, simply set this to, say, 2.0 - it's impossible to push a 
00396 // plunger forward that far, so that will effectively turn off the 
00397 // push mode.
00398 const float LaunchBallPushDistance = .08;
00399 
00400 
00401 // --------------------------------------------------------------------------
00402 //
00403 // TLC5940 PWM controller chip setup - Enhanced LedWiz emulation
00404 //
00405 // By default, the Pinscape Controller software can provide limited LedWiz
00406 // emulation through the KL25Z's on-board GPIO ports.  This lets you hook
00407 // up external devices, such as LED flashers or solenoids, to the KL25Z
00408 // outputs (using external circuitry to boost power - KL25Z GPIO ports
00409 // are limited to a meager 4mA per port).  This capability is limited by
00410 // the number of available GPIO ports on the KL25Z, and even smaller limit
00411 // of 10 PWM-capable GPIO ports.
00412 //
00413 // As an alternative, the controller software lets you use external PWM
00414 // controller chips to control essentially unlimited channels with full
00415 // PWM control on all channels.  This requires building external circuitry
00416 // using TLC5940 chips.  Each TLC5940 chip provides 16 full PWM channels,
00417 // and you can daisy-chain multiple TLC5940 chips together to set up 32, 
00418 // 48, 64, or more channels.
00419 //
00420 // If you do add TLC5940 circuits to your controller hardware, use this
00421 // section to configure the connection to the KL25Z.
00422 //
00423 // Note that when using the TLC5940, you can still also use some GPIO
00424 // pins for outputs as normal.  See ledWizPinMap[] for 
00425 
00426 // Number of TLC5940 chips you're using.  For a full LedWiz-compatible
00427 // setup, you need two of these chips, for 32 outputs.  The software
00428 // will handle up to 8.  
00429 // If you're using the expansion board, the main KL25Z interface board
00430 // has 2 chips and the MOSFET board has 2 more, for a total of 4.  If
00431 // you add extra daisy-chained MOSFET boards, add 2 more per board.
00432 #ifdef EXPANSION_BOARD
00433 # define TLC5940_NCHIPS  4
00434 #else
00435 # define TLC5940_NCHIPS  0     // change this if you're using TLC5940's without the expansion board
00436 #endif
00437 
00438 // If you're using TLC5940s, change any of these as needed to match the
00439 // GPIO pins that you connected to the TLC5940 control pins.  Note that
00440 // SIN and SCLK *must* be connected to the KL25Z SPI0 MOSI and SCLK
00441 // outputs, respectively, which effectively limits them to the default
00442 // selections, and that the GSCLK pin must be PWM-capable.  These defaults
00443 // all match the expansion board wiring.
00444 #define TLC5940_SIN    PTC6    // Serial data - Must connect to SPI0 MOSI -> PTC6 or PTD2
00445 #define TLC5940_SCLK   PTC5    // Serial clock - Must connect to SPI0 SCLK -> PTC5 or PTD1,
00446                                //  but don't use PTD1 because it's hard-wired to the on-board 
00447                                //  blue LED
00448 #define TLC5940_XLAT   PTC10   // XLAT (latch) signal - Any GPIO pin can be used
00449 #define TLC5940_BLANK  PTC7    // BLANK signal - Any GPIO pin can be used
00450 #define TLC5940_GSCLK  PTA1    // Grayscale clock - Must be a PWM-capable pin
00451 
00452 
00453 // --------------------------------------------------------------------------
00454 //
00455 // 74HC595 digital output setup - "Chime Board" module
00456 //
00457 // The 74HC595 is an 8-output serial-to-parallel shift register IC.  This lets
00458 // us add extra digital outputs (on/off only, not PWM), 8 at a time, similar
00459 // to the way the TLC5940 lets us add extra PWM outputs.  The 74HC595 requires
00460 // four control signals, so one chip gives us 8 outputs using only 4 GPIOs.
00461 // The chips can be daisy-chained, so by adding multiple chips, we can add 
00462 // any number of new outputs, still using only 4 GPIO pins for the whole chain.
00463 //
00464 // The TLC5940 is more useful for general-purpose outputs because of its PWM
00465 // capabilities, but digital-only outputs are better for some special cases.
00466 //
00467 // The Expansion Board "Chime" module uses these chips to add timer-protected
00468 // outputs.  The timer triggers are edge-sensitive, so we want simple on/off
00469 // signals to control them; a PWM signal wouldn't work properly because it's
00470 // constantly switching on and off even when nominally 100% on.
00471 //
00472 
00473 #define HC595_NCHIPS   0       // Number of chips == number of Chime boards connected
00474 #define HC595_SIN      PTA5    // Serial data - use any GPIO pin
00475 #define HC595_SCLK     PTA4    // Serial clock - use any GPIO pin
00476 #define HC595_LATCH    PTA12   // Latch signal - use any GPIO pin
00477 #define HC595_ENA      PTD4    // Enable signal - use any GPIO pin
00478 
00479 
00480 #endif // CONFIG_H - end of include-once section (code below this point can be multiply included)
00481 
00482 
00483 #ifdef DECL_EXTERNS  // this section defines global variables, only if this macro is set
00484 
00485 // --------------------------------------------------------------------------
00486 //
00487 
00488 // Joystick button input pin assignments.  
00489 //
00490 // You can wire up to 32 GPIO ports to buttons (equipped with 
00491 // momentary switches).  Connect each switch between the desired 
00492 // GPIO port and ground (J9 pin 12 or 14).  When the button is pressed, 
00493 // we'll tell the host PC that the corresponding joystick button is 
00494 // pressed.  We debounce the keystrokes in software, so you can simply 
00495 // wire directly to pushbuttons with no additional external hardware.
00496 //
00497 // Note that we assign 24 buttons by default, even though the USB
00498 // joystick interface can handle up to 32 buttons.  VP itself only
00499 // allows mapping of up to 24 buttons in the preferences dialog 
00500 // (although it can recognize 32 buttons internally).  If you want 
00501 // more buttons, you can reassign pins that are assigned by default
00502 // as LedWiz outputs.  To reassign a pin, find the pin you wish to
00503 // reassign in the LedWizPortMap array below, and change the pin name 
00504 // there to NC (for Not Connected).  You can then change one of the
00505 // "NC" entries below to the reallocated pin name.  The limit is 32
00506 // buttons total.
00507 //
00508 // (If you're using TLC5940 chips to control outputs, many of the
00509 // GPIO pins that are mapped to LedWiz outputs in the default
00510 // mapping can be reassigned as keys, since the TLC5940 outputs
00511 // take over for the GPIO pins.  The exceptions are the pins that
00512 // are reassigned to control the TLC5940 chips.)
00513 //
00514 // Note: PTD1 (pin J2-12) should NOT be assigned as a button input,
00515 // as this pin is physically connected on the KL25Z to the on-board
00516 // indicator LED's blue segment.
00517 PinName buttonMap[] = {
00518     PTC2,      // J10 pin 10, joystick button 1
00519     PTB3,      // J10 pin 8,  joystick button 2
00520     PTB2,      // J10 pin 6,  joystick button 3
00521     PTB1,      // J10 pin 4,  joystick button 4
00522     
00523     PTE30,     // J10 pin 11, joystick button 5
00524 #ifdef EXPANSION_BOARD
00525     PTC11,     // J1 pin 15,  joystick button 6
00526 #else
00527     PTE22,     // J10 pin 5,  joystick button 6
00528 #endif
00529     
00530     PTE5,      // J9 pin 15,  joystick button 7
00531     PTE4,      // J9 pin 13,  joystick button 8
00532     PTE3,      // J9 pin 11,  joystick button 9
00533     PTE2,      // J9 pin 9,   joystick button 10
00534     PTB11,     // J9 pin 7,   joystick button 11
00535     PTB10,     // J9 pin 5,   joystick button 12
00536     PTB9,      // J9 pin 3,   joystick button 13
00537     PTB8,      // J9 pin 1,   joystick button 14
00538     
00539     PTC12,     // J2 pin 1,   joystick button 15
00540     PTC13,     // J2 pin 3,   joystick button 16
00541     PTC16,     // J2 pin 5,   joystick button 17
00542     PTC17,     // J2 pin 7,   joystick button 18
00543     PTA16,     // J2 pin 9,   joystick button 19
00544     PTA17,     // J2 pin 11,  joystick button 20
00545     PTE31,     // J2 pin 13,  joystick button 21
00546     PTD6,      // J2 pin 17,  joystick button 22
00547     PTD7,      // J2 pin 19,  joystick button 23
00548     
00549     PTE1,      // J2 pin 20,  joystick button 24
00550 
00551     NC,        // not used,   joystick button 25
00552     NC,        // not used,   joystick button 26
00553     NC,        // not used,   joystick button 27
00554     NC,        // not used,   joystick button 28
00555     NC,        // not used,   joystick button 29
00556     NC,        // not used,   joystick button 30
00557     NC,        // not used,   joystick button 31
00558     NC         // not used,   joystick button 32
00559 };
00560 
00561 // --------------------------------------------------------------------------
00562 //
00563 // LED-Wiz emulation output pin assignments
00564 //
00565 // This sets the mapping from logical LedWiz port numbers, as used
00566 // in the software on the PC side, to physical hardware pins on the
00567 // KL25Z and/or the TLC5940 controllers.
00568 //
00569 // The LedWiz protocol lets the PC software set a "brightness" level
00570 // for each output.  This is used to control the intensity of LEDs
00571 // and other lights, and can also control motor speeds.  To implement 
00572 // the intensity level in hardware, we use PWM, or pulse width
00573 // modulation, which switches the output on and off very rapidly
00574 // to give the effect of a reduced voltage.  Unfortunately, the KL25Z
00575 // hardware is limited to 10 channels of PWM control for its GPIO
00576 // outputs, so it's impossible to implement the LedWiz's full set
00577 // of 32 adjustable outputs using only GPIO ports.  However, you can
00578 // create 10 adjustable ports and fill out the rest with "digital"
00579 // GPIO pins, which are simple on/off switches.  The intensity level
00580 // of a digital port can't be adjusted - it's either fully on or
00581 // fully off - but this is fine for devices that don't have
00582 // different intensity settings anyway, such as replay knockers
00583 // and flipper solenoids.
00584 //
00585 // In the mapping list below, you can decide how to dole out the
00586 // PWM-capable and digital-only GPIO pins.  To make it easier to
00587 // remember which is which, the default mapping below groups all
00588 // of the PWM-capable ports together in the first 10 logical LedWiz
00589 // port numbers.  Unfortunately, these ports aren't *physically*
00590 // together on the KL25Z pin headers, so this layout may be simple
00591 // in terms of the LedWiz numbering, but it's a little jumbled
00592 // in the physical layout.t
00593 //
00594 // "NC" in the pin name slot means "not connected".  This means
00595 // that there's no physical output for this LedWiz port number.
00596 // The device will still accept commands that control the port,
00597 // but these will just be silently ignored, since there's no pin
00598 // to turn on or off for these ports.  The reason we leave some 
00599 // ports unconnected is that we don't have enough physical GPIO 
00600 // pins to fill out the full LedWiz complement of 32 ports.  Many 
00601 // pins are already taken for other purposes, such as button 
00602 // inputs or the plunger CCD interface.
00603 //
00604 // The mapping between physical output pins on the KL25Z and the
00605 // assigned LED-Wiz port numbers is essentially arbitrary.  You can
00606 // customize this by changing the entries in the array below if you
00607 // wish to rearrange the pins for any reason.  Be aware that some
00608 // of the physical outputs are already used for other purposes
00609 // (e.g., some of the GPIO pins on header J10 are used for the
00610 // CCD sensor - but you can of course reassign those as well by
00611 // changing the corresponding declarations elsewhere in this file).
00612 // The assignments we make here have two main objectives: first,
00613 // to group the outputs on headers J1 and J2 (to facilitate neater
00614 // wiring by keeping the output pins together physically), and
00615 // second, to make the physical pin layout match the LED-Wiz port
00616 // numbering order to the extent possible.  There's one big wrench
00617 // in the works, though, which is the limited number and discontiguous
00618 // placement of the KL25Z PWM-capable output pins.  This prevents
00619 // us from doing the most obvious sequential ordering of the pins,
00620 // so we end up with the outputs arranged into several blocks.
00621 // Hopefully this isn't too confusing; for more detailed rationale,
00622 // read on...
00623 // 
00624 // With the LED-Wiz, the host software configuration usually 
00625 // assumes that each RGB LED is hooked up to three consecutive ports
00626 // (for the red, green, and blue components, which need to be 
00627 // physically wired to separate outputs to allow each color to be 
00628 // controlled independently).  To facilitate this, we arrange the 
00629 // PWM-enabled outputs so that they're grouped together in the 
00630 // port numbering scheme.  Unfortunately, these outputs aren't
00631 // together in a single group in the physical pin layout, so to
00632 // group them logically in the LED-Wiz port numbering scheme, we
00633 // have to break up the overall numbering scheme into several blocks.
00634 // So our port numbering goes sequentially down each column of
00635 // header pins, but there are several break points where we have
00636 // to interrupt the obvious sequence to keep the PWM pins grouped
00637 // logically.
00638 //
00639 // In the list below, "pin J1-2" refers to pin 2 on header J1 on
00640 // the KL25Z, using the standard pin numbering in the KL25Z 
00641 // documentation - this is the physical pin that the port controls.
00642 // "LW port 1" means LED-Wiz port 1 - this is the LED-Wiz port
00643 // number that you use on the PC side (in the DirectOutput config
00644 // file, for example) to address the port.  PWM-capable ports are
00645 // marked as such - we group the PWM-capable ports into the first
00646 // 10 LED-Wiz port numbers.
00647 //
00648 // If you wish to reallocate a pin in the array below to some other
00649 // use, such as a button input port, simply change the pin name in
00650 // the entry to NC (for Not Connected).  This will disable the given
00651 // logical LedWiz port number and free up the physical pin.
00652 //
00653 // If you wish to reallocate a pin currently assigned to the button
00654 // input array, simply change the entry for the pin in the buttonMap[]
00655 // array above to NC (for "not connected"), and plug the pin name into
00656 // a slot of your choice in the array below.
00657 //
00658 // Note: Don't assign PTD1 (pin J2-12) as an LedWiz output.  That pin
00659 // is hard-wired on the KL25Z to the on-board indicator LED's blue segment,  
00660 // which pretty precludes other uses of the pin.
00661 //
00662 // ACTIVE-LOW PORTS:  By default, when a logical port is turned on in
00663 // the software, we set the physical GPIO voltage to "high" (3.3V), and
00664 // set it "low" (0V) when the logical port is off.  This is the right
00665 // scheme for the booster circuit described in the build guide.  Some
00666 // third-party booster circuits want the opposite voltage scheme, where
00667 // logical "on" is represented by 0V on the port and logical "off" is
00668 // represented by 3.3V.  If you're using an "active low" booster like
00669 // that, set the PORT_ACTIVE_LOW flag in the array below for each 
00670 // affected port.
00671 //
00672 // TLC5940 PORTS:  To assign an LedWiz output port number to a particular
00673 // output on a TLC5940, set the port type to TLC_PORT and set the 'pin'
00674 // value to the index of the output port in the daisy chain.  The first
00675 // chip in the daisy chain has ports 1-16, the second has ports 17-32, 
00676 // and so on.
00677 //
00678 // 74HC595 PORTS:  To assign an LedWiz output port to a 74HC595 port,
00679 // set the port type to HC595_PORT and set 'pin' to the index of the port
00680 // in the daisy chain.  The first chip has ports 1-8, the second has 
00681 // 9-16, etc.
00682 //
00683 
00684 // ledWizPortMap 'typ' values
00685 enum LWPortType {
00686     NO_PORT    = -1,  // Not connected
00687     DIG_GPIO   = 0,   // DigitalOut I/O pin (not PWM capable)
00688     PWM_GPIO   = 1,   // AnalogOut I/O pin (PWM capable)
00689     TLC_PORT   = 2,   // TLC5940 output port
00690     HC595_PORT = 3    // 74HC595 output port
00691 };
00692 
00693 // flags - combine with '|'
00694 const int PORT_ACTIVE_LOW = 0x0001;  // use LOW voltage (0V) when port is ON
00695 
00696 struct {
00697     int pin;            // Pin name/index - PinName for GPIO, pin index for TLC5940 or 74HC595
00698     LWPortType typ;     // type of pin
00699     int flags;          // flags - a combination of PORT_xxx flag bits (see above)
00700 } ledWizPortMap[] = {
00701     
00702 #if TLC5940_NCHIPS == 0
00703 
00704     // *** BASIC MODE - GPIO OUTPUTS ONLY ***
00705     // This is the basic mapping, using entirely GPIO pins, for when you're 
00706     // not using external TLC5940 chips.  We provide 22 physical outputs, 10 
00707     // of which are PWM capable.
00708     //
00709     // Important!  Note that the "isPWM" setting isn't just something we get to
00710     // choose.  It's a feature of the KL25Z hardware.  Some pins are PWM capable 
00711     // and some aren't, and there's nothing we can do about that in the software.
00712     // Refer to the KL25Z manual or schematics for the possible connections.  Note 
00713     // that there are other PWM-capable pins besides the 10 shown below, BUT they 
00714     // all share TPM channels with the pins below.  For example, TPM 2.0 can be 
00715     // connected to PTA1, PTB2, PTB18, PTE22 - but only one at a time.  So if you 
00716     // want to use PTB2 as a PWM out, it means you CAN'T use PTA1 as a PWM out.
00717     // We commented each PWM pin with its hardware channel number to help you keep
00718     // track of available channels if you do need to rearrange any of these pins.
00719 
00720     { PTA1,  PWM_GPIO },      // pin J1-2,  LW port 1  (PWM capable - TPM 2.0 = channel 9)
00721     { PTA2,  PWM_GPIO },      // pin J1-4,  LW port 2  (PWM capable - TPM 2.1 = channel 10)
00722     { PTD4,  PWM_GPIO },      // pin J1-6,  LW port 3  (PWM capable - TPM 0.4 = channel 5)
00723     { PTA12, PWM_GPIO },      // pin J1-8,  LW port 4  (PWM capable - TPM 1.0 = channel 7)
00724     { PTA4,  PWM_GPIO },      // pin J1-10, LW port 5  (PWM capable - TPM 0.1 = channel 2)
00725     { PTA5,  PWM_GPIO },      // pin J1-12, LW port 6  (PWM capable - TPM 0.2 = channel 3)
00726     { PTA13, PWM_GPIO },      // pin J2-2,  LW port 7  (PWM capable - TPM 1.1 = channel 13)
00727     { PTD5,  PWM_GPIO },      // pin J2-4,  LW port 8  (PWM capable - TPM 0.5 = channel 6)
00728     { PTD0,  PWM_GPIO },      // pin J2-6,  LW port 9  (PWM capable - TPM 0.0 = channel 1)
00729     { PTD3,  PWM_GPIO },      // pin J2-10, LW port 10 (PWM capable - TPM 0.3 = channel 4)
00730     { PTD2,  DIG_GPIO },      // pin J2-8,  LW port 11
00731     { PTC8,  DIG_GPIO },      // pin J1-14, LW port 12
00732     { PTC9,  DIG_GPIO },      // pin J1-16, LW port 13
00733     { PTC7,  DIG_GPIO },      // pin J1-1,  LW port 14
00734     { PTC0,  DIG_GPIO },      // pin J1-3,  LW port 15
00735     { PTC3,  DIG_GPIO },      // pin J1-5,  LW port 16
00736     { PTC4,  DIG_GPIO },      // pin J1-7,  LW port 17
00737     { PTC5,  DIG_GPIO },      // pin J1-9,  LW port 18
00738     { PTC6,  DIG_GPIO },      // pin J1-11, LW port 19
00739     { PTC10, DIG_GPIO },      // pin J1-13, LW port 20
00740     { PTC11, DIG_GPIO },      // pin J1-15, LW port 21
00741     { PTE0,  DIG_GPIO },      // pin J2-18, LW port 22
00742     { NC,    NO_PORT  },      // Not connected,  LW port 23
00743     { NC,    NO_PORT  },      // Not connected,  LW port 24
00744     { NC,    NO_PORT  },      // Not connected,  LW port 25
00745     { NC,    NO_PORT  },      // Not connected,  LW port 26
00746     { NC,    NO_PORT  },      // Not connected,  LW port 27
00747     { NC,    NO_PORT  },      // Not connected,  LW port 28
00748     { NC,    NO_PORT  },      // Not connected,  LW port 29
00749     { NC,    NO_PORT  },      // Not connected,  LW port 30
00750     { NC,    NO_PORT  },      // Not connected,  LW port 31
00751     { NC,    NO_PORT  }       // Not connected,  LW port 32
00752 
00753 #elif defined(EXPANSION_BOARD)
00754 
00755     // *** EXPANSION BOARD MODE ***
00756     // 
00757     // This mapping is for the expansion board, which uses four TLC5940
00758     // chips to provide 64  outputs.  The expansion board also uses
00759     // one GPIO pin to provide a digital (non-PWM) output dedicated to
00760     // the knocker circuit.  That's on a digital pin because it's used
00761     // to trigger an external timer circuit that limits the amount of
00762     // time that the knocker coil can be continuously energized, to protect
00763     // it against software faults on the PC that leave the port stuck on.
00764     // (The knocker coil is unique among standard virtual cabinet output
00765     // devices in this respect - it's the only device in common use that
00766     // can be damaged if left on for too long.  Other devices won't be
00767     // damaged, so they don't require such elaborate precautions.)
00768     //
00769     // The specific device assignments in the last column are just 
00770     // recommendations.  You can assign any port to any device with 
00771     // compatible power needs.  The "General Purpose" ports are good to
00772     // at least 5A, so you can use these for virtually anything; put
00773     // your heavy-duty devices, such as solenoids and motors, on these
00774     // outputs.  You can also put lighter loads like lamps and LEDs
00775     // on these if you have ports left over after connecting all of
00776     // your high-power devices.  The "Flasher" and "Button light" ports 
00777     // are good to about 1.5A, so they work for medium loads like lamps, 
00778     // flashers, high-power LEDs, etc.  The flipper and magnasave ports 
00779     // only provide 20mA; use these only for small LEDs.
00780     //
00781     // The TLC5940 outputs on the expansion board are hard-wired to
00782     // specific output drivers - that's what determines the power
00783     // limits described above.  You can rearrange the ports in the
00784     // list below to change the LedWiz port numbering to any order 
00785     // you prefer, but the association between a TLC5940 port number 
00786     // and the output circuit type can't be changed in the software.
00787     // That's a function of how the TLC5940 port is physically wired 
00788     // on the board.  Likewise, the PTC8 output is hard-wired to the 
00789     // knocker time limiter.
00790     //   TLC ports 1-20 and 44-47 = Darlington outputs, 1.5A max
00791     //   TLC ports 21-44 = MOSFET outputs (limit depends on MOSFET chosen)
00792     //   TLC ports 49-64 = direct outputs, limited to 20mA
00793 
00794     // The first 32 ports are LedWiz-compatible, so they're universally
00795     // accessible, even to older non-DOF software.  Attach the most common
00796     // devices to these ports.
00797     { 1, TLC_PORT },         // TLC port 1,  LW output 1  - Flasher 1 R
00798     { 2, TLC_PORT },         // TLC port 2,  LW output 2  - Flasher 1 G
00799     { 3, TLC_PORT },         // TLC port 3,  LW output 3  - Flasher 1 B
00800     { 4, TLC_PORT },         // TLC port 4,  LW output 4  - Flasher 2 R
00801     { 5, TLC_PORT },         // TLC port 5,  LW output 5  - Flasher 2 G
00802     { 6, TLC_PORT },         // TLC port 6,  LW output 6  - Flasher 2 B
00803     { 7, TLC_PORT },         // TLC port 7,  LW output 7  - Flasher 3 R
00804     { 8, TLC_PORT },         // TLC port 8,  LW output 8  - Flasher 3 G
00805     { 9, TLC_PORT },         // TLC port 9,  LW output 9  - Flasher 3 B
00806     { 10, TLC_PORT },        // TLC port 10, LW output 10 - Flasher 4 R
00807     { 11, TLC_PORT },        // TLC port 11, LW output 11 - Flasher 4 G
00808     { 12, TLC_PORT },        // TLC port 12, LW output 12 - Flasher 4 B
00809     { 13, TLC_PORT },        // TLC port 13, LW output 13 - Flasher 5 R
00810     { 14, TLC_PORT },        // TLC port 14, LW output 14 - Flasher 5 G
00811     { 15, TLC_PORT },        // TLC port 15, LW output 15 - Flasher 5 B
00812     { 16, TLC_PORT },        // TLC port 16, LW output 16 - Strobe/Button light
00813     { 17, TLC_PORT },        // TLC port 17, LW output 17 - Button light 1
00814     { 18, TLC_PORT },        // TLC port 18, LW output 18 - Button light 2
00815     { 19, TLC_PORT },        // TLC port 19, LW output 19 - Button light 3
00816     { 20, TLC_PORT },        // TLC port 20, LW output 20 - Button light 4
00817     { PTC8, DIG_GPIO },      // PTC8,        LW output 21 - Replay Knocker
00818     { 21, TLC_PORT },        // TLC port 21, LW output 22 - Contactor 1/General purpose
00819     { 22, TLC_PORT },        // TLC port 22, LW output 23 - Contactor 2/General purpose
00820     { 23, TLC_PORT },        // TLC port 23, LW output 24 - Contactor 3/General purpose
00821     { 24, TLC_PORT },        // TLC port 24, LW output 25 - Contactor 4/General purpose
00822     { 25, TLC_PORT },        // TLC port 25, LW output 26 - Contactor 5/General purpose
00823     { 26, TLC_PORT },        // TLC port 26, LW output 27 - Contactor 6/General purpose
00824     { 27, TLC_PORT },        // TLC port 27, LW output 28 - Contactor 7/General purpose
00825     { 28, TLC_PORT },        // TLC port 28, LW output 29 - Contactor 8/General purpose
00826     { 29, TLC_PORT },        // TLC port 29, LW output 30 - Contactor 9/General purpose
00827     { 30, TLC_PORT },        // TLC port 30, LW output 31 - Contactor 10/General purpose
00828     { 31, TLC_PORT },        // TLC port 31, LW output 32 - Shaker Motor/General purpose
00829     
00830     // Ports 33+ are accessible only to DOF-based software.  Older LedWiz-only
00831     // software on the can't access these.  Attach less common devices to these ports.
00832     { 32, TLC_PORT },        // TLC port 32, LW output 33 - Gear Motor/General purpose
00833     { 33, TLC_PORT },        // TLC port 33, LW output 34 - Fan/General purpose
00834     { 34, TLC_PORT },        // TLC port 34, LW output 35 - Beacon/General purpose
00835     { 35, TLC_PORT },        // TLC port 35, LW output 36 - Undercab RGB R/General purpose
00836     { 36, TLC_PORT },        // TLC port 36, LW output 37 - Undercab RGB G/General purpose
00837     { 37, TLC_PORT },        // TLC port 37, LW output 38 - Undercab RGB B/General purpose
00838     { 38, TLC_PORT },        // TLC port 38, LW output 39 - Bell/General purpose
00839     { 39, TLC_PORT },        // TLC port 39, LW output 40 - Chime 1/General purpose
00840     { 40, TLC_PORT },        // TLC port 40, LW output 41 - Chime 2/General purpose
00841     { 41, TLC_PORT },        // TLC port 41, LW output 42 - Chime 3/General purpose
00842     { 42, TLC_PORT },        // TLC port 42, LW output 43 - General purpose
00843     { 43, TLC_PORT },        // TLC port 43, LW output 44 - General purpose
00844     { 44, TLC_PORT },        // TLC port 44, LW output 45 - Button light 5
00845     { 45, TLC_PORT },        // TLC port 45, LW output 46 - Button light 6
00846     { 46, TLC_PORT },        // TLC port 46, LW output 47 - Button light 7
00847     { 47, TLC_PORT },        // TLC port 47, LW output 48 - Button light 8
00848     { 49, TLC_PORT },        // TLC port 49, LW output 49 - Flipper button RGB left R
00849     { 50, TLC_PORT },        // TLC port 50, LW output 50 - Flipper button RGB left G
00850     { 51, TLC_PORT },        // TLC port 51, LW output 51 - Flipper button RGB left B
00851     { 52, TLC_PORT },        // TLC port 52, LW output 52 - Flipper button RGB right R
00852     { 53, TLC_PORT },        // TLC port 53, LW output 53 - Flipper button RGB right G
00853     { 54, TLC_PORT },        // TLC port 54, LW output 54 - Flipper button RGB right B
00854     { 55, TLC_PORT },        // TLC port 55, LW output 55 - MagnaSave button RGB left R
00855     { 56, TLC_PORT },        // TLC port 56, LW output 56 - MagnaSave button RGB left G
00856     { 57, TLC_PORT },        // TLC port 57, LW output 57 - MagnaSave button RGB left B
00857     { 58, TLC_PORT },        // TLC port 58, LW output 58 - MagnaSave button RGB right R
00858     { 59, TLC_PORT },        // TLC port 59, LW output 59 - MagnaSave button RGB right G
00859     { 60, TLC_PORT },        // TLC port 60, LW output 60 - MagnaSave button RGB right B
00860     { 61, TLC_PORT },        // TLC port 61, LW output 61 - Extra RGB LED R
00861     { 62, TLC_PORT },        // TLC port 62, LW output 62 - Extra RGB LED G
00862     { 63, TLC_PORT },        // TLC port 63, LW output 63 - Extra RGB LED B
00863     { 64, TLC_PORT }         // TLC port 64, LW output 64 - Extra single LED
00864     
00865 #else
00866 
00867     // *** TLC5940 + GPIO OUTPUTS, Without the expansion board ***
00868     //
00869     // This is the mapping for the ehnanced mode, with one or more TLC5940 
00870     // chips connected.  Each TLC5940 chip provides 16 PWM channels.  We
00871     // can supplement the TLC5940 outputs with GPIO pins to get even more 
00872     // physical outputs.  
00873     //
00874     // Because we've already declared the number of TLC5940 chips earlier
00875     // in this file, we don't actually have to map out all of the TLC5940
00876     // ports here.  The software will automatically assign all of the 
00877     // TLC5940 ports that aren't explicitly mentioned here to the next
00878     // available LedWiz port numbers after the end of this array, assigning
00879     // them sequentially in TLC5940 port order.
00880     //
00881     // In contrast to the basic mode arrangement, we're putting all of the
00882     // NON PWM ports first in this mapping.  The logic is that all of the 
00883     // TLC5940 ports are PWM-capable, and they'll all at the end of the list
00884     // here, so by putting the PWM GPIO pins last here, we'll keep all of the
00885     // PWM ports grouped in the final mapping.
00886     //
00887     // Note that the TLC5940 control wiring takes away several GPIO pins
00888     // that we used as output ports in the basic mode.  Further, because the
00889     // TLC5940 makes ports so plentiful, we're intentionally omitting several 
00890     // more of the pins from the basic set, to make them available for other
00891     // uses.  To keep things more neatly grouped, we're only assigning J1 pins
00892     // in this set.  This leaves the following ports from the basic mode output
00893     // set available for other users: PTA13, PTD0, PTD2, PTD3, PTD5, PTE0.
00894     
00895     { PTC8,  DIG_GPIO },      // pin J1-14, LW port 1
00896     { PTC9,  DIG_GPIO },      // pin J1-16, LW port 2
00897     { PTC0,  DIG_GPIO },      // pin J1-3,  LW port 3
00898     { PTC3,  DIG_GPIO },      // pin J1-5,  LW port 4
00899     { PTC4,  DIG_GPIO },      // pin J1-7,  LW port 5
00900     { PTC11, DIG_GPIO },      // pin J1-15, LW port 6
00901     { PTA2,  PWM_GPIO },      // pin J1-4,  LW port 7   (PWM capable - TPM 2.1 = channel 10)
00902     { PTD4,  PWM_GPIO },      // pin J1-6,  LW port 8   (PWM capable - TPM 0.4 = channel 5)
00903     { PTA12, PWM_GPIO },      // pin J1-8,  LW port 9   (PWM capable - TPM 1.0 = channel 7)
00904     { PTA4,  PWM_GPIO },      // pin J1-10, LW port 10  (PWM capable - TPM 0.1 = channel 2)
00905     { PTA5,  PWM_GPIO }       // pin J1-12, LW port 11  (PWM capable - TPM 0.2 = channel 3)
00906 
00907     // TLC5940 ports start here!
00908     // First chip port 0 ->   LW port 12
00909     // First chip port 1 ->   LW port 13
00910     // ... etc, filling out all chip ports sequentially ...
00911 
00912 #endif // TLC5940_NCHIPS
00913 };
00914 
00915 
00916 #endif // DECL_EXTERNS