Skip to content

Commit

Permalink
Merge pull request #21201 from dylad/pr/cpu/sam4s/add_support
Browse files Browse the repository at this point in the history
cpu/sam4s: add initial support with SAM4S-XPRO board
  • Loading branch information
dylad authored Feb 17, 2025
2 parents 26e46ae + 363fb75 commit cdceb08
Show file tree
Hide file tree
Showing 31 changed files with 727 additions and 118 deletions.
3 changes: 3 additions & 0 deletions boards/sam4s-xpro/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
MODULE = board

include $(RIOTBASE)/Makefile.base
7 changes: 7 additions & 0 deletions boards/sam4s-xpro/Makefile.features
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
CPU = sam4s
CPU_MODEL = sam4sd32c

# Put defined MCU peripherals here (in alphabetical order)
FEATURES_PROVIDED += periph_gpio periph_gpio_irq
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart
6 changes: 6 additions & 0 deletions boards/sam4s-xpro/Makefile.include
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# export this module and its includes
INCLUDES += -I$(RIOTBOARD)/sam4s-xpro/include

# setup flasher (using openOCD)
PROGRAMMER ?= openocd
PROGRAMMERS_SUPPORTED += openocd edbg
2 changes: 2 additions & 0 deletions boards/sam4s-xpro/dist/openocd.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
source [find board/atmel_sam4s_xplained_pro.cfg]
$_TARGETNAME configure -rtos auto
48 changes: 48 additions & 0 deletions boards/sam4s-xpro/doc.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
@defgroup boards_sam4s-xpro ATSAM4S Xplained Pro board
@ingroup boards
@brief Support for the ATSAM4S Xplained Pro board

## Overview

The `ATSAM4S Xplained Pro` is an evaluation board by Microchip (formerly Atmel)
featuring a SAM4SD32 (Cortex-M4) SoC running up to 120 MHz. This MCU comes with
160Kb of RAM and 2048Kb of flash memory.

## Hardware

