From 2218375f26e1ff38f386f496723517d7eae7a9a6 Mon Sep 17 00:00:00 2001 From: Michael D Sherwood Date: Tue, 11 Mar 2025 10:35:54 -0700 Subject: [PATCH 1/8] modules: microchip Addition of pic32cxsg modules Addition of pic32cxsg modules Kconfig Signed-off-by: Michael D Sherwood --- modules/Kconfig.microchip | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/Kconfig.microchip b/modules/Kconfig.microchip index 7497d99ead0a5..20befa5b6c7fb 100644 --- a/modules/Kconfig.microchip +++ b/modules/Kconfig.microchip @@ -1,4 +1,5 @@ # Microchip MEC HAL drivers configuration +# Microchip PIC32C HAL drivers configuration # SPDX-License-Identifier: Apache-2.0 @@ -10,3 +11,15 @@ config HAS_MPFS_HAL config HAS_MEC5_HAL bool "Microchip MEC5 HAL drivers support" + +config HAS_PIC32C_HAL + bool "Microchip PIC32C HAL drivers support" + +config PIC32C + bool + select HAS_CMSIS_CORE + +config HAS_PIC32CXSG_HAL + bool "Microchip PIC32CXSG HAL drivers support" + select HAS_CMSIS_CORE + depends on SOC_FAMILY_MICROCHIP_PIC32CXSG From a151edd46df7caa693412165435e658ce16a91f4 Mon Sep 17 00:00:00 2001 From: Michael D Sherwood Date: Tue, 11 Mar 2025 10:08:08 -0700 Subject: [PATCH 2/8] dts: arm: microchip Addition of pic32cxsg Addition of pic32cxsg 'dtsi' files Signed-off-by: Michael D Sherwood --- .../pic32c/pic32cx_sg/pic32cx1025sg.dtsi | 22 + .../pic32c/pic32cx_sg/pic32cxsg.dtsi | 485 ++++++++++++++++++ 2 files changed, 507 insertions(+) create mode 100644 dts/arm/microchip/pic32c/pic32cx_sg/pic32cx1025sg.dtsi create mode 100644 dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi diff --git a/dts/arm/microchip/pic32c/pic32cx_sg/pic32cx1025sg.dtsi b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cx1025sg.dtsi new file mode 100644 index 0000000000000..99d01edd212d8 --- /dev/null +++ b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cx1025sg.dtsi @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +/ { + soc { + nvmctrl@41004000 { + flash0: flash@0 { + reg = <0x0 DT_SIZE_K(1024)>; + }; + }; + + sram0: memory@20000000 { + reg = <0x20000000 DT_SIZE_K(256)>; + }; + }; +}; diff --git a/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi new file mode 100644 index 0000000000000..afe23532fe63b --- /dev/null +++ b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi @@ -0,0 +1,485 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include + +/ { + aliases { + adc-0 = &adc0; + adc-1 = &adc1; + + port-a = &porta; + port-b = &portb; + port-c = &portc; + port-d = &portd; + + sercom-0 = &sercom0; + sercom-1 = &sercom1; + sercom-2 = &sercom2; + sercom-3 = &sercom3; + sercom-4 = &sercom4; + sercom-5 = &sercom5; + sercom-6 = &sercom6; + sercom-7 = &sercom7; + + tc-0 = &tc0; + tc-2 = &tc2; + tc-4 = &tc4; + tc-6 = &tc6; + + tcc-0 = &tcc0; + tcc-1 = &tcc1; + tcc-2 = &tcc2; + tcc-3 = &tcc3; + tcc-4 = &tcc4; + + watchdog0 = &wdog; + }; + + chosen { + zephyr,entropy = &trng; + zephyr,flash-controller = &nvmctrl; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu0: cpu@0 { + compatible = "arm,cortex-m4f"; + reg = <0>; + #address-cells = <1>; + #size-cells = <1>; + device_type = "cpu"; + + mpu: mpu@e000ed90 { + compatible = "arm,armv7m-mpu"; + reg = <0xe000ed90 0x40>; + }; + }; + }; + + soc { + id: device_id@8061fc { + compatible = "atmel,sam0-id"; + reg = <0x008061FC 0x4>, + <0x00806010 0x4>, + <0x00806014 0x4>, + <0x00806018 0x4>; + }; + + sram0: memory@20000000 { + compatible = "mmio-sram"; + reg = <0x20000000 0x40000>; + }; + + mclk: mclk@40000800 { + compatible = "atmel,sam0-mclk"; + reg = <0x40000800 0x400>; + #clock-cells = <2>; + }; + + osc32kctrl: osc32kctrl@40001400 { + compatible = "atmel,sam0-osc32kctrl"; + reg = <0x40001400 0x400>; + #clock-cells = <0>; + #atmel,assigned-clock-cells = <1>; + }; + + gclk: gclk@40001c00 { + compatible = "atmel,sam0-gclk"; + reg = <0x40001c00 0x400>; + #clock-cells = <1>; + #atmel,assigned-clock-cells = <1>; + }; + + wdog: watchdog@40002000 { + compatible = "atmel,sam0-watchdog"; + reg = <0x40002000 13>; + interrupts = <10 0>; + status = "disabled"; + }; + + eic: eic@40002800 { + compatible = "atmel,sam0-eic"; + reg = <0x40002800 0x38>; + interrupts = <12 0>, <13 0>, <14 0>, <15 0>, + <16 0>, <17 0>, <18 0>, <19 0>, + <20 0>, <21 0>, <22 0>, <23 0>, + <24 0>, <25 0>, <26 0>, <27 0>; + status = "disabled"; + }; + + sercom0: sercom@40003000 { + compatible = "atmel,sam0-sercom"; + reg = <0x40003000 0x40>; + interrupts = <46 0>, <47 0>, <48 0>, <49 0>; + clocks = <&gclk 7>, <&mclk 0x14 12>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + sercom1: sercom@40003400 { + compatible = "atmel,sam0-sercom"; + reg = <0x40003400 0x40>; + interrupts = <50 0>, <51 0>, <52 0>, <53 0>; + clocks = <&gclk 8>, <&mclk 0x14 13>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + usb0: usb@41000000 { + compatible = "atmel,sam0-usb"; + reg = <0x41000000 0x1000>; + interrupts = <80 0>, <81 0>, <82 0>, <83 0>; + status = "disabled"; + num-bidir-endpoints = <8>; + }; + + nvmctrl: nvmctrl@41004000 { + compatible = "atmel,sam0-nvmctrl"; + reg = <0x41004000 0x22>; + interrupts = <29 0>, <30 0>; + #address-cells = <1>; + #size-cells = <1>; + lock-regions = <32>; + + flash0: flash@0 { + compatible = "soc-nv-flash"; + write-block-size = <8>; + }; + }; + + pinmux_a: pinmux@41008000 { + compatible = "atmel,sam0-pinmux"; + reg = <0x41008000 0x80>; + }; + + pinmux_b: pinmux@41008080 { + compatible = "atmel,sam0-pinmux"; + reg = <0x41008080 0x80>; + }; + + pinmux_c: pinmux@41008100 { + compatible = "atmel,sam0-pinmux"; + reg = <0x41008100 0x80>; + }; + + pinmux_d: pinmux@41008180 { + compatible = "atmel,sam0-pinmux"; + reg = <0x41008180 0x80>; + }; + + dmac: dmac@4100a000 { + compatible = "atmel,sam0-dmac"; + reg = <0x4100A000 0x50>; + interrupts = <31 0>, <32 0>, <33 0>, <34 0>, <35 0>; + status = "disabled"; + #dma-cells = <2>; + }; + + rtc: rtc@40002400 { + compatible = "atmel,sam0-rtc"; + reg = <0x40002400 0x40>; + interrupts = <11 0>; + clocks = <&osc32kctrl>, <&mclk 0x14 9>; + clock-names = "OSC32KCTRL", "MCLK"; + atmel,assigned-clocks = <&osc32kctrl 0>; + atmel,assigned-clock-names = "OSC32KCTRL"; + status = "disabled"; + }; + + tc0: tc@40003800 { + compatible = "atmel,sam0-tc32"; + reg = <0x40003800 0x34>; + interrupts = <107 0>; + clocks = <&gclk 9>, <&mclk 0x14 14>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + sercom2: sercom@41012000 { + compatible = "atmel,sam0-sercom"; + reg = <0x41012000 0x40>; + interrupts = <54 0>, <55 0>, <56 0>, <57 0>; + clocks = <&gclk 23>, <&mclk 0x18 9>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + sercom3: sercom@41014000 { + compatible = "atmel,sam0-sercom"; + reg = <0x41014000 0x40>; + interrupts = <58 0>, <59 0>, <60 0>, <61 0>; + clocks = <&gclk 24>, <&mclk 0x18 10>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + tcc0: tcc@41016000 { + compatible = "atmel,sam0-tcc"; + reg = <0x41016000 0x2000>; + interrupts = <85 0>, <86 0>, <87 0>, <88 0>, <89 0>, + <90 0>, <91 0>; + clocks = <&gclk 25>, <&mclk 0x18 11>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + channels = <6>; + counter-size = <24>; + }; + + tcc1: tcc@41018000 { + compatible = "atmel,sam0-tcc"; + reg = <0x41018000 0x2000>; + interrupts = <92 0>, <93 0>, <94 0>, <95 0>, <96 0>; + clocks = <&gclk 25>, <&mclk 0x18 12>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + channels = <4>; + counter-size = <24>; + }; + + tc2: tc@4101a000 { + compatible = "atmel,sam0-tc32"; + reg = <0x4101A000 0x34>; + interrupts = <109 0>; + clocks = <&gclk 26>, <&mclk 0x18 13>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + can0: can@42000000 { + compatible = "atmel,sam0-can"; + reg = <0x42000000 0x400>; + interrupts = <78 0>, <78 0>; + interrupt-names = "int0", "int1"; + clocks = <&gclk 27>, <&mclk 0x10 17>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + bosch,mram-cfg = <0x0 128 64 64 64 64 32 32>; + divider = <12>; + }; + + can1: can@42000400 { + compatible = "atmel,sam0-can"; + reg = <0x42000400 0x400>; + interrupts = <79 0>, <79 0>; + interrupt-names = "int0", "int1"; + clocks = <&gclk 28>, <&mclk 0x10 18>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + bosch,mram-cfg = <0x0 128 64 64 64 64 32 32>; + divider = <12>; + }; + + gmac: ethernet@42000800 { + compatible = "atmel,sam0-gmac"; + reg = <0x42000800 0x400>; + interrupts = <84 0>; + interrupt-names = "gmac"; + status = "disabled"; + num-queues = <1>; + local-mac-address = [00 00 00 00 00 00]; + }; + + mdio: mdio@42000800 { + compatible = "atmel,sam-mdio"; + reg = <0x42000800 0x400>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; + }; + + tcc2: tcc@42000c00 { + compatible = "atmel,sam0-tcc"; + reg = <0x42000c00 0x400>; + interrupts = <97 0>, <98 0>, <99 0>, <100 0>; + clocks = <&gclk 29>, <&mclk 0x1c 3>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + channels = <3>; + counter-size = <16>; + }; + + tcc3: tcc@42001000 { + compatible = "atmel,sam0-tcc"; + reg = <0x42001000 0x400>; + interrupts = <101 0>, <102 0>, <103 0>; + clocks = <&gclk 29>, <&mclk 0x1c 4>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + channels = <2>; + counter-size = <16>; + }; + + tc4: tc@42001400 { + compatible = "atmel,sam0-tc32"; + reg = <0x42001400 0x34>; + interrupts = <111 0>; + clocks = <&gclk 30>, <&mclk 0x1c 5>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + trng: random@42002800 { + compatible = "atmel,sam-trng"; + reg = <0x42002800 0x1e>; + interrupts = <131 0>; + status = "disabled"; + }; + + sercom4: sercom@43000000 { + compatible = "atmel,sam0-sercom"; + reg = <0x43000000 0x40>; + interrupts = <62 0>, <63 0>, <64 0>, <65 0>; + clocks = <&gclk 34>, <&mclk 0x20 0>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + sercom5: sercom@43000400 { + compatible = "atmel,sam0-sercom"; + reg = <0x43000400 0x40>; + interrupts = <66 0>, <67 0>, <68 0>, <69 0>; + clocks = <&gclk 35>, <&mclk 0x20 1>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + sercom6: sercom@43000800 { + compatible = "atmel,sam0-sercom"; + reg = <0x43000800 0x40>; + interrupts = <70 0>, <71 0>, <72 0>, <73 0>; + clocks = <&gclk 36>, <&mclk 0x20 2>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + sercom7: sercom@43000c00 { + compatible = "atmel,sam0-sercom"; + reg = <0x43000C00 0x40>; + interrupts = <74 0>, <75 0>, <76 0>, <77 0>; + clocks = <&gclk 37>, <&mclk 0x20 3>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + tcc4: tcc@43001000 { + compatible = "atmel,sam0-tcc"; + reg = <0x43001000 0x400>; + interrupts = <104 0>, <105 0>, <106 0>; + clocks = <&gclk 38>, <&mclk 0x20 4>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + channels = <2>; + counter-size = <16>; + }; + + tc6: tc@43001400 { + compatible = "atmel,sam0-tc32"; + reg = <0x43001400 0x34>; + interrupts = <113 0>; + clocks = <&gclk 39>, <&mclk 0x20 5>; + clock-names = "GCLK", "MCLK"; + atmel,assigned-clocks = <&gclk 0>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + }; + + adc0: adc@43001c00 { + compatible = "atmel,sam0-adc"; + reg = <0x43001C00 0x4A>; + interrupts = <118 0>, <119 0>; + interrupt-names = "overrun", "resrdy"; + clocks = <&gclk 40>, <&mclk 0x20 7>; + clock-names = "GCLK", "MCLK"; + /* + * 16 MHz is ADC max clock, source clock must not exceed 100 MHz. + * - table 54-8, section 54.6, page 2020 + * - table 54-24, section 54.10.4, page 2031 + * 48 MHz GCLK / 4 = 12 MHz + * Generator 2: DFLL48M / 4 + */ + atmel,assigned-clocks = <&gclk 2>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + #io-channel-cells = <1>; + prescaler = <4>; + calib-offset = <0>; + }; + + adc1: adc@43002000 { + compatible = "atmel,sam0-adc"; + reg = <0x43002000 0x4A>; + interrupts = <120 0>, <121 0>; + interrupt-names = "overrun", "resrdy"; + clocks = <&gclk 41>, <&mclk 0x20 8>; + clock-names = "GCLK", "MCLK"; + /* + * 16 MHz is ADC max clock, source clock must not exceed 100 MHz. + * - table 54-8, section 54.6, page 2020 + * - table 54-24, section 54.10.4, page 2031 + * 48 MHz GCLK / 4 = 12 MHz + * Generator 2: DFLL48M / 4 + */ + atmel,assigned-clocks = <&gclk 2>; + atmel,assigned-clock-names = "GCLK"; + status = "disabled"; + #io-channel-cells = <1>; + prescaler = <4>; + calib-offset = <14>; + }; + + backup0: memory@47000000 { + compatible = "mmio-sram"; + reg = <0x47000000 0x2000>; + }; + }; +}; + +&nvic { + arm,num-irq-priority-bits = <3>; +}; From 7adc77c7e7d5352c8b94147a3d4cd8cce9e0e21c Mon Sep 17 00:00:00 2001 From: Michael D Sherwood Date: Tue, 11 Mar 2025 10:24:26 -0700 Subject: [PATCH 3/8] soc: microchip: pic32cxsg Addition of pic32cxsg Addition of pic32cxsg current family of devices Signed-off-by: Michael D Sherwood --- soc/microchip/pic32cxsg/CMakeLists.txt | 9 + soc/microchip/pic32cxsg/Kconfig | 14 + soc/microchip/pic32cxsg/Kconfig.defconfig | 24 ++ soc/microchip/pic32cxsg/Kconfig.soc | 13 + soc/microchip/pic32cxsg/common/CMakeLists.txt | 14 + .../pic32cxsg/common/Kconfig.pic32cxsg | 15 + .../pic32cxsg/common/microchip_pic32cxsg_dt.h | 404 ++++++++++++++++++ soc/microchip/pic32cxsg/common/pinctrl_soc.h | 17 + .../pic32cxsg/common/soc_pic32cxsg.c | 155 +++++++ soc/microchip/pic32cxsg/common/soc_port.c | 81 ++++ soc/microchip/pic32cxsg/common/soc_port.h | 126 ++++++ .../pic32cxsg/pic32cxsg41/CMakeLists.txt | 4 + soc/microchip/pic32cxsg/pic32cxsg41/Kconfig | 13 + .../pic32cxsg/pic32cxsg41/Kconfig.defconfig | 15 + .../pic32cxsg/pic32cxsg41/Kconfig.soc | 36 ++ soc/microchip/pic32cxsg/pic32cxsg41/soc.h | 58 +++ .../pic32cxsg/pic32cxsg60/CMakeLists.txt | 4 + soc/microchip/pic32cxsg/pic32cxsg60/Kconfig | 12 + .../pic32cxsg/pic32cxsg60/Kconfig.defconfig | 15 + .../pic32cxsg/pic32cxsg60/Kconfig.soc | 26 ++ soc/microchip/pic32cxsg/pic32cxsg60/soc.h | 54 +++ .../pic32cxsg/pic32cxsg61/CMakeLists.txt | 4 + soc/microchip/pic32cxsg/pic32cxsg61/Kconfig | 13 + .../pic32cxsg/pic32cxsg61/Kconfig.defconfig | 15 + .../pic32cxsg/pic32cxsg61/Kconfig.soc | 26 ++ soc/microchip/pic32cxsg/pic32cxsg61/soc.h | 54 +++ soc/microchip/pic32cxsg/soc.yml | 17 + 27 files changed, 1238 insertions(+) create mode 100644 soc/microchip/pic32cxsg/CMakeLists.txt create mode 100644 soc/microchip/pic32cxsg/Kconfig create mode 100644 soc/microchip/pic32cxsg/Kconfig.defconfig create mode 100644 soc/microchip/pic32cxsg/Kconfig.soc create mode 100644 soc/microchip/pic32cxsg/common/CMakeLists.txt create mode 100644 soc/microchip/pic32cxsg/common/Kconfig.pic32cxsg create mode 100644 soc/microchip/pic32cxsg/common/microchip_pic32cxsg_dt.h create mode 100644 soc/microchip/pic32cxsg/common/pinctrl_soc.h create mode 100644 soc/microchip/pic32cxsg/common/soc_pic32cxsg.c create mode 100644 soc/microchip/pic32cxsg/common/soc_port.c create mode 100644 soc/microchip/pic32cxsg/common/soc_port.h create mode 100644 soc/microchip/pic32cxsg/pic32cxsg41/CMakeLists.txt create mode 100644 soc/microchip/pic32cxsg/pic32cxsg41/Kconfig create mode 100644 soc/microchip/pic32cxsg/pic32cxsg41/Kconfig.defconfig create mode 100644 soc/microchip/pic32cxsg/pic32cxsg41/Kconfig.soc create mode 100644 soc/microchip/pic32cxsg/pic32cxsg41/soc.h create mode 100644 soc/microchip/pic32cxsg/pic32cxsg60/CMakeLists.txt create mode 100644 soc/microchip/pic32cxsg/pic32cxsg60/Kconfig create mode 100644 soc/microchip/pic32cxsg/pic32cxsg60/Kconfig.defconfig create mode 100644 soc/microchip/pic32cxsg/pic32cxsg60/Kconfig.soc create mode 100644 soc/microchip/pic32cxsg/pic32cxsg60/soc.h create mode 100644 soc/microchip/pic32cxsg/pic32cxsg61/CMakeLists.txt create mode 100644 soc/microchip/pic32cxsg/pic32cxsg61/Kconfig create mode 100644 soc/microchip/pic32cxsg/pic32cxsg61/Kconfig.defconfig create mode 100644 soc/microchip/pic32cxsg/pic32cxsg61/Kconfig.soc create mode 100644 soc/microchip/pic32cxsg/pic32cxsg61/soc.h create mode 100644 soc/microchip/pic32cxsg/soc.yml diff --git a/soc/microchip/pic32cxsg/CMakeLists.txt b/soc/microchip/pic32cxsg/CMakeLists.txt new file mode 100644 index 0000000000000..acc6bac9044ad --- /dev/null +++ b/soc/microchip/pic32cxsg/CMakeLists.txt @@ -0,0 +1,9 @@ +# Makefile - Microchip PIC32CXSG MCU family + +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +zephyr_include_directories(${ZEPHYR_BASE}/drivers) + +add_subdirectory(common) +add_subdirectory(${SOC_SERIES}) diff --git a/soc/microchip/pic32cxsg/Kconfig b/soc/microchip/pic32cxsg/Kconfig new file mode 100644 index 0000000000000..30b03d9a237e0 --- /dev/null +++ b/soc/microchip/pic32cxsg/Kconfig @@ -0,0 +1,14 @@ +# Microchip PIC32CXSG MCU family configuration options +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +config SOC_FAMILY_MICROCHIP_PIC32CXSG + select PIC32C + select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE + +if SOC_FAMILY_MICROCHIP_PIC32CXSG + +rsource "common/Kconfig.pic32cxsg" +rsource "*/Kconfig" + +endif # SOC_FAMILY_MICROCHIP_PIC32CXSG diff --git a/soc/microchip/pic32cxsg/Kconfig.defconfig b/soc/microchip/pic32cxsg/Kconfig.defconfig new file mode 100644 index 0000000000000..65659c2313391 --- /dev/null +++ b/soc/microchip/pic32cxsg/Kconfig.defconfig @@ -0,0 +1,24 @@ +# Microchip PIC32CXSG MCU family default configuration options + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +if SOC_FAMILY_MICROCHIP_PIC32CXSG + +rsource "*/Kconfig.defconfig" + +config GPIO + default y + +config SYS_CLOCK_HW_CYCLES_PER_SEC + default $(dt_node_int_prop_int,/cpus/cpu@0,clock-frequency) + +if USB_DEVICE_DRIVER + +config HEAP_MEM_POOL_ADD_SIZE_SOC + def_int 1024 + +endif # USB_DEVICE_DRIVER + +endif # SOC_FAMILY_MICROCHIP_PIC32CXSG diff --git a/soc/microchip/pic32cxsg/Kconfig.soc b/soc/microchip/pic32cxsg/Kconfig.soc new file mode 100644 index 0000000000000..8ef8beb3da8b7 --- /dev/null +++ b/soc/microchip/pic32cxsg/Kconfig.soc @@ -0,0 +1,13 @@ +# Microchip PIC32CXSG MCU family + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +config SOC_FAMILY_MICROCHIP_PIC32CXSG + bool + +config SOC_FAMILY + default "microchip_pic32cxsg" if SOC_FAMILY_MICROCHIP_PIC32CXSG + +rsource "*/Kconfig.soc" diff --git a/soc/microchip/pic32cxsg/common/CMakeLists.txt b/soc/microchip/pic32cxsg/common/CMakeLists.txt new file mode 100644 index 0000000000000..f4b41e71492b0 --- /dev/null +++ b/soc/microchip/pic32cxsg/common/CMakeLists.txt @@ -0,0 +1,14 @@ +# Makefile - Microchip PIC32CXSG MCU family +# +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +zephyr_sources(soc_port.c) + +zephyr_sources_ifdef(CONFIG_BOOTLOADER_BOSSA bossa.c) + +zephyr_sources_ifdef(CONFIG_SOC_FAMILY_MICROCHIP_PIC32CXSG soc_pic32cxsg.c) + +zephyr_include_directories(.) + +set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/arm/cortex_m/scripts/linker.ld CACHE INTERNAL "") diff --git a/soc/microchip/pic32cxsg/common/Kconfig.pic32cxsg b/soc/microchip/pic32cxsg/common/Kconfig.pic32cxsg new file mode 100644 index 0000000000000..4c5cf3869277e --- /dev/null +++ b/soc/microchip/pic32cxsg/common/Kconfig.pic32cxsg @@ -0,0 +1,15 @@ +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +if SOC_FAMILY_MICROCHIP_PIC32CXSG + +config SOC_MICROCHIP_PIC32CXSG_XOSC32K + bool "The external 32 kHz crystal oscillator" + default y if DT_HAS_ATMEL_SAM0_OSC32KCTRL_ENABLED + help + Enable gclk device tree node to use 32K crystal + as clock source. If not enabled the soc will be + configured for internal oscillator. + +endif diff --git a/soc/microchip/pic32cxsg/common/microchip_pic32cxsg_dt.h b/soc/microchip/pic32cxsg/common/microchip_pic32cxsg_dt.h new file mode 100644 index 0000000000000..2b1cf5afa55f6 --- /dev/null +++ b/soc/microchip/pic32cxsg/common/microchip_pic32cxsg_dt.h @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** @file + * @brief Microchip PIC32CXSG MCU family devicetree helper macros + */ + +#ifndef _MICROCHIP_PIC32CXSG_DT_H_ +#define _MICROCHIP_PIC32CXSG_DT_H_ + +/* clang-format off */ + +#define ATMEL_SAM0_DT_INST_CELL_REG_ADDR_OFFSET(n, cell) \ + (volatile uint32_t *) \ + (DT_REG_ADDR(DT_INST_PHANDLE_BY_NAME(n, clocks, cell)) + \ + DT_INST_CLOCKS_CELL_BY_NAME(n, cell, offset)) + +#define ATMEL_SAM0_DT_INST_CELL_PERIPH_MASK(n, name, cell) \ + BIT(DT_INST_CLOCKS_CELL_BY_NAME(n, name, cell)) + +/* Helper macro to get register address that control peripheral clock + * enable bit. + */ +#define ATMEL_SAM0_DT_INST_MCLK_PM_REG_ADDR_OFFSET(n) \ + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(mclk)), \ + (ATMEL_SAM0_DT_INST_CELL_REG_ADDR_OFFSET(n, mclk)), \ + (ATMEL_SAM0_DT_INST_CELL_REG_ADDR_OFFSET(n, pm))) + +/* Helper macro to get peripheral clock bit mask. + */ +#define ATMEL_SAM0_DT_INST_MCLK_PM_PERIPH_MASK(n, cell) \ + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(mclk)), \ + (ATMEL_SAM0_DT_INST_CELL_PERIPH_MASK(n, mclk, cell)), \ + (ATMEL_SAM0_DT_INST_CELL_PERIPH_MASK(n, pm, cell))) + +/* Helper macros for use with Microchip PIC32CXSG DMAC controller + * return 0xff as default value if there is no 'dmas' property + */ +#define ATMEL_SAM0_DT_INST_DMA_CELL(n, name, cell) \ + COND_CODE_1(DT_INST_NODE_HAS_PROP(n, dmas), \ + (DT_INST_DMAS_CELL_BY_NAME(n, name, cell)), \ + (0xff)) +#define ATMEL_SAM0_DT_INST_DMA_TRIGSRC(n, name) \ + ATMEL_SAM00_DT_INST_DMA_CELL(n, name, trigsrc) +#define ATMEL_SAM0_DT_INST_DMA_CHANNEL(n, name) \ + ATMEL_SAM00_DT_INST_DMA_CELL(n, name, channel) +#define ATMEL_SAM0_DT_INST_DMA_CTLR(n, name) \ + COND_CODE_1(DT_INST_NODE_HAS_PROP(n, dmas), \ + (DT_INST_DMAS_CTLR_BY_NAME(n, name)), \ + (DT_INVALID_NODE)) + + +/* Use to check if a sercom 'n' is enabled for a given 'compat' */ +#define ATMEL_SAM0_DT_SERCOM_CHECK(n, compat) \ + DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(sercom##n), compat, okay) + +/* Use to check if TCC 'n' is enabled for a given 'compat' */ +#define ATMEL_SAM0_DT_TCC_CHECK(n, compat) \ + DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(tcc##n), compat, okay) + +/* Common macro for use to set HCLK_FREQ_HZ */ +#define ATMEL_SAM0_DT_CPU_CLK_FREQ_HZ \ + DT_PROP(DT_PATH(cpus, cpu_0), clock_frequency) + +/** + * @brief Test if a node has a atmel,assigned-clocks phandle-array property at + * a given index. + * + * This expands to 1 if the given index is valid atmel,assigned-clocks property + * phandle-array index. Otherwise, it expands to 0. + * + * Example devicetree fragment: + * + * n1: node-1 { + * atmel,assigned-clocks = <...>, <...>; + * }; + * + * n2: node-2 { + * atmel,assigned-clocks = <...>; + * }; + * + * Example usage: + * + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_IDX(DT_NODELABEL(n1), 0) - 1 + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_IDX(DT_NODELABEL(n1), 1) - 1 + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_IDX(DT_NODELABEL(n1), 2) - 0 + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_IDX(DT_NODELABEL(n2), 1) - 0 + * + * @param node_id node identifier; may or may not have any atmel,assigned-clocks + * property + * @param idx index of a atmel,assigned-clocks property phandle-array whose + * existence to check + * @return 1 if the index exists, 0 otherwise + */ +#define ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_IDX(node_id, idx) \ + DT_PROP_HAS_IDX(node_id, atmel_assigned_clocks, idx) + +/** + * @brief Test if a node has a clock-names array property holds a given name + * + * This expands to 1 if the name is available as atmel,assigned-clocks-name array + * property cell. Otherwise, it expands to 0. + * + * Example devicetree fragment: + * + * n1: node-1 { + * atmel,assigned-clocks = <...>, <...>; + * atmel,assigned-clock-names = "alpha", "beta"; + * }; + * + * n2: node-2 { + * atmel,assigned-clocks = <...>; + * atmel,assigned-clock-names = "alpha"; + * }; + * + * Example usage: + * + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_NAME(DT_NODELABEL(n1), alpha) - 1 + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_NAME(DT_NODELABEL(n1), beta) - 1 + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_NAME(DT_NODELABEL(n2), beta) - 0 + * + * @param node_id node identifier; may or may not have any clock-names property. + * @param name lowercase-and-underscores clock-names cell value name to check + * @return 1 if the atmel,assigned-clock name exists, 0 otherwise + */ +#define ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_NAME(node_id, name) \ + DT_PROP_HAS_NAME(node_id, atmel_assigned_clocks, name) + +/** + * @brief Get the number of elements in a atmel,assigned-clocks property + * + * Example devicetree fragment: + * + * n1: node-1 { + * atmel,assigned-clocks = <&foo>, <&bar>; + * }; + * + * n2: node-2 { + * atmel,assigned-clocks = <&foo>; + * }; + * + * Example usage: + * + * ATMEL_SAM0_DT_NUM_ASSIGNED_CLOCKS(DT_NODELABEL(n1)) - 2 + * ATMEL_SAM0_DT_NUM_ASSIGNED_CLOCKS(DT_NODELABEL(n2)) - 1 + * + * @param node_id node identifier with a atmel,assigned-clocks property + * @return number of elements in the property + */ +#define ATMEL_SAM0_DT_NUM_ASSIGNED_CLOCKS(node_id) \ + DT_PROP_LEN(node_id, atmel_assigned_clocks) + + +/** + * @brief Get the node identifier for the controller phandle from a + * "atmel,assigned-clocks" phandle-array property at an index + * + * Example devicetree fragment: + * + * clk1: clock-controller@... { ... }; + * + * clk2: clock-controller@... { ... }; + * + * n: node { + * atmel,assigned-clocks = <&clk1 10 20>, <&clk2 30 40>; + * }; + * + * Example usage: + * + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_IDX(DT_NODELABEL(n), 0)) - DT_NODELABEL(clk1) + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_IDX(DT_NODELABEL(n), 1)) - DT_NODELABEL(clk2) + * + * @param node_id node identifier + * @param idx logical index into "atmel,assigned-clocks" + * @return the node identifier for the clock controller referenced at index "idx" + * @see DT_PHANDLE_BY_IDX() + */ +#define ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_IDX(node_id, idx) \ + DT_PHANDLE_BY_IDX(node_id, atmel_assigned_clocks, idx) + +/** + * @brief Equivalent to ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_IDX(node_id, 0) + * @param node_id node identifier + * @return a node identifier for the atmel,assigned-clocks controller at index 0 + * in "atmel,assigned-clocks" + * @see ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_IDX() + */ +#define ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR(node_id) \ + ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_IDX(node_id, 0) + +/** + * @brief Get the node identifier for the controller phandle from a + * atmel,assigned-clocks phandle-array property by name + * + * Example devicetree fragment: + * + * clk1: clock-controller@... { ... }; + * + * clk2: clock-controller@... { ... }; + * + * n: node { + * atmel,assigned-clocks = <&clk1 10 20>, <&clk2 30 40>; + * atmel,assigned-clock-names = "alpha", "beta"; + * }; + * + * Example usage: + * + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_NAME(DT_NODELABEL(n), beta) - DT_NODELABEL(clk2) + * + * @param node_id node identifier + * @param name lowercase-and-underscores name of a atmel,assigned-clocks element + * as defined by the node's clock-names property + * @return the node identifier for the clock controller referenced by name + * @see DT_PHANDLE_BY_NAME() + */ +#define ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_NAME(node_id, name) \ + DT_PHANDLE_BY_NAME(node_id, atmel_assigned_clocks, name) + +/** + * @brief Get a atmel,assigned-clock specifier's cell value at an index + * + * Example devicetree fragment: + * + * clk1: clock-controller@... { + * compatible = "vnd,clock"; + * #atmel,assigned-clock-cells = < 2 >; + * }; + * + * n: node { + * atmel,assigned-clocks = < &clk1 10 20 >, < &clk1 30 40 >; + * }; + * + * Bindings fragment for the vnd,clock compatible: + * + * atmel,assigned-clock-cells: + * - bus + * - bits + * + * Example usage: + * + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_IDX(DT_NODELABEL(n), 0, bus) - 10 + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_IDX(DT_NODELABEL(n), 1, bits) - 40 + * + * @param node_id node identifier for a node with a atmel,assigned-clocks property + * @param idx logical index into atmel,assigned-clocks property + * @param cell lowercase-and-underscores cell name + * @return the cell value at index "idx" + * @see DT_PHA_BY_IDX() + */ +#define ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_IDX(node_id, idx, cell) \ + DT_PHA_BY_IDX(node_id, atmel_assigned_clocks, idx, cell) + +/** + * @brief Get a atmel,assigned-clock specifier's cell value by name + * + * Example devicetree fragment: + * + * clk1: clock-controller@... { + * compatible = "vnd,clock"; + * #atmel,assigned-clock-cells = < 2 >; + * }; + * + * n: node { + * atmel,assigned-clocks = < &clk1 10 20 >, < &clk1 30 40 >; + * clock-names = "alpha", "beta"; + * }; + * + * Bindings fragment for the vnd,clock compatible: + * + * atmel,assigned-clock-cells: + * - bus + * - bits + * + * Example usage: + * + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_NAME(DT_NODELABEL(n), alpha, bus) - 10 + * ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_NAME(DT_NODELABEL(n), beta, bits) - 40 + * + * @param node_id node identifier for a node with a atmel,assigned-clocks property + * @param name lowercase-and-underscores name of a atmel,assigned-clocks element + * as defined by the node's clock-names property + * @param cell lowercase-and-underscores cell name + * @return the cell value in the specifier at the named element + * @see DT_PHA_BY_NAME() + */ +#define ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_NAME(node_id, name, cell) \ + DT_PHA_BY_NAME(node_id, atmel_assigned_clocks, name, cell) + +/** + * @brief Equivalent to ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_IDX(node_id, 0, cell) + * @param node_id node identifier for a node with a atmel,assigned-clocks property + * @param cell lowercase-and-underscores cell name + * @return the cell value at index 0 + * @see ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_IDX() + */ +#define ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL(node_id, cell) \ + ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_IDX(node_id, 0, cell) + +/** + * @brief Equivalent to ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_IDX(DT_DRV_INST(inst), idx) + * @param inst DT_DRV_COMPAT instance number; may or may not have any + * atmel,assigned-clocks property + * @param idx index of a atmel,assigned-clocks property phandle-array whose existence + * to check + * @return 1 if the index exists, 0 otherwise + */ +#define ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_HAS_IDX(inst, idx) \ + DT_ASSIGNED_CLOCKS_HAS_IDX(DT_DRV_INST(inst), idx) + +/** + * @brief Equivalent to DT_CLOCK_HAS_NAME(DT_DRV_INST(inst), name) + * @param inst DT_DRV_COMPAT instance number; may or may not have any + * atmel,clock-names property. + * @param name lowercase-and-underscores clock-names cell value name to check + * @return 1 if the atmel,assigned-clock name exists, 0 otherwise + */ +#define ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_HAS_NAME(inst, name) \ + ATMEL_SAM0_DT_ASSIGNED_CLOCKS_HAS_NAME(DT_DRV_INST(inst), name) + +/** + * @brief Equivalent to ATMEL_SAM0_DT_NUM_ASSIGNED_CLOCKS(DT_DRV_INST(inst)) + * @param inst instance number + * @return number of elements in the atmel,assigned-clocks property + */ +#define ATMEL_SAM0_DT_INST_NUM_ASSIGNED_CLOCKS(inst) \ + ATMEL_SAM0_DT_NUM_ASSIGNED_CLOCKS(DT_DRV_INST(inst)) + +/** + * @brief Get the node identifier for the controller phandle from a + * "atmel,assigned-clocks" phandle-array property at an index + * + * @param inst instance number + * @param idx logical index into "atmel,assigned-clocks" + * @return the node identifier for the clock controller referenced at + * index "idx" + * @see ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_IDX() + */ +#define ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CTLR_BY_IDX(inst, idx) \ + ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_IDX(DT_DRV_INST(inst), idx) + +/** + * @brief Equivalent to ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CTLR_BY_IDX(inst, 0) + * @param inst instance number + * @return a node identifier for the atmel,assigned-clocks controller at index 0 + * in "atmel,assigned-clocks" + * @see ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR() + */ +#define ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CTLR(inst) \ + ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CTLR_BY_IDX(inst, 0) + +/** + * @brief Get the node identifier for the controller phandle from a + * atmel,assigned-clocks phandle-array property by name + * + * @param inst instance number + * @param name lowercase-and-underscores name of a atmel,assigned-clocks element + * as defined by the node's atmel,assigned-clock-names property + * @return the node identifier for the clock controller referenced by + * the named element + * @see ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_NAME() + */ +#define ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CTLR_BY_NAME(inst, name) \ + ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CTLR_BY_NAME(DT_DRV_INST(inst), name) + +/** + * @brief Get a DT_DRV_COMPAT instance's atmel,assigned-clock specifier's cell + * value at an index + * @param inst DT_DRV_COMPAT instance number + * @param idx logical index into atmel,assigned-clocks property + * @param cell lowercase-and-underscores cell name + * @return the cell value at index "idx" + * @see ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_IDX() + */ +#define ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CELL_BY_IDX(inst, idx, cell) \ + ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_IDX(DT_DRV_INST(inst), idx, cell) + +/** + * @brief Get a DT_DRV_COMPAT instance's atmel,assigned-clock specifier's cell + * value by name + * @param inst DT_DRV_COMPAT instance number + * @param name lowercase-and-underscores name of a atmel,assigned-clocks element + * as defined by the node's atmel,assigned-clock-names property + * @param cell lowercase-and-underscores cell name + * @return the cell value in the specifier at the named element + * @see ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_NAME() + */ +#define ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CELL_BY_NAME(inst, name, cell) \ + ATMEL_SAM0_DT_ASSIGNED_CLOCKS_CELL_BY_NAME(DT_DRV_INST(inst), name, cell) + +/** + * @brief Equivalent to ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CELL_BY_IDX(inst, 0, cell) + * @param inst DT_DRV_COMPAT instance number + * @param cell lowercase-and-underscores cell name + * @return the value of the cell inside the specifier at index 0 + */ +#define ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CELL(inst, cell) \ + ATMEL_SAM0_DT_INST_ASSIGNED_CLOCKS_CELL_BY_IDX(inst, 0, cell) + +/* clang-format on */ + +#endif /* _MICROCHIP_PIC32CXSG_DT_H_ */ diff --git a/soc/microchip/pic32cxsg/common/pinctrl_soc.h b/soc/microchip/pic32cxsg/common/pinctrl_soc.h new file mode 100644 index 0000000000000..504f5e7437522 --- /dev/null +++ b/soc/microchip/pic32cxsg/common/pinctrl_soc.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * Microchip PIC32CXSG SoC specific helpers for pinctrl driver + */ + +#ifndef ZEPHYR_SOC_ARM_MICROCHIP_PIC32CXSG_COMMON_PINCTRL_SOC_H_ +#define ZEPHYR_SOC_ARM_MICROCHIP_PIC32CXSG_COMMON_PINCTRL_SOC_H_ + +#include + +#endif /* ZEPHYR_SOC_ARM_MICROCHIP_PIC32CXSG_COMMON_PINCTRL_SOC_H_ */ diff --git a/soc/microchip/pic32cxsg/common/soc_pic32cxsg.c b/soc/microchip/pic32cxsg/common/soc_pic32cxsg.c new file mode 100644 index 0000000000000..ae87343e22bdd --- /dev/null +++ b/soc/microchip/pic32cxsg/common/soc_pic32cxsg.c @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Micorchip PIC32CXSG MCU series initialization code + */ + +#include +#include +#include +#include + +#define PIC32CXSG_DFLL_FREQ_HZ (48000000U) +#define PIC32CXSG_DPLL_FREQ_MIN_HZ (96000000U) +#define PIC32CXSG_DPLL_FREQ_MAX_HZ (200000000U) +#define PIC32CXSG_XOSC32K_STARTUP_TIME (6) /* Microchip - was 7 which is a reserved value */ + +#if CONFIG_SOC_MICROCHIP_PIC32CXSG_XOSC32K +static void osc32k_init(void) +{ + gclk_registers_t *gregs = (gclk_registers_t *)DT_REG_ADDR(DT_NODELABEL(gclk)); + osc32kctrl_registers_t *oregs = + (osc32kctrl_registers_t *)DT_REG_ADDR(DT_NODELABEL(osc32kctrl)); + + oregs->OSC32KCTRL_XOSC32K = OSC32KCTRL_XOSC32K_ENABLE(1) | OSC32KCTRL_XOSC32K_XTALEN(1) | + OSC32KCTRL_XOSC32K_EN32K(1) | OSC32KCTRL_XOSC32K_RUNSTDBY(1) | + OSC32KCTRL_XOSC32K_STARTUP(PIC32CXSG_XOSC32K_STARTUP_TIME); + + while ((oregs->OSC32KCTRL_STATUS & BIT(OSC32KCTRL_STATUS_XOSC32KRDY_Pos)) == 0) { + } + + gregs->GCLK_GENCTRL[1] = GCLK_GENCTRL_SRC(GCLK_SOURCE_XOSC32K) | GCLK_GENCTRL_RUNSTDBY(1) | + GCLK_GENCTRL_GENEN(1); +} +#else +static void osc32k_init(void) +{ + gclk_registers_t *gregs = (gclk_registers_t *)DT_REG_ADDR(DT_NODELABEL(gclk)); + + gregs->GCLK_GENCTRL[1] = GCLK_GENCTRL_SRC(GCLK_SOURCE_OSCULP32K) | + GCLK_GENCTRL_RUNSTDBY(1) | GCLK_GENCTRL_GENEN(1); +} +#endif + +static void dpll_init(uint8_t n, uint32_t f_cpu) +{ + gclk_registers_t *gregs = (gclk_registers_t *)DT_REG_ADDR(DT_NODELABEL(gclk)); + oscctrl_registers_t *oscc_regs = (oscctrl_registers_t *)(OSCCTRL_BASE_ADDRESS); + /* We source the DPLL from 32kHz GCLK1 */ + const uint32_t ldr = ((f_cpu << 5) / SOC_MICROCHIP_PIC32CXSG_OSC32K_FREQ_HZ); + uint32_t dpll_rdy_msk = + BIT(OSCCTRL_DPLLSTATUS_CLKRDY_Pos) | BIT(OSCCTRL_DPLLSTATUS_LOCK_Pos); + + /* disable the DPLL before changing the configuration */ + oscc_regs->DPLL[n].OSCCTRL_DPLLCTRLA &= ~BIT(OSCCTRL_DPLLCTRLA_ENABLE_Pos); + + while (oscc_regs->DPLL[n].OSCCTRL_DPLLSYNCBUSY != 0) { + } + + /* set DPLL clock source to 32kHz GCLK1 */ + gregs->GCLK_PCHCTRL[OSCCTRL_GCLK_ID_FDPLL0 + n] = + (GCLK_PCHCTRL_GEN(1) | BIT(GCLK_PCHCTRL_CHEN_Pos)); + + while ((gregs->GCLK_PCHCTRL[OSCCTRL_GCLK_ID_FDPLL0 + n] & BIT(GCLK_PCHCTRL_CHEN_Pos)) == + 0) { + }; + + oscc_regs->DPLL[n].OSCCTRL_DPLLRATIO = + OSCCTRL_DPLLRATIO_LDRFRAC(ldr & 0x1F) | OSCCTRL_DPLLRATIO_LDR((ldr >> 5) - 1); + + /* Without LBYPASS, startup takes very long, see errata section 2.13. */ + oscc_regs->DPLL[n].OSCCTRL_DPLLCTRLB = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | + OSCCTRL_DPLLCTRLB_WUF(1) | + OSCCTRL_DPLLCTRLB_LBYPASS(1); + + oscc_regs->DPLL[n].OSCCTRL_DPLLCTRLA = OSCCTRL_DPLLCTRLA_ENABLE(1); + + while (oscc_regs->DPLL[n].OSCCTRL_DPLLSYNCBUSY != 0) { + } + + while ((oscc_regs->DPLL[n].OSCCTRL_DPLLSTATUS & dpll_rdy_msk) != dpll_rdy_msk) { + } +} + +static void dfll_init(void) +{ + oscctrl_registers_t *oscc_regs = (oscctrl_registers_t *)(OSCCTRL_BASE_ADDRESS); + uint32_t reg = OSCCTRL_DFLLCTRLB_QLDIS(1) +#ifdef OSCCTRL_DFLLCTRLB_WAITLOCK + | OSCCTRL_DFLLCTRLB_WAITLOCK(1) +#endif + ; + + oscc_regs->OSCCTRL_DFLLCTRLB = reg; + oscc_regs->OSCCTRL_DFLLCTRLA = OSCCTRL_DFLLCTRLA_ENABLE(1); + + while ((oscc_regs->OSCCTRL_STATUS & BIT(OSCCTRL_STATUS_DFLLRDY_Pos)) == 0) { + } +} + +static void gclk_reset(void) +{ + gclk_registers_t *gregs = (gclk_registers_t *)DT_REG_ADDR(DT_NODELABEL(gclk)); + + gregs->GCLK_CTRLA |= BIT(GCLK_CTRLA_SWRST_Pos); + + while ((gregs->GCLK_SYNCBUSY & BIT(GCLK_SYNCBUSY_SWRST_Pos)) != 0) { + } +} + +static void gclk_connect(uint8_t gclk, uint8_t src, uint8_t div) +{ + gclk_registers_t *gregs = (gclk_registers_t *)DT_REG_ADDR(DT_NODELABEL(gclk)); + + gregs->GCLK_GENCTRL[gclk] = + (GCLK_GENCTRL_SRC(src) | GCLK_GENCTRL_DIV(div) | GCLK_GENCTRL_GENEN(1)); +} + +void soc_reset_hook(void) +{ + cmcc_registers_t *cmcc_regs = (cmcc_registers_t *)(CMCC_BASE_ADDRESS); + uint8_t dfll_div = 1; + + if (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC < PIC32CXSG_DFLL_FREQ_HZ) { + dfll_div = 3; + } else if (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC < PIC32CXSG_DPLL_FREQ_MIN_HZ) { + dfll_div = 2; + } else { + dfll_div = 1; + } + + /* + * Force Cortex M Cache Controller disabled + * + * It is not clear if regular Cortex-M instructions can be used to + * perform cache maintenance or this is a proprietary cache controller + * that require special SoC support. + */ + cmcc_regs->CMCC_CTRL &= ~BIT(CMCC_CTRL_CEN_Pos); + + gclk_reset(); + osc32k_init(); + dfll_init(); + dpll_init(0, dfll_div * CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC); + + /* use DPLL for main clock */ + gclk_connect(0, GCLK_SOURCE_DPLL0, dfll_div); + + /* connect GCLK2 to 48 MHz DFLL for USB */ + gclk_connect(2, GCLK_SOURCE_DFLL48M, 0); +} diff --git a/soc/microchip/pic32cxsg/common/soc_port.c b/soc/microchip/pic32cxsg/common/soc_port.c new file mode 100644 index 0000000000000..22be73f1f45f9 --- /dev/null +++ b/soc/microchip/pic32cxsg/common/soc_port.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016 Piotr Mienkowski + * Copyright (c) 2018 Google LLC. + * Copyright (c) 2021 Gerson Fernando Budke + * Copyright (c) 2024 Microchip + * SPDX-License-Identifier: Apache-2.0 + */ + +/** @file + * @brief Microchip PIC32CSXSG MCU family I/O Pin Controller (PORT) + */ + +#include + +#include "soc_port.h" + +int soc_port_pinmux_set(PortGroup *pg, uint32_t pin, uint32_t func) +{ + bool is_odd = pin & 1; + int idx = pin / 2U; + + /* Each pinmux register holds the config for two pins. The + * even numbered pin goes in the bits 0..3 and the odd + * numbered pin in bits 4..7. + */ + if (is_odd) { + pg->PMUX[idx].bit.PMUXO = func; + } else { + pg->PMUX[idx].bit.PMUXE = func; + } + pg->PINCFG[pin].bit.PMUXEN = 1; + + return 0; +} + +void soc_port_configure(const struct soc_port_pin *pin) +{ + PortGroup *pg = pin->regs; + uint32_t flags = pin->flags; + uint32_t func = (pin->flags & SOC_PORT_FUNC_MASK) >> SOC_PORT_FUNC_POS; + PORT_PINCFG_Type pincfg = {.reg = 0}; + + /* Reset or analog I/O: all digital disabled */ + pg->PINCFG[pin->pinum] = pincfg; + pg->DIRCLR.reg = (1 << pin->pinum); + pg->OUTCLR.reg = (1 << pin->pinum); + + if (flags & SOC_PORT_PMUXEN_ENABLE) { + soc_port_pinmux_set(pg, pin->pinum, func); + return; + } + + if (flags & (SOC_PORT_PULLUP | SOC_PORT_PULLDOWN)) { + if (flags & SOC_PORT_PULLUP) { + pg->OUTSET.reg = (1 << pin->pinum); + } + + pincfg.bit.PULLEN = 1; + } + + if (flags & SOC_PORT_INPUT_ENABLE) { + pincfg.bit.INEN = 1; + } + + if (flags & SOC_PORT_OUTPUT_ENABLE) { + pg->DIRSET.reg = (1 << pin->pinum); + } + + if (flags & SOC_PORT_STRENGTH_STRONGER) { + pincfg.bit.DRVSTR = 1; + } + + pg->PINCFG[pin->pinum] = pincfg; +} + +void soc_port_list_configure(const struct soc_port_pin pins[], unsigned int size) +{ + for (int i = 0; i < size; i++) { + soc_port_configure(&pins[i]); + } +} diff --git a/soc/microchip/pic32cxsg/common/soc_port.h b/soc/microchip/pic32cxsg/common/soc_port.h new file mode 100644 index 0000000000000..6e743062ed577 --- /dev/null +++ b/soc/microchip/pic32cxsg/common/soc_port.h @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** @file + * @brief Microchip PIC32CXSG MCU family I/O Pin Controller (PORT) + */ + +#ifndef MICROCHIP_PIC32CXSG_SOC_PORT_H_ +#define MICROCHIP_PIC32CXSG_SOC_PORT_H_ + +#include + +/* + * Pin flags/attributes + */ +#define SOC_PORT_DEFAULT (0) + +#define SOC_PORT_FLAGS_POS (0) +#define SOC_PORT_FLAGS_MASK (0x7B << SOC_PORT_FLAGS_POS) +#define SOC_PORT_PULLUP_POS (SOC_PORT_FLAGS_POS) +#define SOC_PORT_PULLUP (1 << SOC_PORT_PULLUP_POS) +#define SOC_PORT_PULLDOWN_POS (SOC_PORT_PULLUP_POS + 1U) +#define SOC_PORT_PULLDOWN (1 << SOC_PORT_PULLDOWN_POS) +/* Open-Drain is a reserved entry at pinctrl driver */ +#define SOC_GPIO_OPENDRAIN_POS (SOC_PORT_PULLDOWN_POS + 1U) +/* Input-Enable means Input-Buffer, see dts/pinctrl/pincfg-node.yaml */ +#define SOC_PORT_INPUT_ENABLE_POS (SOC_GPIO_OPENDRAIN_POS + 1U) +#define SOC_PORT_INPUT_ENABLE (1 << SOC_PORT_INPUT_ENABLE_POS) +/* Output-Enable, see dts/pinctrl/pincfg-node.yaml */ +#define SOC_PORT_OUTPUT_ENABLE_POS (SOC_PORT_INPUT_ENABLE_POS + 1U) +#define SOC_PORT_OUTPUT_ENABLE (1 << SOC_PORT_OUTPUT_ENABLE_POS) +/* Drive-Strength, 0mA means normal, any other value means stronger */ +#define SOC_PORT_STRENGTH_STRONGER_POS (SOC_PORT_OUTPUT_ENABLE_POS + 1U) +#define SOC_PORT_STRENGTH_STRONGER (1 << SOC_PORT_STRENGTH_STRONGER_POS) +/* Peripheral Multiplexer Enable */ +#define SOC_PORT_PMUXEN_ENABLE_POS (SOC_PORT_STRENGTH_STRONGER_POS + 1U) +#define SOC_PORT_PMUXEN_ENABLE (1 << SOC_PORT_PMUXEN_ENABLE_POS) + +/* Bit field: SOC_PORT_FUNC */ +#define SOC_PORT_FUNC_POS (16U) +#define SOC_PORT_FUNC_MASK (0xF << SOC_PORT_FUNC_POS) + +/** Connect pin to peripheral A. */ +#define SOC_PORT_FUNC_A (0x0 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral B. */ +#define SOC_PORT_FUNC_B (0x1 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral C. */ +#define SOC_PORT_FUNC_C (0x2 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral D. */ +#define SOC_PORT_FUNC_D (0x3 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral E. */ +#define SOC_PORT_FUNC_E (0x4 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral F. */ +#define SOC_PORT_FUNC_F (0x5 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral G. */ +#define SOC_PORT_FUNC_G (0x6 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral H. */ +#define SOC_PORT_FUNC_H (0x7 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral I. */ +#define SOC_PORT_FUNC_I (0x8 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral J. */ +#define SOC_PORT_FUNC_J (0x9 << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral K. */ +#define SOC_PORT_FUNC_K (0xa << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral L. */ +#define SOC_PORT_FUNC_L (0xb << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral M. */ +#define SOC_PORT_FUNC_M (0xc << SOC_PORT_FUNC_POS) +/** Connect pin to peripheral N. */ +#define SOC_PORT_FUNC_N (0xd << SOC_PORT_FUNC_POS) + +struct soc_port_pin { + PortGroup *regs; /** pointer to registers of the I/O Pin Controller */ + uint32_t pinum; /** pin number */ + uint32_t flags; /** pin flags/attributes */ +}; + +/** + * @brief Configure PORT pin muxing. + * + * Configure one pin muxing belonging to some PORT. + * + * @param pg PortGroup register + * @param pin Pin number + * @param func Pin Function + */ +int soc_port_pinmux_set(PortGroup *pg, uint32_t pin, uint32_t func); + +/** + * @brief Configure PORT pin. + * + * Configure one pin belonging to some PORT. + * Example scenarios: + * - configure pin(s) as input. + * - connect pin(s) to a peripheral B and enable pull-up. + * + * @remark During Reset, all PORT lines are configured as inputs with input + * buffers, output buffers and pull disabled. When the device is set to the + * BACKUP sleep mode, even if the PORT configuration registers and input + * synchronizers will lose their contents (these will not be restored when + * PORT is powered up again), the latches in the pads will keep their current + * configuration, such as the output value and pull settings. Refer to the + * Power Manager documentation for more features related to the I/O lines + * configuration in and out of BACKUP mode. The PORT peripheral will continue + * operating in any Sleep mode where its source clock is running. + * + * @param pin pin's configuration data such as pin mask, pin attributes, etc. + */ +void soc_port_configure(const struct soc_port_pin *pin); + +/** + * @brief Configure a list of PORT pin(s). + * + * Configure an arbitrary amount of pins in an arbitrary way. Each + * configuration entry is a single item in an array passed as an argument to + * the function. + * + * @param pins an array where each item contains pin's configuration data. + * @param size size of the pin list. + */ +void soc_port_list_configure(const struct soc_port_pin pins[], unsigned int size); + +#endif /* MICROCHIP_PIC32CXSG_SOC_PORT_H_ */ diff --git a/soc/microchip/pic32cxsg/pic32cxsg41/CMakeLists.txt b/soc/microchip/pic32cxsg/pic32cxsg41/CMakeLists.txt new file mode 100644 index 0000000000000..a7bdea6c18973 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg41/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +zephyr_include_directories(.) diff --git a/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig b/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig new file mode 100644 index 0000000000000..efc48a981a887 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig @@ -0,0 +1,13 @@ +# Microchip PIC32CXSG MCU series + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +config SOC_SERIES_PIC32CXSG41 + select ARM + select CPU_CORTEX_M4 + select CPU_CORTEX_M_HAS_DWT + select CPU_HAS_ARM_MPU + select CPU_HAS_FPU + select SOC_RESET_HOOK diff --git a/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig.defconfig b/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig.defconfig new file mode 100644 index 0000000000000..9edcc65db5a59 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig.defconfig @@ -0,0 +1,15 @@ +# Microchip PIC32CXSG MCU series configuration options + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +if SOC_SERIES_PIC32CXSG41 + +config NUM_IRQS + default 137 + +config ROM_START_OFFSET + default 0x400 if BOOTLOADER_MCUBOOT + +endif # SOC_SERIES_PIC32CXSG41 diff --git a/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig.soc b/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig.soc new file mode 100644 index 0000000000000..18ca99879d514 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg41/Kconfig.soc @@ -0,0 +1,36 @@ +# Microchip PIC29CXSG41 MCU series + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +config SOC_SERIES_PIC32CXSG41 + bool + select SOC_FAMILY_MICROCHIP_PIC32CXSG + help + Enable support for Microchip PIC32CXSG Cortex-M4F microcontrollers. + +config SOC_SERIES + default "pic32cxsg41" if SOC_SERIES_PIC32CXSG41 + +config SOC_PIC32CX1025SG41064 + bool + select SOC_SERIES_PIC32CXSG41 + +config SOC_PIC32CX1025SG41080 + bool + select SOC_SERIES_PIC32CXSG41 + +config SOC_PIC32CX1025SG41100 + bool + select SOC_SERIES_PIC32CXSG41 + +config SOC_PIC32CX1025SG41128 + bool + select SOC_SERIES_PIC32CXSG41 + +config SOC + default "pic32cx1025sg41064" if SOC_PIC32CX1025SG41064 + default "pic32cx1025sg41080" if SOC_PIC32CX1025SG41080 + default "pic32cx1025sg41100" if SOC_PIC32CX1025SG41100 + default "pic32cx1025sg41128" if SOC_PIC32CX1025SG41128 diff --git a/soc/microchip/pic32cxsg/pic32cxsg41/soc.h b/soc/microchip/pic32cxsg/pic32cxsg41/soc.h new file mode 100644 index 0000000000000..184ebf3a70cb7 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg41/soc.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _SOC_MICROCHIP_PIC32CXSG41_SOC_H_ +#define _SOC_MICROCHIP_PIC32CXSG41_SOC_H_ + +#ifndef _ASMLANGUAGE + +#define DONT_USE_CMSIS_INIT + +#include + +#if defined(CONFIG_SOC_PIC32CX1025SG41064) +#include +#elif defined(CONFIG_SOC_PIC32CX1025SG41080) +#include +#elif defined(CONFIG_SOC_PIC32CX1025SG41100) +#include +#elif defined(CONFIG_SOC_PIC32CX1025SG41128) +#include + +#else +#error Library does not support the specified device. +#endif + +#endif /* _ASMLANGUAGE */ + +#include +#include "../common/microchip_pic32cxsg_dt.h" + +#define SOC_MICROCHIP_PIC32CXSG_OSC32K_FREQ_HZ 32768 +#define SOC_MICROCHIP_PIC32CXSG_DFLL48_FREQ_HZ 48000000 + +/** Processor Clock (HCLK) Frequency */ +#define SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC +/** Master Clock (MCK) Frequency */ +#define SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ +#define SOC_MICROCHIP_PIC32CXSG_GCLK0_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ +#define SOC_MICROCHIP_PIC32CXSG_GCLK2_FREQ_HZ 48000000 + +#define SOC_ATMEL_SAM0_HCLK_FREQ_HZ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC +#define SOC_ATMEL_SAM0_MCK_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ +#define SOC_ATMEL_SAM0_GCLK0_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ +#define SOC_ATMEL_SAM0_GCLK2_FREQ_HZ 48000000 + +/* PIC32CXSG is using the original Atmel SAM0 UART driver. + * The driver uses MCLK to select different GCLK register structures. + * We define GCLK pointer using a HAL define fixup structure matching the MCLK + * version of global clock registers. + * Once PIC32CXSG has Microchip DFP compliant driver these will no longer be required. + */ +#define MCLK (DT_REG_ADDR(DT_NODELABEL(mclk))) +#define GCLK ((Gclk *)(DT_REG_ADDR(DT_NODELABEL(gclk)))) + +#endif /* _SOC_MICROCHIP_PIC32CXSG41_SOC_H_ */ diff --git a/soc/microchip/pic32cxsg/pic32cxsg60/CMakeLists.txt b/soc/microchip/pic32cxsg/pic32cxsg60/CMakeLists.txt new file mode 100644 index 0000000000000..a7bdea6c18973 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg60/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +zephyr_include_directories(.) diff --git a/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig b/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig new file mode 100644 index 0000000000000..7c94de92c88b0 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig @@ -0,0 +1,12 @@ +# Microchip PIC32CXSG MCU series + +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +config SOC_SERIES_PIC32CXSG60 + select ARM + select CPU_CORTEX_M4 + select CPU_CORTEX_M_HAS_DWT + select CPU_HAS_ARM_MPU + select CPU_HAS_FPU + select SOC_RESET_HOOK diff --git a/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig.defconfig b/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig.defconfig new file mode 100644 index 0000000000000..86b25e34f635c --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig.defconfig @@ -0,0 +1,15 @@ +# Microchip PIC32CXSG MCU series configuration options + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +if SOC_SERIES_PIC32CXSG60 + +config NUM_IRQS + default 137 + +config ROM_START_OFFSET + default 0x400 if BOOTLOADER_MCUBOOT + +endif # SOC_SERIES_PIC32CXSG60 diff --git a/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig.soc b/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig.soc new file mode 100644 index 0000000000000..5665679cb3085 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg60/Kconfig.soc @@ -0,0 +1,26 @@ +# Microchip PIC32CXSG60 MCU series + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +config SOC_SERIES_PIC32CXSG60 + bool + select SOC_FAMILY_MICROCHIP_PIC32CXSG + help + Enable support for Microchip PIC32CXSG Cortex-M4F microcontrollers. + +config SOC_SERIES + default "pic32cxsg60" if SOC_SERIES_PIC32CXSG60 + +config SOC_PIC32CX1025SG60100 + bool + select SOC_SERIES_PIC32CXSG60 + +config SOC_PIC32CX1025SG60128 + bool + select SOC_SERIES_PIC32CXSG60 + +config SOC + default "pic32cx1025sg60100" if SOC_PIC32CX1025SG60100 + default "pic32cx1025sg60128" if SOC_PIC32CX1025SG60128 diff --git a/soc/microchip/pic32cxsg/pic32cxsg60/soc.h b/soc/microchip/pic32cxsg/pic32cxsg60/soc.h new file mode 100644 index 0000000000000..f1534204dd26a --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg60/soc.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _SOC_MICROCHIP_PIC32CXSG60_SOC_H_ +#define _SOC_MICROCHIP_PIC32CXSG60_SOC_H_ + +#ifndef _ASMLANGUAGE + +#define DONT_USE_CMSIS_INIT + +#include + +#if defined(CONFIG_SOC_PIC32CX1025SG60100) +#include +#elif defined(CONFIG_SOC_PIC32CX1025SG60128) +#include + +#else +#error Library does not support the specified device. +#endif + +#endif /* _ASMLANGUAGE */ + +#include +#include "../common/microchip_pic32cxsg_dt.h" + +#define SOC_MICROCHIP_PIC32CXSG_OSC32K_FREQ_HZ 32768 +#define SOC_MICROCHIP_PIC32CXSG_DFLL48_FREQ_HZ 48000000 + +/** Processor Clock (HCLK) Frequency */ +#define SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC +/** Master Clock (MCK) Frequency */ +#define SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ +#define SOC_MICROCHIP_PIC32CXSG_GCLK0_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ +#define SOC_MICROCHIP_PIC32CXSG_GCLK2_FREQ_HZ 48000000 + +#define SOC_ATMEL_SAM0_HCLK_FREQ_HZ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC +#define SOC_ATMEL_SAM0_MCK_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ +#define SOC_ATMEL_SAM0_GCLK0_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ +#define SOC_ATMEL_SAM0_GCLK2_FREQ_HZ 48000000 + +/* PIC32CXSG is using the original Atmel SAM0 UART driver. + * The driver uses MCLK to select different GCLK register structures. + * We define GCLK pointer using a HAL define fixup structure matching the MCLK + * version of global clock registers. + * Once PIC32CXSG has Microchip DFP compliant driver these will no longer be required. + */ +#define MCLK (DT_REG_ADDR(DT_NODELABEL(mclk))) +#define GCLK ((Gclk *)(DT_REG_ADDR(DT_NODELABEL(gclk)))) + +#endif /* _SOC_MICROCHIP_PIC32CXSG41_SOC_H_ */ diff --git a/soc/microchip/pic32cxsg/pic32cxsg61/CMakeLists.txt b/soc/microchip/pic32cxsg/pic32cxsg61/CMakeLists.txt new file mode 100644 index 0000000000000..a7bdea6c18973 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg61/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +zephyr_include_directories(.) diff --git a/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig b/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig new file mode 100644 index 0000000000000..c7fda07db11c0 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig @@ -0,0 +1,13 @@ +# Microchip PIC32CXSG MCU series + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +config SOC_SERIES_PIC32CXSG61 + select ARM + select CPU_CORTEX_M4 + select CPU_CORTEX_M_HAS_DWT + select CPU_HAS_ARM_MPU + select CPU_HAS_FPU + select SOC_RESET_HOOK diff --git a/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig.defconfig b/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig.defconfig new file mode 100644 index 0000000000000..8c006547df9ef --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig.defconfig @@ -0,0 +1,15 @@ +# Microchip PIC32CXSG MCU series configuration options + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +if SOC_SERIES_PIC32CXSG61 + +config NUM_IRQS + default 137 + +config ROM_START_OFFSET + default 0x400 if BOOTLOADER_MCUBOOT + +endif # SOC_SERIES_PIC32CXSG61 diff --git a/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig.soc b/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig.soc new file mode 100644 index 0000000000000..3d32e6e4a02ce --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg61/Kconfig.soc @@ -0,0 +1,26 @@ +# Microchip PIC32CXSG61 MCU series + +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +config SOC_SERIES_PIC32CXSG61 + bool + select SOC_FAMILY_MICROCHIP_PIC32CXSG + help + Enable support for Microchip PIC32CXSG Cortex-M4F microcontrollers. + +config SOC_SERIES + default "pic32cxsg61" if SOC_SERIES_PIC32CXSG61 + +config SOC_PIC32CX1025SG61100 + bool + select SOC_SERIES_PIC32CXSG61 + +config SOC_PIC32CX1025SG61128 + bool + select SOC_SERIES_PIC32CXSG61 + +config SOC + default "pic32cx1025sg61100" if SOC_PIC32CX1025SG61100 + default "pic32cx1025sg61128" if SOC_PIC32CX1025SG61128 diff --git a/soc/microchip/pic32cxsg/pic32cxsg61/soc.h b/soc/microchip/pic32cxsg/pic32cxsg61/soc.h new file mode 100644 index 0000000000000..d8d1f7021c523 --- /dev/null +++ b/soc/microchip/pic32cxsg/pic32cxsg61/soc.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _SOC_MICROCHIP_PIC32CXSG61_SOC_H_ +#define _SOC_MICROCHIP_PIC32CXSG61_SOC_H_ + +#ifndef _ASMLANGUAGE + +#define DONT_USE_CMSIS_INIT + +#include + +#if defined(CONFIG_SOC_PIC32CX1025SG61100) +#include +#elif defined(CONFIG_SOC_PIC32CX1025SG61128) +#include + +#else +#error Library does not support the specified device. +#endif + +#endif /* _ASMLANGUAGE */ + +#include +#include "../common/microchip_pic32cxsg_dt.h" + +#define SOC_MICROCHIP_PIC32CXSG_OSC32K_FREQ_HZ 32768 +#define SOC_MICROCHIP_PIC32CXSG_DFLL48_FREQ_HZ 48000000 + +/** Processor Clock (HCLK) Frequency */ +#define SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC +/** Master Clock (MCK) Frequency */ +#define SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ +#define SOC_MICROCHIP_PIC32CXSG_GCLK0_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ +#define SOC_MICROCHIP_PIC32CXSG_GCLK2_FREQ_HZ 48000000 + +#define SOC_ATMEL_SAM0_HCLK_FREQ_HZ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC +#define SOC_ATMEL_SAM0_MCK_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_HCLK_FREQ_HZ +#define SOC_ATMEL_SAM0_GCLK0_FREQ_HZ SOC_MICROCHIP_PIC32CXSG_MCK_FREQ_HZ +#define SOC_ATMEL_SAM0_GCLK2_FREQ_HZ 48000000 + +/* PIC32CXSG is using the original Atmel SAM0 UART driver. + * The driver uses MCLK to select different GCLK register structures. + * We define GCLK pointer using a HAL define fixup structure matching the MCLK + * version of global clock registers. + * Once PIC32CXSG has Microchip DFP compliant driver these will no longer be required. + */ +#define MCLK (DT_REG_ADDR(DT_NODELABEL(mclk))) +#define GCLK ((Gclk *)(DT_REG_ADDR(DT_NODELABEL(gclk)))) + +#endif /* _SOC_MICROCHIP_PIC32CXSG41_SOC_H_ */ diff --git a/soc/microchip/pic32cxsg/soc.yml b/soc/microchip/pic32cxsg/soc.yml new file mode 100644 index 0000000000000..787388f435a42 --- /dev/null +++ b/soc/microchip/pic32cxsg/soc.yml @@ -0,0 +1,17 @@ +family: +- name: microchip_pic32cxsg + series: + - name: pic32cxsg41 + socs: + - name: pic32cx1025sg41064 + - name: pic32cx1025sg41080 + - name: pic32cx1025sg41100 + - name: pic32cx1025sg41128 + - name: pic32cxsg60 + socs: + - name: pic32cx1025sg60100 + - name: pic32cx1025sg60128 + - name: pic32cxsg61 + socs: + - name: pic32cx1025sg61100 + - name: pic32cx1025sg61128 From 74b0f44312e9565a6decf68e94e0f875e1cdf7d0 Mon Sep 17 00:00:00 2001 From: Michael Sherwood Date: Mon, 4 Aug 2025 07:40:12 -0700 Subject: [PATCH 4/8] dts: pinctl: Add pinctrl node to PIC32CXSG dtsi Added pinctrl node to PIC32CXSG dtsi without driver compatible Signed-off-by: Michael Sherwood --- .../pic32c/pic32cx_sg/pic32cxsg.dtsi | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi index afe23532fe63b..b4ad3df9f33a3 100644 --- a/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi +++ b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi @@ -181,6 +181,44 @@ reg = <0x41008180 0x80>; }; + pinctrl: pinctrl@41008000 { + ranges = <0x41008000 0x41008000 0x200>; + #address-cells = <1>; + #size-cells = <1>; + + porta: gpio@41008000 { + compatible = "atmel,sam0-gpio"; + reg = <0x41008000 0x80>; + #atmel,pin-cells = <2>; + #gpio-cells = <2>; + gpio-controller; + }; + + portb: gpio@41008080 { + compatible = "atmel,sam0-gpio"; + reg = <0x41008080 0x80>; + #atmel,pin-cells = <2>; + #gpio-cells = <2>; + gpio-controller; + }; + + portc: gpio@41008100 { + compatible = "atmel,sam0-gpio"; + reg = <0x41008100 0x80>; + #atmel,pin-cells = <2>; + #gpio-cells = <2>; + gpio-controller; + }; + + portd: gpio@41008180 { + compatible = "atmel,sam0-gpio"; + reg = <0x41008180 0x80>; + #atmel,pin-cells = <2>; + #gpio-cells = <2>; + gpio-controller; + }; + }; + dmac: dmac@4100a000 { compatible = "atmel,sam0-dmac"; reg = <0x4100A000 0x50>; From 2f35e49aedac75c34b28b67cedb5c66a17d696aa Mon Sep 17 00:00:00 2001 From: Michael D Sherwood Date: Tue, 11 Mar 2025 10:32:10 -0700 Subject: [PATCH 5/8] drivers: pinctrl Addition of pic32cxsg pin control Addition of pic32cxsg pin control including yaml, bindings, Kconfig, Signed-off-by: Michael D Sherwood --- drivers/pinctrl/CMakeLists.txt | 1 + drivers/pinctrl/Kconfig | 1 + drivers/pinctrl/Kconfig.pic32cxsg | 9 ++ .../pic32c/pic32cx_sg/pic32cxsg.dtsi | 1 + .../pinctrl/microchip,pic32cxsg-pinctrl.yaml | 121 ++++++++++++++++++ .../pinctrl/microchip,pic32cxsg-pinmux.yaml | 13 ++ .../pinctrl/pinctrl_soc_pic32cxsg_common.h | 102 +++++++++++++++ 7 files changed, 248 insertions(+) create mode 100644 drivers/pinctrl/Kconfig.pic32cxsg create mode 100644 dts/bindings/pinctrl/microchip,pic32cxsg-pinctrl.yaml create mode 100644 dts/bindings/pinctrl/microchip,pic32cxsg-pinmux.yaml create mode 100644 include/zephyr/drivers/pinctrl/pinctrl_soc_pic32cxsg_common.h diff --git a/drivers/pinctrl/CMakeLists.txt b/drivers/pinctrl/CMakeLists.txt index 7346578e75d03..fd01852d90dc7 100644 --- a/drivers/pinctrl/CMakeLists.txt +++ b/drivers/pinctrl/CMakeLists.txt @@ -21,6 +21,7 @@ zephyr_library_sources_ifdef(CONFIG_PINCTRL_RPI_PICO pinctrl_rpi_pico.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_SAM pinctrl_sam.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_SAM0 pinctrl_sam0.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_SAM_PIO4 pinctrl_sam_pio4.c) +zephyr_library_sources_ifdef(CONFIG_PINCTRL_PIC32CXSG pinctrl_sam0.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_STM32 pinctrl_stm32.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_NXP_PORT pinctrl_nxp_port.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_MCHP_XEC pinctrl_mchp_xec.c) diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index e13c4e427ff71..905d968fc58f0 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig @@ -50,6 +50,7 @@ source "drivers/pinctrl/Kconfig.mspm0" source "drivers/pinctrl/Kconfig.rpi_pico" source "drivers/pinctrl/Kconfig.sam" source "drivers/pinctrl/Kconfig.sam0" +source "drivers/pinctrl/Kconfig.pic32cxsg" source "drivers/pinctrl/Kconfig.stm32" source "drivers/pinctrl/Kconfig.nxp_port" source "drivers/pinctrl/Kconfig.xec" diff --git a/drivers/pinctrl/Kconfig.pic32cxsg b/drivers/pinctrl/Kconfig.pic32cxsg new file mode 100644 index 0000000000000..c7840b1179d12 --- /dev/null +++ b/drivers/pinctrl/Kconfig.pic32cxsg @@ -0,0 +1,9 @@ +# Copyright (c) 2024, Microchip +# SPDX-License-Identifier: Apache-2.0 + +config PINCTRL_PIC32CXSG + bool "Microchip PIC32CXSG pin controller driver" + default y + depends on DT_HAS_MICROCHIP_PIC32CXSG_PINCTRL_ENABLED + help + Microchip pin controller driver is used on PIC32CXSG SoC series diff --git a/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi index b4ad3df9f33a3..1fb77fab236d7 100644 --- a/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi +++ b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi @@ -182,6 +182,7 @@ }; pinctrl: pinctrl@41008000 { + compatible = "atmel,sam0-pinctrl"; ranges = <0x41008000 0x41008000 0x200>; #address-cells = <1>; #size-cells = <1>; diff --git a/dts/bindings/pinctrl/microchip,pic32cxsg-pinctrl.yaml b/dts/bindings/pinctrl/microchip,pic32cxsg-pinctrl.yaml new file mode 100644 index 0000000000000..7c898c611bb44 --- /dev/null +++ b/dts/bindings/pinctrl/microchip,pic32cxsg-pinctrl.yaml @@ -0,0 +1,121 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +description: | + Microchip PIC32CXSG Pinctrl container node + + The Microchip PIC32CXSG pin controller is a singleton node responsible for controlling + pin function selection and pin properties. For example, you can use this node + to route SERCOM0 as UART were RX to pin PAD1 and enable the pull-up resistor + on the pin. + + The node has the 'pinctrl' node label set in your SoC's devicetree, so you can + modify it like this: + + &pinctrl { + /* your modifications go here */ + }; + + All device pin configurations should be placed in child nodes of the 'pinctrl' + node, as shown in this example: + + /** You can put this in places like a -pinctrl.dtsi file in + * your board directory, or a devicetree overlay in your application. + */ + + /** include pre-defined combinations for the SoC variant used by the board */ + #include + + &pinctrl { + /* configuration for the usart0 "default" state */ + sercom0_uart_default: sercom0_uart_default { + /* group 1 */ + group1 { + /* configure PA6 as USART0 TX and PA8 as USART0 CTS */ + pinmux = , ; + }; + /* group 2 */ + group2 { + /* configure PA5 as USART0 RX and PA7 as USART0 RTS */ + pinmux = , ; + /* both PA5 and PA7 have pull-up enabled */ + bias-pull-up; + }; + }; + }; + + The 'usart0_default' child node encodes the pin configurations for a + particular state of a device; in this case, the default (that is, active) + state. + + As shown, pin configurations are organized in groups within each child node. + Each group can specify a list of pin function selections in the 'pinmux' + property. + + A group can also specify shared pin properties common to all the specified + pins, such as the 'bias-pull-up' property in group 2. Here is a list of + supported standard pin properties: + + - bias-pull-up: Enable pull-up resistor. + - bias-pull-down: Enable pull-down resistor. + - drive-strength: Increase sink current. + - input-enable: Enable input on pin. + - output-enable: Enable output on a pin without actively driving it. + + To link pin configurations with a device, use a pinctrl-N property for some + number N, like this example you could place in your board's DTS file: + + #include "board-pinctrl.dtsi" + + &usart0 { + pinctrl-0 = <&usart0_default>; + pinctrl-names = "default"; + }; + +compatible: "microchip,pic32cxsg-pinctrl" + +include: base.yaml + +properties: + "#address-cells": + required: true + const: 1 + "#size-cells": + required: true + const: 1 + +child-binding: + description: | + Each child node defines the configuration for a particular state. + child-binding: + description: | + The grandchild nodes group pins that share the pic32cxsg pin configuration. + + include: + - name: pincfg-node.yaml + property-allowlist: + - bias-pull-up + - bias-pull-down + - drive-strength + - input-enable + - output-enable + + properties: + pinmux: + required: true + type: array + description: | + An array of pins sharing the pic32cxsg group properties. The pins should + be defined using pre-defined macros or, alternatively, using the + SAM_PINCTRL utility macros depending on the pinmux model used by the + SoC series. + drive-strength: + enum: + - 0 + - 1 + default: 0 + description: | + The drive strength controls the output driver strength of an I/O pin + configured as an output. + 0: Pin drive strength is set to normal drive strength. + 1: Pin drive strength is set to stronger drive strength. diff --git a/dts/bindings/pinctrl/microchip,pic32cxsg-pinmux.yaml b/dts/bindings/pinctrl/microchip,pic32cxsg-pinmux.yaml new file mode 100644 index 0000000000000..990405fd8eb88 --- /dev/null +++ b/dts/bindings/pinctrl/microchip,pic32cxsg-pinmux.yaml @@ -0,0 +1,13 @@ +description: Microchip PIC32CXSG PINMUX + +compatible: "microchip,pic32cxsg-pinmux" + +include: base.yaml + +properties: + reg: + required: true + +pinmux-cells: + - pin + - function diff --git a/include/zephyr/drivers/pinctrl/pinctrl_soc_pic32cxsg_common.h b/include/zephyr/drivers/pinctrl/pinctrl_soc_pic32cxsg_common.h new file mode 100644 index 0000000000000..2808e2f32fe2e --- /dev/null +++ b/include/zephyr/drivers/pinctrl/pinctrl_soc_pic32cxsg_common.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * Microchip PIC32CXSG SoC specific helpers for pinctrl driver + */ + +#ifndef ZEPHYR_INCLUDE_DRIVERS_PINCTRL_PINCTRL_SOC_PIC32CXSG_COMMON_H_ +#define ZEPHYR_INCLUDE_DRIVERS_PINCTRL_PINCTRL_SOC_PIC32CXSG_COMMON_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond INTERNAL_HIDDEN */ + +/** @brief Type for PIC32CXSG pin. + * + * Bits: + * - 0-15: PIC32CXSG pinmux bit field (@ref SAM_PINMUX). + * - 16-21: Pin flags bit field (@ref PIC32CXSG_PINFLAGS). + * - 22-31: Reserved. + */ +typedef uint32_t pinctrl_soc_pin_t; + +/** + * @brief Utility macro to initialize each pin. + * + * @param node_id Node identifier. + * @param prop Property name. + * @param idx Property entry index. + */ +/* (CONFIG_SOC_FAMILY_MICROCHIP_PIC32CXSG) */ +#define Z_PINCTRL_STATE_PIN_INIT(node_id, prop, idx) \ + ((DT_PROP_BY_IDX(node_id, prop, idx) << SAM_PINCTRL_PINMUX_POS) | \ + (DT_PROP(node_id, bias_pull_up) << SAM_PINCTRL_PULLUP_POS) | \ + (DT_PROP(node_id, bias_pull_down) << SAM_PINCTRL_PULLDOWN_POS) | \ + (DT_PROP(node_id, input_enable) << SAM_PINCTRL_INPUTENABLE_POS) | \ + (DT_PROP(node_id, output_enable) << SAM_PINCTRL_OUTPUTENABLE_POS) | \ + (DT_ENUM_IDX(node_id, drive_strength) << SAM_PINCTRL_DRIVESTRENGTH_POS)), + +/** + * @brief Utility macro to initialize state pins contained in a given property. + * + * @param node_id Node identifier. + * @param prop Property name describing state pins. + */ +#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \ + {DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), DT_FOREACH_PROP_ELEM, pinmux, \ + Z_PINCTRL_STATE_PIN_INIT)} + +/** @endcond */ + +/** + * @brief Pin flags/attributes + * @anchor PIC32CXSG_PINFLAGS + * + * @{ + */ + +#define SAM_PINCTRL_FLAGS_DEFAULT (0U) +#define SAM_PINCTRL_FLAGS_POS (0U) +#define SAM_PINCTRL_FLAGS_MASK (0x3F << SAM_PINCTRL_FLAGS_POS) +#define SAM_PINCTRL_FLAG_MASK (1U) +#define SAM_PINCTRL_PULLUP_POS (SAM_PINCTRL_FLAGS_POS) +#define SAM_PINCTRL_PULLUP (1U << SAM_PINCTRL_PULLUP_POS) +#define SAM_PINCTRL_PULLDOWN_POS (SAM_PINCTRL_PULLUP_POS + 1U) +#define SAM_PINCTRL_PULLDOWN (1U << SAM_PINCTRL_PULLDOWN_POS) +#define SAM_PINCTRL_OPENDRAIN_POS (SAM_PINCTRL_PULLDOWN_POS + 1U) +#define SAM_PINCTRL_OPENDRAIN (1U << SAM_PINCTRL_OPENDRAIN_POS) +#define SAM_PINCTRL_INPUTENABLE_POS (SAM_PINCTRL_OPENDRAIN_POS + 1U) +#define SAM_PINCTRL_INPUTENABLE (1U << SAM_PINCTRL_INPUTENABLE_POS) +#define SAM_PINCTRL_OUTPUTENABLE_POS (SAM_PINCTRL_INPUTENABLE_POS + 1U) +#define SAM_PINCTRL_OUTPUTENABLE (1U << SAM_PINCTRL_OUTPUTENABLE_POS) +#define SAM_PINCTRL_DRIVESTRENGTH_POS (SAM_PINCTRL_OUTPUTENABLE_POS + 1U) +#define SAM_PINCTRL_DRIVESTRENGTH (1U << SAM_PINCTRL_DRIVESTRENGTH_POS) + +/** @} */ + +/** + * Obtain Flag value from pinctrl_soc_pin_t configuration. + * + * @param pincfg pinctrl_soc_pin_t bit field value. + * @param pos attribute/flags bit position (@ref PIC32CXSG_PINFLAGS). + */ +#define SAM_PINCTRL_FLAG_GET(pincfg, pos) (((pincfg) >> pos) & SAM_PINCTRL_FLAG_MASK) + +#define SAM_PINCTRL_FLAGS_GET(pincfg) (((pincfg) >> SAM_PINCTRL_FLAGS_POS) & SAM_PINCTRL_FLAGS_MASK) + +#ifdef __cplusplus +} +#endif + +#endif /* ZEPHYR_INCLUDE_DRIVERS_PINCTRL_PINCTRL_SOC_PIC32CXSG_COMMON_H_ */ From 750923e69790cf1617ca1e7c1629882ac8b6d5bb Mon Sep 17 00:00:00 2001 From: Michael Sherwood Date: Mon, 4 Aug 2025 08:22:47 -0700 Subject: [PATCH 6/8] dts: serial: Use pic32cxsg compatiable for sercom Use microchip pic32cxsg compatiable for sercom Signed-off-by: Michael Sherwood --- .../microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi index 1fb77fab236d7..f635a7dc3f368 100644 --- a/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi +++ b/dts/arm/microchip/pic32c/pic32cx_sg/pic32cxsg.dtsi @@ -118,7 +118,7 @@ }; sercom0: sercom@40003000 { - compatible = "atmel,sam0-sercom"; + compatible = "microchip,pic32cxsg-sercom"; reg = <0x40003000 0x40>; interrupts = <46 0>, <47 0>, <48 0>, <49 0>; clocks = <&gclk 7>, <&mclk 0x14 12>; @@ -129,7 +129,7 @@ }; sercom1: sercom@40003400 { - compatible = "atmel,sam0-sercom"; + compatible = "microchip,pic32cxsg-sercom"; reg = <0x40003400 0x40>; interrupts = <50 0>, <51 0>, <52 0>, <53 0>; clocks = <&gclk 8>, <&mclk 0x14 13>; @@ -251,7 +251,7 @@ }; sercom2: sercom@41012000 { - compatible = "atmel,sam0-sercom"; + compatible = "microchip,pic32cxsg-sercom"; reg = <0x41012000 0x40>; interrupts = <54 0>, <55 0>, <56 0>, <57 0>; clocks = <&gclk 23>, <&mclk 0x18 9>; @@ -262,7 +262,7 @@ }; sercom3: sercom@41014000 { - compatible = "atmel,sam0-sercom"; + compatible = "microchip,pic32cxsg-sercom"; reg = <0x41014000 0x40>; interrupts = <58 0>, <59 0>, <60 0>, <61 0>; clocks = <&gclk 24>, <&mclk 0x18 10>; @@ -401,7 +401,7 @@ }; sercom4: sercom@43000000 { - compatible = "atmel,sam0-sercom"; + compatible = "microchip,pic32cxsg-sercom"; reg = <0x43000000 0x40>; interrupts = <62 0>, <63 0>, <64 0>, <65 0>; clocks = <&gclk 34>, <&mclk 0x20 0>; @@ -412,7 +412,7 @@ }; sercom5: sercom@43000400 { - compatible = "atmel,sam0-sercom"; + compatible = "microchip,pic32cxsg-sercom"; reg = <0x43000400 0x40>; interrupts = <66 0>, <67 0>, <68 0>, <69 0>; clocks = <&gclk 35>, <&mclk 0x20 1>; @@ -423,7 +423,7 @@ }; sercom6: sercom@43000800 { - compatible = "atmel,sam0-sercom"; + compatible = "microchip,pic32cxsg-sercom"; reg = <0x43000800 0x40>; interrupts = <70 0>, <71 0>, <72 0>, <73 0>; clocks = <&gclk 36>, <&mclk 0x20 2>; @@ -434,7 +434,7 @@ }; sercom7: sercom@43000c00 { - compatible = "atmel,sam0-sercom"; + compatible = "microchip,pic32cxsg-sercom"; reg = <0x43000C00 0x40>; interrupts = <74 0>, <75 0>, <76 0>, <77 0>; clocks = <&gclk 37>, <&mclk 0x20 3>; From 9608226545d5a8296d8796ec3b5a3e9f6ae2fc71 Mon Sep 17 00:00:00 2001 From: Michael D Sherwood Date: Tue, 11 Mar 2025 10:44:54 -0700 Subject: [PATCH 7/8] drivers: serial: microchip Addition of pic32cxsg serial Addition of pic32cxsg serial driver, Kconfig, yaml Signed-off-by: Michael D Sherwood --- drivers/serial/CMakeLists.txt | 1 + drivers/serial/Kconfig | 1 + drivers/serial/Kconfig.pic32cxsg | 18 ++++ .../arm/microchip,pic32cxsg-sercom.yaml | 17 ++++ .../serial/microchip,pic32cxsg-uart.yaml | 93 +++++++++++++++++++ 5 files changed, 130 insertions(+) create mode 100644 drivers/serial/Kconfig.pic32cxsg create mode 100644 dts/bindings/arm/microchip,pic32cxsg-sercom.yaml create mode 100644 dts/bindings/serial/microchip,pic32cxsg-uart.yaml diff --git a/drivers/serial/CMakeLists.txt b/drivers/serial/CMakeLists.txt index d2e05081316d8..a37e3f0d9baac 100644 --- a/drivers/serial/CMakeLists.txt +++ b/drivers/serial/CMakeLists.txt @@ -64,6 +64,7 @@ zephyr_library_sources_ifdef(CONFIG_UART_NUMICRO uart_numicro.c) zephyr_library_sources_ifdef(CONFIG_UART_NXP_S32_LINFLEXD uart_nxp_s32_linflexd.c) zephyr_library_sources_ifdef(CONFIG_UART_OPENTITAN uart_opentitan.c) zephyr_library_sources_ifdef(CONFIG_UART_PDL_INFINEON_CAT1 uart_ifx_cat1_pdl.c) +zephyr_library_sources_ifdef(CONFIG_UART_PIC32CXSG uart_sam0.c) zephyr_library_sources_ifdef(CONFIG_UART_PIPE uart_pipe.c) zephyr_library_sources_ifdef(CONFIG_UART_PL011 uart_pl011.c) zephyr_library_sources_ifdef(CONFIG_UART_PSOC6 uart_psoc6.c) diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index ea3fbed123bac..142d3759f0184 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -207,6 +207,7 @@ rsource "Kconfig.numaker" rsource "Kconfig.numicro" rsource "Kconfig.nxp_s32" rsource "Kconfig.opentitan" +rsource "Kconfig.pic32cxsg" rsource "Kconfig.pl011" rsource "Kconfig.psoc6" rsource "Kconfig.ql_usbserialport_s3b" diff --git a/drivers/serial/Kconfig.pic32cxsg b/drivers/serial/Kconfig.pic32cxsg new file mode 100644 index 0000000000000..ac5d529b2add3 --- /dev/null +++ b/drivers/serial/Kconfig.pic32cxsg @@ -0,0 +1,18 @@ +# Microchip PIC32CXSG SERCOM configuration options + +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +config UART_PIC32CXSG + bool "Microchip PIC32CXSG series SERCOM USART driver" + default y + depends on DT_HAS_MICROCHIP_PIC32CXSG_UART_ENABLED + select SERIAL_HAS_DRIVER + select SERIAL_SUPPORT_INTERRUPT + help + This option enables the SERCOMx USART driver for Microchip PIC32CXSG MCUs. + +config UART_PIC32CXSG_ASYNC + bool "Async UART support for Microchip PIC32CXSG series" + depends on UART_PIC32CXSG + depends on UART_ASYNC_API diff --git a/dts/bindings/arm/microchip,pic32cxsg-sercom.yaml b/dts/bindings/arm/microchip,pic32cxsg-sercom.yaml new file mode 100644 index 0000000000000..ffc220a75cec5 --- /dev/null +++ b/dts/bindings/arm/microchip,pic32cxsg-sercom.yaml @@ -0,0 +1,17 @@ +description: Microchip PIC32CXSG multi-protocol (UART, SPI, I2C) SERCOM unit + +compatible: "microchip,pic32cxsg-sercom" + +include: + - name: base.yaml + - name: atmel,assigned-clocks.yaml + +properties: + reg: + required: true + + interrupts: + required: true + + clocks: + required: true diff --git a/dts/bindings/serial/microchip,pic32cxsg-uart.yaml b/dts/bindings/serial/microchip,pic32cxsg-uart.yaml new file mode 100644 index 0000000000000..d1f9c8aea3e20 --- /dev/null +++ b/dts/bindings/serial/microchip,pic32cxsg-uart.yaml @@ -0,0 +1,93 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +description: Microchip PIC32CXSG SERCOM UART driver + +compatible: "microchip,pic32cxsg-uart" + +include: + - name: uart-controller.yaml + - name: pinctrl-device.yaml + - name: atmel,assigned-clocks.yaml + +properties: + reg: + required: true + + interrupts: + required: true + + clocks: + required: true + + clock-names: + required: true + + atmel,assigned-clocks: + required: true + + atmel,assigned-clock-names: + required: true + + rxpo: + type: int + required: true + description: | + Receive Data Pinout. An enumeration with the following values: + + +-------+---------------+ + | Value | RX Pin | + +-------+---------------+ + | 0 | SERCOM_PAD[0] | + +-------+---------------+ + | 1 | SERCOM_PAD[1] | + +-------+---------------+ + | 2 | SERCOM_PAD[2] | + +-------+---------------+ + | 3 | SERCOM_PAD[3] | + +-------+---------------+ + + + txpo: + type: int + required: true + description: | + Transmit Data Pinout. An enumeration with values that depend on the + hardware being used. This controls both the transmit pins and if + hardware flow control is used. + + PIC32CXSG: + + +-------+---------------+---------------+---------------+ + | Value | TX Pin | RTS | CTS | + +-------+---------------+---------------+---------------+ + | 0 | SERCOM_PAD[0] | N/A | N/A | + +-------+---------------+---------------+---------------+ + | 1 | Reserved | + +-------+---------------+---------------+---------------+ + | 2 | SERCOM_PAD[0] | SERCOM_PAD[2] | SERCOM_PAD[3] | + +-------+---------------+---------------+---------------+ + | 3 | SERCOM_PAD[0] | SERCOM_PAD[2] | N/A | + +-------+---------------+---------------+---------------+ + + + collision-detection: + type: boolean + description: Enable collision detection for half-duplex mode. + + dmas: + description: | + Optional TX & RX dma specifiers. Each specifier will have a phandle + reference to the dmac controller, the channel number, and peripheral + trigger source. + + For example dmas for TX, RX on SERCOM3 + dmas = <&dmac 0 0xb>, <&dmac 0 0xa>; + + dma-names: + description: | + Required if the dmas property exists. This should be "tx" and "rx" + to match the dmas property. + + For example + dma-names = "tx", "rx"; From daa9f914a6b0c119560a87ac97c2b239c4a5d893 Mon Sep 17 00:00:00 2001 From: Michael D Sherwood Date: Tue, 11 Mar 2025 10:46:55 -0700 Subject: [PATCH 8/8] boards: microchip Addition of pic32cxsg board Addition of pic32cxsg SG41 Curiosity Ultra board Signed-off-by: Michael D Sherwood --- .../pic32cxsg41_cult/Kconfig.defconfig | 27 +++ .../pic32cxsg41_cult/Kconfig.pic32cxsg41_cult | 5 + boards/microchip/pic32cxsg41_cult/board.cmake | 6 + boards/microchip/pic32cxsg41_cult/board.yml | 6 + .../pic32cxsg41_cult/board_jlink.cmake | 5 + .../doc/img/PIC32CXSG41-pinout1.webp | Bin 0 -> 56240 bytes .../doc/img/PIC32CXSG41-pinout2.webp | Bin 0 -> 56918 bytes .../doc/img/PIC32CXSG41-pinout3.webp | Bin 0 -> 34158 bytes .../microchip/pic32cxsg41_cult/doc/index.rst | 166 +++++++++++++++ .../pic32cxsg41_cult-pinctrl.dtsi | 63 ++++++ .../pic32cxsg41_cult/pic32cxsg41_cult.dts | 194 ++++++++++++++++++ .../pic32cxsg41_cult/pic32cxsg41_cult.yaml | 22 ++ .../pic32cxsg41_cult_defconfig | 12 ++ .../pic32cxsg41_cult/pre_dt_board.cmake | 7 + .../pic32cxsg41_cult/support/openocd.cfg | 26 +++ 15 files changed, 539 insertions(+) create mode 100644 boards/microchip/pic32cxsg41_cult/Kconfig.defconfig create mode 100644 boards/microchip/pic32cxsg41_cult/Kconfig.pic32cxsg41_cult create mode 100644 boards/microchip/pic32cxsg41_cult/board.cmake create mode 100644 boards/microchip/pic32cxsg41_cult/board.yml create mode 100644 boards/microchip/pic32cxsg41_cult/board_jlink.cmake create mode 100644 boards/microchip/pic32cxsg41_cult/doc/img/PIC32CXSG41-pinout1.webp create mode 100644 boards/microchip/pic32cxsg41_cult/doc/img/PIC32CXSG41-pinout2.webp create mode 100644 boards/microchip/pic32cxsg41_cult/doc/img/PIC32CXSG41-pinout3.webp create mode 100644 boards/microchip/pic32cxsg41_cult/doc/index.rst create mode 100644 boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult-pinctrl.dtsi create mode 100644 boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult.dts create mode 100644 boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult.yaml create mode 100644 boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult_defconfig create mode 100644 boards/microchip/pic32cxsg41_cult/pre_dt_board.cmake create mode 100644 boards/microchip/pic32cxsg41_cult/support/openocd.cfg diff --git a/boards/microchip/pic32cxsg41_cult/Kconfig.defconfig b/boards/microchip/pic32cxsg41_cult/Kconfig.defconfig new file mode 100644 index 0000000000000..e6c29d2e55a71 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/Kconfig.defconfig @@ -0,0 +1,27 @@ +# PIC32CX SG41 Curiosity Ultra board configuration +# +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +if ETH_SAM_GMAC + +# Read MAC address from AT24MAC402 EEPROM + +config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS + default 0x9A + +config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE + default 1 + +config ETH_SAM_GMAC_MAC_I2C_EEPROM + default y + select I2C + +endif # ETH_SAM_GMAC + +if NETWORKING + +config NET_L2_ETHERNET + default y + +endif # NETWORKING diff --git a/boards/microchip/pic32cxsg41_cult/Kconfig.pic32cxsg41_cult b/boards/microchip/pic32cxsg41_cult/Kconfig.pic32cxsg41_cult new file mode 100644 index 0000000000000..2f6a9521a3a46 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/Kconfig.pic32cxsg41_cult @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_PIC32CXSG41_CULT + select SOC_PIC32CX1025SG41128 diff --git a/boards/microchip/pic32cxsg41_cult/board.cmake b/boards/microchip/pic32cxsg41_cult/board.cmake new file mode 100644 index 0000000000000..9d42d88af586e --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/board.cmake @@ -0,0 +1,6 @@ +# Copyright (c) 2024 Microchip + +# SPDX-License-Identifier: Apache-2.0 + +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +board_finalize_runner_args(jlink "--device=pic32cx1025sg41128") diff --git a/boards/microchip/pic32cxsg41_cult/board.yml b/boards/microchip/pic32cxsg41_cult/board.yml new file mode 100644 index 0000000000000..c364f93b059a1 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/board.yml @@ -0,0 +1,6 @@ +board: + name: pic32cxsg41_cult + full_name: PIC32CX SG41 Curiosity Ultra Evaluation Kit + vendor: microchip + socs: + - name: pic32cx1025sg41128 diff --git a/boards/microchip/pic32cxsg41_cult/board_jlink.cmake b/boards/microchip/pic32cxsg41_cult/board_jlink.cmake new file mode 100644 index 0000000000000..137148574e63e --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/board_jlink.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +board_finalize_runner_args(jlink "--device=pic32cx1025sg41128") diff --git a/boards/microchip/pic32cxsg41_cult/doc/img/PIC32CXSG41-pinout1.webp b/boards/microchip/pic32cxsg41_cult/doc/img/PIC32CXSG41-pinout1.webp new file mode 100644 index 0000000000000000000000000000000000000000..132f032433e5056a4f08b3ba351bed2d42799d6b GIT binary patch literal 56240 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 z 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 DF)6+H literal 0 HcmV?d00001 diff --git a/boards/microchip/pic32cxsg41_cult/doc/img/PIC32CXSG41-pinout3.webp b/boards/microchip/pic32cxsg41_cult/doc/img/PIC32CXSG41-pinout3.webp new file mode 100644 index 0000000000000000000000000000000000000000..38fe02c5608323d87eba810b404cc461dcc0843d GIT binary patch literal 34158 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≤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 literal 0 HcmV?d00001 diff --git a/boards/microchip/pic32cxsg41_cult/doc/index.rst b/boards/microchip/pic32cxsg41_cult/doc/index.rst new file mode 100644 index 0000000000000..8ff67167bd1de --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/doc/index.rst @@ -0,0 +1,166 @@ +.. zephyr:board:: pic32cxsg41_cult + +Overview +******** + +The PIC32CX SG41 Curiosity Ultra evaluation kit is ideal for evaluation and +prototyping with the PIC32CX SG Cortex®-M4F processor-based +microcontrollers. The kit includes Microchip’s Embedded Debugger (EDBG), +which provides a full debug interface without the need for additional +hardware. + +Hardware +******** + +- PIC32CX1025SG41 ARM Cortex-M4F processor at 120 MHz +- 32.768 kHz crystal oscillator +- 12 MHz crystal oscillator +- 1024 KiB flash memory and 256 KiB of RAM +- Two yellow user LEDs +- Two mechanical user push buttons +- One reset button +- On-board USB based EDBG unit with serial console +- Embedded Debugger MCU (PKoB4) +- 64 Mbit QSPI Flash +- AT24MAC402 serial EEPROM with EUI-48™ MAC address +- Ethernet transceiver 10/100 Mbps Ethernet MAC, + compatible with the IEEE 802.3 standard. +- Arduino Uno header connectors +- X32 Audio Interface Headers +- mikroBUS header connectors +- DAC Output header +- USB interface, host, and device +- SD/SDIO card connector + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Pin Mapping +=========== + +The Microchip PIC32CXSG41 Curiosity Ultra evaluation kit has 4 GPIO controllers. These +controllers are responsible for pin muxing, input/output, pull-up, etc. + +For more details please refer to `Microchip PIC32CX SG41-SG60-SG61 Family Datasheet`_. + +.. image:: img/PIC32CXSG41-pinout1.webp + :align: center + :alt: PIC32CXSG41-CULT-pinout1 + +.. image:: img/PIC32CXSG41-pinout2.webp + :align: center + :alt: PIC32CXSG41-CULT-pinout2 + +.. image:: img/PIC32CXSG41-pinout3.webp + :align: center + :alt: PIC32CXSG41-CULT-pinout3 + +Default Zephyr Peripheral Mapping: +---------------------------------- + +- SERCOM2 USART TX : PB13 +- SERCOM2 USART RX : PB12 +- GPIO/PWM LED1 : PC21 +- GPIO/PWM LED2 : PA16 +- GPIO SW1 : PD00 +- GPIO SW2 : PD01 +- GMAC RMII REFCK : PA14 +- GMAC RMII TXEN : PA17 +- GMAC RMII TXD0 : PA18 +- GMAC RMII TXD1 : PA19 +- GMAC RMII CRSDV : PC20 +- GMAC RMII RXD0 : PA13 +- GMAC RMII RXD1 : PA12 +- GMAC RMII RXER : PA15 +- GMAC MDIO MDC : PC11 +- GMAC MDIO MDIO : PC12 +- SERCOM0 SPI SCK : PB24 +- SERCOM0 SPI MOSI : PB25 +- SERCOM0 SPI MISO : PC25 +- SERCOM0 SPI SS : PC24 +- SERCOM7 I2C SDA : PD08 +- SERCOM7 I2C SCL : PD09 +- USB DP : PA25 +- USB DM : PA24 + +System Clock +============ + +The PIC32CXSG41 MCU is configured to use the 32.768 kHz external oscillator +with the on-chip PLL generating the 48 MHz system clock. + +Serial Port +=========== + +The PIC32CXSG41 MCU has 8 SERCOM based USARTs with one configured as USARTs in this BSP. +- SERCOM4 is the default Zephyr console. + +- SERCOM4 115200 8n1 connected to the onboard Microchip Embedded Debugger (EDBG). + +The PIC32CXSG41 MCU has 8 SERCOM based SPIs. + +The PIC32CXSG41 MCU has 5 SERCOM based I2Cs. On the Microchip PIC32CXSG41 Curiosity Ultra, +SERCOM7 is connected to a AT24MAC402 EEPROM. + +Programming and Debugging +========================= + +.. zephyr:board-supported-runners:: + +The Microchip PIC32CXSG41 Curiosity Ultra comes with a Microchip Embedded Debugger (EDBG). +This provides a debug interface to the PIC32CXSG41 chip and is supported by OpenOCD. + +Flashing +======== + +#. Build the Zephyr kernel and the ``hello_world`` sample application: + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: pic32cxsg41_cult + :goals: build + :compact: + +Connect the Microchip PIC32CXSG41 Curiosity Ultra to your host computer using the USB debug port. + +Run your favorite terminal program to listen for output. Under Linux thet terminal should be. + +.. code-block:: console + + $ minicom -D /dev/ttyACM0 -o + +The -o option tells minicom not to send the modem initialization string. +Connection should be configured as follows: + + - Speed: 115200 + - Data: 8 bits + - Parity: None + - Stop bits: 1 + +To flash an image: + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: pic32cxsg41_cult + :goals: flash + :compact: + +You should see "Hello World! pic32cxsg41_cult" in your terminal. + +Debugging +========= + +SVD files are included in hal_microchip/pic32c/pic32cxsg/include/pic32cxsg41/svd. + +References +********** + +.. target-notes:: + +.. _Microchip website: + https://www.microchip.com/en-us/development-tool/EV06X38A + +.. _Microchip PIC32CX SG41-SG60-SG61 Family Datasheet: + https://ww1.microchip.com/downloads/aemDocuments/documents/MCU32/ProductDocuments/DataSheets/PIC32CX-SG41-SG60-SG61-Family-Data-Sheet-DS60001715.pdf diff --git a/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult-pinctrl.dtsi b/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult-pinctrl.dtsi new file mode 100644 index 0000000000000..1015fa4b63bb1 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult-pinctrl.dtsi @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024 Microchip + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +&pinctrl { + pwm_default: pwm_default { + group1 { + pinmux = ; + }; + }; + + gmac_rmii: gmac_rmii { + group1 { + pinmux = , + , + , + , + , + , + , + ; + }; + }; + + mdio_default: mdio_default { + group1 { + pinmux = , + ; + }; + }; + + sercom7_i2c_default: sercom7_i2c_default { + group1 { + pinmux = , + ; + }; + }; + + sercom0_spi_default: sercom0_spi_default { + group1 { + pinmux = , + , + ; + }; + }; + + sercom4_uart_default: sercom4_uart_default { + group1 { + pinmux = , + ; + }; + }; + + usb_dc_default: usb_dc_default { + group1 { + pinmux = , + ; + }; + }; +}; diff --git a/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult.dts b/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult.dts new file mode 100644 index 0000000000000..e3fc49b42ab76 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult.dts @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2024 Microchip + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include "pic32cxsg41_cult-pinctrl.dtsi" +#include + +/ { + model = "PIC32CX SG41 Curiosity Ultra"; + + compatible = "pic32cxsg41,cult", "microchip,pic32cx1025sg41128", "microchip,pic32cxsg"; + + chosen { + zephyr,console = &sercom4; + zephyr,shell-uart = &sercom4; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + }; + + /* These aliases are provided for compatibility with samples */ + + aliases { + userled1 = &led1; + userled2 = &led2; + pwm-led1 = &pwm_led1; + sw1 = &button1; + sw2 = &button2; + i2c-0 = &sercom7; + }; + + leds { + compatible = "gpio-leds"; + + led1: led_1 { + gpios = <&portc 21 GPIO_ACTIVE_LOW>; + label = "Yellow LED 1"; + }; + + led2: led_2 { + gpios = <&porta 16 GPIO_ACTIVE_LOW>; + label = "Yellow LED 2"; + }; + }; + + pwmleds { + compatible = "pwm-leds"; + + pwm_led1: pwm_led_1 { + pwms = <&tcc0 2 PWM_MSEC(20)>; + }; + }; + + buttons { + compatible = "gpio-keys"; + + button1: button_1 { + gpios = <&portd 00 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "SW1"; + zephyr,code = ; + }; + + button2: button_2 { + gpios = <&portd 01 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "SW2"; + zephyr,code = ; + }; + }; +}; + +&cpu0 { + clock-frequency = <120000000>; +}; + +&tcc0 { + compatible = "atmel,sam0-tcc-pwm"; + + /* Gives a maximum period of 1.1s for 120MHz main clock */ + + prescaler = <8>; + + #pwm-cells = <2>; + + pinctrl-0 = <&pwm_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&sercom4 { + compatible = "atmel,sam0-uart"; + + current-speed = <115200>; + rxpo = <1>; + txpo = <0>; + + #address-cells = <1>; + #size-cells = <0>; + + pinctrl-0 = <&sercom4_uart_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&sercom0 { + compatible = "atmel,sam0-spi"; + + dipo = <3>; + dopo = <0>; + + #address-cells = <1>; + #size-cells = <0>; + + pinctrl-0 = <&sercom0_spi_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&sercom7 { + compatible = "atmel,sam0-i2c"; + + clock-frequency = ; + + #address-cells = <1>; + #size-cells = <0>; + + pinctrl-0 = <&sercom7_i2c_default>; + pinctrl-names = "default"; + status = "okay"; + + eeprom: eeprom@5e { + compatible = "atmel,24mac402"; + + reg = <0x5e>; + }; +}; + +&adc0 { + status = "okay"; +}; + +zephyr_udc0: &usb0 { + pinctrl-0 = <&usb_dc_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&gmac { + pinctrl-0 = <&gmac_rmii>; + pinctrl-names = "default"; + mac-eeprom = <&eeprom>; + phy-handle = <&phy>; + status = "okay"; +}; + +&mdio { + pinctrl-0 = <&mdio_default>; + pinctrl-names = "default"; + status = "okay"; + + phy: ethernet-phy@0 { + compatible = "ethernet-phy"; + + reg = <0>; + status = "okay"; + }; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + + #address-cells = <1>; + #size-cells = <1>; + + /* + * The final 16 KiB is reserved for the application. + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + + storage_partition: partition@fc000 { + label = "storage"; + reg = <0x000fc000 0x00004000>; + }; + }; +}; + +&osc32kctrl { + status = "okay"; +}; diff --git a/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult.yaml b/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult.yaml new file mode 100644 index 0000000000000..0851cf5e3a856 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult.yaml @@ -0,0 +1,22 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 +identifier: pic32cxsg41_cult +name: PIC32CX SG41 Curiosity Ultra +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +flash: 1024 +ram: 256 +supported: + - uart +testing: + ignore_tags: + - posix + - bluetooth + - net + - usb + - led +vendor: microchip diff --git a/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult_defconfig b/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult_defconfig new file mode 100644 index 0000000000000..8dba601092c16 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/pic32cxsg41_cult_defconfig @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_BUILD_OUTPUT_HEX=y + +CONFIG_ARM_MPU=y +CONFIG_HW_STACK_PROTECTION=y + +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y diff --git a/boards/microchip/pic32cxsg41_cult/pre_dt_board.cmake b/boards/microchip/pic32cxsg41_cult/pre_dt_board.cmake new file mode 100644 index 0000000000000..d60aac1adec60 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/pre_dt_board.cmake @@ -0,0 +1,7 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +# Suppress "unique_unit_address_if_enabled" to handle the following overlaps: +# - /soc/pinmux@41004400 & /soc/gpio@41004400 +# - /soc/pinmux@41004480 & /soc/gpio@41004480 +list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") diff --git a/boards/microchip/pic32cxsg41_cult/support/openocd.cfg b/boards/microchip/pic32cxsg41_cult/support/openocd.cfg new file mode 100644 index 0000000000000..1765e28ac7283 --- /dev/null +++ b/boards/microchip/pic32cxsg41_cult/support/openocd.cfg @@ -0,0 +1,26 @@ +# Copyright (c) 2024 Microchip +# SPDX-License-Identifier: Apache-2.0 + +source [find interface/cmsis-dap.cfg] +transport select swd + +# chip name +set CHIPNAME pic32cx1025sg41 +set ENDIAN little +set CPUTAPID 0x61870500 + +source [find target/pic32cxsg41.cfg] + +reset_config none +cortex_m reset_config sysresetreq + +$_TARGETNAME configure -event gdb-attach { + echo "Debugger attaching: halting execution" + reset halt + gdb_breakpoint_override hard +} + +$_TARGETNAME configure -event gdb-detach { + echo "Debugger detaching: resuming execution" + resume +}