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
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
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
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
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
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
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
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
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
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 }