set up PADCONF for am33xx from userspace

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!

Control module registers are write protected.

Thanks. That explains it!

Cheers!