- Main Page
- Related Pages
- Data Structures
- Files

- File List
- Globals

# drivers/gpio/portmux_gpio.c

Go to the documentation of this file.

    00001
    00041 #include <debug.h>
    00042 #include <io.h>
    00043 #include <chip/memory-map.h>
    00044 #include <chip/portmux.h>
    00045
    00056 void portmux_select_peripheral(void *port, pin_mask_t pin_mask,
    00057                 enum portmux_function func, unsigned long flags)
    00058 {
    00059         /* Both pull-up and pull-down set means buskeeper */
    00060         if (portmux_gpio_version() >= PORTMUX_GPIO_VER(2, 0)) {
    00061                 if (flags & PORTMUX_PULL_DOWN)
    00062                         gpio_write_reg(port, PDERS, pin_mask);
    00063                 else
    00064                         gpio_write_reg(port, PDERC, pin_mask);
    00065         }
    00066         if (flags & PORTMUX_PULL_UP)
    00067                 gpio_write_reg(port, PUERS, pin_mask);
    00068         else
    00069                 gpio_write_reg(port, PUERC, pin_mask);
    00070
    00071         /* Select drive strength */
    00072         if (portmux_gpio_version() >= PORTMUX_GPIO_VER(2, 0)) {
    00073                 if (flags & PORTMUX_DRIVE_LOW)
    00074                         gpio_write_reg(port, ODCR0S, pin_mask);
    00075                 else
    00076                         gpio_write_reg(port, ODCR0C, pin_mask);
    00077                 if (flags & PORTMUX_DRIVE_HIGH)
    00078                         gpio_write_reg(port, ODCR1S, pin_mask);
    00079                 else
    00080                         gpio_write_reg(port, ODCR1C, pin_mask);
    00081         }
    00082
    00083         /* Select function */
    00084         if (func & PORTMUX_FUNC_B)
    00085                 gpio_write_reg(port, PMR0S, pin_mask);
    00086         else
    00087                 gpio_write_reg(port, PMR0C, pin_mask);
    00088         if (func & PORTMUX_FUNC_C)
    00089                 gpio_write_reg(port, PMR1S, pin_mask);
    00090         else
    00091                 gpio_write_reg(port, PMR1C, pin_mask);
    00092
    00093         /* Disable GPIO (i.e. enable peripheral) */
    00094         gpio_write_reg(port, GPERC, pin_mask);
    00095 }
    00096
    00105 void portmux_select_gpio(void *port, pin_mask_t pin_mask, unsigned long flags)
    00106 {
    00107         /* Both pull-up and pull-down set means buskeeper */
    00108         if (portmux_gpio_version() >= PORTMUX_GPIO_VER(2, 0)) {
    00109                 if (flags & PORTMUX_PULL_DOWN)
    00110                         gpio_write_reg(port, PDERS, pin_mask);
    00111                 else
    00112                         gpio_write_reg(port, PDERC, pin_mask);
    00113         }
    00114         if (flags & PORTMUX_PULL_UP)
    00115                 gpio_write_reg(port, PUERS, pin_mask);
    00116         else
    00117                 gpio_write_reg(port, PUERC, pin_mask);
    00118
    00119         /* Enable open-drain mode if requested */
    00120         if (portmux_gpio_version() >= PORTMUX_GPIO_VER(2, 0)) {
    00121                 if (flags & PORTMUX_OPEN_DRAIN)
    00122                         gpio_write_reg(port, ODMERS, pin_mask);
    00123                 else
    00124                         gpio_write_reg(port, ODMERC, pin_mask);
    00125         } else {
    00126                 if (flags & PORTMUX_OPEN_DRAIN)
    00127                         gpio_write_reg(port, PDERS, pin_mask);
    00128                 else
    00129                         gpio_write_reg(port, PDERC, pin_mask);
    00130         }
    00131
    00132         if (portmux_gpio_version() >= PORTMUX_GPIO_VER(2, 0)) {
    00133                 /* Select drive strength */
    00134                 if (flags & PORTMUX_DRIVE_LOW)
    00135                         gpio_write_reg(port, ODCR0S, pin_mask);
    00136                 else
    00137                         gpio_write_reg(port, ODCR0C, pin_mask);
    00138                 if (flags & PORTMUX_DRIVE_HIGH)
    00139                         gpio_write_reg(port, ODCR1S, pin_mask);
    00140                 else
    00141                         gpio_write_reg(port, ODCR1C, pin_mask);
    00142         }
    00143
    00144         /* Select direction and initial pin state */
    00145         if (flags & PORTMUX_DIR_OUTPUT) {
    00146                 if (flags & PORTMUX_INIT_HIGH)
    00147                         gpio_write_reg(port, OVRS, pin_mask);
    00148                 else
    00149                         gpio_write_reg(port, OVRC, pin_mask);
    00150                 gpio_write_reg(port, ODERS, pin_mask);
    00151         } else {
    00152                 gpio_write_reg(port, ODERC, pin_mask);
    00153         }
    00154
    00155         /* Enable GPIO */
    00156         gpio_write_reg(port, GPERS, pin_mask);
    00157 }
    00158
    00170 void gpio_set_value_noninline(gpio_pin_t pin, bool value)
    00171 {
    00172         gpio_set_value_inline(pin, value);
    00173 }
    00174
    00183 bool gpio_get_value_noninline(gpio_pin_t pin)
    00184 {
    00185         return gpio_get_value_inline(pin);
    00186 }
    00187
    00188 __weak void __portmux_error_bad_id(const char *periph_type, unsigned int id)
    00189 {
    00190         dbg_printf("portmux: Bad ID %u for peripheral type %s\n",
    00191                         id, periph_type);
    00192 }