Hi,
I have white beagleboard running 3.2 Linux (Ubuntu). I would like to access PADCONF registers from userspace by mmpa()ing address 0x44E10000LU and do normal read/write through pointer to setup GPIO as output/input.
I can get the mmap()ed address. Reading from offset 0x800 (AM33XX_CONTROL_PADCONF_GPMC_AD0_OFFSET) yields correct value as seen by the ‘/sys/kernel/debug/omap_mux/gpmc_ad0’.
Writing to that address has no effect. I’m not sure what I’m missing here.
Here is a small C program I use for test and the corresponding output.
`
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)
int main(int argc, char **argv) {
DBG(“enter\n”);
int memfd = open("/dev/mem", O_RDWR);
if (memfd == -1) {
ERR(“open(): /dev/mem %s\n”, strerror(errno));
DBG(“leave -1\n”);
return -1;
}
void *mapped = mmap(0,
MAP_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED, memfd, AM33XX_CONTROL_PADCONF_MUX_PBASE & ~MAP_MASK);
if (mapped == MAP_FAILED) {
ERR(“mmap(): %s\n”, strerror(errno));
DBG(“leave -1\n”);
return -1;
}
DBG(“mapped to %p\n”, mapped);
unsigned int val;
val = *((volatile unsigned int *) (mapped + AM33XX_CONTROL_PADCONF_GPMC_AD0_OFFSET));
DBG(“1 val for AM33XX_CONTROL_PADCONF_GPMC_AD0_OFFSET = 0x%08X\n”, val);
*((volatile unsigned int *) (mapped + AM33XX_CONTROL_PADCONF_GPMC_AD0_OFFSET)) = 7;
val = *((volatile unsigned int *) (mapped + AM33XX_CONTROL_PADCONF_GPMC_AD0_OFFSET));
DBG(“2 val for AM33XX_CONTROL_PADCONF_GPMC_AD0_OFFSET = 0x%08X\n”, val);
munmap(mapped, MAP_SIZE);
close(memfd);
DBG(“leave 0\n”);
return 0;
}
`
$ sudo ./Debug/omapmem
DBG src/omapmem.c:57:main(): enter
DBG src/omapmem.c:75:main(): mapped to 0x4018c000
DBG src/omapmem.c:79:main(): 1 val for AM33XX_CONTROL_PADCONF_GPMC_AD0_OFFSET = 0x00000030
DBG src/omapmem.c:84:main(): 2 val for AM33XX_CONTROL_PADCONF_GPMC_AD0_OFFSET = 0x00000030
DBG src/omapmem.c:89:main(): leave 0
Thanks!