drivers/pinmux: stm32f1: Rework pinmux remap information encoding

Aim of this change is to remove the need for the pinmux driver
on stm32f1 series to access the base address of the pinmux owner
device.

This is achieved by a modification in the device tree pin definition.
Instead of providing a generic information on type of the remap
(such as NO_REMAP, PARTIAL_REMAP, FULL_REMAP), the remap field
encodes all the information required to perform the remap register
configuration:
-Address of the targeted remap register in AFIO peripheral
-Position of the remap configuration in the remap register
-Mask used for the remap configuration encoding
-Value of the expected remap configuration.

All the possible remap configurations are encoded and predefined
in a new stm32f1-afio.h dt-bindings include.

To match this new configuration, all stm32f1 -pinctrl.dtsi should
be regenerated to use these new remap definitions.

Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
This commit is contained in:
Erwan Gouriou 2021-11-19 15:34:39 +01:00 committed by Anas Nashif
commit 097cb02e59
4 changed files with 239 additions and 263 deletions

View file

@ -0,0 +1,212 @@
/*
* Copyright (c) 2021 Linaro Limited
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_STM32_AFIO_H_
#define ZEPHYR_STM32_AFIO_H_
/**
* @brief STM32F1 Remap configuration bit field.
*
* - reg (0/1) [ 0 : 0 ]
* - shift (0..31) [ 1 : 5 ]
* - mask (0x1, 0x3) [ 6 : 7 ]
* - val (0..3) [ 8 : 9 ]
*
* @param reg AFIO_MAPRx register (MAPR, MAPR2).
* @param shift Position within AFIO_MAPRx.
* @param mask Mask for the AFIO_MAPRx field.
* @param val Remap value (0, 1, 2 or 3).
*/
#define STM32_REMAP_REG_MASK 0x1U
#define STM32_REMAP_REG_SHIFT 0U
#define STM32_REMAP_SHIFT_MASK 0x1FU
#define STM32_REMAP_SHIFT_SHIFT 1U
#define STM32_REMAP_MASK_MASK 0x3U
#define STM32_REMAP_MASK_SHIFT 6U
#define STM32_REMAP_VAL_MASK 0x3U
#define STM32_REMAP_VAL_SHIFT 8U
#define STM32_REMAP(val, mask, shift, reg) \
((((reg) & STM32_REMAP_REG_MASK) << STM32_REMAP_REG_SHIFT) | \
(((shift) & STM32_REMAP_SHIFT_MASK) << STM32_REMAP_SHIFT_SHIFT) | \
(((mask) & STM32_REMAP_MASK_MASK) << STM32_REMAP_MASK_SHIFT) | \
(((val) & STM32_REMAP_VAL_MASK) << STM32_REMAP_VAL_SHIFT))
/* Accessors for remap value */
/**
* Obtain register field from remap configuration.
*
* @param remap Remap bit field value.
*/
#define STM32_REMAP_REG_GET(remap) \
(((remap) >> STM32_REMAP_REG_SHIFT) & STM32_REMAP_REG_MASK)
/**
* Obtain position field from remap configuration.
*
* @param remap Remap bit field value.
*/
#define STM32_REMAP_SHIFT_GET(remap) \
(((remap) >> STM32_REMAP_SHIFT_SHIFT) & STM32_REMAP_SHIFT_MASK)
/**
* Obtain mask field from remap configuration.
*
* @param remap Remap bit field value.
*/
#define STM32_REMAP_MASK_GET(remap) \
(((remap) >> STM32_REMAP_MASK_SHIFT) & STM32_REMAP_MASK_MASK)
/**
* Obtain value field from remap configuration.
*
* @param remap Remap bit field value.
*/
#define STM32_REMAP_VAL_GET(remap) \
(((remap) >> STM32_REMAP_VAL_SHIFT) & STM32_REMAP_VAL_MASK)
/* Remap values definitions, according to RM0008.pdf */
#define STM32_AFIO_MAPR 0U
#define STM32_AFIO_MAPR2 1U
/** Device not remappable **/
#define NO_REMAP 0
/** SPI1 (no remap) */
#define SPI1_REMAP0 STM32_REMAP(0U, 0x1U, 0U, STM32_AFIO_MAPR)
/** SPI1 (remap) */
#define SPI1_REMAP1 STM32_REMAP(1U, 0x1U, 0U, STM32_AFIO_MAPR)
/** I2C1 (no remap) */
#define I2C1_REMAP0 STM32_REMAP(0U, 0x1U, 1U, STM32_AFIO_MAPR)
/** I2C1 (remap) */
#define I2C1_REMAP1 STM32_REMAP(1U, 0x1U, 1U, STM32_AFIO_MAPR)
/** USART1 (no remap) */
#define USART1_REMAP0 STM32_REMAP(0U, 0x1U, 2U, STM32_AFIO_MAPR)
/** USART1 (remap) */
#define USART1_REMAP1 STM32_REMAP(1U, 0x1U, 2U, STM32_AFIO_MAPR)
/** USART2 (no remap) */
#define USART2_REMAP0 STM32_REMAP(0U, 0x1U, 3U, STM32_AFIO_MAPR)
/** USART2 (remap) */
#define USART2_REMAP1 STM32_REMAP(1U, 0x1U, 3U, STM32_AFIO_MAPR)
/** USART3 (no remap) */
#define USART3_REMAP0 STM32_REMAP(0U, 0x3U, 4U, STM32_AFIO_MAPR)
/** USART3 (partial remap) */
#define USART3_REMAP1 STM32_REMAP(1U, 0x3U, 4U, STM32_AFIO_MAPR)
/** USART3 (full remap) */
#define USART3_REMAP2 STM32_REMAP(3U, 0x3U, 4U, STM32_AFIO_MAPR)
/** TIM1 (no remap) */
#define TIM1_REMAP0 STM32_REMAP(0U, 0x3U, 6U, STM32_AFIO_MAPR)
/** TIM1 (partial remap) */
#define TIM1_REMAP1 STM32_REMAP(1U, 0x3U, 6U, STM32_AFIO_MAPR)
/** TIM1 (full remap) */
#define TIM1_REMAP2 STM32_REMAP(3U, 0x3U, 6U, STM32_AFIO_MAPR)
/** TIM2 (no remap) */
#define TIM2_REMAP0 STM32_REMAP(0U, 0x3U, 8U, STM32_AFIO_MAPR)
/** TIM2 (partial remap 1) */
#define TIM2_REMAP1 STM32_REMAP(1U, 0x3U, 8U, STM32_AFIO_MAPR)
/** TIM2 (partial remap 2) */
#define TIM2_REMAP2 STM32_REMAP(2U, 0x3U, 8U, STM32_AFIO_MAPR)
/** TIM2 (full remap) */
#define TIM2_REMAP3 STM32_REMAP(3U, 0x3U, 8U, STM32_AFIO_MAPR)
/** TIM3 (no remap) */
#define TIM3_REMAP0 STM32_REMAP(0U, 0x3U, 10U, STM32_AFIO_MAPR)
/** TIM3 (partial remap 1) */
#define TIM3_REMAP1 STM32_REMAP(1U, 0x3U, 10U, STM32_AFIO_MAPR)
/** TIM3 (partial remap 2) */
#define TIM3_REMAP2 STM32_REMAP(2U, 0x3U, 10U, STM32_AFIO_MAPR)
/** TIM3 (full remap) */
#define TIM3_REMAP3 STM32_REMAP(3U, 0x3U, 10U, STM32_AFIO_MAPR)
/** TIM4 (no remap) */
#define TIM4_REMAP0 STM32_REMAP(0U, 0x1U, 12U, STM32_AFIO_MAPR)
/** TIM4 (remap) */
#define TIM4_REMAP1 STM32_REMAP(1U, 0x1U, 12U, STM32_AFIO_MAPR)
/** CAN (no remap) */
#define CAN_REMAP0 STM32_REMAP(0U, 0x3U, 13U, STM32_AFIO_MAPR)
/** CAN (partial remap) */
#define CAN_REMAP1 STM32_REMAP(2U, 0x3U, 13U, STM32_AFIO_MAPR)
/** CAN (full remap) */
#define CAN_REMAP2 STM32_REMAP(3U, 0x3U, 13U, STM32_AFIO_MAPR)
/** CAN1 alias */
#define CAN1_REMAP0 CAN_REMAP0
#define CAN1_REMAP1 CAN_REMAP1
#define CAN1_REMAP2 CAN_REMAP2
/** ETH (no remap) */
#define ETH_REMAP0 STM32_REMAP(0U, 0x1U, 20U, STM32_AFIO_MAPR)
/** ETH (remap) */
#define ETH_REMAP1 STM32_REMAP(1U, 0x1U, 20U, STM32_AFIO_MAPR)
/** CAN2 (no remap) */
#define CAN2_REMAP0 STM32_REMAP(0U, 0x1U, 21U, STM32_AFIO_MAPR)
/** CAN2 (remap) */
#define CAN2_REMAP1 STM32_REMAP(1U, 0x1U, 21U, STM32_AFIO_MAPR)
/** SPI3 (no remap) */
#define SPI3_REMAP0 STM32_REMAP(0U, 0x1U, 27U, STM32_AFIO_MAPR)
/** SPI3 (remap) */
#define SPI3_REMAP1 STM32_REMAP(1U, 0x1U, 27U, STM32_AFIO_MAPR)
/** I2S3 (SPI3) (no remap) */
#define I2S3_REMAP0 SPI3_REMAP0
/** I2S3 (SPI3) (remap) */
#define I2S3_REMAP1 SPI3_REMAP1
/** TIM9 (no remap) */
#define TIM9_REMAP0 STM32_REMAP(0U, 0x1U, 5U, STM32_AFIO_MAPR2)
/** TIM9 (remap) */
#define TIM9_REMAP1 STM32_REMAP(1U, 0x1U, 5U, STM32_AFIO_MAPR2)
/** TIM10 (no remap) */
#define TIM10_REMAP0 STM32_REMAP(0U, 0x1U, 6U, STM32_AFIO_MAPR2)
/** TIM10 (remap) */
#define TIM10_REMAP1 STM32_REMAP(1U, 0x1U, 6U, STM32_AFIO_MAPR2)
/** TIM11 (no remap) */
#define TIM11_REMAP0 STM32_REMAP(0U, 0x1U, 7U, STM32_AFIO_MAPR2)
/** TIM11 (remap) */
#define TIM11_REMAP1 STM32_REMAP(1U, 0x1U, 7U, STM32_AFIO_MAPR2)
/** TIM13 (no remap) */
#define TIM13_REMAP0 STM32_REMAP(0U, 0x1U, 8U, STM32_AFIO_MAPR2)
/** TIM13 (remap) */
#define TIM13_REMAP1 STM32_REMAP(1U, 0x1U, 8U, STM32_AFIO_MAPR2)
/** TIM14 (no remap) */
#define TIM14_REMAP0 STM32_REMAP(0U, 0x1U, 9U, STM32_AFIO_MAPR2)
/** TIM14 (remap) */
#define TIM14_REMAP1 STM32_REMAP(1U, 0x1U, 9U, STM32_AFIO_MAPR2)
/** TIM15 (no remap) */
#define TIM15_REMAP0 STM32_REMAP(0U, 0x1U, 0U, STM32_AFIO_MAPR2)
/** TIM15 (remap) */
#define TIM15_REMAP1 STM32_REMAP(1U, 0x1U, 0U, STM32_AFIO_MAPR2)
/** TIM16 (no remap) */
#define TIM16_REMAP0 STM32_REMAP(0U, 0x1U, 1U, STM32_AFIO_MAPR2)
/** TIM16 (remap) */
#define TIM16_REMAP1 STM32_REMAP(1U, 0x1U, 1U, STM32_AFIO_MAPR2)
/** TIM17 (no remap) */
#define TIM17_REMAP0 STM32_REMAP(0U, 0x1U, 2U, STM32_AFIO_MAPR2)
/** TIM17 (remap) */
#define TIM17_REMAP1 STM32_REMAP(1U, 0x1U, 2U, STM32_AFIO_MAPR2)
#endif /* ZEPHYR_STM32_AFIO_H_ */

