SFBPins.h

Go to the documentation of this file.
00001 /*                                       -*- mode:C++; fill-column: 100 -*-
00002   SFBPins.h Definitions of the programmer visible 'pins' in SFB
00003   Copyright (C) 2008 The Regents of the University of New Mexico.  All rights reserved.
00004 
00005   This library is free software; you can redistribute it and/or
00006   modify it under the terms of the GNU Lesser General Public
00007   License as published by the Free Software Foundation; either
00008   version 2.1 of the License, or (at your option) any later version.
00009 
00010   This library is distributed in the hope that it will be useful,
00011   but WITHOUT ANY WARRANTY; without even the implied warranty of
00012   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013   Lesser General Public License for more details.
00014 
00015   You should have received a copy of the GNU General Public License
00016   along with this library; if not, write to the Free Software
00017   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
00018   USA
00019 
00020   $Id$
00021 */
00029 #ifndef SFBPINS_H
00030 #define SFBPINS_H
00031 
00032 #include "SFBTypes.h"  /* for u8, etc */
00033 #include "SFBConstants.h"  /* for HIGH, LOW, etc */
00034 
00035 #define NOT_A_PIN 99
00036 #define NOT_A_PORT 99
00037 
00038 /* Face pin offsets */
00039 enum {
00040   FACE_D0_PIN = 0,              
00041   FACE_D1_PIN = 1,              
00042   FACE_D2_PIN = 2,              
00043   FACE_D3_PIN = 3,              
00044   FACE_RX_PIN = 4,              
00045   FACE_TX_PIN = 5,              
00046   FACE_VIN_ENABLE_PIN = 6,      
00047   FACE_VOUT_ENABLE_PIN = 7,     
00048   FACE_ISENSE_PIN = 8,          
00049   FACE_LED_PIN = 9,             
00050   FACE_SIDE_LED_PIN = 10,       
00051   FACE_PIN_COUNT = 11
00052 };
00053 
00054 /* Virtual pin definitions.  Indices into the tables below.  First set
00055  * of values are aliases, forming a kind Arduino compatibility layer.
00056  * In SFBPins.c they are aliased to the 'real' SFB pins appearing later
00057  * in the table.
00058  */
00059 enum {
00060   ARDUINO_RX = 0,               
00061   ARDUINO_TX = 1,               
00062   ARDUINO_DIGITAL_PIN2 = 2,     
00063   ARDUINO_DIGITAL_PIN3 = 3,     
00064   ARDUINO_DIGITAL_PIN4 = 4,     
00065   ARDUINO_DIGITAL_PIN5 = 5,     
00066   ARDUINO_DIGITAL_PIN6 = 6,     
00067   ARDUINO_DIGITAL_PIN7 = 7,     
00068   ARDUINO_DIGITAL_PIN8 = 8,     
00069   ARDUINO_DIGITAL_PIN9 = 9,     
00070   ARDUINO_DIGITAL_PIN10 = 10,   
00071   ARDUINO_DIGITAL_PIN11 = 11,   
00072   ARDUINO_DIGITAL_PIN12 = 12,   
00073   ARDUINO_DIGITAL_PIN13 = 13,   
00075   ARDUINO_ANALOG_PIN1 = 14,     
00076   ARDUINO_ANALOG_PIN2 = 15,     
00077   ARDUINO_ANALOG_PIN3 = 16,     
00078   ARDUINO_ANALOG_PIN4 = 17,     
00079   ARDUINO_ANALOG_PIN5 = 18,
00080   ARDUINO_ANALOG_PIN6 = 19,
00081 
00082   NORTH_BASE_PIN = 20,
00083   NORTH_D0_PIN = NORTH_BASE_PIN+FACE_D0_PIN, 
00084   NORTH_D1_PIN = NORTH_BASE_PIN+FACE_D1_PIN, 
00085   NORTH_D2_PIN = NORTH_BASE_PIN+FACE_D2_PIN, 
00086   NORTH_D3_PIN = NORTH_BASE_PIN+FACE_D3_PIN, 
00087   NORTH_RX_PIN = NORTH_BASE_PIN+FACE_RX_PIN, 
00088   NORTH_TX_PIN = NORTH_BASE_PIN+FACE_TX_PIN, 
00089   NORTH_VIN_ENABLE_PIN = NORTH_BASE_PIN+FACE_VIN_ENABLE_PIN, 
00090   NORTH_VOUT_ENABLE_PIN = NORTH_BASE_PIN+FACE_VOUT_ENABLE_PIN, 
00091   NORTH_ISENSE_PIN = NORTH_BASE_PIN+FACE_ISENSE_PIN, 
00092   NORTH_LED_PIN = NORTH_BASE_PIN+FACE_LED_PIN, 
00093   NORTH_SIDE_LED_PIN = NORTH_BASE_PIN+FACE_SIDE_LED_PIN, 
00095   SOUTH_BASE_PIN = 31,
00096   SOUTH_D0_PIN = SOUTH_BASE_PIN+FACE_D0_PIN, 
00097   SOUTH_D1_PIN = SOUTH_BASE_PIN+FACE_D1_PIN, 
00098   SOUTH_D2_PIN = SOUTH_BASE_PIN+FACE_D2_PIN, 
00099   SOUTH_D3_PIN = SOUTH_BASE_PIN+FACE_D3_PIN, 
00100   SOUTH_RX_PIN = SOUTH_BASE_PIN+FACE_RX_PIN, 
00101   SOUTH_TX_PIN = SOUTH_BASE_PIN+FACE_TX_PIN, 
00102   SOUTH_VIN_ENABLE_PIN = SOUTH_BASE_PIN+FACE_VIN_ENABLE_PIN, 
00103   SOUTH_VOUT_ENABLE_PIN = SOUTH_BASE_PIN+FACE_VOUT_ENABLE_PIN, 
00104   SOUTH_ISENSE_PIN = SOUTH_BASE_PIN+FACE_ISENSE_PIN, 
00105   SOUTH_LED_PIN = SOUTH_BASE_PIN+FACE_LED_PIN, 
00106   SOUTH_SIDE_LED_PIN = SOUTH_BASE_PIN+FACE_SIDE_LED_PIN, 
00108   EAST_BASE_PIN = 42,
00109   EAST_D0_PIN = EAST_BASE_PIN+FACE_D0_PIN, 
00110   EAST_D1_PIN = EAST_BASE_PIN+FACE_D1_PIN, 
00111   EAST_D2_PIN = EAST_BASE_PIN+FACE_D2_PIN, 
00112   EAST_D3_PIN = EAST_BASE_PIN+FACE_D3_PIN, 
00113   EAST_RX_PIN = EAST_BASE_PIN+FACE_RX_PIN, 
00114   EAST_TX_PIN = EAST_BASE_PIN+FACE_TX_PIN, 
00115   EAST_VIN_ENABLE_PIN = EAST_BASE_PIN+FACE_VIN_ENABLE_PIN, 
00116   EAST_VOUT_ENABLE_PIN = EAST_BASE_PIN+FACE_VOUT_ENABLE_PIN, 
00117   EAST_ISENSE_PIN = EAST_BASE_PIN+FACE_ISENSE_PIN, 
00118   EAST_LED_PIN = EAST_BASE_PIN+FACE_LED_PIN, 
00119   EAST_SIDE_LED_PIN = EAST_BASE_PIN+FACE_SIDE_LED_PIN, 
00121   WEST_BASE_PIN = 53,
00122   WEST_D0_PIN = WEST_BASE_PIN+FACE_D0_PIN, 
00123   WEST_D1_PIN = WEST_BASE_PIN+FACE_D1_PIN, 
00124   WEST_D2_PIN = WEST_BASE_PIN+FACE_D2_PIN, 
00125   WEST_D3_PIN = WEST_BASE_PIN+FACE_D3_PIN, 
00126   WEST_RX_PIN = WEST_BASE_PIN+FACE_RX_PIN, 
00127   WEST_TX_PIN = WEST_BASE_PIN+FACE_TX_PIN, 
00128   WEST_VIN_ENABLE_PIN = WEST_BASE_PIN+FACE_VIN_ENABLE_PIN, 
00129   WEST_VOUT_ENABLE_PIN = WEST_BASE_PIN+FACE_VOUT_ENABLE_PIN, 
00130   WEST_ISENSE_PIN = WEST_BASE_PIN+FACE_ISENSE_PIN, 
00131   WEST_LED_PIN = WEST_BASE_PIN+FACE_LED_PIN, 
00132   WEST_SIDE_LED_PIN = WEST_BASE_PIN+FACE_SIDE_LED_PIN, 
00134   /* Non-face-specific pins */
00135   BODY_SWITCH0_PIN = 64,        
00136   BODY_RGB_RED_PIN = 65,        
00137   BODY_RGB_GREEN_PIN = 66,      
00138   BODY_RGB_BLUE_PIN = 67,       
00140   BODY_EEPROM_SSEL1_PIN = 68,   
00141   BODY_EEPROM_SCK1_PIN = 69,    
00142   BODY_EEPROM_MISO1_PIN = 70,   
00143   BODY_EEPROM_MOSI1_PIN = 71,   
00145   BODY_AMUX_READ_PIN = 72,      
00146   BODY_AMUX_SELA_PIN = 73,      
00147   BODY_AMUX_SELB_PIN = 74,      
00148   BODY_AMUX_SELC_PIN = 75,      
00150   VIRTUAL_PIN_COUNT = 76,
00151 
00152   /* Alternate names and structures on the pin numbers */
00153   ALIAS_COUNT=20,
00154   FIRST_SFB_PIN=20
00155 };
00156 
00162 struct PinInfo_s  {
00163   u8 portNumber;  
00164   u8 bitNumber;   
00165   u8 aliasMode;   
00166   u8 flags;       
00167 } __attribute__ ((aligned (4)));
00168 
00175 #define SFB_GET_PIN_PORT_AND_MASK(sfbPin,infoVar,portVar,maskVar) \
00176  do {                                                           \
00177    (infoVar) = pinInfoMap[sfbPin];                              \
00178    if ((infoVar).aliasMode >= ALIAS_COUNT) {                    \
00179      (sfbPin) = (infoVar).aliasMode;                            \
00180      (infoVar) = pinInfoMap[sfbPin];                            \
00181    }                                                            \
00182    (portVar) = (infoVar).portNumber;                            \
00183    (maskVar) = 1UL<<(infoVar).bitNumber;                        \
00184  } while (0)
00185 
00192 #define SFB_UNALIAS_PIN(sfbPin) \
00193   ((pinInfoMap[sfbPin].aliasMode >= ALIAS_COUNT)?pinInfoMap[sfbPin].aliasMode:(sfbPin))
00194 
00204 #define SFB_GET_UNALIASED_PIN_PORT_AND_MASK(sfbPin,portVar,maskVar) \
00205   do {                                                              \
00206    (portVar) = pinInfoMap[sfbPin].portNumber;                       \
00207    (maskVar) = 1UL<<pinInfoMap[sfbPin].bitNumber;                   \
00208   } while (0)
00209 
00210 typedef const struct PinInfo_s PinInfo_t;  /* We're putting the pin info into flash, so, const.. */
00211                   
00212 extern PinInfo_t pinInfoMap[VIRTUAL_PIN_COUNT];  /* Read-only */
00213 
00214 enum { PIN_SKETCH_MAP_WORDS = (VIRTUAL_PIN_COUNT+31)/32 };
00215 
00216 #define GET_SKETCH_FLAG(sfbPin) \
00217   ((pinSketchMap[(sfbPin)>>5]>>((sfbPin)&31))&1)
00218 #define SET_SKETCH_FLAG(sfbPin) \
00219   (pinSketchMap[(sfbPin)>>5] |= 1<<((sfbPin)&31))
00220 #define CLR_SKETCH_FLAG(sfbPin) \
00221   (pinSketchMap[(sfbPin)>>5] &= ~(1<<((sfbPin)&31)))
00222 
00223 extern u32 pinSketchMap[PIN_SKETCH_MAP_WORDS];   /* Bit mask of which pins the sketch is controlling */
00224       
00250 extern int pinInFace(int facePin, int face);
00251 
00304 extern bool isFacePin(int pin, u8 * face = 0, u8 * facePin = 0);
00305 
00306 extern void reflexDigitalWrite(int sfbPin, int value);
00307 extern void implDigitalWrite(int sfbPin, int value);
00308 
00309 static inline void reflexLedOn(int sfbPin) { reflexDigitalWrite(sfbPin,LOW); }
00310 static inline void reflexLedOff(int sfbPin) { reflexDigitalWrite(sfbPin,HIGH); }
00311 static inline void reflexLedSet(int sfbPin,int on) { reflexDigitalWrite(sfbPin,on?LOW:HIGH); }
00312 
00313 extern int reflexDigitalRead(int sfbPin);
00314 extern int implDigitalRead(int sfbPin);
00315 
00316 extern void reflexPinMode(int sfbPin, int mode);
00317 extern void implPinMode(int sfbPin, int mode);
00318 
00319 extern void pins_startup_initialization();
00320 
00328 extern void setPinResistor(int sfbPin, int pullupDownCode);
00329 
00330 #define PULLUP_ONLY 0           
00331 #define NEITHER_PULLUP_NOR_PULLDOWN 2 
00332 #define PULLDOWN_ONLY 3         
00334 extern void reflexSetPinResistor(int sfbPin, int pullupDownCode);
00335 extern void implSetPinResistor(int sfbPin, int pullupDownCode);
00336 
00337 #include "SFBHWPins.h"
00338 
00339 #endif  /* SFBPINS_H */

Generated on Fri Apr 22 06:54:12 2011 for SFB by doxygen 1.5.9