2016-03-03 22:33:15 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2016 Open-RnD Sp. z o.o.
|
|
|
|
*
|
2017-01-19 09:01:01 +08:00
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
2016-03-03 22:33:15 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @file header for STM32 pin multiplexing
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _STM32_PINMUX_H_
|
|
|
|
#define _STM32_PINMUX_H_
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <clock_control.h>
|
2016-03-22 04:14:15 +08:00
|
|
|
#include "pinmux/pinmux.h"
|
2016-03-03 22:33:15 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief numerical IDs for IO ports
|
|
|
|
*/
|
|
|
|
enum stm32_pin_port {
|
|
|
|
STM32_PORTA = 0, /* IO port A */
|
|
|
|
STM32_PORTB, /* .. */
|
|
|
|
STM32_PORTC,
|
|
|
|
STM32_PORTD,
|
|
|
|
STM32_PORTE,
|
|
|
|
STM32_PORTF,
|
|
|
|
STM32_PORTG,
|
|
|
|
STM32_PORTH, /* IO port H */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* override this at soc level */
|
|
|
|
#ifndef STM32_PORTS_MAX
|
|
|
|
#define STM32_PORTS_MAX (STM32_PORTH + 1)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper macro to encode an IO port pin in a numerical format
|
|
|
|
*/
|
|
|
|
#define STM32PIN(_port, _pin) \
|
|
|
|
(_port << 4 | _pin)
|
|
|
|
|
|
|
|
/*
|
|
|
|
*/
|
|
|
|
enum stm32_pin_alt_func {
|
|
|
|
STM32_PINMUX_FUNC_ALT_0 = 0, /* GPIO */
|
|
|
|
STM32_PINMUX_FUNC_ALT_1,
|
|
|
|
STM32_PINMUX_FUNC_ALT_2,
|
|
|
|
STM32_PINMUX_FUNC_ALT_3,
|
|
|
|
STM32_PINMUX_FUNC_ALT_4,
|
|
|
|
STM32_PINMUX_FUNC_ALT_5,
|
|
|
|
STM32_PINMUX_FUNC_ALT_6,
|
|
|
|
STM32_PINMUX_FUNC_ALT_7,
|
2016-08-11 05:28:32 +08:00
|
|
|
STM32_PINMUX_FUNC_ALT_8,
|
|
|
|
STM32_PINMUX_FUNC_ALT_9,
|
|
|
|
STM32_PINMUX_FUNC_ALT_10,
|
|
|
|
STM32_PINMUX_FUNC_ALT_11,
|
|
|
|
STM32_PINMUX_FUNC_ALT_12,
|
|
|
|
STM32_PINMUX_FUNC_ALT_13,
|
|
|
|
STM32_PINMUX_FUNC_ALT_14,
|
|
|
|
STM32_PINMUX_FUNC_ALT_15,
|
2016-12-21 16:56:20 +08:00
|
|
|
STM32_PINMUX_FUNC_ALT_16,
|
2016-03-03 22:33:15 +08:00
|
|
|
STM32_PINMUX_FUNC_ALT_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define STM32_PINMUX_FUNC_GPIO 0
|
|
|
|
#define STM32_PINMUX_FUNC_ANALOG (STM32_PINMUX_FUNC_ALT_MAX)
|
|
|
|
|
|
|
|
#define STM32_PIN_PA0 STM32PIN(STM32_PORTA, 0)
|
|
|
|
#define STM32_PIN_PA1 STM32PIN(STM32_PORTA, 1)
|
|
|
|
#define STM32_PIN_PA2 STM32PIN(STM32_PORTA, 2)
|
|
|
|
#define STM32_PIN_PA3 STM32PIN(STM32_PORTA, 3)
|
|
|
|
#define STM32_PIN_PA4 STM32PIN(STM32_PORTA, 4)
|
|
|
|
#define STM32_PIN_PA5 STM32PIN(STM32_PORTA, 5)
|
|
|
|
#define STM32_PIN_PA6 STM32PIN(STM32_PORTA, 6)
|
|
|
|
#define STM32_PIN_PA7 STM32PIN(STM32_PORTA, 7)
|
|
|
|
#define STM32_PIN_PA8 STM32PIN(STM32_PORTA, 8)
|
|
|
|
#define STM32_PIN_PA9 STM32PIN(STM32_PORTA, 9)
|
|
|
|
#define STM32_PIN_PA10 STM32PIN(STM32_PORTA, 10)
|
|
|
|
#define STM32_PIN_PA11 STM32PIN(STM32_PORTA, 11)
|
|
|
|
#define STM32_PIN_PA12 STM32PIN(STM32_PORTA, 12)
|
|
|
|
#define STM32_PIN_PA13 STM32PIN(STM32_PORTA, 13)
|
|
|
|
#define STM32_PIN_PA14 STM32PIN(STM32_PORTA, 14)
|
|
|
|
#define STM32_PIN_PA15 STM32PIN(STM32_PORTA, 15)
|
|
|
|
|
|
|
|
#define STM32_PIN_PB0 STM32PIN(STM32_PORTB, 0)
|
|
|
|
#define STM32_PIN_PB1 STM32PIN(STM32_PORTB, 1)
|
|
|
|
#define STM32_PIN_PB2 STM32PIN(STM32_PORTB, 2)
|
|
|
|
#define STM32_PIN_PB3 STM32PIN(STM32_PORTB, 3)
|
|
|
|
#define STM32_PIN_PB4 STM32PIN(STM32_PORTB, 4)
|
|
|
|
#define STM32_PIN_PB5 STM32PIN(STM32_PORTB, 5)
|
|
|
|
#define STM32_PIN_PB6 STM32PIN(STM32_PORTB, 6)
|
|
|
|
#define STM32_PIN_PB7 STM32PIN(STM32_PORTB, 7)
|
|
|
|
#define STM32_PIN_PB8 STM32PIN(STM32_PORTB, 8)
|
|
|
|
#define STM32_PIN_PB9 STM32PIN(STM32_PORTB, 9)
|
|
|
|
#define STM32_PIN_PB10 STM32PIN(STM32_PORTB, 10)
|
|
|
|
#define STM32_PIN_PB11 STM32PIN(STM32_PORTB, 11)
|
|
|
|
#define STM32_PIN_PB12 STM32PIN(STM32_PORTB, 12)
|
|
|
|
#define STM32_PIN_PB13 STM32PIN(STM32_PORTB, 13)
|
|
|
|
#define STM32_PIN_PB14 STM32PIN(STM32_PORTB, 14)
|
|
|
|
#define STM32_PIN_PB15 STM32PIN(STM32_PORTB, 15)
|
|
|
|
|
|
|
|
#define STM32_PIN_PC0 STM32PIN(STM32_PORTC, 0)
|
|
|
|
#define STM32_PIN_PC1 STM32PIN(STM32_PORTC, 1)
|
|
|
|
#define STM32_PIN_PC2 STM32PIN(STM32_PORTC, 2)
|
|
|
|
#define STM32_PIN_PC3 STM32PIN(STM32_PORTC, 3)
|
|
|
|
#define STM32_PIN_PC4 STM32PIN(STM32_PORTC, 4)
|
|
|
|
#define STM32_PIN_PC5 STM32PIN(STM32_PORTC, 5)
|
|
|
|
#define STM32_PIN_PC6 STM32PIN(STM32_PORTC, 6)
|
|
|
|
#define STM32_PIN_PC7 STM32PIN(STM32_PORTC, 7)
|
|
|
|
#define STM32_PIN_PC8 STM32PIN(STM32_PORTC, 8)
|
|
|
|
#define STM32_PIN_PC9 STM32PIN(STM32_PORTC, 9)
|
|
|
|
#define STM32_PIN_PC10 STM32PIN(STM32_PORTC, 10)
|
|
|
|
#define STM32_PIN_PC11 STM32PIN(STM32_PORTC, 11)
|
|
|
|
#define STM32_PIN_PC12 STM32PIN(STM32_PORTC, 12)
|
|
|
|
#define STM32_PIN_PC13 STM32PIN(STM32_PORTC, 13)
|
|
|
|
#define STM32_PIN_PC14 STM32PIN(STM32_PORTC, 14)
|
|
|
|
#define STM32_PIN_PC15 STM32PIN(STM32_PORTC, 15)
|
|
|
|
|
|
|
|
#define STM32_PIN_PD0 STM32PIN(STM32_PORTD, 0)
|
|
|
|
#define STM32_PIN_PD1 STM32PIN(STM32_PORTD, 1)
|
|
|
|
#define STM32_PIN_PD2 STM32PIN(STM32_PORTD, 2)
|
|
|
|
#define STM32_PIN_PD3 STM32PIN(STM32_PORTD, 3)
|
|
|
|
#define STM32_PIN_PD4 STM32PIN(STM32_PORTD, 4)
|
|
|
|
#define STM32_PIN_PD5 STM32PIN(STM32_PORTD, 5)
|
|
|
|
#define STM32_PIN_PD6 STM32PIN(STM32_PORTD, 6)
|
|
|
|
#define STM32_PIN_PD7 STM32PIN(STM32_PORTD, 7)
|
|
|
|
#define STM32_PIN_PD8 STM32PIN(STM32_PORTD, 8)
|
|
|
|
#define STM32_PIN_PD9 STM32PIN(STM32_PORTD, 9)
|
|
|
|
#define STM32_PIN_PD10 STM32PIN(STM32_PORTD, 10)
|
|
|
|
#define STM32_PIN_PD11 STM32PIN(STM32_PORTD, 11)
|
|
|
|
#define STM32_PIN_PD12 STM32PIN(STM32_PORTD, 12)
|
|
|
|
#define STM32_PIN_PD13 STM32PIN(STM32_PORTD, 13)
|
|
|
|
#define STM32_PIN_PD14 STM32PIN(STM32_PORTD, 14)
|
|
|
|
#define STM32_PIN_PD15 STM32PIN(STM32_PORTD, 15)
|
|
|
|
|
|
|
|
#define STM32_PIN_PE0 STM32PIN(STM32_PORTE, 0)
|
|
|
|
#define STM32_PIN_PE1 STM32PIN(STM32_PORTE, 1)
|
|
|
|
#define STM32_PIN_PE2 STM32PIN(STM32_PORTE, 2)
|
|
|
|
#define STM32_PIN_PE3 STM32PIN(STM32_PORTE, 3)
|
|
|
|
#define STM32_PIN_PE4 STM32PIN(STM32_PORTE, 4)
|
|
|
|
#define STM32_PIN_PE5 STM32PIN(STM32_PORTE, 5)
|
|
|
|
#define STM32_PIN_PE6 STM32PIN(STM32_PORTE, 6)
|
|
|
|
#define STM32_PIN_PE7 STM32PIN(STM32_PORTE, 7)
|
|
|
|
#define STM32_PIN_PE8 STM32PIN(STM32_PORTE, 8)
|
|
|
|
#define STM32_PIN_PE9 STM32PIN(STM32_PORTE, 9)
|
|
|
|
#define STM32_PIN_PE10 STM32PIN(STM32_PORTE, 10)
|
|
|
|
#define STM32_PIN_PE11 STM32PIN(STM32_PORTE, 11)
|
|
|
|
#define STM32_PIN_PE12 STM32PIN(STM32_PORTE, 12)
|
|
|
|
#define STM32_PIN_PE13 STM32PIN(STM32_PORTE, 13)
|
|
|
|
#define STM32_PIN_PE14 STM32PIN(STM32_PORTE, 14)
|
|
|
|
#define STM32_PIN_PE15 STM32PIN(STM32_PORTE, 15)
|
|
|
|
|
|
|
|
#define STM32_PIN_PF0 STM32PIN(STM32_PORTF, 0)
|
|
|
|
#define STM32_PIN_PF1 STM32PIN(STM32_PORTF, 1)
|
|
|
|
#define STM32_PIN_PF2 STM32PIN(STM32_PORTF, 2)
|
|
|
|
#define STM32_PIN_PF3 STM32PIN(STM32_PORTF, 3)
|
|
|
|
#define STM32_PIN_PF4 STM32PIN(STM32_PORTF, 4)
|
|
|
|
#define STM32_PIN_PF5 STM32PIN(STM32_PORTF, 5)
|
|
|
|
#define STM32_PIN_PF6 STM32PIN(STM32_PORTF, 6)
|
|
|
|
#define STM32_PIN_PF7 STM32PIN(STM32_PORTF, 7)
|
|
|
|
#define STM32_PIN_PF8 STM32PIN(STM32_PORTF, 8)
|
|
|
|
#define STM32_PIN_PF9 STM32PIN(STM32_PORTF, 9)
|
|
|
|
#define STM32_PIN_PF10 STM32PIN(STM32_PORTF, 10)
|
|
|
|
#define STM32_PIN_PF11 STM32PIN(STM32_PORTF, 11)
|
|
|
|
#define STM32_PIN_PF12 STM32PIN(STM32_PORTF, 12)
|
|
|
|
#define STM32_PIN_PF13 STM32PIN(STM32_PORTF, 13)
|
|
|
|
#define STM32_PIN_PF14 STM32PIN(STM32_PORTF, 14)
|
|
|
|
#define STM32_PIN_PF15 STM32PIN(STM32_PORTF, 15)
|
|
|
|
|
|
|
|
#define STM32_PIN_PG0 STM32PIN(STM32_PORTG, 0)
|
|
|
|
#define STM32_PIN_PG1 STM32PIN(STM32_PORTG, 1)
|
|
|
|
#define STM32_PIN_PG2 STM32PIN(STM32_PORTG, 2)
|
|
|
|
#define STM32_PIN_PG3 STM32PIN(STM32_PORTG, 3)
|
|
|
|
#define STM32_PIN_PG4 STM32PIN(STM32_PORTG, 4)
|
|
|
|
#define STM32_PIN_PG5 STM32PIN(STM32_PORTG, 5)
|
|
|
|
#define STM32_PIN_PG6 STM32PIN(STM32_PORTG, 6)
|
|
|
|
#define STM32_PIN_PG7 STM32PIN(STM32_PORTG, 7)
|
|
|
|
#define STM32_PIN_PG8 STM32PIN(STM32_PORTG, 8)
|
|
|
|
#define STM32_PIN_PG9 STM32PIN(STM32_PORTG, 9)
|
|
|
|
#define STM32_PIN_PG10 STM32PIN(STM32_PORTG, 10)
|
|
|
|
#define STM32_PIN_PG11 STM32PIN(STM32_PORTG, 11)
|
|
|
|
#define STM32_PIN_PG12 STM32PIN(STM32_PORTG, 12)
|
|
|
|
#define STM32_PIN_PG13 STM32PIN(STM32_PORTG, 13)
|
|
|
|
#define STM32_PIN_PG14 STM32PIN(STM32_PORTG, 14)
|
|
|
|
#define STM32_PIN_PG15 STM32PIN(STM32_PORTG, 15)
|
|
|
|
|
2016-10-05 17:51:34 +08:00
|
|
|
#define STM32_PIN_PH0 STM32PIN(STM32_PORTH, 0)
|
|
|
|
#define STM32_PIN_PH1 STM32PIN(STM32_PORTH, 1)
|
|
|
|
#define STM32_PIN_PH2 STM32PIN(STM32_PORTH, 2)
|
|
|
|
#define STM32_PIN_PH3 STM32PIN(STM32_PORTH, 3)
|
|
|
|
#define STM32_PIN_PH4 STM32PIN(STM32_PORTH, 4)
|
|
|
|
#define STM32_PIN_PH5 STM32PIN(STM32_PORTH, 5)
|
|
|
|
#define STM32_PIN_PH6 STM32PIN(STM32_PORTH, 6)
|
|
|
|
#define STM32_PIN_PH7 STM32PIN(STM32_PORTH, 7)
|
|
|
|
#define STM32_PIN_PH8 STM32PIN(STM32_PORTH, 8)
|
|
|
|
#define STM32_PIN_PH9 STM32PIN(STM32_PORTH, 9)
|
|
|
|
#define STM32_PIN_PH10 STM32PIN(STM32_PORTH, 10)
|
|
|
|
#define STM32_PIN_PH11 STM32PIN(STM32_PORTH, 11)
|
|
|
|
#define STM32_PIN_PH12 STM32PIN(STM32_PORTH, 12)
|
|
|
|
#define STM32_PIN_PH13 STM32PIN(STM32_PORTH, 13)
|
|
|
|
#define STM32_PIN_PH14 STM32PIN(STM32_PORTH, 14)
|
|
|
|
#define STM32_PIN_PH15 STM32PIN(STM32_PORTH, 15)
|
|
|
|
|
2016-03-03 22:33:15 +08:00
|
|
|
/* pretend that array will cover pin functions */
|
|
|
|
typedef int stm32_pin_func_t;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief pinmux config wrapper
|
|
|
|
*
|
|
|
|
* GPIO function is assumed to be always available, as such it's not listed
|
|
|
|
* in @funcs array
|
|
|
|
*/
|
|
|
|
struct stm32_pinmux_conf {
|
|
|
|
uint32_t pin; /* pin ID */
|
|
|
|
const stm32_pin_func_t *funcs; /* functions array, indexed with
|
|
|
|
* (stm32_pin_alt_func - 1)
|
|
|
|
*/
|
|
|
|
const size_t nfuncs; /* number of alternate functions, not
|
|
|
|
* counting GPIO
|
|
|
|
*/
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper to define pins
|
|
|
|
*/
|
|
|
|
#define STM32_PIN_CONF(__pin, __funcs) \
|
|
|
|
{__pin, __funcs, ARRAY_SIZE(__funcs)}
|
|
|
|
|
2016-12-21 16:56:20 +08:00
|
|
|
#define STM32_AF_SHIFT 16
|
|
|
|
/**
|
|
|
|
* @brief helper for encoding alternate function with pin config mode
|
|
|
|
* on stm32_pin_func_t
|
|
|
|
*/
|
|
|
|
#define STM32_AS_AF(__af) \
|
|
|
|
(__af << STM32_AF_SHIFT)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper for extracting alternate function from stm32_pin_func_t
|
|
|
|
*/
|
|
|
|
#define STM32_AF(__pinconf) \
|
|
|
|
(__pinconf >> STM32_AF_SHIFT)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper for encoding pin mode on stm32_pin_func_t
|
|
|
|
*/
|
|
|
|
#define STM32_AS_MODE(__mode) \
|
|
|
|
(__mode)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper for extracting pin mode encoded on stm32_pin_func_t
|
|
|
|
*/
|
|
|
|
#define STM32_MODE(__pinconf) \
|
|
|
|
(__pinconf & ((1 << STM32_AF_SHIFT) - 1))
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper for encoding pin mode and alternate function on
|
|
|
|
* stm32_pin_func_t
|
|
|
|
*/
|
|
|
|
#define STM32_PINFUNC(__af, __mode) \
|
|
|
|
(STM32_AS_AF(__af) | STM32_AS_MODE(__mode))
|
|
|
|
|
2016-03-03 22:33:15 +08:00
|
|
|
/**
|
|
|
|
* @brief helper to extract IO port number from STM32PIN() encoded
|
|
|
|
* value
|
|
|
|
*/
|
|
|
|
#define STM32_PORT(__pin) \
|
|
|
|
(__pin >> 4)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper to extract IO pin number from STM32PIN() encoded
|
|
|
|
* value
|
|
|
|
*/
|
|
|
|
#define STM32_PIN(__pin) \
|
|
|
|
(__pin & 0xf)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper for mapping pin function to its configuration
|
|
|
|
*
|
|
|
|
* @param pin pin ID encoded with STM32PIN()
|
|
|
|
* @param func alternate function ID
|
|
|
|
*
|
|
|
|
* Helper function for mapping alternate function for given pin to its
|
|
|
|
* configuration. This function must be implemented by SoC integartion
|
|
|
|
* code.
|
|
|
|
*
|
|
|
|
* @return SoC specific pin configuration
|
|
|
|
*/
|
|
|
|
int stm32_get_pin_config(int pin, int func);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper for mapping IO port to its clock subsystem
|
|
|
|
*
|
|
|
|
* @param port IO port
|
|
|
|
*
|
|
|
|
* Map given IO @port to corresponding clock subsystem. The returned
|
|
|
|
* clock subsystemd ID must suitable for passing as parameter to
|
|
|
|
* clock_control_on(). Implement this function at the SoC level.
|
|
|
|
*
|
|
|
|
* @return clock subsystem ID
|
|
|
|
*/
|
|
|
|
clock_control_subsys_t stm32_get_port_clock(int port);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper for configuration of IO pin
|
|
|
|
*
|
|
|
|
* @param pin IO pin, STM32PIN() encoded
|
|
|
|
* @param func IO function encoded
|
2016-03-22 04:14:15 +08:00
|
|
|
* @param clk clock control device, for enabling/disabling clock gate
|
|
|
|
* for the port
|
2016-03-03 22:33:15 +08:00
|
|
|
*/
|
2016-03-22 04:14:15 +08:00
|
|
|
int _pinmux_stm32_set(uint32_t pin, uint32_t func,
|
|
|
|
struct device *clk);
|
2016-03-03 22:33:15 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief helper for obtaining pin configuration for the board
|
|
|
|
*
|
|
|
|
* @param[out] pins set to the number of pins in the array
|
|
|
|
*
|
|
|
|
* Obtain pin assignment/configuration for current board. This call
|
|
|
|
* needs to be implemented at the board integration level. After
|
|
|
|
* restart all pins are already configured as GPIO and can be skipped
|
|
|
|
* in the configuration arrray. Pin numbers in @pin_num field are
|
|
|
|
* STM32PIN() encoded.
|
|
|
|
*
|
|
|
|
* @return array of pin assignments
|
|
|
|
*/
|
2016-03-22 04:14:15 +08:00
|
|
|
void stm32_setup_pins(const struct pin_config *pinconf,
|
|
|
|
size_t pins);
|
2016-03-03 22:33:15 +08:00
|
|
|
|
|
|
|
/* common pinmux device name for all STM32 chips */
|
|
|
|
#define STM32_PINMUX_NAME "stm32-pinmux"
|
|
|
|
|
2016-04-03 10:40:26 +08:00
|
|
|
#ifdef CONFIG_SOC_SERIES_STM32F1X
|
2016-03-06 20:53:00 +08:00
|
|
|
#include "pinmux_stm32f1.h"
|
2016-12-21 16:56:20 +08:00
|
|
|
#elif CONFIG_SOC_SERIES_STM32F3X
|
|
|
|
#include "pinmux_stm32f3.h"
|
2016-08-11 05:28:32 +08:00
|
|
|
#elif CONFIG_SOC_SERIES_STM32F4X
|
|
|
|
#include "pinmux_stm32f4.h"
|
2016-12-21 16:56:20 +08:00
|
|
|
#elif CONFIG_SOC_SERIES_STM32L4X
|
2016-10-05 17:53:10 +08:00
|
|
|
#include "pinmux_stm32l4x.h"
|
|
|
|
#endif
|
|
|
|
|
2016-03-03 22:33:15 +08:00
|
|
|
#endif /* _STM32_PINMUX_H_ */
|