Digital InOut
Digital_InOut.h
- Committer:
- kiran_mbed
- Date:
- 2014-06-12
- Revision:
- 0:b2ebb454185a
- Child:
- 1:b4bc3430a055
File content as of revision 0:b2ebb454185a:
/* Test Code #include "Digital_InOut.h" DigitalOut myled(LED2); int main() { Digital_InOut toggle(p2_5,output); Digital_InOut in(p0_9,input); in.mode(pull_down); Digital_InOut led2(p1_20,1,output); toggle=1; while(1) { if(in.read()){ toggle.input(); toggle.mode(pull_down); while(1){ if(toggle.read()) led2=1; else led2=0; } } else led2=0; } } */ #ifndef DIGITAL_IN_H #define DIGITAL_IN_H #include "mbed.h" #define _PINSEL_BASE 0x4002C000 #define _FIODIR_BASE 0x2009C000 #define _PINMODE_BASE 0x4002C040 #define _FIOPIN_BASE 0x2009C014 #define _FIOSET_BASE 0x2009C018 #define _FIOCLR_BASE 0x2009C01C #ifndef _PIN_ #define _PIN_ typedef struct { int port; int pin; }Pin; #endif /* Pin */ #ifndef _PIN_NAME_ #define _PIN_NAME_ // Note many pins are not available as fully functional GPIOs, they are ommitted below enum Pin_Name { p0_0 = 0, p0_1 = 1, p0_2 = 2, p0_3 = 3, p0_4 = 4, p0_5 = 5, p0_6 = 6, p0_7 = 7, p0_8 = 8, p0_9 = 9, p0_10 = 10, p0_11 = 11, /*p0_12 = 12, p0_13 = 13, p0_14 = 14,*/ p0_15 = 15, p0_16 = 16, p0_17 = 17, p0_18 = 18, p0_19 = 19, p0_20 = 20, p0_21 = 21, p0_22 = 22, p0_23 = 23, p0_24 = 24, p0_25 = 25, p0_26 = 26, /* p0_27 = 27, p0_28 = 28, p0_29 = 29, p0_30 = 30,*/ p1_0 = 100, p1_1 = 101, /* p1_2 = 102, p1_3 = 103,*/ p1_4 = 104, /* p1_5 = 105, p1_6 = 106, p1_7 = 107,*/ p1_8 = 108, p1_9 = 109, p1_10 = 110, /* p1_11 = 111, p1_12 = 112, p1_13 = 113,*/ p1_14 = 114, p1_15 = 115, p1_16 = 116, p1_17 = 117, p1_18 = 118, p1_19 = 119, p1_20 = 120, p1_21 = 121, p1_22 = 122, p1_23 = 123, p1_24 = 124, p1_25 = 125, p1_26 = 126, p1_27 = 127, p1_28 = 128, p1_29 = 129, p1_30 = 130, p2_0 = 200, p2_1 = 201, p2_2 = 202, p2_3 = 203, p2_4 = 204, p2_5 = 205, p2_6 = 206, p2_7 = 207, p2_8 = 208, p2_9 = 209, p2_10 = 210, p2_11 = 211, p2_12 = 212, p2_13 = 213, /* p2_14 = 214, p2_15 = 215, p2_16 = 216, p2_17 = 217, p2_18 = 218, p2_19 = 219, p2_20 = 220, p2_21 = 221, p2_22 = 222, p2_23 = 223, p2_24 = 224, p2_25 = 225, p2_26 = 226, p2_27 = 227, p2_28 = 228, p2_29 = 229, p2_30 = 230,*/ /* p3_0 = 300, p3_1 = 301, p3_2 = 302, p3_3 = 303, p3_4 = 304, p3_5 = 305, p3_6 = 306, p3_7 = 307, p3_8 = 308, p3_9 = 309, p3_10 = 310, p3_11 = 311, p3_12 = 312, p3_13 = 313, p3_14 = 314, p3_15 = 315, p3_16 = 316, p3_17 = 317, p3_18 = 318, p3_19 = 319, p3_20 = 320, p3_21 = 321, p3_22 = 322, p3_23 = 323, p3_24 = 324,*/ p3_25 = 325, p3_26 = 326, /*p3_27 = 327, p3_28 = 328, p3_29 = 329, p3_30 = 330,*/ /*p4_0 = 400, p4_1 = 401, p4_2 = 402, p4_3 = 403, p4_4 = 404, p4_5 = 405, p4_6 = 406, p4_7 = 407, p4_8 = 408, p4_9 = 409, p4_10 = 410, p4_11 = 411, p4_12 = 412, p4_13 = 413, p4_14 = 414, p4_15 = 415, p4_16 = 416, p4_17 = 417, p4_18 = 418, p4_19 = 419, p4_20 = 420, p4_21 = 421, p4_22 = 422, p4_23 = 423, p4_24 = 424, p4_25 = 425, p4_26 = 426, p4_27 = 427,*/ p4_28 = 428, p4_29 = 429, /*p4_30 = 430*/ }; #endif /* Pin_Name */ enum Pin_Mode { pull_up = 0, pull_down = 1, neither = 2, repeater = 3 }; enum Pin_Direction { input = 0, output = 1 }; class Digital_InOut { private: Pin _pin; bool _Dir; public: Digital_InOut(Pin_Name IPin, Pin_Direction IDir) { _pin.port=(IPin/100); _pin.pin=(IPin%100); const int PINSELx = ((_pin.port*2) + (1* (_pin.pin > 15) ? 1:0)); const int FIODIRx = _pin.port; *(uint32_t*)(_PINSEL_BASE + (PINSELx*4)) &= ~(1 << ((_pin.pin%16)*2) | (1 << (((_pin.pin%16)*2)+1))); //GPIO if(!IDir) *(uint32_t*)(_FIODIR_BASE + (FIODIRx*0x20)) &= ~(1 << _pin.pin); //Input else *(uint32_t*)(_FIODIR_BASE + (FIODIRx*0x20)) |= (1 << _pin.pin); //Output _Dir=IDir; } Digital_InOut(Pin_Name IPin, Pin_Mode value, Pin_Direction IDir) { _pin.port=(IPin/100); _pin.pin=(IPin%100); const int PINSELx = ((_pin.port*2) + (1* (_pin.pin > 15) ? 1:0)); const int PINMODEx = ((_pin.port*2) + (1* (_pin.pin > 15) ? 1:0)); const int FIODIRx = _pin.port; *(uint32_t*)(_PINSEL_BASE + (PINSELx*4)) &= ~(1 << ((_pin.pin%16)*2) | (1 << (((_pin.pin%16)*2)+1))); //GPIO _Dir=IDir; if(!_Dir) { *(uint32_t*)(_FIODIR_BASE + (FIODIRx*0x20)) &= ~(1 << _pin.pin); //Input if(value==0) { *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) &= ~(1 << ((_pin.pin%16)*2) | (1 << (((_pin.pin%16)*2)+1))); //PULL_UP } else if(value==1) { *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) |= (1 << ((_pin.pin%16)*2) | (1 << (((_pin.pin%16)*2)+1))); //PULL_DOWN } else if(value==2) { *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) |= (1 << (((_pin.pin%16)*2)+1) ); //NEITHER *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) &= ~(1 << ((_pin.pin%16)*2)); //NEITHER } else if(value==3) { *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) &= ~(1 << (((_pin.pin%16)*2)+1) ); //REPEATER *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) |= (1 << ((_pin.pin%16)*2)); //REPEATER } } } Digital_InOut(Pin_Name IPin, int value, Pin_Direction IDir) { _pin.port=(IPin/100); _pin.pin=(IPin%100); const int PINSELx = ((_pin.port*2) + (1* (_pin.pin > 15) ? 1:0)); const int FIODIRx = _pin.port; _Dir=IDir; *(uint32_t*)(_PINSEL_BASE + (PINSELx*4)) &= ~(1 << ((_pin.pin%16)*2) | (1 << (((_pin.pin%16)*2)+1))); //GPIO if(_Dir) { *(uint32_t*)(_FIODIR_BASE + (FIODIRx*0x20)) |= (1 << _pin.pin); //Output *(uint32_t*)((_FIOSET_BASE*value) + (_FIOCLR_BASE*(1-value)) + (_pin.port*0x20)) |= (1 << _pin.pin); //Write } } void input() { const int FIODIRx = _pin.port; int value=0; *(uint32_t*)((_FIOSET_BASE*value)+(_FIOCLR_BASE*(1-value)) + (_pin.port*0x20)) |= (1 << _pin.pin); //Reset *(uint32_t*)(_FIODIR_BASE + (FIODIRx*0x20)) &= ~(1 << _pin.pin); //Input //Output _Dir=0; } void output() { const int FIODIRx = _pin.port; *(uint32_t*)(_FIODIR_BASE + (FIODIRx*0x20)) |= (1 << _pin.pin); //Output _Dir=1; } int read() { return ((*(uint32_t*)(_FIOPIN_BASE +_pin.port*0x20) & (1 << _pin.pin)) >> _pin.pin); //Read } void write(int value) { if(_Dir) { if (value != 1 && value != 0) return; *(uint32_t*)((_FIOSET_BASE*value)+(_FIOCLR_BASE*(1-value)) + (_pin.port*0x20)) |= (1 << _pin.pin); //Write } } Digital_InOut& operator= (int value) { write(value); return *this; } Digital_InOut& operator= (Digital_InOut& rhs) { write(rhs.read()); return *this; } void mode(Pin_Mode value) { const int PINMODEx = ((_pin.port*2) + (1* (_pin.pin > 15) ? 1:0)); if(!_Dir) { if(value==0) { *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) &= ~(1 << ((_pin.pin%16)*2) | (1 << (((_pin.pin%16)*2)+1))); //PULL_UP } else if(value==1) { *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) |= (1 << ((_pin.pin%16)*2) | (1 << (((_pin.pin%16)*2)+1))); //PULL_DOWN } else if(value==2) { *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) |= (1 << (((_pin.pin%16)*2)+1) ); //NEITHER *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) &= ~(1 << ((_pin.pin%16)*2)); //NEITHER } else if(value==3) { *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) &= ~(1 << (((_pin.pin%16)*2)+1) ); //REPEATER *(uint32_t*)(_PINMODE_BASE + (PINMODEx*4)) |= (1 << ((_pin.pin%16)*2)); //REPEATER } } } operator int() { return read(); } }; #endif /* DIGITAL_IN_H */