Omap3-mux is a project mainly written in C, it's free.
Read the PADCONF register configuration for GPIO
A small kernel module that lets you look at the current PADCONF register value for a given GPIO. It also shows the GPIO_OE register status for the GPIO in question.
It should work for any OMAP34XX board, but I've only tested it with Overo's. I wrote it because I keep forgetting to mark the microSD cards with the different u-boot muxings I've been playing around with.
The output is similar to the u-boot muxing file board/overo/overo.h
To build it, you need a cross-compile environment and the source tree for the current kernel that you are running on the device.
If you are using OE, then you can source the appropriate
After that, run make to build.
Here's an example.
$ git clone git://github.com/scottellis/omap3-mux.git
$ cd omap3-mux
$ [optional] export OETMP=/oe1
$ . overo-source-me.txt
$ make
make -C /oe1/sysroots/overo-angstrom-linux-gnueabi/kernel M=/home/scott/examples/omap3-mux modules
make[1]: Entering directory `/oe1/sysroots/overo-angstrom-linux-gnueabi/kernel'
CC [M] /home/scott/examples/omap3-mux/mux.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/scott/examples/omap3-mux/mux.mod.o
LD [M] /home/scott/examples/omap3-mux/mux.ko
make[1]: Leaving directory `/oe1/sysroots/overo-angstrom-linux-gnueabi/kernel'
The module will be called mux.ko
Copy it to your device and load it with insmod.
When the module loads a /dev/mux special file will be created.
Send it a gpio number and it will give you back the PADCONF register value corresponding to the GPIO on the console.
Write is the only I/O operation the module responds to.
A few GPIO appear more then once in table 7.5 of the OMAP3 TRM, for those pins you will get two lines of output.
You can find the TRM here [http://www-s.ti.com/sc/techlit/spruf98]
Output format
[padconf_register_address] GPIO_XXX ([16-bit padconf_reg_value]) : [flags]
[gpio_oe_register_address] GPIO_OE[bank] : [gpio_oe_reg_value] (bit state)
The address is at 16-bit resolution as opposed to the TRM Table 7.5's 32-bit level.
Flags
IEN - Input Enable
IDIS - Input Disable
PTD - Pull type Down
PTU - Pull type Up
DIS - Pull type selection is inactive
EN - Pull type selection is active
If for some reason the value the module is putting out doesn't look right, verify that I got the gpio to padconf register mapping correct (gp_map) in mux.c. There was plenty of opportunity for typos there. I've really only verified the GPIO I'm interested in.
Sample session
[copy mux.ko to the overo]
root@overo:~# ls
mux.ko
root@overo:~# insmod mux.ko
root@overo:~# ls -all /dev/mux
crw-r--r-- 1 root root 251, 0 Feb 7 12:42 /dev/mux
root@overo:~# echo 170 > /dev/mux
0x480021c6 GPIO_170 (0x001c) : IDIS | PTU | EN | M4
0x49058034 GPIO_OE[5] : 0xFF7FFEEF bit 10 is ON (input)
root@overo:/sys/class/gpio# echo 170 > export
root@overo:/sys/class/gpio# echo 170 > /dev/mux
0x480021c6 GPIO_170 (0x001c) : IDIS | PTU | EN | M4
0x49058034 GPIO_OE[5] : 0xFF7FFEEF bit 10 is ON (input)
root@overo:/sys/class/gpio# echo out > gpio170/direction
root@overo:/sys/class/gpio# echo 170 > /dev/mux
0x480021c6 GPIO_170 (0x001c) : IDIS | PTU | EN | M4
0x49058034 GPIO_OE[5] : 0xFF7FFAEF bit 10 is OFF (output)
root@overo:~# echo 146 > /dev/mux
0x48002178 GPIO_146 (0x0104) : IEN | PTD | DIS | M4
0x49056034 GPIO_OE[4] : 0xFFFFFFFF bit 18 is ON (input)
root@overo:~# rmmod mux