View file

@ -8,6 +8,7 @@
#define ZEPHYR_STM32_PINCTRLF1_H_
#include <dt-bindings/pinctrl/stm32-pinctrl-common.h>
#include <dt-bindings/pinctrl/stm32f1-afio.h>
/* Adapted from Linux: include/dt-bindings/pinctrl/stm32-pinfunc.h */
@ -24,7 +25,7 @@
* - mode [ 0 : 1 ]
* - line [ 2 : 5 ]
* - port [ 6 : 9 ]
* - remap [ 10 : 12 ]
* - remap [ 10 : 19 ]
*
* @param port Port ('A'..'K')
* @param line Pin (0..15)
@ -39,7 +40,7 @@
#define STM32_PORT_SHIFT 6U
#define STM32_PORT_MASK 0xFU
#define STM32_REMAP_SHIFT 10U
#define STM32_REMAP_MASK 0x1FU
#define STM32_REMAP_MASK 0x3FFU
#define STM32F1_PINMUX(port, line, mode, remap) \
(((((port) - 'A') & STM32_PORT_MASK) << STM32_PORT_SHIFT) | \
@ -55,16 +56,6 @@
#define GPIO_IN 0x1 /* Input */
#define ANALOG 0x2 /* Analog */
/**
* @brief Pin remapping configurations
*/
#define NO_REMAP 0x0 /* No remapping */
#define REMAP_1 0x1 /* Partial remapping 1 */
#define REMAP_2 0x2 /* Partial remapping 2 */
#define REMAP_3 0x3 /* Partial remapping 3 */
#define REMAP_FULL 0x4 /* Full remapping */
/**
* @brief PIN configuration bitfield
*