| /* pinmux_board_galileo.c - pin out mapping for the Galileo board */ |
| |
| /* |
| * Copyright (c) 2016 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <kernel.h> |
| #include "board.h" |
| #include <device.h> |
| #include <init.h> |
| |
| #include <pinmux.h> |
| #include <i2c.h> |
| #include <gpio.h> |
| #include <pwm.h> |
| |
| #include <pinmux/pinmux.h> |
| |
| #include "pinmux_galileo.h" |
| |
| /* max number of functions per pin */ |
| #define NUM_PIN_FUNCS 4 |
| |
| enum gpio_chip { |
| NONE, |
| EXP0, |
| EXP1, |
| EXP2, |
| PWM0, |
| G_DW, |
| G_CW, |
| G_RW, |
| }; |
| |
| enum pin_level { |
| PIN_LOW = 0x00, |
| PIN_HIGH = 0x01, |
| DONT_CARE = 0xFF, |
| }; |
| |
| struct mux_pin { |
| enum gpio_chip mux; |
| u8_t pin; |
| enum pin_level level; |
| |
| /* Pin configuration (e.g. direction, pull up/down, etc.) */ |
| u32_t cfg; |
| }; |
| |
| /* |
| * This structure provides the breakdown mapping for the pinmux to follow to |
| * enable each functionality within the hardware. There should be nothing to |
| * edit here unless you absolutely know what you are doing |
| */ |
| struct mux_path { |
| u8_t io_pin; |
| u8_t func; |
| struct mux_pin path[5]; |
| }; |
| |
| static struct mux_path _galileo_path[PINMUX_NUM_PINS * NUM_PIN_FUNCS] = { |
| {0, PINMUX_FUNC_A, {{ EXP1, 0, PIN_HIGH, (GPIO_DIR_OUT) }, /* GPIO3 out */ |
| { EXP1, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 3, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {0, PINMUX_FUNC_B, {{ EXP1, 0, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO3 in */ |
| { EXP1, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 3, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {0, PINMUX_FUNC_C, {{ EXP1, 0, PIN_HIGH, (GPIO_DIR_OUT) }, /* UART0_RXD */ |
| { EXP1, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {0, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {1, PINMUX_FUNC_A, {{ EXP1, 13, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO4 out */ |
| { EXP0, 12, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 13, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 4, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {1, PINMUX_FUNC_B, {{ EXP1, 13, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO4 in */ |
| { EXP0, 12, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 13, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 4, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {1, PINMUX_FUNC_C, {{ EXP1, 13, PIN_HIGH, (GPIO_DIR_OUT) }, /* UART0_TXD */ |
| { EXP0, 12, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 13, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {1, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {2, PINMUX_FUNC_A, {{ PWM0, 13, PIN_HIGH, (GPIO_DIR_OUT) }, /* GPIO5 out */ |
| { EXP1, 2, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP1, 3, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {2, PINMUX_FUNC_B, {{ PWM0, 13, PIN_HIGH, (GPIO_DIR_OUT) }, /* GPIO5 in */ |
| { EXP1, 2, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP1, 3, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 5, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {2, PINMUX_FUNC_C, {{ PWM0, 13, PIN_LOW, (GPIO_DIR_OUT) }, /* UART1_RXD */ |
| { EXP1, 2, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP1, 3, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {2, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {3, PINMUX_FUNC_A, {{ PWM0, 0, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO6 out */ |
| { PWM0, 12, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 0, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 6, PIN_LOW, (GPIO_DIR_OUT) } } }, |
| {3, PINMUX_FUNC_B, {{ PWM0, 0, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO6 in */ |
| { PWM0, 12, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 0, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 6, PIN_LOW, (GPIO_DIR_IN) } } }, |
| {3, PINMUX_FUNC_C, {{ PWM0, 0, PIN_LOW, (GPIO_DIR_OUT) }, /* UART1_TXD */ |
| { PWM0, 12, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 0, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {3, PINMUX_FUNC_D, {{ PWM0, 0, PIN_HIGH, (GPIO_DIR_OUT) }, /* PWM.LED1 */ |
| { PWM0, 12, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 0, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {4, PINMUX_FUNC_A, {{ EXP1, 4, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS4 out */ |
| { EXP1, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 4, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {4, PINMUX_FUNC_B, {{ EXP1, 4, PIN_HIGH, (GPIO_DIR_OUT) }, /* GPIO_SUS4 in */ |
| { EXP1, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 4, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {4, PINMUX_FUNC_C, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {4, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {5, PINMUX_FUNC_A, {{ PWM0, 2, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO8 (out) */ |
| { EXP0, 2, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 3, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_CW, 0, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {5, PINMUX_FUNC_B, {{ PWM0, 2, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO8 (in) */ |
| { EXP0, 2, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 3, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_CW, 0, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {5, PINMUX_FUNC_C, {{ PWM0, 2, PIN_HIGH, (GPIO_DIR_OUT) }, /* PWM.LED3 */ |
| { EXP0, 2, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 3, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {5, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {6, PINMUX_FUNC_A, {{ PWM0, 4, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO9 (out) */ |
| { EXP0, 4, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_CW, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {6, PINMUX_FUNC_B, {{ PWM0, 4, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO9 (in) */ |
| { EXP0, 4, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_CW, 1, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {6, PINMUX_FUNC_C, {{ PWM0, 4, PIN_HIGH, (GPIO_DIR_OUT) }, /* PWM.LED5 */ |
| { EXP0, 4, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {6, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {7, PINMUX_FUNC_A, {{ EXP1, 6, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS0 (out) */ |
| { EXP1, 7, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 0, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {7, PINMUX_FUNC_B, {{ EXP1, 6, PIN_LOW, (GPIO_DIR_IN) }, /* GPIO_SUS0 (in) */ |
| { EXP1, 7, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 0, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {7, PINMUX_FUNC_C, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {7, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {8, PINMUX_FUNC_A, {{ EXP1, 8, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS1 (out) */ |
| { EXP1, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {8, PINMUX_FUNC_B, {{ EXP1, 8, PIN_LOW, (GPIO_DIR_IN) }, /* GPIO_SUS1 (in) */ |
| { EXP1, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 1, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {8, PINMUX_FUNC_C, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {8, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {9, PINMUX_FUNC_A, {{ PWM0, 6, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS2 (out) */ |
| { EXP0, 6, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 7, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 2, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {9, PINMUX_FUNC_B, {{ PWM0, 6, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS2 (in) */ |
| { EXP0, 6, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 7, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 2, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {9, PINMUX_FUNC_C, {{ PWM0, 6, PIN_HIGH, (GPIO_DIR_OUT) }, /* PWM.LED7 */ |
| { EXP0, 6, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 7, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {9, PINMUX_FUNC_C, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {10, PINMUX_FUNC_A, {{ PWM0, 10, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO2 (out) */ |
| { EXP0, 10, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 2, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {10, PINMUX_FUNC_B, {{ PWM0, 10, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO2 (in) */ |
| { EXP0, 10, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 2, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {10, PINMUX_FUNC_C, {{ PWM0, 10, PIN_HIGH, (GPIO_DIR_OUT) }, /* PWM.LED11 */ |
| { EXP0, 10, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {10, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {11, PINMUX_FUNC_A, {{ EXP1, 12, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS3 (out) */ |
| { PWM0, 8, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 8, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 3, PIN_LOW, (GPIO_DIR_OUT) } } }, |
| {11, PINMUX_FUNC_B, {{ EXP1, 12, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS3 (in) */ |
| { PWM0, 8, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 8, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 3, PIN_LOW, (GPIO_DIR_IN) } } }, |
| {11, PINMUX_FUNC_C, {{ EXP1, 12, PIN_LOW, (GPIO_DIR_OUT) }, /* PWM.LED9 */ |
| { PWM0, 8, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 8, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {11, PINMUX_FUNC_D, {{ EXP1, 12, PIN_HIGH, (GPIO_DIR_OUT) }, /* SPI1_MOSI */ |
| { PWM0, 8, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 8, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {12, PINMUX_FUNC_A, {{ EXP1, 10, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO7 (out) */ |
| { EXP1, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 7, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {12, PINMUX_FUNC_B, {{ EXP1, 10, PIN_HIGH, (GPIO_DIR_OUT) }, /* GPIO7 (in) */ |
| { EXP1, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 7, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {12, PINMUX_FUNC_C, {{ EXP1, 10, PIN_HIGH, (GPIO_DIR_OUT) }, /* SPI1_MISO */ |
| { EXP1, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_DW, 7, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {12, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {13, PINMUX_FUNC_A, {{ EXP1, 14, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS5 (out) */ |
| { EXP0, 14, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 15, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {13, PINMUX_FUNC_B, {{ EXP1, 14, PIN_LOW, (GPIO_DIR_OUT) }, /* GPIO_SUS5 (in) */ |
| { EXP0, 14, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP0, 15, PIN_LOW, (GPIO_DIR_OUT) }, |
| { G_RW, 5, PIN_LOW, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {13, PINMUX_FUNC_C, {{ EXP1, 14, PIN_HIGH, (GPIO_DIR_OUT) }, /* SPI1_CLK */ |
| { EXP0, 14, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP0, 15, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {13, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {14, PINMUX_FUNC_A, {{ EXP2, 0, PIN_LOW, (GPIO_DIR_OUT) }, /* EXP2.P0_0 (out)/ADC.IN0 */ |
| { EXP2, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {14, PINMUX_FUNC_B, {{ EXP2, 0, PIN_LOW, (GPIO_DIR_IN) }, /* EXP2.P0_0 (in)/ADC.IN0 */ |
| { EXP2, 1, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {14, PINMUX_FUNC_C, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {14, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {15, PINMUX_FUNC_A, {{ EXP2, 2, PIN_LOW, (GPIO_DIR_OUT) }, /* EXP2.P0_2 (out)/ADC.IN1 */ |
| { EXP2, 3, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {15, PINMUX_FUNC_B, {{ EXP2, 2, PIN_LOW, (GPIO_DIR_IN) }, /* EXP2.P0_2 (in)/ADC.IN1 */ |
| { EXP2, 3, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {15, PINMUX_FUNC_C, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {15, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {16, PINMUX_FUNC_A, {{ EXP2, 4, PIN_LOW, (GPIO_DIR_OUT) }, /* EXP2.P0_4 (out)/ADC.IN2 */ |
| { EXP2, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {16, PINMUX_FUNC_B, {{ EXP2, 4, PIN_LOW, (GPIO_DIR_IN) }, /* EXP2.P0_4 (in)/ADC.IN2 */ |
| { EXP2, 5, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {16, PINMUX_FUNC_C, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {16, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {17, PINMUX_FUNC_A, {{ EXP2, 6, PIN_LOW, (GPIO_DIR_OUT) }, /* EXP2.P0_6 (out)/ADC.IN3 */ |
| { EXP2, 7, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {17, PINMUX_FUNC_B, {{ EXP2, 6, PIN_LOW, (GPIO_DIR_IN) }, /* EXP2.P0_6 (in)/ADC.IN3 */ |
| { EXP2, 7, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {17, PINMUX_FUNC_C, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {17, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {18, PINMUX_FUNC_A, {{ PWM0, 14, PIN_HIGH, (GPIO_DIR_OUT) }, /* EXP2.P1_0 (out) */ |
| { EXP2, 12, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP2, 8, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP2, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {18, PINMUX_FUNC_B, {{ PWM0, 14, PIN_LOW, (GPIO_DIR_OUT) }, /* ADC.IN4 (in) */ |
| { EXP2, 12, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP2, 8, PIN_LOW, (GPIO_DIR_IN) }, |
| { EXP2, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {18, PINMUX_FUNC_C, {{ PWM0, 14, PIN_HIGH, (GPIO_DIR_OUT) }, /* I2C SDA */ |
| { EXP2, 9, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP2, 12, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {18, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| |
| {19, PINMUX_FUNC_A, {{ PWM0, 15, PIN_HIGH, (GPIO_DIR_OUT) }, /* EXP2.P1_2 (out)*/ |
| { EXP2, 12, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP2, 10, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP2, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {19, PINMUX_FUNC_B, {{ PWM0, 15, PIN_LOW, (GPIO_DIR_OUT) }, /* ADC.IN5 */ |
| { EXP2, 12, PIN_HIGH, (GPIO_DIR_OUT) }, |
| { EXP2, 10, PIN_LOW, (GPIO_DIR_IN) }, |
| { EXP2, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {19, PINMUX_FUNC_C, {{ PWM0, 15, PIN_HIGH, (GPIO_DIR_OUT) }, /* I2C SCL */ |
| { EXP2, 11, PIN_LOW, (GPIO_DIR_OUT) }, |
| { EXP2, 12, PIN_LOW, (GPIO_DIR_OUT) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| {19, PINMUX_FUNC_D, {{ NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, /* NONE */ |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) }, |
| { NONE, 0, DONT_CARE, (GPIO_DIR_IN) } } }, |
| }; |
| |
| int z_galileo_pinmux_set_pin(struct device *port, u8_t pin, u32_t func) |
| { |
| struct galileo_data * const drv_data = port->driver_data; |
| |
| u8_t mux_index = 0U; |
| u8_t i = 0U; |
| struct mux_path *enable = NULL; |
| struct pin_config *mux_config = drv_data->mux_config; |
| |
| if (pin > PINMUX_NUM_PINS) { |
| return -ENOTSUP; |
| } |
| |
| mux_config[pin].mode = func; |
| |
| /* NUM_PIN_FUNCS being the number of alt functions */ |
| mux_index = NUM_PIN_FUNCS * pin; |
| /* |
| * functions are in numeric order, we can just skip to the index |
| * needed |
| */ |
| mux_index += func; |
| |
| enable = &_galileo_path[mux_index]; |
| |
| for (i = 0U; i < 5; i++) { |
| switch (enable->path[i].mux) { |
| case EXP0: |
| gpio_pin_write(drv_data->exp0, |
| enable->path[i].pin, |
| enable->path[i].level); |
| gpio_pin_configure(drv_data->exp0, |
| enable->path[i].pin, |
| enable->path[i].cfg); |
| break; |
| case EXP1: |
| gpio_pin_write(drv_data->exp1, |
| enable->path[i].pin, |
| enable->path[i].level); |
| gpio_pin_configure(drv_data->exp1, |
| enable->path[i].pin, |
| enable->path[i].cfg); |
| break; |
| case EXP2: |
| gpio_pin_write(drv_data->exp2, |
| enable->path[i].pin, |
| enable->path[i].level); |
| gpio_pin_configure(drv_data->exp2, |
| enable->path[i].pin, |
| enable->path[i].cfg); |
| break; |
| case PWM0: |
| pwm_pin_set_cycles(drv_data->pwm0, |
| enable->path[i].pin, |
| 100, |
| enable->path[i].level ? 100 : 0); |
| break; |
| case G_DW: |
| gpio_pin_write(drv_data->gpio_dw, |
| enable->path[i].pin, |
| enable->path[i].level); |
| gpio_pin_configure(drv_data->gpio_dw, |
| enable->path[i].pin, |
| enable->path[i].cfg); |
| break; |
| case G_CW: |
| gpio_pin_write(drv_data->gpio_core, |
| enable->path[i].pin, |
| enable->path[i].level); |
| gpio_pin_configure(drv_data->gpio_core, |
| enable->path[i].pin, |
| enable->path[i].cfg); |
| break; |
| case G_RW: |
| gpio_pin_write(drv_data->gpio_resume, |
| enable->path[i].pin, |
| enable->path[i].level); |
| gpio_pin_configure(drv_data->gpio_resume, |
| enable->path[i].pin, |
| enable->path[i].cfg); |
| break; |
| |
| case NONE: |
| /* no need to do anything */ |
| break; |
| default: |
| __ASSERT(false, "Invalid pinmux option"); |
| break; |
| } |
| } |
| |
| return 0; |
| } |
| |
| int z_galileo_pinmux_get_pin(struct device *port, u32_t pin, u32_t *func) |
| { |
| struct galileo_data * const drv_data = port->driver_data; |
| struct pin_config *mux_config = drv_data->mux_config; |
| |
| *func = mux_config[pin].mode; |
| |
| return 0; |
| } |
| |
| /* Alter this table to change the default pin settings on the Galileo Gen2 |
| * boards. Specifically change the PINMUX_FUNC_* value to represent the |
| * functionaltiy desired |
| */ |
| static struct pin_config mux_config[PINMUX_NUM_PINS] = { |
| /* pin, selected mode <mode A, mode B, mode C, mode D> */ |
| /* Analog Inputs */ |
| { 0, PINMUX_FUNC_C }, /* GPIO3 (out), GPIO3 (in), UART0_RXD, NA */ |
| { 1, PINMUX_FUNC_C }, /* GPIO4 (out), GPIO4 (in), UART0_TXD, NA */ |
| { 2, PINMUX_FUNC_C }, /* GPIO5 (out), GPIO5 (in), UART1_RXD, NA */ |
| { 3, PINMUX_FUNC_C }, /* GPIO6 (out), GPIO6 (in), UART1_TXD, PWM.LED1 */ |
| { 4, PINMUX_FUNC_B }, /* GPIO_SUS4 (out), GPIO_SUS4 (in), NA, NA */ |
| { 5, PINMUX_FUNC_B }, /* GPIO8 (out), GPIO8 (in), PWM.LED3, NA */ |
| { 6, PINMUX_FUNC_B }, /* GPIO9 (out), GPIO9 (in), PWM.LED5, NA */ |
| { 7, PINMUX_FUNC_A }, /* EXP1.P0_6 (out), EXP1.P0_6 (in), NA, NA */ |
| { 8, PINMUX_FUNC_A }, /* EXP1.P1_0 (out), EXP1.P1_0 (in), NA, NA */ |
| { 9, PINMUX_FUNC_B }, /* GPIO_SUS2 (out), GPIO_SUS2 (in), PWM.LED7, NA */ |
| #if defined(CONFIG_SPI_1) |
| { 10, PINMUX_FUNC_A }, /* GPIO2 (out), GPIO2 (in), PWM.LED11, NA */ |
| { 11, PINMUX_FUNC_D }, /* GPIO_SUS3 (out), GPIO_SUS3 (in), PWM.LED9, SPI1_MOSI */ |
| { 12, PINMUX_FUNC_C }, /* GPIO7 (out), GPIO7 (in), SPI1_MISO, NA */ |
| { 13, PINMUX_FUNC_C }, /* GPIO_SUS5 (out), GPIO_SUS5(in), SPI1_SCK, NA */ |
| #else |
| { 10, PINMUX_FUNC_B }, /* GPIO2 (out), GPIO2 (in), PWM.LED11, NA */ |
| { 11, PINMUX_FUNC_B }, /* GPIO_SUS3 (out), GPIO_SUS3 (in), PWM.LED9, SPI1_MOSI */ |
| { 12, PINMUX_FUNC_B }, /* GPIO7 (out), GPIO7 (in), SPI1_MISO, NA */ |
| { 13, PINMUX_FUNC_B }, /* GPIO_SUS5 (out), GPIO_SUS5(in), SPI1_SCK, NA */ |
| #endif |
| { 14, PINMUX_FUNC_B }, /* EXP2.P0_0 (out)/ADC.IN0, EXP2.P0_0 (in)/ADC.IN0, NA, NA */ |
| { 15, PINMUX_FUNC_B }, /* EXP2.P0_2 (out)/ADC.IN1, EXP2.P0_2 (in)/ADC.IN1, NA, NA */ |
| { 16, PINMUX_FUNC_B }, /* EXP2.P0_4 (out)/ADC.IN2, EXP2.P0_4 (in)/ADC.IN2, NA, NA */ |
| { 17, PINMUX_FUNC_B }, /* EXP2.P0_6 (out)/ADC.IN3, EXP2.P0_6 (in)/ADC.IN3, NA, NA */ |
| { 18, PINMUX_FUNC_C }, /* EXP2.P1_0 (out), ADC.IN4, I2C_SDA, NA */ |
| { 19, PINMUX_FUNC_C }, /* EXP2.P1_2 (out), ADC.IN5, I2C_SCL, NA */ |
| }; |
| |
| static int pinmux_pullup(struct device *dev, |
| u32_t pin, |
| u8_t func) |
| { |
| /* |
| * Nothing to do. |
| * On Galileo the pullup operation is handled through the selection |
| * of an actual pin |
| */ |
| ARG_UNUSED(dev); |
| ARG_UNUSED(pin); |
| ARG_UNUSED(func); |
| |
| return 0; |
| } |
| |
| static int pinmux_input_enable(struct device *dev, |
| u32_t pin, |
| u8_t func) |
| { |
| /* |
| * Nothing to do. |
| * On Galileo select a pin for input enabling is handled through the |
| * selection of an actual pin user configuration. |
| */ |
| ARG_UNUSED(dev); |
| ARG_UNUSED(pin); |
| ARG_UNUSED(func); |
| |
| return 0; |
| } |
| |
| static int pinmux_set(struct device *dev, |
| u32_t pin, |
| u32_t func) |
| { |
| if (pin > PINMUX_NUM_PINS) { |
| return -EINVAL; |
| } |
| |
| return z_galileo_pinmux_set_pin(dev, pin, func); |
| } |
| |
| static int pinmux_get(struct device *dev, |
| u32_t pin, |
| u32_t *func) |
| { |
| if (pin > PINMUX_NUM_PINS) { |
| return -EINVAL; |
| } |
| |
| return z_galileo_pinmux_get_pin(dev, pin, func); |
| } |
| |
| static struct pinmux_driver_api api_funcs = { |
| .set = pinmux_set, |
| .get = pinmux_get, |
| .pullup = pinmux_pullup, |
| .input = pinmux_input_enable |
| }; |
| |
| struct galileo_data galileo_pinmux_driver = { |
| .exp0 = NULL, |
| .exp1 = NULL, |
| .exp2 = NULL, |
| .pwm0 = NULL, |
| .mux_config = mux_config, |
| }; |
| |
| static int pinmux_galileo_initialize(struct device *port) |
| { |
| struct galileo_data *dev = port->driver_data; |
| int i; |
| |
| /* Grab the EXP0, EXP1, EXP2, and PWM0 now by name */ |
| dev->exp0 = device_get_binding(PINMUX_GALILEO_EXP0_NAME); |
| if (!dev->exp0) { |
| return -EINVAL; |
| } |
| dev->exp1 = device_get_binding(PINMUX_GALILEO_EXP1_NAME); |
| if (!dev->exp1) { |
| return -EINVAL; |
| } |
| dev->exp2 = device_get_binding(PINMUX_GALILEO_EXP2_NAME); |
| if (!dev->exp2) { |
| return -EINVAL; |
| } |
| dev->pwm0 = device_get_binding(PINMUX_GALILEO_PWM0_NAME); |
| if (!dev->pwm0) { |
| return -EINVAL; |
| } |
| dev->gpio_dw = device_get_binding(PINMUX_GALILEO_GPIO_DW_NAME); |
| if (!dev->gpio_dw) { |
| return -EINVAL; |
| } |
| dev->gpio_core = device_get_binding( |
| PINMUX_GALILEO_GPIO_INTEL_CW_NAME); |
| if (!dev->gpio_core) { |
| return -EINVAL; |
| } |
| dev->gpio_resume = device_get_binding( |
| PINMUX_GALILEO_GPIO_INTEL_RW_NAME); |
| if (!dev->gpio_resume) { |
| return -EINVAL; |
| } |
| |
| /* |
| * Now that we have everything, let us start parsing everything |
| * from the above mapping as selected by the end user |
| */ |
| for (i = 0; i < PINMUX_NUM_PINS; i++) { |
| z_galileo_pinmux_set_pin(port, |
| mux_config[i].pin_num, |
| mux_config[i].mode); |
| } |
| |
| return 0; |
| } |
| |
| /* |
| * This needs to be a level 2 or later init process due to the following |
| * dependency chain: |
| * 0 - I2C |
| * 1 - PCA9535 and PCAL9685 |
| * 2 - pinmux |
| */ |
| DEVICE_AND_API_INIT(pmux, CONFIG_PINMUX_NAME, &pinmux_galileo_initialize, |
| &galileo_pinmux_driver, NULL, |
| POST_KERNEL, CONFIG_PINMUX_INIT_PRIORITY, &api_funcs); |