OMAP GPIO API's HowTo ===================== This document is a short summary how to use OMAP Linux GPIO API. It is mainly focussed on OMAP5912 OSK, but should fit with extensions (more or less GPIOs) to other OMAP processors as well. If anything is missing, is wrong, needs extension or update, please send update to Linux-omap-open-source@linux.omap.com. ************************************************************* NOTICE: these OMAP-specific interfaces are deprecated/obsolete. See Documentation/gpio.txt for information on the standard cross-platform GPIO interface. All new code should use those calls instead of the ones described here. The only exception to that policy is the omap_cfg_reg() call, which isn't a GPIO-specific interface; it configures how chip functions are multiplexed to pins, with GPIO being only one of those functions. ************************************************************* I. GPIO Modules/Banks --------------------- OMAP5912 OSK has 64 GPIOs (general purpose IO pins). These are organized in four modules (banks) with 16 pins each. OMAP GPIO API doesn't distinguish between modules and numbers the pins from 0 - 63: A) GPIO MODULE/BANK 0 - PIN 0-15 B) GPIO MODULE/BANK 1 - PIN 16-31 C) GPIO MODULE/BANK 2 - PIN 32-47 D) GPIO MODULE/BANK 3 - PIN 48-63 See http://www-s.ti.com/sc/psheets/spru767a/spru767a.pdf for more details. II. GPIO API's -------------- A) Include #include B) omap_cfg_reg(xxxx); Description: Configure pin mux. Parameter: Pin to be configured for GPIO. Note: This function may only be necessary for some GPIO pins. Because OMAP chip itself has less real hardware pins than necessary to use all its functionality at the same time, some pins share different functions (called pin multiplexing, short pin mux). E.g. one pin may be used for serial interface *or* GPIO. Check if this is the case for the GPIO you want to use and if you have to configure the pin mux. C) omap_request_gpio(int gpio) Description: Request GPIO to be used. Parameter: int gpio - GPIO PIN (Pin 0-63) Note: Using this function, you dont have to worry about banks/modules where the gpio pin is. D) omap_set_gpio_direction(int gpio, int is_input) Description: This function is responsible for setting the gpio pin direction (input or output). Parameter: int gpio - GPIO PIN (Pin 0-63) int is_input - pin direction (0 = output, 1 = input) E) omap_set_gpio_dataout(int gpio, int enable) Description: This function is responsible for writing to a pin. Parameter: int gpio - GPIO PIN (Pin 0-63) int enable - pin value (0 or 1) F) omap_get_gpio_datain(int gpio) Description: This function is responsible for reading pin values. Parameter: int gpio - GPIO PIN (Pin 0-63) G) omap_free_gpio(int gpio) Description: This function is responsible for freeing the pin used. Parameter: int gpio - GPIO PIN (Pin 0-63) H) OMAP_GPIO_IRQ(int gpio) Description: Returns the Interrupt number for the specified gpio pin. Parameter: int gpio - GPIO PIN (Pin 0-63) I) set_irq_type(unsigned int irq, unsigned int type) Description: This function is responsible for setting the type of interrupt (RISING or FALLING). Parameter: unsigned int irq - The interrupt number for the gpio pin. unsigned int type - (IRQT_RISING = rising, IRQT_FALLING= falling) III. Example ------------ 1) Writing to gpio pin#3 a value 1 and reading the value of gpio pin#3. #include int ret; /* Return value */ omap_request_gpio(3); /* Request for gpio pin */ omap_set_gpio_direction(3,0); omap_set_set_dataout(3,1); /* Writing a 1 to gpio pin # 3: */ ret = omap_get_datain(3); /* Reading the value of pin # 3 */ printk("value of pin # 3 = %d\n",ret); omap_free_gpio(3); /* Freeing gpio pin # 3 */ 2) Interrupt input by gpio pin#3 #include omap_request_gpio(3); /* Request for gpio pin */ omap_set_gpio_direction(3,0); set_irq_type(OMAP_GPIO_IRQ(3),IRQT_RISING); /* Setting up pin for interrupt */ request_irq(OMAP_GPIO_IRQ(3), (void *)&my_int_handler, SA_SHIRQ,....); ... /* Do stuff, handle interrupts in my_int_handler */ free_irq(OMAP_GPIO_IRQ(3),&id); /* Freeing interrupt and gpio pin */ omap_free_gpio(3); ------------------------------------------------------------------ Last modified 14. August 2006 The OMAP Linux Kernel Team Arnold Dirk Behme OMAP GPIO API's HowTo ===================== This document is a short summary how to use OMAP Linux GPIO API. It is mainly focussed on OMAP5912 OSK, but should fit with extensions (more or less GPIOs) to other OMAP processors as well. If anything is missing, is wrong, needs extension or update, please send update to Linux-omap-open-source@linux.omap.com. I. GPIO Modules/Banks --------------------- OMAP5912 OSK has 64 GPIOs (general purpose IO pins). These are organized in four modules (banks) with 16 pins each. OMAP GPIO API doesn't distinguish between modules and numbers the pins from 0 - 63: A) GPIO MODULE/BANK 0 - PIN 0-15 B) GPIO MODULE/BANK 1 - PIN 16-31 C) GPIO MODULE/BANK 2 - PIN 32-47 D) GPIO MODULE/BANK 3 - PIN 48-63 See http://www-s.ti.com/sc/psheets/spru767a/spru767a.pdf for more details. II. GPIO API's -------------- A) Include #include B) omap_cfg_reg(xxxx); Description: Configure pin mux. Parameter: Pin to be configured for GPIO. Note: This function may only be necessary for some GPIO pins. Because OMAP chip itself has less real hardware pins than necessary to use all its functionality at the same time, some pins share different functions (called pin multiplexing, short pin mux). E.g. one pin may be used for serial interface *or* GPIO. Check if this is the case for the GPIO you want to use and if you have to configure the pin mux. C) omap_request_gpio(int gpio) Description: Request GPIO to be used. Parameter: int gpio - GPIO PIN (Pin 0-63) Note: Using this function, you dont have to worry about banks/modules where the gpio pin is. D) omap_set_gpio_direction(int gpio, int is_input) Description: This function is responsible for setting the gpio pin direction (input or output). Parameter: int gpio - GPIO PIN (Pin 0-63) int is_input - pin direction (0 = output, 1 = input) E) omap_set_gpio_dataout(int gpio, int enable) Description: This function is responsible for writing to a pin. Parameter: int gpio - GPIO PIN (Pin 0-63) int enable - pin value (0 or 1) F) omap_get_gpio_datain(int gpio) Description: This function is responsible for reading pin values. Parameter: int gpio - GPIO PIN (Pin 0-63) G) omap_free_gpio(int gpio) Description: This function is responsible for freeing the pin used. Parameter: int gpio - GPIO PIN (Pin 0-63) H) OMAP_GPIO_IRQ(int gpio) Description: Returns the Interrupt number for the specified gpio pin. Parameter: int gpio - GPIO PIN (Pin 0-63) I) set_irq_type(unsigned int irq, unsigned int type) Description: This function is responsible for setting the type of interrupt (RISING or FALLING). Parameter: unsigned int irq - The interrupt number for the gpio pin. unsigned int type - (IRQT_RISING = rising, IRQT_FALLING= falling) III. Example ------------ 1) Writing to gpio pin#3 a value 1 and reading the value of gpio pin#3. #include int ret; /* Return value */ omap_request_gpio(3); /* Request for gpio pin */ omap_set_gpio_direction(3,0); omap_set_set_dataout(3,1); /* Writing a 1 to gpio pin # 3: */ ret = omap_get_datain(3); /* Reading the value of pin # 3 */ printk("value of pin # 3 = %d\n",ret); omap_free_gpio(3); /* Freeing gpio pin # 3 */ 2) Interrupt input by gpio pin#3 #include omap_request_gpio(3); /* Request for gpio pin */ omap_set_gpio_direction(3,0); set_irq_type(OMAP_GPIO_IRQ(3),IRQT_RISING); /* Setting up pin for interrupt */ request_irq(OMAP_GPIO_IRQ(3), (void *)&my_int_handler, SA_SHIRQ,....); ... /* Do stuff, handle interrupts in my_int_handler */ free_irq(OMAP_GPIO_IRQ(3),&id); /* Freeing interrupt and gpio pin */ omap_free_gpio(3); ------------------------------------------------------------------ Last modified 14. August 2006 The OMAP Linux Kernel Team Arnold Dirk Behme