Hello, Currently for a college project, I'm developing an application that needs read input from the GPIOs but I'm stuck with that!! I already know how to use the UART ports but I have no idea of how to use the GPIOs. Currently I'm coding in C#, but if any of you have any example for how to use the GPIOs in c++, I could simply start again in c++!! Please any help with this would be greatly appreciated!!
Help using GPIOs
extern "C" BOOL VirtualCopy(LPVOID dest, LPVOID src, DWORD size, DWORD flags); typedef struct { unsigned int rGPACON; // 00 unsigned int rGPADAT; unsigned int rPAD1[2]; unsigned int rGPBCON; // 10 unsigned int rGPBDAT; unsigned int rGPBUP; unsigned int rPAD2; unsigned int rGPCCON; // 20 unsigned int rGPCDAT; unsigned int rGPCUP; unsigned int rPAD3; unsigned int rGPDCON; // 30 unsigned int rGPDDAT; unsigned int rGPDUP; unsigned int rPAD4; unsigned int rGPECON; // 40 unsigned int rGPEDAT; unsigned int rGPEUP; unsigned int rPAD5; unsigned int rGPFCON; // 50 unsigned int rGPFDAT; unsigned int rGPFUP; unsigned int rPAD6; unsigned int rGPGCON; // 60 unsigned int rGPGDAT; unsigned int rGPGUP; unsigned int rPAD7; unsigned int rGPHCON; // 70 unsigned int rGPHDAT; unsigned int rGPHUP; unsigned int rPAD8; unsigned int rMISCCR; // 80 unsigned int rDCKCON; unsigned int rEXTINT0; unsigned int rEXTINT1; unsigned int rEXTINT2; // 90 unsigned int rEINTFLT0; unsigned int rEINTFLT1; unsigned int rEINTFLT2; unsigned int rEINTFLT3; // A0 unsigned int rEINTMASK; unsigned int rEINTPEND; unsigned int rGSTATUS0; // AC unsigned int rGSTATUS1; // B0 unsigned int rGSTATUS2; // B4 ;;; SHL unsigned int rGSTATUS3; // B8 unsigned int rGSTATUS4; // BC unsigned int rFLTOUT; // C0 unsigned int rDSC0; unsigned int rDSC1; unsigned int rMSLCON; unsigned int rGPJCON; // D0 unsigned int rGPJDAT; unsigned int rGPJUP; unsigned int rPAD9; }IOPreg; typedef struct { unsigned int rADCCON; //ADC control unsigned int rADCTSC; //ADC touch screen control unsigned int rADCDLY; //ADC start or Interval Delay unsigned int rADCDAT0; //ADC conversion data 0 unsigned int rADCDAT1; //ADC conversion data 1 unsigned int rADCUPDN; //Stylus Up/Down interrupt status }ADCreg; #define IOP_BASE 0xB1600000 // 0x56000000 #define ADC_BASE 0xB1800000 // 0x58000000 volatile IOPreg *m_p2440IOP; volatile ADCreg *m_p2440ADC; void CALLBACK RegInit(void) { m_p2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS); VirtualCopy((PVOID)m_p2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE|P AGE_NOCACHE); m_p2440ADC = (volatile ADCreg *) VirtualAlloc(0,sizeof(ADCreg),MEM_RESERVE, PAGE_NOACCESS); VirtualCopy((PVOID)m_p2440ADC,(PVOID)(ADC_BASE),sizeof(ADCreg),PAGE_READWRITE|P AGE_NOCACHE); } int CALLBACK ReadAdc(int ch) { m_p2440ADC->rADCCON = (1<<14)|(20<<6)|(ch<<3); //setup channel m_p2440ADC->rADCCON|=0x1; //start ADC while(m_p2440ADC->rADCCON&0x1); //check if Enable_start is low while(!(m_p2440ADC->rADCCON&0x8000)); //check if EC(End of Conversion) flag is high return ((int)m_p2440ADC->rADCDAT0 & 0x3ff); } int CALLBACK ReadKey(void) { int key=0; if(m_p2440IOP->rGPGDAT&1) key|=1; if(m_p2440IOP->rGPGDAT&8) key|=2; if(m_p2440IOP->rGPGDAT&32) key|=4; if(m_p2440IOP->rGPGDAT&64) key|=8; if(m_p2440IOP->rGPGDAT&128) key|=16; if(m_p2440IOP->rGPGDAT&2048) key|=32; key^=0x3f; return key; }
Hello Mutzev, I tried to use the above example and modified little bit to use the GPF (EINT0-EINT4) pins on GPIO but was not successful in toggling them. I tried to configure them as output. Do you have any idea? Thanks.
Hello matt_Damon, #define SetBit(x,y) (*(x)|=(1<<y)) #define ClrBit(x,y) *(x)=*(x)&~(1<<y) #define ClrPin(x,y) (*(x)|=(1<<y)) #define SetPin(x,y) *(x)=*(x)&~(1<<y) typedef struct { unsigned int rGPACON; // 00 unsigned int rGPADAT; unsigned int rPAD1[2]; unsigned int rGPBCON; // 10 unsigned int rGPBDAT; unsigned int rGPBUP; unsigned int rPAD2; unsigned int rGPCCON; // 20 unsigned int rGPCDAT; unsigned int rGPCUP; unsigned int rPAD3; unsigned int rGPDCON; // 30 unsigned int rGPDDAT; unsigned int rGPDUP; unsigned int rPAD4; unsigned int rGPECON; // 40 unsigned int rGPEDAT; unsigned int rGPEUP; unsigned int rPAD5; unsigned int rGPFCON; // 50 unsigned int rGPFDAT; unsigned int rGPFUP; unsigned int rPAD6; unsigned int rGPGCON; // 60 unsigned int rGPGDAT; unsigned int rGPGUP; unsigned int rPAD7; unsigned int rGPHCON; // 70 unsigned int rGPHDAT; unsigned int rGPHUP; unsigned int rPAD8; unsigned int rMISCCR; // 80 unsigned int rDCKCON; unsigned int rEXTINT0; unsigned int rEXTINT1; unsigned int rEXTINT2; // 90 unsigned int rEINTFLT0; unsigned int rEINTFLT1; unsigned int rEINTFLT2; unsigned int rEINTFLT3; // A0 unsigned int rEINTMASK; unsigned int rEINTPEND; unsigned int rGSTATUS0; // AC unsigned int rGSTATUS1; // B0 unsigned int rGSTATUS2; // B4 ;;; SHL unsigned int rGSTATUS3; // B8 unsigned int rGSTATUS4; // BC unsigned int rFLTOUT; // C0 unsigned int rDSC0; unsigned int rDSC1; unsigned int rMSLCON; unsigned int rGPJCON; // D0 unsigned int rGPJDAT; unsigned int rGPJUP; unsigned int rPAD9; }IOPreg; #define IOP_BASE 0xB1600000 // 0x56000000 volatile IOPreg *m_p2440IOP; void CALLBACK Init(void) { // init GPIO m_p2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS); VirtualCopy((PVOID)m_p2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE|PA GE_NOCACHE); // make led output 01 ClrBit(&m_p2440IOP->rGPBCON,17); SetBit(&m_p2440IOP->rGPBCON,16); ClrBit(&m_p2440IOP->rGPBCON,15); SetBit(&m_p2440IOP->rGPBCON,14); ClrBit(&m_p2440IOP->rGPBCON,13); SetBit(&m_p2440IOP->rGPBCON,12); ClrBit(&m_p2440IOP->rGPBCON,11); SetBit(&m_p2440IOP->rGPBCON,10); } void CALLBACK SetLed(int xled) { if(xled&1) SetPin(&m_p2440IOP->rGPBDAT,5); else ClrPin(&m_p2440IOP->rGPBDAT,5); if(xled&2) SetPin(&m_p2440IOP->rGPBDAT,6); else ClrPin(&m_p2440IOP->rGPBDAT,6); if(xled&4) SetPin(&m_p2440IOP->rGPBDAT,7); else ClrPin(&m_p2440IOP->rGPBDAT,7); if(xled&8) SetPin(&m_p2440IOP->rGPBDAT,8); else ClrPin(&m_p2440IOP->rGPBDAT,8); return; } void CALLBACK alabala(void) { static int led=0; Init(); led=1; SetLed(led); led=2; SetLed(led); led=4; SetLed(led); led=8; SetLed(led); led=0x0f; SetLed(led); led=0; SetLed(led); Sleep(1000); }
Hello Mutzev, The above program works great for setting any pin. However, how can we configure them as input and read their values? I believe we should use Clrbit function instead of setbit to configure as input. But how will we read the value? Do we need to disable pull-up resistor for pins? Thanks.
Hello Mutzev, In the first example of Key Press, int CALLBACK ReadKey(void) { int key=0; if(m_p2440IOP->rGPGDAT&1) key|=1; if(m_p2440IOP->rGPGDAT&8) key|=2; if(m_p2440IOP->rGPGDAT&32) key|=4; if(m_p2440IOP->rGPGDAT&64) key|=8; if(m_p2440IOP->rGPGDAT&128) key|=16; if(m_p2440IOP->rGPGDAT&2048) key|=32; key^=0x3f; return key; } I always receiving 16, indicating that KEY5 is pressed. I verified this using a multimeter. Can we clear this pin so that it outputs 0 when no pin is pressed? Thanks.
Hello Mutzev, I tried to use the GPIO pins as input but some of the pis are allways High! Can you please let me know what I am doing wrong?? Here is the modified code which I am using: #include <windows.h> #define DLLEXPORT __declspec(dllexport) #define EXTERNC extern "C" EXTERNC BOOL VirtualCopy(LPVOID dest, LPVOID src, DWORD size, DWORD flags); #define ClrBit(x,y) *(x)=*(x)&~(1<<y) typedef struct { unsigned int rGPACON; // 00 unsigned int rGPADAT; unsigned int rPAD1[2]; unsigned int rGPBCON; // 10 unsigned int rGPBDAT; unsigned int rGPBUP; unsigned int rPAD2; unsigned int rGPCCON; // 20 unsigned int rGPCDAT; unsigned int rGPCUP; unsigned int rPAD3; unsigned int rGPDCON; // 30 unsigned int rGPDDAT; unsigned int rGPDUP; unsigned int rPAD4; unsigned int rGPECON; // 40 unsigned int rGPEDAT; unsigned int rGPEUP; unsigned int rPAD5; unsigned int rGPFCON; // 50 unsigned int rGPFDAT; unsigned int rGPFUP; unsigned int rPAD6; unsigned int rGPGCON; // 60 unsigned int rGPGDAT; unsigned int rGPGUP; unsigned int rPAD7; unsigned int rGPHCON; // 70 unsigned int rGPHDAT; unsigned int rGPHUP; unsigned int rPAD8; unsigned int rMISCCR; // 80 unsigned int rDCKCON; unsigned int rEXTINT0; unsigned int rEXTINT1; unsigned int rEXTINT2; // 90 unsigned int rEINTFLT0; unsigned int rEINTFLT1; unsigned int rEINTFLT2; unsigned int rEINTFLT3; // A0 unsigned int rEINTMASK; unsigned int rEINTPEND; unsigned int rGSTATUS0; // AC unsigned int rGSTATUS1; // B0 unsigned int rGSTATUS2; // B4 ;;; SHL unsigned int rGSTATUS3; // B8 unsigned int rGSTATUS4; // BC unsigned int rFLTOUT; // C0 unsigned int rDSC0; unsigned int rDSC1; unsigned int rMSLCON; unsigned int rGPJCON; // D0 unsigned int rGPJDAT; unsigned int rGPJUP; unsigned int rPAD9; }IOPreg; #define IOP_BASE 0xB1600000 // 0x56000000 volatile IOPreg *m_p2440IOP; EXTERNC DLLEXPORT void RegInit(void); void RegInit(void) { m_p2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS); VirtualCopy((PVOID)m_p2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE|P AGE_NOCACHE); ClrBit(&m_p2440IOP->rGPFCON,0xF); ClrBit(&m_p2440IOP->rGPFCON,0xE); ClrBit(&m_p2440IOP->rGPFCON,0xD); ClrBit(&m_p2440IOP->rGPFCON,0xC); ClrBit(&m_p2440IOP->rGPFCON,0xB); ClrBit(&m_p2440IOP->rGPFCON,0xA); ClrBit(&m_p2440IOP->rGPFCON,9); ClrBit(&m_p2440IOP->rGPFCON,8); ClrBit(&m_p2440IOP->rGPFCON,7); ClrBit(&m_p2440IOP->rGPFCON,6); ClrBit(&m_p2440IOP->rGPFCON,5); ClrBit(&m_p2440IOP->rGPFCON,4); ClrBit(&m_p2440IOP->rGPFCON,3); ClrBit(&m_p2440IOP->rGPFCON,2); ClrBit(&m_p2440IOP->rGPFCON,1); ClrBit(&m_p2440IOP->rGPFCON,0); } EXTERNC DLLEXPORT int ReadKey(void); int ReadKey(void) { int key=0; if(m_p2440IOP->rGPFDAT&1) key|=1; if(m_p2440IOP->rGPFDAT&2) key|=2; if(m_p2440IOP->rGPFDAT&4) key|=3; if(m_p2440IOP->rGPFDAT&8) key|=4; if(m_p2440IOP->rGPFDAT&16) key|=5; if(m_p2440IOP->rGPFDAT&32) key|=6; if(m_p2440IOP->rGPFDAT&64) key|=7; if(m_p2440IOP->rGPFDAT&128) key|=8; key^=0xff; return key; } Thanks.
Colleague, what you doing this? ... ClrBit(&m_p2440IOP->rGPFCON,0xF); ClrBit(&m_p2440IOP->rGPFCON,0xE); ClrBit(&m_p2440IOP->rGPFCON,0xD); ClrBit(&m_p2440IOP->rGPFCON,0xC); ClrBit(&m_p2440IOP->rGPFCON,0xB); ClrBit(&m_p2440IOP->rGPFCON,0xA); ClrBit(&m_p2440IOP->rGPFCON,9); ClrBit(&m_p2440IOP->rGPFCON,8); ClrBit(&m_p2440IOP->rGPFCON,7); ClrBit(&m_p2440IOP->rGPFCON,6); ClrBit(&m_p2440IOP->rGPFCON,5); ClrBit(&m_p2440IOP->rGPFCON,4); ClrBit(&m_p2440IOP->rGPFCON,3); ClrBit(&m_p2440IOP->rGPFCON,2); ClrBit(&m_p2440IOP->rGPFCON,1); ClrBit(&m_p2440IOP->rGPFCON,0); ....
1. Must read guide to s3c2440. Page 263. 2. Misunderstanding what is the problem. When you configure ports as input it in set to 1 and becomes 0 at press. If You want pressed key=1 use the XOR (key ^ 0xff). .... int key=0; if(m_p2440IOP->rGPGDAT&1) key|=1; ..... if(m_p2440IOP->rGPGDAT&0x80) key|=0x80; key^=0xff; 3. If you want to do all of the pins as inputs GPF is not it easier instead to use just above m_p2440IOP-> rGPFCON = 0, or if you want set to output m_p2440IOP-> rGPFCON = 0haa; aa (hex) = 10 10 10 10 4. Possibly due to bad my english misunderstood what you ask for which I apologize.
Hello Mutzev, I was using Clrbit function to set GPFCON register to input on all pins. Then I am using the GPFDAT function to read the values of respective pin values on the GPIO port. The 6 Key press is working fine now. But GPFDAT on the GPIO port are not working.
"The 6 Key press is working fine now. But GPFDAT on the GPIO port are not working." if it works, what does not work?! See whether the F PORT was finally correctly as input. See also register GPFUP
Hello mutzev, Here is the code which I am using. The vale of "key" is 240. I expected it to be 0 when nothing is connected to the GPF pins. I checked the GPFCON and GPFUP values. They are 0: m_p2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS); VirtualCopy((PVOID)m_p2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE|PA GE_NOCACHE); m_p2440IOP->rGPFCON = 0; //to set GPF to input m_p2440IOP->rGPFUP = 0; //disable pullups } EXTERNC DLLEXPORT int ReadKey(void); int ReadKey(void) { int key=0; //key=m_p2440IOP->rGPFUP; This is to check GPFUP value //key=m_p2440IOP->rGPFCON; This is to check GPFCON value if(m_p2440IOP->rGPFDAT&1) key|=1; if(m_p2440IOP->rGPFDAT&2) key|=2; if(m_p2440IOP->rGPFDAT&4) key|=3; if(m_p2440IOP->rGPFDAT&8) key|=4; if(m_p2440IOP->rGPFDAT&16) key|=5; if(m_p2440IOP->rGPFDAT&32) key|=6; if(m_p2440IOP->rGPFDAT&64) key|=7; if(m_p2440IOP->rGPFDAT&128) key|=8; key^=0xff; return key; }
// incorect ... if(m_p2440IOP->rGPFDAT&1) key|=1; if(m_p2440IOP->rGPFDAT&2) key|=2; if(m_p2440IOP->rGPFDAT&4) key|=3; if(m_p2440IOP->rGPFDAT&8) key|=4; if(m_p2440IOP->rGPFDAT&16) key|=5; if(m_p2440IOP->rGPFDAT&32) key|=6; if(m_p2440IOP->rGPFDAT&64) key|=7; if(m_p2440IOP->rGPFDAT&128) key|=8; .... // corect ... if(m_p2440IOP->rGPFDAT&1) key|=1; if(m_p2440IOP->rGPFDAT&2) key|=2; if(m_p2440IOP->rGPFDAT&4) key|=4; if(m_p2440IOP->rGPFDAT&8) key|=8; if(m_p2440IOP->rGPFDAT&16) key|=16; if(m_p2440IOP->rGPFDAT&32) key|=32; if(m_p2440IOP->rGPFDAT&64) key|=64; if(m_p2440IOP->rGPFDAT&128) key|=128; .... or try this key = (m_p2440IOP->rGPFDAT)^0xff;
Hello mutzev, The following code works! I am not sure what I was doing wrong before. Using this I was able to use GPIO pins as input and output: //#include "stdafx.h" //#include "Pkfuncs.h" //#include "s2440.h" //In some BSPs this file has a slightly different name #include <windows.h> //#include <time.h> //#include <ceddk.h> void gpioInit(); void Virtual_Alloc(); #define DLLEXPORT __declspec(dllexport) #define EXTERNC extern "C" EXTERNC BOOL VirtualCopy(LPVOID dest, LPVOID src, DWORD size, DWORD flags); typedef struct { unsigned int rGPACON; // 00 unsigned int rGPADAT; unsigned int rPAD1[2]; unsigned int rGPBCON; // 10 unsigned int rGPBDAT; unsigned int rGPBUP; unsigned int rPAD2; unsigned int rGPCCON; // 20 unsigned int rGPCDAT; unsigned int rGPCUP; unsigned int rPAD3; unsigned int rGPDCON; // 30 unsigned int rGPDDAT; unsigned int rGPDUP; unsigned int rPAD4; unsigned int rGPECON; // 40 unsigned int rGPEDAT; unsigned int rGPEUP; unsigned int rPAD5; unsigned int rGPFCON; // 50 unsigned int rGPFDAT; unsigned int rGPFUP; unsigned int rPAD6; unsigned int rGPGCON; // 60 unsigned int rGPGDAT; unsigned int rGPGUP; unsigned int rPAD7; unsigned int rGPHCON; // 70 unsigned int rGPHDAT; unsigned int rGPHUP; unsigned int rPAD8; unsigned int rMISCCR; // 80 unsigned int rDCKCON; unsigned int rEXTINT0; unsigned int rEXTINT1; unsigned int rEXTINT2; // 90 unsigned int rEINTFLT0; unsigned int rEINTFLT1; unsigned int rEINTFLT2; unsigned int rEINTFLT3; // A0 unsigned int rEINTMASK; unsigned int rEINTPEND; unsigned int rGSTATUS0; // AC unsigned int rGSTATUS1; // B0 unsigned int rGSTATUS2; // B4 ;;; SHL unsigned int rGSTATUS3; // B8 unsigned int rGSTATUS4; // BC unsigned int rFLTOUT; // C0 unsigned int rDSC0; unsigned int rDSC1; unsigned int rMSLCON; unsigned int rGPJCON; // D0 unsigned int rGPJDAT; unsigned int rGPJUP; unsigned int rPAD9; }IOPreg; #define IOP_BASE 0xB1600000 // 0x56000000 bool memoryAlloced = false; volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE; EXTERNC DLLEXPORT bool DLLreadPin(int port, int pin); bool DLLreadPin(int port, int pin) { gpioInit(); switch (port) { case 0: if (s2440IOP->rGPADAT & (0x1 << pin)) return true; else return false; break; case 1: if (s2440IOP->rGPBDAT & (0x1 << pin)) return true; else return false; break; case 2: if (s2440IOP->rGPCDAT & (0x1 << pin)) return true; else return false; break; case 3: if (s2440IOP->rGPDDAT & (0x1 << pin)) return true; else return false; break; case 4: if (s2440IOP->rGPEDAT & (0x1 << pin)) return true; else return false; break; case 5: if (s2440IOP->rGPFDAT & (0x1 << pin)) return true; else return false; break; case 6: if (s2440IOP->rGPGDAT & (0x1 << pin)) return true; else return false; break; } return false; } EXTERNC DLLEXPORT int DLLmakeInputPin(int port, int pin); int DLLmakeInputPin(int port, int pin) { gpioInit(); switch (port) { case 0: s2440IOP->rGPACON = (s2440IOP->rGPACON &~ ( 3 << pin*2)) ; break; case 1: s2440IOP->rGPBCON = (s2440IOP->rGPBCON &~ ( 3 << pin*2)) ; break; case 2: s2440IOP->rGPCCON = (s2440IOP->rGPCCON &~ ( 3 << pin*2)) ; break; case 3: s2440IOP->rGPDCON = (s2440IOP->rGPDCON &~ ( 3 << pin*2)) ; break; case 4: s2440IOP->rGPECON = (s2440IOP->rGPECON &~ ( 3 << pin*2)) ; break; case 5: s2440IOP->rGPFCON = (s2440IOP->rGPFCON &~ ( 3 << pin*2)) ; break; case 6: s2440IOP->rGPGCON = (s2440IOP->rGPGCON &~ ( 3 << pin*2)) ; break; } return 0; } EXTERNC DLLEXPORT int DLLsetPin(int port, int pin, bool on); int DLLsetPin(int port, int pin, bool on) { gpioInit(); switch (port) { case 0: s2440IOP->rGPACON = (s2440IOP->rGPACON &~ ( 3 << pin*2)) | ( 1<< pin*2); if (!on) s2440IOP->rGPADAT = (s2440IOP->rGPADAT &~ (0x1 << pin)); else s2440IOP->rGPADAT = (s2440IOP->rGPADAT | (0x1 << pin)); break; case 1: s2440IOP->rGPBCON = (s2440IOP->rGPBCON &~ ( 3 << pin*2)) | ( 1<< pin*2); if (!on) s2440IOP->rGPBDAT = (s2440IOP->rGPBDAT &~ (0x1 << pin)); else s2440IOP->rGPBDAT = (s2440IOP->rGPBDAT | (0x1 << pin)); break; case 2: s2440IOP->rGPCCON = (s2440IOP->rGPCCON &~ ( 3 << pin*2)) | ( 1<< pin*2); if (!on) s2440IOP->rGPCDAT = (s2440IOP->rGPCDAT &~ (0x1 << pin)); else s2440IOP->rGPCDAT = (s2440IOP->rGPCDAT | (0x1 << pin)); break; case 3: s2440IOP->rGPDCON = (s2440IOP->rGPDCON &~ ( 3 << pin*2)) | ( 1<< pin*2); if (!on) s2440IOP->rGPDDAT = (s2440IOP->rGPDDAT &~ (0x1 << pin)); else s2440IOP->rGPDDAT = (s2440IOP->rGPDDAT | (0x1 << pin)); break; case 4: s2440IOP->rGPECON = (s2440IOP->rGPECON &~ ( 3 << pin*2)) | ( 1<< pin*2); if (!on) s2440IOP->rGPEDAT = (s2440IOP->rGPEDAT &~ (0x1 << pin)); else s2440IOP->rGPEDAT = (s2440IOP->rGPEDAT | (0x1 << pin)); break; case 5: s2440IOP->rGPFCON = (s2440IOP->rGPFCON &~ ( 3 << pin*2)) | ( 1<< pin*2); if (!on) s2440IOP->rGPFDAT = (s2440IOP->rGPFDAT &~ (0x1 << pin)); else s2440IOP->rGPFDAT = (s2440IOP->rGPFDAT | (0x1 << pin)); break; case 6: s2440IOP->rGPGCON = (s2440IOP->rGPGCON &~ ( 3 << pin*2)) | ( 1<< pin*2); if (!on) s2440IOP->rGPGDAT = (s2440IOP->rGPGDAT &~ (0x1 << pin)); else s2440IOP->rGPGDAT = (s2440IOP->rGPGDAT | (0x1 << pin)); break; } return 0; } void Virtual_Alloc() { // GPIO Virtual alloc s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS); if(s2440IOP == NULL) { RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc faiLED!\r\n"))); } else { if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) { RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy faiLED!\r\n"))); } } } void gpioInit() { if (!memoryAlloced) { Virtual_Alloc(); memoryAlloced = true; } }
|=OR 1|2|3=3 1|2=3 1|2|3|4|5|6|7|8=15=0x0f... 0x0f^ff=240... 1|2|4|8|16|32|64|128=0xff ... 0xff^0xff=0....
I assume you meant . . . any other way of doing this in C. There is nothing special about "C, under Linux". Have a look at these: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&... http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewforum&... Fortunately the same compiler (GCC) is used for both. What can make a difference is the device architecture (Havard versus von Neumann). The AVR devices referred to here are Harvard. Some macro definitions for ports, as far as I understand, may not work for both. More investigation required! Good luck.
And by Linux, I meant in C targeted towards mini2440 running a Linux OS, not using windows.h header.
You are in the wrong forum/topic (WinCE). Search in the Linux forum for "GPIO". If you want direct access to the GPIO registers then its also nearly the same under WinCE and Linux...
I tried to compile this dll... but I have this error: Error 4 error LNK2019: unresolved external symbol _VirtualCopy referenced in function "void __cdecl Virtual_Alloc(void)" (?Virtual_Alloc@@YAXXZ) gpio_arm.obj can someone send me the compiled DLL or upload it here (jeangr@alice.it)?
I tried to compile this dll... but I have this error: Error 4 error LNK2019: unresolved external symbol _VirtualCopy referenced in function "void __cdecl Virtual_Alloc(void)" (?Virtual_Alloc@@YAXXZ) gpio_arm.obj can someone send me the compiled DLL or upload it here (info@edgsistemi.it)?
You can find a Wince 6 GPIO driver on my website (http://www.domodom.fr/spip/A-GPIO-driver-for-mini2440.html?lang=en), with c++, c# and VB.net samples. domodom
Hi everybody I have been using S3C2440 Micro2440 for WINCE 5.0, but I can't find GPIO driver in regedit of Board. How I can load GPIO driver into this board. Please instruct me. Thanks a lot
If you're using CE5, there's no need to use DLLs specifically to access the I/O pins from C# It can be done directly from the C# code, without any need for P/Invoking DLLs written in C. e.g. ( a snippet) unchecked { unsafe { IOP_BASE = new IntPtr((void*)0xB1600000UL); } } lpv = VirtualAlloc(IntPtr.Zero, (UInt32)Marshal.SizeOf(Registers), MemUsageFlags.MEM_RESERVE, PageAccessFlags.PAGE_NOACCESS); bRet = VirtualCopy(lpv, IOP_BASE, (UInt32)Marshal.SizeOf(Registers), PageAccessFlags.PAGE_READWRITE | PageAccessFlags.PAGE_NOCACHE); unsafe { GPIOReg = (IOPReg*)lpv; } you can then just use it as you would a C structure. e.g. unsafe { GPIOReg->aregister = avalue; } Basically C# allows the use of pointers provided you use them in an unsafe context.