Some time ago, I started working on reorganizing STM32 to use common peripheral driver code wherever possible. The goal is to standardize and organize STM32 ports so that they are easier to use, easier to maintain, and easier to add new stm32 ports and new features.
Code duplication in STM32 ports has reached such a level that it's hard to maintain and synchronize. At some point, the copy-paste approach becomes an anti-pattern, and in the case of STM32, this has been achieved. Many new families are copy-pasted from old code, but some authors introducing new features or patterns of their own, making the ports incompatible with each other. Furthermore, not all changes were ported to other families where they should have been, and now we have a multitude of different, incompatible code. Draft PR with more details is here: https://github.com/apache/nuttx/pull/19004 The entire reorganization is a long-term effort, this PR focuses primarily on the initial stages and breaking changes that need to be applied. Ultimately, Kconfig will be cleaned up and all overly complex drivers that messily mix multiple IP cores will be separated so we limit "#ifdefs" to minimum This change requires a number of breaking changes, mainly related to standardizing Kconfig options and standardizing the STM32 API. The changes are primarily name changes, such as stm32h7_xxx() to stm32_xxx(), CONFIG_STM32H7_ to CONFIG_STM32_ and so one. Also most out-of-tree STM32 specific code will need to be migrated. In short, the main changes are: 1. Introduction of the STM32 port standard described in the documentation. All future stm32 ports must conform to this. 1. Unification of Kconfig options, each family uses the same names. (STM32_XXX not STM32L4_XXX etc) 2. Each family has a separate folder in /arch: stm32f1, stm32f2, stm32h7 etc. Family directory contains family-specific things that should not be shared, e.g. chip definitions, memory map, irq map, pin definitions, etc 3. Code that can be shared between families goes to arch/arm/src/common/stm32. Code that should not be shared remains in the family directory. 4. Peripheral drivers are divided based on the IP core. Families that use the same IP core use the same driver code. 5. The huge Kconfig for stm32 is divided into smaller parts: Kconfig.tim, Kconfig.adc, Kconfig.spi etc. 6. Thanks to the generalized /arch API, we can create generalized common board code, significantly reducing code duplication in boards. Later we can standardize the functions available on nucleo boards. If there is no massive community backlash against this change, I'll start opening smaller PRs with the changes next week. If the community agrees, the major breaking changes from draft PR should go into release 13.0, which is already a significant breaking release.
