Get accesss to GPIO Registers from serial port

Dependencies:   mbed

Committer:
jm
Date:
Sat Feb 12 16:36:31 2011 +0000
Revision:
0:35df659aaddf
General IO Command Line Interface

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jm 0:35df659aaddf 1 /*************************************************************************
jm 0:35df659aaddf 2 * @file jmLPC17xx_gpio.c
jm 0:35df659aaddf 3 * @brief Command Line Interface Module for LPC_GPIO
jm 0:35df659aaddf 4 *
jm 0:35df659aaddf 5 * @version 1.1
jm 0:35df659aaddf 6 * @date Jan 24, 2011
jm 0:35df659aaddf 7 */
jm 0:35df659aaddf 8
jm 0:35df659aaddf 9 #include "jmLPC17xx_gpio.h"
jm 0:35df659aaddf 10 #include "LPC17xx.h"
jm 0:35df659aaddf 11 #include "main.h"
jm 0:35df659aaddf 12 #include "jmCommands.h"
jm 0:35df659aaddf 13 #include "jmMessages.h"
jm 0:35df659aaddf 14 #include "jmRingBuffer.h"
jm 0:35df659aaddf 15 #include "stdio.h"
jm 0:35df659aaddf 16
jm 0:35df659aaddf 17
jm 0:35df659aaddf 18 #define DIR 0
jm 0:35df659aaddf 19 #define PIN 1
jm 0:35df659aaddf 20 #define MASK 2
jm 0:35df659aaddf 21 #define CLR 3
jm 0:35df659aaddf 22 #define SET 4
jm 0:35df659aaddf 23
jm 0:35df659aaddf 24 #define Clear 0
jm 0:35df659aaddf 25 #define Set 1
jm 0:35df659aaddf 26 #define Toggle 2
jm 0:35df659aaddf 27
jm 0:35df659aaddf 28 /***********************************************************************
jm 0:35df659aaddf 29 * @brief Send port registers content
jm 0:35df659aaddf 30 * @param[in] portNum (Port Number value)0..4
jm 0:35df659aaddf 31 * @return none
jm 0:35df659aaddf 32 **********************************************************************/
jm 0:35df659aaddf 33 void PortInfo(unsigned int portNum){
jm 0:35df659aaddf 34 if(portNum <5){
jm 0:35df659aaddf 35 printf("Port %1d\n",portNum);
jm 0:35df659aaddf 36 printf("FIODIR \t0x%08X\n",jmGPIO[portNum]->FIODIR);
jm 0:35df659aaddf 37 printf("FIOMASK \t0x%08X\n",jmGPIO[portNum]->FIOMASK);
jm 0:35df659aaddf 38 printf("FIOPIN \t0x%08X\n",jmGPIO[portNum]->FIOPIN);
jm 0:35df659aaddf 39 printf("FIOSET \t0x%08X\n",jmGPIO[portNum]->FIOSET);
jm 0:35df659aaddf 40 printf("FIOCLR \t0x%08X\n",jmGPIO[portNum]->FIOCLR);
jm 0:35df659aaddf 41 printf("\n");
jm 0:35df659aaddf 42 }
jm 0:35df659aaddf 43 }
jm 0:35df659aaddf 44
jm 0:35df659aaddf 45 /***********************************************************************
jm 0:35df659aaddf 46 * @brief Send all ports registers content
jm 0:35df659aaddf 47 * @param[in] none
jm 0:35df659aaddf 48 * @return none
jm 0:35df659aaddf 49 **********************************************************************/
jm 0:35df659aaddf 50 void PortsInfo(void){
jm 0:35df659aaddf 51 unsigned int portNum;
jm 0:35df659aaddf 52 for(portNum=0;portNum<5;portNum++) PortInfo(portNum);
jm 0:35df659aaddf 53 }
jm 0:35df659aaddf 54
jm 0:35df659aaddf 55 /***********************************************************************
jm 0:35df659aaddf 56 * @brief iport Command Line Interface.
jm 0:35df659aaddf 57 * Send port register content
jm 0:35df659aaddf 58 * Command Line Format: iport (portNumber)0..4
jm 0:35df659aaddf 59 * @example iport 1 Will printout Port1 registers content
jm 0:35df659aaddf 60 * @param[in] Extracted from command line ring buffer (PortNumber)0..4
jm 0:35df659aaddf 61 * @return none
jm 0:35df659aaddf 62 **********************************************************************/
jm 0:35df659aaddf 63 void cli_PortInfo(void){
jm 0:35df659aaddf 64 unsigned int portNum;
jm 0:35df659aaddf 65
jm 0:35df659aaddf 66 if(ExtractUInteger(pLine,&portNum,0,4))
jm 0:35df659aaddf 67 PortInfo(portNum);
jm 0:35df659aaddf 68 else{
jm 0:35df659aaddf 69 if(Help)printf("iport (portNumber)0..4\n");
jm 0:35df659aaddf 70 // Ignore pending command line
jm 0:35df659aaddf 71 NextCommand(nl,pLine);
jm 0:35df659aaddf 72 }
jm 0:35df659aaddf 73 }
jm 0:35df659aaddf 74
jm 0:35df659aaddf 75
jm 0:35df659aaddf 76 /***********************************************************************
jm 0:35df659aaddf 77 * @brief Command line interface to read and send Port.Bit per bit position
jm 0:35df659aaddf 78 * Command Line Format: bitRead (Port Number)0..4 (Bit position)0..31
jm 0:35df659aaddf 79 * ex: bitRead 1 18 read and send P1.18 input pin value
jm 0:35df659aaddf 80 * pin must be previously set to input in GPIODIR and associated GPIOMASK bit= 0
jm 0:35df659aaddf 81 * @param[in] Extracted from command line (Port Number)0..4 (Bit position)0..31
jm 0:35df659aaddf 82 * @return none
jm 0:35df659aaddf 83 **********************************************************************/
jm 0:35df659aaddf 84 void cli_BitRead(void){
jm 0:35df659aaddf 85 unsigned int portNumber, bitPosition, bitValue;
jm 0:35df659aaddf 86 // Extract pin number from Command Line
jm 0:35df659aaddf 87 if(ExtractUInteger(pLine,&portNumber,0,4)){
jm 0:35df659aaddf 88 // Extract bit position from Command Line
jm 0:35df659aaddf 89 if(ExtractUInteger(pLine,&bitPosition,0,31)){
jm 0:35df659aaddf 90 // Extract state from Command Line
jm 0:35df659aaddf 91 bitValue = 1<<bitPosition;
jm 0:35df659aaddf 92 if(jmGPIO[portNumber]->FIOPIN & bitValue)bitValue =1;
jm 0:35df659aaddf 93 printf("P%d.%d %d\n",portNumber,bitPosition,bitValue);
jm 0:35df659aaddf 94 return;
jm 0:35df659aaddf 95 }
jm 0:35df659aaddf 96 }
jm 0:35df659aaddf 97 if(Help)printf("bitRead (Port Number)0..4 (Bit position)0..31\n");
jm 0:35df659aaddf 98 // Ignore pending command line
jm 0:35df659aaddf 99 NextCommand(nl,pLine);
jm 0:35df659aaddf 100 }
jm 0:35df659aaddf 101
jm 0:35df659aaddf 102 /** Read GPIO Registers
jm 0:35df659aaddf 103 * @brief Command Line Interface to Read and Send GPIO register value
jm 0:35df659aaddf 104 * @param[in] Extracted from command line GPPG0 (Port)0..4 (Register DIR/PIN/MASK)0..2
jm 0:35df659aaddf 105 * @returns Message: GPPG0 (Port)0..4 (Register DIR/PIN/MASK)0..2 (value)0..0xFFFFFFFF
jm 0:35df659aaddf 106 */
jm 0:35df659aaddf 107 void cli_GPPG0(void){
jm 0:35df659aaddf 108 uint32_t value=0;
jm 0:35df659aaddf 109 unsigned int port, reg;
jm 0:35df659aaddf 110 if(ExtractUInteger(pLine,&port,0,4)){ // extract port id
jm 0:35df659aaddf 111 if(ExtractUInteger(pLine,&reg,0,4)){ // extract register id
jm 0:35df659aaddf 112 switch(reg){
jm 0:35df659aaddf 113 case DIR: value = jmGPIO[port]->FIODIR; break;
jm 0:35df659aaddf 114 case PIN: value = jmGPIO[port]->FIOPIN; break;
jm 0:35df659aaddf 115 case MASK: value = jmGPIO[port]->FIOMASK; break;
jm 0:35df659aaddf 116 case CLR: value = jmGPIO[port]->FIOCLR; break;
jm 0:35df659aaddf 117 case SET: value = jmGPIO[port]->FIOSET; break;
jm 0:35df659aaddf 118 }
jm 0:35df659aaddf 119 printf("GPPG0 %d %d 0x%08X\n",port,reg,value);
jm 0:35df659aaddf 120 return;
jm 0:35df659aaddf 121 }
jm 0:35df659aaddf 122 }
jm 0:35df659aaddf 123 if(Help)printf("GPPG0 (Port)0..4 (Register DIR/PIN/MASK/CLR/SET)0..4\n");
jm 0:35df659aaddf 124 // Ignore pending command line
jm 0:35df659aaddf 125 NextCommand(nl,pLine);
jm 0:35df659aaddf 126 }
jm 0:35df659aaddf 127
jm 0:35df659aaddf 128 /***********************************************************************
jm 0:35df659aaddf 129 * @brief Command line interface to access GPIO register bits
jm 0:35df659aaddf 130 * Use with care. Designed to be used with gui which locks non MBED DIP pins
jm 0:35df659aaddf 131 * Command Line Format: gpioBits (Port id)0..4 (Register DIR/PIN/MASK/CLR/SET)0..4 (value)0..0xFFFFFFFF (clear/set/toggle)0..2\n
jm 0:35df659aaddf 132 * @param[in] Extracted from command line (Port)0..4 (Register DIR/PIN/MASK)0..2 (value)0..0xFFFFFFFF
jm 0:35df659aaddf 133 * @return Message: GPPG0 (Port)0..4 (Register DIR/PIN/MASK)0..2 (value)0..0xFFFFFFFF
jm 0:35df659aaddf 134 **********************************************************************/
jm 0:35df659aaddf 135 void cli_gpioBits(void){
jm 0:35df659aaddf 136 unsigned int port, reg, value, action;
jm 0:35df659aaddf 137 // Extract port id from Command Line
jm 0:35df659aaddf 138 if(ExtractUInteger(pLine,&port,0,4)){
jm 0:35df659aaddf 139 // Extract register id from Command Line
jm 0:35df659aaddf 140 if(ExtractUInteger(pLine,&reg,0,4)){
jm 0:35df659aaddf 141 // Extract value from Command Line
jm 0:35df659aaddf 142 if(ExtractUInteger(pLine,&value,0,0xFFFFFFFF)){
jm 0:35df659aaddf 143 // Extract state from Command Line
jm 0:35df659aaddf 144 if(ExtractUInteger(pLine,&action,0,2)){
jm 0:35df659aaddf 145 switch(reg){
jm 0:35df659aaddf 146 case DIR:
jm 0:35df659aaddf 147 switch(action){
jm 0:35df659aaddf 148 case Clear: jmGPIO[port]->FIODIR &= ~value;
jm 0:35df659aaddf 149 break;
jm 0:35df659aaddf 150 case Set: jmGPIO[port]->FIODIR |= value;
jm 0:35df659aaddf 151 break;
jm 0:35df659aaddf 152 case Toggle: jmGPIO[port]->FIODIR ^= value;
jm 0:35df659aaddf 153 break;
jm 0:35df659aaddf 154 }
jm 0:35df659aaddf 155 break;
jm 0:35df659aaddf 156 case PIN:
jm 0:35df659aaddf 157 switch(action){
jm 0:35df659aaddf 158 case Clear: jmGPIO[port]->FIOPIN &= ~value;
jm 0:35df659aaddf 159 break;
jm 0:35df659aaddf 160 case Set: jmGPIO[port]->FIOPIN |= value;
jm 0:35df659aaddf 161 break;
jm 0:35df659aaddf 162 case Toggle: jmGPIO[port]->FIOPIN ^= value;
jm 0:35df659aaddf 163 break;
jm 0:35df659aaddf 164 }
jm 0:35df659aaddf 165 break;
jm 0:35df659aaddf 166 case MASK:
jm 0:35df659aaddf 167 switch(action){
jm 0:35df659aaddf 168 case Clear: jmGPIO[port]->FIOMASK &= ~value;
jm 0:35df659aaddf 169 break;
jm 0:35df659aaddf 170 case Set: jmGPIO[port]->FIOMASK |= value;
jm 0:35df659aaddf 171 break;
jm 0:35df659aaddf 172 case Toggle: jmGPIO[port]->FIOMASK ^= value;
jm 0:35df659aaddf 173 break;
jm 0:35df659aaddf 174 }
jm 0:35df659aaddf 175 break;
jm 0:35df659aaddf 176 case CLR:
jm 0:35df659aaddf 177 switch(action){
jm 0:35df659aaddf 178 case Clear: jmGPIO[port]->FIOCLR &= ~value;
jm 0:35df659aaddf 179 break;
jm 0:35df659aaddf 180 case Set: jmGPIO[port]->FIOCLR |= value;
jm 0:35df659aaddf 181 break;
jm 0:35df659aaddf 182 case Toggle: jmGPIO[port]->FIOCLR ^= value;
jm 0:35df659aaddf 183 break;
jm 0:35df659aaddf 184 }
jm 0:35df659aaddf 185 break;
jm 0:35df659aaddf 186 case SET:
jm 0:35df659aaddf 187 switch(action){
jm 0:35df659aaddf 188 case Clear: jmGPIO[port]->FIOSET &= ~value;
jm 0:35df659aaddf 189 break;
jm 0:35df659aaddf 190 case Set: jmGPIO[port]->FIOSET |= value;
jm 0:35df659aaddf 191 break;
jm 0:35df659aaddf 192 case Toggle: jmGPIO[port]->FIOSET ^= value;
jm 0:35df659aaddf 193 break;
jm 0:35df659aaddf 194 }
jm 0:35df659aaddf 195 break;
jm 0:35df659aaddf 196
jm 0:35df659aaddf 197 }
jm 0:35df659aaddf 198 // gui feedback
jm 0:35df659aaddf 199 switch(reg)
jm 0:35df659aaddf 200 {
jm 0:35df659aaddf 201 case DIR: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIODIR);
jm 0:35df659aaddf 202 break;
jm 0:35df659aaddf 203 case PIN: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIOPIN);
jm 0:35df659aaddf 204 break;
jm 0:35df659aaddf 205 case MASK: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIOMASK);
jm 0:35df659aaddf 206 break;
jm 0:35df659aaddf 207 case CLR: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIOCLR);
jm 0:35df659aaddf 208 break;
jm 0:35df659aaddf 209 case SET: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIOSET);
jm 0:35df659aaddf 210 break;
jm 0:35df659aaddf 211 }
jm 0:35df659aaddf 212 if(Feedback)printf("GPIO %d %d 0x%08X %d\n",port,reg,value,action);
jm 0:35df659aaddf 213 return;
jm 0:35df659aaddf 214 }
jm 0:35df659aaddf 215 }
jm 0:35df659aaddf 216 }
jm 0:35df659aaddf 217 }
jm 0:35df659aaddf 218 if(Help)printf("gpioBits (Port id)0..4 (Register DIR/PIN/MASK/CLR/SET)0..4 (value)0..0xFFFFFFFF (clear/set/toggle)0..2\n");
jm 0:35df659aaddf 219 // Ignore pending command line
jm 0:35df659aaddf 220 NextCommand(nl,pLine);
jm 0:35df659aaddf 221 }
jm 0:35df659aaddf 222
jm 0:35df659aaddf 223 /** @brief Reset/Set/Toggle an output pin
jm 0:35df659aaddf 224 * Also sets pin as outputs.
jm 0:35df659aaddf 225 * @param[in] pin pin id (value)0..432
jm 0:35df659aaddf 226 * @param[in] action 0..2 Clear/Set/Toggle
jm 0:35df659aaddf 227 * @returns Return Message: GPPB0 pin state
jm 0:35df659aaddf 228 */
jm 0:35df659aaddf 229 void gpio(unsigned int pin, unsigned int action){
jm 0:35df659aaddf 230 // Get port and bit for that pin
jm 0:35df659aaddf 231 uint32_t bitValue;
jm 0:35df659aaddf 232 uint8_t port;
jm 0:35df659aaddf 233
jm 0:35df659aaddf 234 // Get port, bit and bit value
jm 0:35df659aaddf 235 port = pin/100;
jm 0:35df659aaddf 236 bitValue = 1<<(pin%100);
jm 0:35df659aaddf 237
jm 0:35df659aaddf 238 // set mbed pin direction as output
jm 0:35df659aaddf 239 jmGPIO[port]->FIODIR |= bitValue;
jm 0:35df659aaddf 240 // make sure FIOMASK bit is enable
jm 0:35df659aaddf 241 jmGPIO[port]->FIOMASK &= ~bitValue;
jm 0:35df659aaddf 242
jm 0:35df659aaddf 243 switch(action)
jm 0:35df659aaddf 244 {
jm 0:35df659aaddf 245 case Clear: jmGPIO[port]->FIOPIN &= ~bitValue; // reset pin low
jm 0:35df659aaddf 246 break;
jm 0:35df659aaddf 247 case Set: jmGPIO[port]->FIOPIN |= bitValue; // set pin High
jm 0:35df659aaddf 248 break;
jm 0:35df659aaddf 249 case Toggle:jmGPIO[port]->FIOPIN ^= bitValue; // toggle pin
jm 0:35df659aaddf 250 break;
jm 0:35df659aaddf 251 }
jm 0:35df659aaddf 252 if( (jmGPIO[port]->FIOPIN & bitValue) == 0)bitValue = 0;
jm 0:35df659aaddf 253 else bitValue = 1;
jm 0:35df659aaddf 254
jm 0:35df659aaddf 255 // Report bit modification
jm 0:35df659aaddf 256 printf("GPPB0 %d %d\n",pin, bitValue);
jm 0:35df659aaddf 257 }
jm 0:35df659aaddf 258
jm 0:35df659aaddf 259 /** @brief Command line to Reset/Set/Toggle an output pin
jm 0:35df659aaddf 260 * Also sets pin as outputs. Not all pins are available
jm 0:35df659aaddf 261 * Use with care. Designed to be used with gui which locks non MBED DIP pins
jm 0:35df659aaddf 262 * Command Line Format: gpioBit (Pin id)0..432 (action clear/set/toggle)0..2
jm 0:35df659aaddf 263 * @param[in] From command line: (Pin id)0..432 (action clear/set/toggle)0..2
jm 0:35df659aaddf 264 * @returns Return Message: GPPB0 pin state
jm 0:35df659aaddf 265 */
jm 0:35df659aaddf 266 void cli_gpioBit(void){
jm 0:35df659aaddf 267 unsigned int pin, action;
jm 0:35df659aaddf 268 // Extract pin number from Command Line
jm 0:35df659aaddf 269 if(ExtractUInteger(pLine,&pin,0,432)){
jm 0:35df659aaddf 270 // Extract action from Command Line
jm 0:35df659aaddf 271 if(ExtractUInteger(pLine,&action,0,2)){
jm 0:35df659aaddf 272 gpio(pin,action);
jm 0:35df659aaddf 273 return;
jm 0:35df659aaddf 274 }
jm 0:35df659aaddf 275 }
jm 0:35df659aaddf 276 if(Help)printf("Use with care ! gpioBit (pin Number)0..432 (action Clear/Set/Toggle)0..2\n");
jm 0:35df659aaddf 277 // Ignore pending command line
jm 0:35df659aaddf 278 NextCommand(nl,pLine);
jm 0:35df659aaddf 279 }