![sam4s-xpro image](https://www.microchip.com/content/dam/mchp/mrt-dam/devtools/1801-atsam4s-xpro.jpg)


### MCU
| MCU | ATSAM4SD32C |
|:------------- |:--------------------- |
| Family | ARM Cortex-M4 |
| Vendor | Microchip |
| RAM | 160Kb |
| Flash | 2048Kb |
| Frequency | up to 120MHz |
| FPU | no |
| Timers | 2 three channels (16-bit) |
| ADCs | 1x 12-bit (16 channels) |
| UARTs | 2 UARTs (+ 2 USARTs shared with SPIs) |
| SPIs | 2 shared with USARTs |
| I2Cs | 2 |
| Datasheet | [Datasheet](https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/Atmel-11100-32-bitCortex-M4-Microcontroller-SAM4S_Datasheet.pdf) |
| Board Manual | [Board Manual](https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/UserGuides/Atmel-42075-SAM4S-Xplained-Pro_User-Guide.pdf)|

### User Interface

1 User button and 1 LED:

| Device | PIN |
|:------ |:--- |
| LED0 | PC23 |
| SW0 (button) | PA02 |

### Flashing options
By default, openOCD is used for both flashing and debugging.
EDBG programmer is also available with:
`PROGRAMMER=edbg BOARD=sam4s-xpro make -C tests/leds flash`

*/
62 changes: 62 additions & 0 deletions boards/sam4s-xpro/include/board.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright (C) 2025 Mesotic SAS
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/

/**
* @ingroup boards_sam4s-xpro
* @{
*
* @file
* @brief Board specific definitions for the Microchip SAM 4S Xplained Pro
* board
*
* @author Dylan Laduranty <dylan.laduranty@mesotic.com>
*/

#ifndef BOARD_H
#define BOARD_H

#include "cpu.h"
#include "periph_conf.h"
#include "periph_cpu.h"
#include "periph/gpio.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
* @name ztimer configuration
* @{
*/
#define CONFIG_ZTIMER_USEC_WIDTH (16)
/** @} */

/**
* @name LED pin definitions and handlers
* @{
*/
#define LED0_PIN GPIO_PIN(PC, 23)

#define LED0_ON (PIOC->PIO_CODR = PIO_PC23)
#define LED0_OFF (PIOC->PIO_SODR = PIO_PC23)
#define LED0_TOGGLE ((PIOC->PIO_ODSR & PIO_PC23) ? LED0_ON : LED0_OFF)
/** @} */

/**
* @name SW0 (Button) pin definitions
* @{
*/
#define BTN0_PIN GPIO_PIN(PA, 2)
#define BTN0_MODE GPIO_IN_PU
/** @} */

#ifdef __cplusplus
}
#endif

#endif /* BOARD_H */
/** @} */
94 changes: 94 additions & 0 deletions boards/sam4s-xpro/include/periph_conf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* Copyright (C) 2025 Mesotic SAS
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/

/**
* @ingroup boards_sam4s-xpro
* @{
*
* @file
* @brief Peripheral MCU configuration for SAM4S Xplained pro
*
* @author Dylan Laduranty <dylan.laduranty@mesotic.com>
*/

#ifndef PERIPH_CONF_H
#define PERIPH_CONF_H

#include "periph_cpu.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
* @name Clock configuration
* @{
*/
/* targeted system core clock */
#define CLOCK_CORECLOCK MHZ(120)
/* external oscillator clock */
#define CLOCK_EXT_OSC MHZ(12)
/* define PLL configuration
*
* The values must fulfill this equation:
* CORECLOCK = (EXT_OCS / PLL_DIV) * (PLL_MUL + 1)
*/
#define CLOCK_PLL_MUL (9)
#define CLOCK_PLL_DIV (1)

/* number of wait states before flash read and write operations */
#define CLOCK_FWS (5) /* 5 is safe for 120 MHz */
/** @} */

/**
* @brief Enable external oscillator for driving the slow clock
*/
#define CLOCK_SCLK_XTAL (1)

/**
* @name Timer peripheral configuration
* @{
*/
static const timer_conf_t timer_config[] = {
{ .dev = TC0, .id_ch0 = ID_TC0 },
{ .dev = TC1, .id_ch0 = ID_TC3 }
};

#define TIMER_0_ISR isr_tc0
#define TIMER_1_ISR isr_tc3

#define TIMER_NUMOF ARRAY_SIZE(timer_config)
/** @} */

/**
* @name UART configuration
* @{
*/
static const uart_conf_t uart_config[] = {
{
.dev = (Uart *)UART1,
.rx_pin = GPIO_PIN(PB, 2),
.tx_pin = GPIO_PIN(PB, 3),
.mux = GPIO_MUX_A,
.pmc_id = ID_UART1,
.irqn = UART1_IRQn
}
};

/* define interrupt vectors */
#define UART_0_ISR isr_uart1

#define UART_NUMOF ARRAY_SIZE(uart_config)
/** @} */

#ifdef __cplusplus
}
#endif

#endif /* PERIPH_CONF_H */
/** @} */
2 changes: 1 addition & 1 deletion cpu/sam3/Makefile.dep
Original file line number Diff line number Diff line change
@@ -1 +1 @@
include $(RIOTCPU)/cortexm_common/Makefile.dep
include $(RIOTCPU)/sam_common/Makefile.dep
6 changes: 6 additions & 0 deletions cpu/sam3/Makefile.include
Original file line number Diff line number Diff line change
@@ -1,2 +1,8 @@
ROM_START_ADDR ?= 0x80000
RAM_START_ADDR ?= 0x20070000

ROM_LEN ?= 0x80000
RAM_LEN ?= 0x18000

include $(RIOTCPU)/sam_common/Makefile.include
include $(RIOTMAKE)/arch/cortexm.inc.mk
101 changes: 1 addition & 100 deletions cpu/sam3/include/periph_cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,12 @@
#ifndef PERIPH_CPU_H
#define PERIPH_CPU_H

#include "cpu.h"
#include "periph_cpu_common.h"

#ifdef __cplusplus
extern "C" {
#endif

#ifndef DOXYGEN
#define HAVE_GPIO_T
typedef uint32_t gpio_t;

#define GPIO_UNDEF (0xffffffff)

#define GPIO_PIN(x, y) (((uint32_t)PIOA + (x << 9)) | y)
#endif /* DOXYGEN */

/**
* @name Declare needed generic SPI functions
* @{
Expand All @@ -52,21 +43,6 @@ typedef uint32_t gpio_t;
*/
#define CPUID_LEN (16U)

/**
* @brief All SAM3 timers are 32-bit wide
*/
#define TIMER_MAX_VAL (0xffffffff)

/**
* @brief We use one channel for each defined timer
*
* While the peripheral provides three channels, the current interrupt
* flag handling leads to a race condition where calling timer_clear() on one
* channel can disable a pending flag for other channels.
* Until resolved, limit the peripheral to only one channel.
*/
#define TIMER_CHANNEL_NUMOF (1)

/**
* @name RTT configuration
* @{
Expand All @@ -77,16 +53,6 @@ typedef uint32_t gpio_t;
#define RTT_MAX_FREQUENCY (RTT_CLOCK_FREQUENCY) /* in Hz */
/** @} */

/**
* @brief Generate GPIO mode bitfields
*
* We use 3 bit to determine the pin functions:
* - bit 0: in/out
* - bit 1: PU enable
* - bit 2: OD enable
*/
#define GPIO_MODE(io, pu, od) (io | (pu << 1) | (od << 2))

/**
* @name ADC configuration, valid for all boards using this CPU
*
Expand All @@ -109,43 +75,6 @@ typedef uint32_t gpio_t;
*/
#define DAC_NUMOF (2U)

#ifndef DOXYGEN
#define HAVE_GPIO_MODE_T
typedef enum {
GPIO_IN = GPIO_MODE(0, 0, 0), /**< IN */
GPIO_IN_PD = 0xf, /**< not supported by HW */
GPIO_IN_PU = GPIO_MODE(0, 1, 0), /**< IN with pull-up */
GPIO_OUT = GPIO_MODE(1, 0, 0), /**< OUT (push-pull) */
GPIO_OD = GPIO_MODE(1, 0, 1), /**< OD */
GPIO_OD_PU = GPIO_MODE(1, 1, 1), /**< OD with pull-up */
} gpio_mode_t;

#define HAVE_GPIO_FLANK_T
typedef enum {
GPIO_RISING = 1, /**< emit interrupt on rising flank */
GPIO_FALLING = 2, /**< emit interrupt on falling flank */
GPIO_BOTH = 3 /**< emit interrupt on both flanks */
} gpio_flank_t;
#endif /* ndef DOXYGEN */

/**
* @brief Available ports on the SAM3X8E
*/
enum {
PA = 0, /**< port A */
PB = 1, /**< port B */
PC = 2, /**< port C */
PD = 3, /**< port D */
};

/**
* @brief GPIO mux configuration
*/
typedef enum {
GPIO_MUX_A = 0, /**< alternate function A */
GPIO_MUX_B = 1, /**< alternate function B */
} gpio_mux_t;

#ifndef DOXYGEN
/**
* @brief Override default SPI modes
Expand Down Expand Up @@ -192,26 +121,6 @@ typedef enum {
/** @} */
#endif /* ndef DOXYGEN */

/**
* @brief Timer configuration data
*/
typedef struct {
Tc *dev; /**< timer device */
uint8_t id_ch0; /**< ID of the timer's first channel */
} timer_conf_t;

/**
* @brief UART configuration data
*/
typedef struct {
Uart *dev; /**< U(S)ART device used */
gpio_t rx_pin; /**< RX pin */
gpio_t tx_pin; /**< TX pin */
gpio_mux_t mux; /**< MUX used for pins */
uint8_t pmc_id; /**< bit in the PMC register of the device*/
uint8_t irqn; /**< interrupt number of the device */
} uart_conf_t;

/**
* @brief PWM channel configuration data
*/
Expand All @@ -232,14 +141,6 @@ typedef struct {
gpio_mux_t mux; /**< pin MUX setting */
} spi_conf_t;

/**
* @brief Configure the given GPIO pin to be used with the given MUX setting
*
* @param[in] pin GPIO pin to configure
* @param[in] mux MUX setting to use
*/
void gpio_init_mux(gpio_t pin, gpio_mux_t mux);

#ifdef __cplusplus
}
#endif
Expand Down
Loading

0 comments on commit cdceb08

Please # to comment.