Hi,
I'm trying to use pins 12, 14, 16, 17 (of the 66 pins connector) as GPIO output.
First I've used the /sys/class/gpio interface.
Then I've tested a C program that directly writes into the registers.
The result is the same.
I can only change the status of pin 14.
Pins 12, 16, 17 are always high.
Any suggestion?
This is my test C program:
C
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <sys/mman.h>
- #include <errno.h>
- #include <string.h>
- #include <stdint.h>
- #include <unistd.h>
- ////////////////////////////////////////////////////////////////////////////
- #define IOMUXC 0x020E0000
- //////////////////////////////////////////////////////// GPIO2_IO26 (EIM_RW)
- #define IOMUXC_SW_MUX_CTL_PAD_EIM_RW 0x0104
- #define GPIO2_IO26_MUX IOMUXC_SW_MUX_CTL_PAD_EIM_RW
- #define GPIO2_IO26_POS 26
- /////////////////////////////////////////////////////// GPIO3_IO16 (EIM_D16)
- #define IOMUXC_SW_MUX_CTL_PAD_EIM_DATA16 0x0090
- #define GPIO3_IO16_MUX IOMUXC_SW_MUX_CTL_PAD_EIM_DATA16
- #define GPIO3_IO16_POS 16
- /////////////////////////////////////////////////////// GPIO3_IO17 (EIM_D17)
- #define IOMUXC_SW_MUX_CTL_PAD_EIM_DATA17 0x0094
- #define GPIO3_IO17_MUX IOMUXC_SW_MUX_CTL_PAD_EIM_DATA17
- #define GPIO3_IO17_POS 17
- /////////////////////////////////////////////////////// GPIO3_IO18 (EIM_D18)
- #define IOMUXC_SW_MUX_CTL_PAD_EIM_DATA18 0x0098
- #define GPIO3_IO18_MUX IOMUXC_SW_MUX_CTL_PAD_EIM_DATA18
- #define GPIO3_IO18_POS 18
- ////////////////////////////////////////////////////////////////////////////
- #define GPIO2_BASE 0x020A0000
- #define GPIO3_BASE 0x020A4000
- #define GPIOx_DR 0x0000
- #define GPIOx_GDIR 0x0004
- ////////////////////////////////////////////////////////////////////////////
- static volatile uint32_t *iomux;
- static volatile uint32_t *gpio2;
- static volatile uint32_t *gpio3;
- ////////////////////////////////////////////////////////////////////////////
- int main(int argc, char **argv)
- {
- int fd ;
- printf("\n");
- /////////////////////////////////////// obtain handle to physical memory
- if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0)
- {
- printf("Unable to open /dev/mem: %s\n", strerror(errno));
- return -1;
- }
- //////////////////////////////////////////////////// map IOMUX registers
- iomux = (uint32_t *)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, IOMUXC);
- if ((int32_t)iomux < 0)
- {
- printf("IOMUX mmap failed: %s\n", strerror(errno));
- exit(1);
- }
- ///////////////////////////////////////////// select GPIO2_IO26 function
- *(iomux + GPIO2_IO26_MUX/4) = 0x5;
- ///////////////////////////////////////////// select GPIO3_IO16 function
- *(iomux + GPIO3_IO16_MUX/4) = 0x5;
- ///////////////////////////////////////////// select GPIO3_IO17 function
- *(iomux + GPIO3_IO17_MUX/4) = 0x5;
- ///////////////////////////////////////////// select GPIO3_IO18 function
- *(iomux + GPIO3_IO18_MUX/4) = 0x5;
- ////////////////////////////////////////////////// unmap IOMUX registers
- if ((munmap((void *)iomux, 0x1000)) < 0)
- {
- printf("IOMUX munmap failed: %s\n", strerror(errno));
- exit(1);
- }
- //////////////////////////////////////////// map GPIO2 control registers
- gpio2 = (uint32_t *)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO2_BASE);
- if ((int32_t)gpio2 < 0)
- {
- printf("GPIO2 mmap failed: %s\n", strerror(errno));
- exit(1);
- }
- //////////////////////////////////////////// map GPIO3 control registers
- gpio3 = (uint32_t *)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO3_BASE);
- if ((int32_t)gpio3 < 0)
- {
- printf("GPIO3 mmap failed: %s\n", strerror(errno));
- exit(1);
- }
- ///////////////////////////////////////////// setup GPIO2_IO26 as output
- *(gpio2 + GPIOx_GDIR/4) = *(gpio2 + GPIOx_GDIR/4) | 1<<GPIO2_IO26_POS;
- ///////////////////////////////////////////// setup GPIO3_IO16 as output
- *(gpio3 + GPIOx_GDIR/4) = *(gpio3 + GPIOx_GDIR/4) | 1<<GPIO3_IO16_POS;
- ///////////////////////////////////////////// setup GPIO3_IO17 as output
- *(gpio3 + GPIOx_GDIR/4) = *(gpio3 + GPIOx_GDIR/4) | 1<<GPIO3_IO17_POS;
- ///////////////////////////////////////////// setup GPIO3_IO18 as output
- *(gpio3 + GPIOx_GDIR/4) = *(gpio3 + GPIOx_GDIR/4) | 1<<GPIO3_IO18_POS;
- ////////////////////////////////////////////////////// toggle GPIOx_IOxx
- while (1)
- {
- *(gpio2 + GPIOx_DR/4) = *(gpio2 + GPIOx_DR/4) ^ 1<<GPIO2_IO26_POS;
- *(gpio3 + GPIOx_DR/4) = *(gpio3 + GPIOx_DR/4) ^ 1<<GPIO3_IO16_POS;
- *(gpio3 + GPIOx_DR/4) = *(gpio3 + GPIOx_DR/4) ^ 1<<GPIO3_IO17_POS;
- *(gpio3 + GPIOx_DR/4) = *(gpio3 + GPIOx_DR/4) ^ 1<<GPIO3_IO18_POS;
- usleep(250000);
- }
- }