soc: sensry: Add support for SY120-GBM and SY120-GEN1
Add soc support for Sensry's RISCV32 based SY1xx. Variants of the soc are GBM and GEN1. Signed-off-by: Sven Ginka <s.ginka@sensry.de>
This commit is contained in:
parent
ec08e1c0e8
commit
402f3d24c4
22 changed files with 1124 additions and 0 deletions
8
dts/bindings/cpu/sensry,ganymed-sy1xx.yaml
Normal file
8
dts/bindings/cpu/sensry,ganymed-sy1xx.yaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2024 sensry.io
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
include: riscv,cpus.yaml
|
||||
|
||||
description: Sensry Ganymed SY1xx Core CPU
|
||||
|
||||
compatible: "sensry,sy1xx"
|
|
@ -588,6 +588,7 @@ seirobotics Shenzhen SEI Robotics Co., Ltd
|
|||
semtech Semtech Corporation
|
||||
sensirion Sensirion AG
|
||||
sensortek Sensortek Technology Corporation
|
||||
sensry sensry.io
|
||||
sff Small Form Factor Committee
|
||||
sgd Solomon Goldentek Display Corporation
|
||||
sgmicro SG Micro Corp
|
||||
|
|
6
soc/sensry/CMakeLists.txt
Normal file
6
soc/sensry/CMakeLists.txt
Normal file
|
@ -0,0 +1,6 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
zephyr_include_directories(${SOC_FAMILY}/${SOC_SERIES}/common)
|
||||
|
||||
add_subdirectory_ifdef(CONFIG_SOC_SERIES_SY1XX ganymed/sy1xx)
|
8
soc/sensry/Kconfig
Normal file
8
soc/sensry/Kconfig
Normal file
|
@ -0,0 +1,8 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
if SOC_FAMILY_GANYMED
|
||||
|
||||
rsource "*/Kconfig"
|
||||
|
||||
endif # SOC_FAMILY_GANYMED
|
8
soc/sensry/Kconfig.defconfig
Normal file
8
soc/sensry/Kconfig.defconfig
Normal file
|
@ -0,0 +1,8 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
if SOC_FAMILY_GANYMED
|
||||
|
||||
rsource "*/Kconfig.defconfig"
|
||||
|
||||
endif
|
10
soc/sensry/Kconfig.soc
Normal file
10
soc/sensry/Kconfig.soc
Normal file
|
@ -0,0 +1,10 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
config SOC_FAMILY_GANYMED
|
||||
bool
|
||||
|
||||
config SOC_FAMILY
|
||||
default "ganymed" if SOC_FAMILY_GANYMED
|
||||
|
||||
rsource "*/Kconfig.soc"
|
11
soc/sensry/ganymed/Kconfig
Normal file
11
soc/sensry/ganymed/Kconfig
Normal file
|
@ -0,0 +1,11 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
config SOC_FAMILY_GANYMED
|
||||
select BUILD_OUTPUT_BIN
|
||||
|
||||
if SOC_SERIES_SY1XX
|
||||
|
||||
rsource "*/Kconfig"
|
||||
|
||||
endif # SOC_SERIES_SY1XX
|
8
soc/sensry/ganymed/Kconfig.defconfig
Normal file
8
soc/sensry/ganymed/Kconfig.defconfig
Normal file
|
@ -0,0 +1,8 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
if SOC_SERIES_SY1XX
|
||||
|
||||
rsource "*/Kconfig.defconfig"
|
||||
|
||||
endif
|
4
soc/sensry/ganymed/Kconfig.soc
Normal file
4
soc/sensry/ganymed/Kconfig.soc
Normal file
|
@ -0,0 +1,4 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
rsource "*/Kconfig.soc"
|
16
soc/sensry/ganymed/sy1xx/CMakeLists.txt
Normal file
16
soc/sensry/ganymed/sy1xx/CMakeLists.txt
Normal file
|
@ -0,0 +1,16 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
zephyr_include_directories(common)
|
||||
|
||||
zephyr_compile_options(-march=rv32imc_zicsr -mabi=ilp32)
|
||||
|
||||
zephyr_sources(
|
||||
common/crt0.S
|
||||
common/soc.c
|
||||
common/udma.c
|
||||
)
|
||||
|
||||
zephyr_linker_sources(ROM_START SORT_KEY 0x0vectors common/vector_table.ld)
|
||||
|
||||
set(SOC_LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/common/linker.ld CACHE INTERNAL "")
|
10
soc/sensry/ganymed/sy1xx/Kconfig
Normal file
10
soc/sensry/ganymed/sy1xx/Kconfig
Normal file
|
@ -0,0 +1,10 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
config SOC_SERIES_SY1XX
|
||||
select RISCV
|
||||
select RISCV_ISA_RV32I
|
||||
select RISCV_ISA_EXT_M
|
||||
select RISCV_ISA_EXT_ZICSR
|
||||
select RISCV_PRIVILEGED
|
||||
select ATOMIC_OPERATIONS_C
|
76
soc/sensry/ganymed/sy1xx/Kconfig.defconfig
Normal file
76
soc/sensry/ganymed/sy1xx/Kconfig.defconfig
Normal file
|
@ -0,0 +1,76 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
if SOC_SERIES_SY1XX
|
||||
|
||||
config RISCV_PMP
|
||||
default n
|
||||
|
||||
config RISCV_HAS_CLIC
|
||||
default n
|
||||
|
||||
config RISCV_VECTORED_MODE
|
||||
default y
|
||||
|
||||
config INCLUDE_RESET_VECTOR
|
||||
default y
|
||||
|
||||
config GEN_IRQ_VECTOR_TABLE
|
||||
default y
|
||||
|
||||
config RISCV_GENERIC_TOOLCHAIN
|
||||
default y if "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "zephyr"
|
||||
|
||||
config RV_BOOT_HART
|
||||
# default cluster id 0x3e, core 0 (FC) => 0x3e0 == 992
|
||||
default 992
|
||||
|
||||
config RISCV_SOC_CONTEXT_SAVE
|
||||
default n
|
||||
|
||||
config RISCV_SOC_OFFSETS
|
||||
default n
|
||||
|
||||
config NUM_IRQS
|
||||
default 32
|
||||
|
||||
config RISCV_SOC_INTERRUPT_INIT
|
||||
default y
|
||||
|
||||
config RISCV_SOC_HAS_ISR_STACKING
|
||||
default n
|
||||
|
||||
config DYNAMIC_INTERRUPTS
|
||||
default y
|
||||
|
||||
config GEN_ISR_TABLES
|
||||
default y
|
||||
|
||||
config RISCV_MCAUSE_EXCEPTION_MASK
|
||||
default 0x1F
|
||||
|
||||
config SYS_CLOCK_HW_CYCLES_PER_SEC
|
||||
default 32768
|
||||
|
||||
config SYS_CLOCK_TICKS_PER_SEC
|
||||
default 993
|
||||
|
||||
config USE_DT_CODE_PARTITION
|
||||
default y
|
||||
|
||||
config RISCV_SOC_HAS_CUSTOM_IRQ_LOCK_OPS
|
||||
default n
|
||||
|
||||
config RISCV_SOC_EXCEPTION_FROM_IRQ
|
||||
default y
|
||||
|
||||
config INIT_STACKS
|
||||
default y
|
||||
|
||||
config XIP
|
||||
default n
|
||||
|
||||
config TIMESLICE_SIZE
|
||||
default 10
|
||||
|
||||
endif
|
21
soc/sensry/ganymed/sy1xx/Kconfig.soc
Normal file
21
soc/sensry/ganymed/sy1xx/Kconfig.soc
Normal file
|
@ -0,0 +1,21 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
config SOC_SERIES_SY1XX
|
||||
bool
|
||||
select SOC_FAMILY_GANYMED
|
||||
|
||||
config SOC_SERIES
|
||||
default "sy1xx" if SOC_SERIES_SY1XX
|
||||
|
||||
config SOC_SY120_GBM
|
||||
bool
|
||||
select SOC_SERIES_SY1XX
|
||||
|
||||
config SOC_SY120_GEN1
|
||||
bool
|
||||
select SOC_SERIES_SY1XX
|
||||
|
||||
config SOC
|
||||
default "sy120_gbm" if SOC_SY120_GBM
|
||||
default "sy120_gen1" if SOC_SY120_GEN1
|
144
soc/sensry/ganymed/sy1xx/common/crt0.S
Normal file
144
soc/sensry/ganymed/sy1xx/common/crt0.S
Normal file
|
@ -0,0 +1,144 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (c) 2024 sensry.io
|
||||
|
||||
#include <zephyr/toolchain.h>
|
||||
|
||||
|
||||
GTEXT(__initialize)
|
||||
|
||||
# abs 0x0000 - entry point after bootloader
|
||||
.section .pre_start, "ax"
|
||||
.global __pre_start
|
||||
__pre_start:
|
||||
jal x0, __prestart_routine
|
||||
|
||||
|
||||
# abs 0x0080 - will be checked by bootloader
|
||||
.section .validity_marker, "ax"
|
||||
.word 0xAA551234
|
||||
|
||||
# abs 0x0100 - text
|
||||
.section .text, "ax"
|
||||
__prestart_routine:
|
||||
/* things that will be done prior to actually starting zephyr */
|
||||
csrwi mstatus, 0x00
|
||||
|
||||
/* Call into Zephyr initialization. */
|
||||
jal x0, __start
|
||||
|
||||
GTEXT(__soc_is_irq)
|
||||
SECTION_FUNC(exception.other, __soc_is_irq)
|
||||
csrr a0, mcause
|
||||
srli a0, a0, 31
|
||||
ret
|
||||
|
||||
GTEXT(__soc_handle_irq)
|
||||
SECTION_FUNC(exception.other, __soc_handle_irq)
|
||||
## clear pending interrupt
|
||||
ret
|
||||
|
||||
# we provide a "backup" isr table, if generation (ex. in tests) is disabled
|
||||
.global _irq_vector_table
|
||||
.weak _irq_vector_table
|
||||
.section .text, "ax"
|
||||
_irq_vector_table:
|
||||
.option norvc;
|
||||
|
||||
j __no_irq_handler0
|
||||
j __no_irq_handler1
|
||||
j __no_irq_handler2
|
||||
j __no_irq_handler3
|
||||
j __no_irq_handler4
|
||||
j __no_irq_handler5
|
||||
j __no_irq_handler6
|
||||
j __no_irq_handler7
|
||||
j __no_irq_handler8
|
||||
j __no_irq_handler9
|
||||
j __no_irq_handler10
|
||||
j __no_irq_handler11
|
||||
j __no_irq_handler12
|
||||
j __no_irq_handler13
|
||||
j __no_irq_handler14
|
||||
j __no_irq_handler15
|
||||
j __no_irq_handler16
|
||||
j __no_irq_handler17
|
||||
j __no_irq_handler18
|
||||
j __no_irq_handler19
|
||||
j __no_irq_handler20
|
||||
j __no_irq_handler21
|
||||
j __no_irq_handler22
|
||||
j __no_irq_handler23
|
||||
j __no_irq_handler24
|
||||
j __no_irq_handler25
|
||||
j __no_irq_handler26
|
||||
j __no_irq_handler27
|
||||
j __no_irq_handler28
|
||||
j __no_irq_handler29
|
||||
j __no_irq_handler30
|
||||
j __no_irq_handler31
|
||||
|
||||
|
||||
__no_irq_handler0:
|
||||
j __no_irq_handler0
|
||||
__no_irq_handler1:
|
||||
j __no_irq_handler1
|
||||
__no_irq_handler2:
|
||||
j __no_irq_handler2
|
||||
__no_irq_handler3:
|
||||
j __no_irq_handler3
|
||||
__no_irq_handler4:
|
||||
j __no_irq_handler4
|
||||
__no_irq_handler5:
|
||||
j __no_irq_handler5
|
||||
__no_irq_handler6:
|
||||
j __no_irq_handler6
|
||||
__no_irq_handler7:
|
||||
j __no_irq_handler7
|
||||
__no_irq_handler8:
|
||||
j __no_irq_handler8
|
||||
__no_irq_handler9:
|
||||
j __no_irq_handler9
|
||||
__no_irq_handler10:
|
||||
j __no_irq_handler10
|
||||
__no_irq_handler11:
|
||||
j __no_irq_handler11
|
||||
__no_irq_handler12:
|
||||
j __no_irq_handler12
|
||||
__no_irq_handler13:
|
||||
j __no_irq_handler13
|
||||
__no_irq_handler14:
|
||||
j __no_irq_handler14
|
||||
__no_irq_handler15:
|
||||
j __no_irq_handler15
|
||||
__no_irq_handler16:
|
||||
j __no_irq_handler16
|
||||
__no_irq_handler17:
|
||||
j __no_irq_handler17
|
||||
__no_irq_handler18:
|
||||
j __no_irq_handler18
|
||||
__no_irq_handler19:
|
||||
j __no_irq_handler19
|
||||
__no_irq_handler20:
|
||||
j __no_irq_handler20
|
||||
__no_irq_handler21:
|
||||
j __no_irq_handler21
|
||||
__no_irq_handler22:
|
||||
j __no_irq_handler22
|
||||
__no_irq_handler23:
|
||||
j __no_irq_handler23
|
||||
__no_irq_handler24:
|
||||
j __no_irq_handler24
|
||||
__no_irq_handler25:
|
||||
j __no_irq_handler25
|
||||
__no_irq_handler26:
|
||||
j __no_irq_handler26
|
||||
__no_irq_handler27:
|
||||
j __no_irq_handler27
|
||||
__no_irq_handler28:
|
||||
j __no_irq_handler28
|
||||
__no_irq_handler29:
|
||||
j __no_irq_handler29
|
||||
__no_irq_handler30:
|
||||
j __no_irq_handler30
|
||||
__no_irq_handler31:
|
||||
j __no_irq_handler31
|
255
soc/sensry/ganymed/sy1xx/common/linker.ld
Normal file
255
soc/sensry/ganymed/sy1xx/common/linker.ld
Normal file
|
@ -0,0 +1,255 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2014 Wind River Systems, Inc.
|
||||
* Copyright (c) 2016-2017 Jean-Paul Etienne <fractalclone@gmail.com>
|
||||
* Copyright (c) 2018 Foundries.io Ltd
|
||||
* Copyright (c) 2024 sensry.io
|
||||
*
|
||||
* This file is based on:
|
||||
*
|
||||
* - include/arch/arm/cortex_m/scripts/linker.ld
|
||||
* - include/arch/riscv/common/linker.ld
|
||||
* - include/arch/riscv/pulpino/linker.ld
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/devicetree.h>
|
||||
|
||||
#include <zephyr/linker/sections.h>
|
||||
#include <zephyr/linker/linker-defs.h>
|
||||
#include <zephyr/linker/linker-tool.h>
|
||||
|
||||
#define MPU_ALIGN(region_size) . = ALIGN(4)
|
||||
|
||||
/*
|
||||
* Extra efforts would need to be taken to ensure the IRQ handlers are within
|
||||
* jumping distance of the vector table in non-XIP builds, so avoid them.
|
||||
*/
|
||||
#define ROMABLE_REGION ROM
|
||||
#define RAMABLE_REGION RAM
|
||||
|
||||
## ROM AREA ##
|
||||
#define ROM_BASE 0x1C010100
|
||||
#define ROM_SIZE 0x5Fa00
|
||||
|
||||
## RAM AREA ##
|
||||
#define RAM_BASE 0x1C070000
|
||||
#define RAM_SIZE 0x200000
|
||||
|
||||
MEMORY
|
||||
{
|
||||
L2_START (rx) : ORIGIN = 0x1c010000, LENGTH = 0x00000080
|
||||
L2_VALIDITY (rx) : ORIGIN = 0x1c010080, LENGTH = 0x00000080
|
||||
|
||||
ROM (rx) : ORIGIN = ROM_BASE, LENGTH = ROM_SIZE /* 392kb */
|
||||
RAM (rwx) : ORIGIN = RAM_BASE, LENGTH = RAM_SIZE /* 2097kb */
|
||||
|
||||
L2_PRIV_CH0 : ORIGIN = 0x1c004100, LENGTH = 0x2000 /* uDMA access */
|
||||
|
||||
/*
|
||||
* Special section, not included in the final binary, used
|
||||
* to generate interrupt tables. See include/linker/intlist.ld.
|
||||
*/
|
||||
IDT_LIST : ORIGIN = 0xFFFFF7FF, LENGTH = 2K
|
||||
}
|
||||
|
||||
ENTRY(CONFIG_KERNEL_ENTRY)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
|
||||
.pre_start MAX(0x1c010000,ALIGN(0x80)) :
|
||||
{
|
||||
KEEP(*(.pre_start))
|
||||
} > L2_START
|
||||
|
||||
.validity_marker MAX(0x1c010080,ALIGN(0x80)) :
|
||||
{
|
||||
KEEP(*(.validity_marker))
|
||||
} > L2_VALIDITY
|
||||
|
||||
/* uninitialized space for uDMA access */
|
||||
.udma_access (NOLOAD): {
|
||||
. = ALIGN(4);
|
||||
_udma_space_start = .;
|
||||
*(.udma_access)
|
||||
_udma_space_end = .;
|
||||
} > L2_PRIV_CH0
|
||||
|
||||
#include <zephyr/linker/rel-sections.ld>
|
||||
|
||||
|
||||
SECTION_PROLOGUE(.plt,,)
|
||||
{
|
||||
*(.plt)
|
||||
}
|
||||
|
||||
|
||||
SECTION_PROLOGUE(.iplt,,)
|
||||
{
|
||||
*(.iplt)
|
||||
}
|
||||
|
||||
|
||||
GROUP_START(ROM)
|
||||
__rom_region_start = ROM_BASE;
|
||||
|
||||
SECTION_PROLOGUE(_TEXT_SECTION_NAME,,)
|
||||
{
|
||||
|
||||
/* Located in generated directory. This file is populated by calling
|
||||
* zephyr_linker_sources(ROM_START ...). This typically contains the vector
|
||||
* table and debug information.
|
||||
*/
|
||||
#include <snippets-rom-start.ld>
|
||||
|
||||
__text_region_start = .;
|
||||
|
||||
*(.text .text.*)
|
||||
*(.gnu.linkonce.t.*)
|
||||
*(.eh_frame)
|
||||
|
||||
} GROUP_LINK_IN(ROM)
|
||||
|
||||
__text_region_end = .;
|
||||
|
||||
|
||||
__rodata_region_start = .;
|
||||
|
||||
#include <zephyr/linker/common-rom.ld>
|
||||
#include <zephyr/linker/thread-local-storage.ld>
|
||||
|
||||
SECTION_PROLOGUE(_RODATA_SECTION_NAME,,)
|
||||
{
|
||||
. = ALIGN(4);
|
||||
*(.srodata)
|
||||
*(".srodata.*")
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.gnu.linkonce.r.*)
|
||||
|
||||
/* Located in generated directory. This file is populated by the
|
||||
* zephyr_linker_sources() Cmake function.
|
||||
*/
|
||||
#include <snippets-rodata.ld>
|
||||
|
||||
} GROUP_LINK_IN(ROMABLE_REGION)
|
||||
|
||||
#include <zephyr/linker/cplusplus-rom.ld>
|
||||
|
||||
__rodata_region_end = .;
|
||||
|
||||
__rom_region_end = .;
|
||||
GROUP_END(ROM)
|
||||
|
||||
GROUP_START(RAM)
|
||||
|
||||
SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,)
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_image_ram_start = .;
|
||||
__data_region_start = .;
|
||||
__data_start = .;
|
||||
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.s.*)
|
||||
|
||||
/* https://groups.google.com/a/groups.riscv.org/d/msg/sw-dev/60IdaZj27dY/TKT3hbNlAgAJ */
|
||||
*(.sdata .sdata.* .gnu.linkonce.s.*)
|
||||
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
|
||||
|
||||
/* Located in generated directory. This file is populated by the
|
||||
* zephyr_linker_sources() Cmake function.
|
||||
*/
|
||||
#include <snippets-rwdata.ld>
|
||||
|
||||
__data_end = .;
|
||||
|
||||
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
||||
__data_size = __data_end - __data_start;
|
||||
|
||||
|
||||
__data_load_start = LOADADDR(_DATA_SECTION_NAME);
|
||||
|
||||
#include <zephyr/linker/common-ram.ld>
|
||||
#include <zephyr/linker/cplusplus-ram.ld>
|
||||
|
||||
/* Located in generated directory. This file is populated by the
|
||||
* zephyr_linker_sources() Cmake function.
|
||||
*/
|
||||
#include <snippets-data-sections.ld>
|
||||
|
||||
__data_region_end = .;
|
||||
__data_region_load_start = LOADADDR(_DATA_SECTION_NAME);
|
||||
|
||||
SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),)
|
||||
{
|
||||
/*
|
||||
* For performance, BSS section is assumed to be 4 byte aligned and
|
||||
* a multiple of 4 bytes, so it can be cleared in words.
|
||||
*/
|
||||
. = ALIGN(4);
|
||||
__bss_start = .;
|
||||
|
||||
*(.bss .bss.*)
|
||||
*(.sbss .sbss.*)
|
||||
COMMON_SYMBOLS
|
||||
|
||||
/* Ensure 4 byte alignment for the entire section. */
|
||||
. = ALIGN(4);
|
||||
__bss_end = .;
|
||||
} GROUP_DATA_LINK_IN(RAMABLE_REGION, RAMABLE_REGION)
|
||||
|
||||
SECTION_PROLOGUE(_NOINIT_SECTION_NAME,(NOLOAD),)
|
||||
{
|
||||
/*
|
||||
* This section is used for non-initialized objects that
|
||||
* will not be cleared during the boot process.
|
||||
*/
|
||||
*(.noinit .noinit.*)
|
||||
|
||||
/* Located in generated directory. This file is populated by the
|
||||
* zephyr_linker_sources() Cmake function.
|
||||
*/
|
||||
#include <snippets-noinit.ld>
|
||||
|
||||
} GROUP_LINK_IN(RAMABLE_REGION)
|
||||
|
||||
/* Located in generated directory. This file is populated by the
|
||||
* zephyr_linker_sources() Cmake function.
|
||||
*/
|
||||
#include <snippets-ram-sections.ld>
|
||||
|
||||
/* Located in generated directory. This file is populated by the
|
||||
* zephyr_linker_sources() Cmake function.
|
||||
*/
|
||||
#include <snippets-sections.ld>
|
||||
|
||||
#include <zephyr/linker/ram-end.ld>
|
||||
|
||||
GROUP_END(RAMABLE_REGION)
|
||||
|
||||
#ifdef CONFIG_GEN_ISR_TABLES
|
||||
/* Bogus section, post-processed during the build to initialize interrupts. */
|
||||
#include <zephyr/linker/intlist.ld>
|
||||
#endif
|
||||
|
||||
#include <zephyr/linker/debug-sections.ld>
|
||||
|
||||
SECTION_PROLOGUE(.riscv.attributes, 0,)
|
||||
{
|
||||
KEEP(*(.riscv.attributes))
|
||||
KEEP(*(.gnu.attributes))
|
||||
}
|
||||
|
||||
/*
|
||||
* Pulpino toolchains emit these sections; we don't care about them,
|
||||
* but need to avoid build system warnings about orphaned sections.
|
||||
*/
|
||||
SECTION_PROLOGUE(.Pulp_Chip.Info,,)
|
||||
{
|
||||
*(.Pulp_Chip.*)
|
||||
}
|
||||
|
||||
}
|
44
soc/sensry/ganymed/sy1xx/common/pad_ctrl.h
Normal file
44
soc/sensry/ganymed/sy1xx/common/pad_ctrl.h
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
* Copyright (c) 2024 sensry.io
|
||||
*/
|
||||
|
||||
#ifndef GANYMED_SY1XX_PAD_CTRL_H
|
||||
#define GANYMED_SY1XX_PAD_CTRL_H
|
||||
|
||||
#define PAD_CONFIG(pin_offset, SMT, SLEW, PULLUP, PULLDOWN, DRV, PMOD, DIR) \
|
||||
(((SMT << 7) | (SLEW << 6) | (PULLUP << 5) | (PULLDOWN << 4) | (DRV << 2) | (PMOD << 1) | \
|
||||
DIR) \
|
||||
<< pin_offset)
|
||||
|
||||
#define PAD_CONFIG_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_APB_SOC_CTRL_OFFSET)
|
||||
|
||||
#define PAD_CONFIG_ADDR_UART (PAD_CONFIG_ADDR + 0x020)
|
||||
#define PAD_CONFIG_ADDR_SPI (PAD_CONFIG_ADDR + 0x02c)
|
||||
#define PAD_CONFIG_ADDR_I2C (PAD_CONFIG_ADDR + 0x100)
|
||||
#define PAD_CONFIG_ADDR_MAC (PAD_CONFIG_ADDR + 0x130)
|
||||
|
||||
#define PAD_SMT_DISABLE 0
|
||||
#define PAD_SMT_ENABLE 1
|
||||
|
||||
#define PAD_SLEW_LOW 0
|
||||
#define PAD_SLEW_HIGH 1
|
||||
|
||||
#define PAD_PULLUP_DIS 0
|
||||
#define PAD_PULLUP_EN 1
|
||||
|
||||
#define PAD_PULLDOWN_DIS 0
|
||||
#define PAD_PULLDOWN_EN 1
|
||||
|
||||
#define PAD_DRIVE_2PF 0
|
||||
#define PAD_DRIVE_4PF 1
|
||||
#define PAD_DRIVE_8PF 2
|
||||
#define PAD_DRIVE_16PF 3
|
||||
|
||||
#define PAD_PMOD_NORMAL 0
|
||||
#define PAD_PMOD_TRISTATE 1
|
||||
|
||||
#define PAD_DIR_OUTPUT 0
|
||||
#define PAD_DIR_INPUT 1
|
||||
|
||||
#endif /* GANYMED_SY1XX_PAD_CTRL_H */
|
91
soc/sensry/ganymed/sy1xx/common/soc.c
Normal file
91
soc/sensry/ganymed/sy1xx/common/soc.c
Normal file
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
* Copyright (c) 2024 sensry.io
|
||||
*/
|
||||
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/init.h>
|
||||
|
||||
#include <zephyr/sys/util.h>
|
||||
|
||||
#define LOG_LEVEL CONFIG_SOC_LOG_LEVEL
|
||||
#include <zephyr/logging/log.h>
|
||||
LOG_MODULE_REGISTER(soc);
|
||||
|
||||
#include "soc.h"
|
||||
|
||||
/* ITC */
|
||||
#define ARCHI_ITC_MASK_OFFSET 0x0
|
||||
#define ARCHI_ITC_MASK_SET_OFFSET 0x4
|
||||
#define ARCHI_ITC_MASK_CLR_OFFSET 0x8
|
||||
#define ARCHI_ITC_STATUS_OFFSET 0xc
|
||||
#define ARCHI_ITC_STATUS_SET_OFFSET 0x10
|
||||
#define ARCHI_ITC_STATUS_CLR_OFFSET 0x14
|
||||
#define ARCHI_ITC_ACK_OFFSET 0x18
|
||||
#define ARCHI_ITC_ACK_SET_OFFSET 0x1c
|
||||
#define ARCHI_ITC_ACK_CLR_OFFSET 0x20
|
||||
#define ARCHI_ITC_FIFO_OFFSET 0x24
|
||||
|
||||
void sys_arch_reboot(int type)
|
||||
{
|
||||
ARG_UNUSED(type);
|
||||
}
|
||||
|
||||
#define ARCHI_REF_CLOCK (32768)
|
||||
#define ARCHI_PER_CLOCK (125000000)
|
||||
|
||||
uint32_t soc_get_rts_clock_frequency(void)
|
||||
{
|
||||
return ARCHI_REF_CLOCK;
|
||||
}
|
||||
|
||||
uint32_t soc_get_peripheral_clock(void)
|
||||
{
|
||||
return ARCHI_PER_CLOCK;
|
||||
}
|
||||
|
||||
void riscv_clic_irq_priority_set(uint32_t irq, uint32_t prio, uint32_t flags)
|
||||
{
|
||||
/* we do not support priorities */
|
||||
}
|
||||
|
||||
void soc_enable_irq(uint32_t idx)
|
||||
{
|
||||
uint32_t current = sys_read32(ARCHI_FC_ITC_ADDR + ARCHI_ITC_MASK_SET_OFFSET);
|
||||
|
||||
sys_write32(current | (1 << (idx & 0x1f)), ARCHI_FC_ITC_ADDR + ARCHI_ITC_MASK_SET_OFFSET);
|
||||
}
|
||||
|
||||
void soc_disable_irq(uint32_t idx)
|
||||
{
|
||||
uint32_t current = sys_read32(ARCHI_FC_ITC_ADDR + ARCHI_ITC_MASK_CLR_OFFSET);
|
||||
|
||||
sys_write32(current & (~(1 << (idx & 0x1f))),
|
||||
ARCHI_FC_ITC_ADDR + ARCHI_ITC_MASK_CLR_OFFSET);
|
||||
}
|
||||
|
||||
/*
|
||||
* SoC-level interrupt initialization. Clear any pending interrupts or
|
||||
* events, and find the INTMUX device if necessary.
|
||||
*
|
||||
* This gets called as almost the first thing z_cstart() does, so it
|
||||
* will happen before any calls to the _arch_irq_xxx() routines above.
|
||||
*/
|
||||
void soc_interrupt_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Perform basic hardware initialization
|
||||
*
|
||||
* Initializes the base clocks and LPFLL using helpers provided by the HAL.
|
||||
*
|
||||
* @return 0
|
||||
*/
|
||||
static int soc_sy1xx_init(void)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SYS_INIT(soc_sy1xx_init, PRE_KERNEL_1, 0);
|
48
soc/sensry/ganymed/sy1xx/common/soc.h
Normal file
48
soc/sensry/ganymed/sy1xx/common/soc.h
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
* Copyright (c) 2024 sensry.io
|
||||
*/
|
||||
|
||||
#ifndef GANYMED_SY1XX_SOC_H
|
||||
#define GANYMED_SY1XX_SOC_H
|
||||
|
||||
#ifndef _ASMLANGUAGE
|
||||
|
||||
#include <zephyr/types.h>
|
||||
|
||||
/* SOC PERIPHERALS */
|
||||
|
||||
#define ARCHI_SOC_PERIPHERALS_ADDR 0x1A100000
|
||||
|
||||
#define ARCHI_GPIO_OFFSET 0x00001000
|
||||
#define ARCHI_UDMA_OFFSET 0x00002000
|
||||
#define ARCHI_APB_SOC_CTRL_OFFSET 0x00004000
|
||||
#define ARCHI_SOC_EU_OFFSET 0x00006000
|
||||
#define ARCHI_FC_ITC_OFFSET 0x00009800
|
||||
#define ARCHI_FC_TIMER_OFFSET 0x0000B000
|
||||
#define ARCHI_STDOUT_OFFSET 0x0000F000
|
||||
|
||||
#define ARCHI_GPIO_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_GPIO_OFFSET)
|
||||
#define ARCHI_UDMA_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_UDMA_OFFSET)
|
||||
#define ARCHI_APB_SOC_CTRL_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_APB_SOC_CTRL_OFFSET)
|
||||
#define ARCHI_SOC_EU_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_SOC_EU_OFFSET)
|
||||
#define ARCHI_FC_ITC_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_FC_ITC_OFFSET)
|
||||
#define ARCHI_FC_TIMER_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_FC_TIMER_OFFSET)
|
||||
#define ARCHI_STDOUT_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_STDOUT_OFFSET)
|
||||
|
||||
#define ARCHI_PLL_ADDR (ARCHI_SOC_PERIPHERALS_ADDR)
|
||||
#define ARCHI_SECURE_MRAM_CTRL_ADDR 0x1D180000
|
||||
#define ARCHI_GLOBAL_MRAM_CTRL_ADDR 0x1E080000
|
||||
#define ARCHI_MRAM_EFUSE_ADDR 0x1D070100
|
||||
#define ARCHI_TSN_ADDR 0x1A120000
|
||||
#define ARCHI_CAN_ADDR 0x1A130000
|
||||
|
||||
uint32_t soc_get_rts_clock_frequency(void);
|
||||
uint32_t soc_get_peripheral_clock(void);
|
||||
|
||||
void soc_enable_irq(uint32_t idx);
|
||||
void soc_disable_irq(uint32_t idx);
|
||||
|
||||
#endif /* _ASMLANGUAGE */
|
||||
|
||||
#endif /* GANYMED_SY1XX_SOC_H */
|
180
soc/sensry/ganymed/sy1xx/common/udma.c
Normal file
180
soc/sensry/ganymed/sy1xx/common/udma.c
Normal file
|
@ -0,0 +1,180 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
* Copyright (c) 2024 sensry.io
|
||||
*/
|
||||
|
||||
#include "soc.h"
|
||||
#include "udma.h"
|
||||
|
||||
#define UDMA_CTRL_PER_CG (ARCHI_UDMA_ADDR + UDMA_CONF_OFFSET)
|
||||
|
||||
#define DRIVERS_MAX_UART_COUNT 3
|
||||
#define DRIVERS_MAX_I2C_COUNT 4
|
||||
#define DRIVERS_MAX_SPI_COUNT 7
|
||||
#define DEVICE_MAX_ETH_COUNT 1
|
||||
|
||||
void drivers_udma_enable_clock(udma_module_t module, uint32_t instance)
|
||||
{
|
||||
|
||||
uint32_t udma_ctrl_per_cg = sys_read32(UDMA_CTRL_PER_CG);
|
||||
|
||||
switch (module) {
|
||||
|
||||
case DRIVERS_UDMA_UART:
|
||||
if (instance >= DRIVERS_MAX_UART_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg |= 1 << (instance + 0);
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_I2C:
|
||||
if (instance >= DRIVERS_MAX_I2C_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg |= 1 << (instance + 10);
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_SPI:
|
||||
if (instance >= DRIVERS_MAX_SPI_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg |= 1 << (instance + 3);
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_MAC:
|
||||
if (instance >= DEVICE_MAX_ETH_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg |= 1 << (instance + 20);
|
||||
break;
|
||||
|
||||
case DRIVERS_MAX_UDMA_COUNT:
|
||||
break;
|
||||
}
|
||||
|
||||
sys_write32(udma_ctrl_per_cg, UDMA_CTRL_PER_CG);
|
||||
}
|
||||
|
||||
void drivers_udma_disable_clock(udma_module_t module, uint32_t instance)
|
||||
{
|
||||
|
||||
uint32_t udma_ctrl_per_cg = sys_read32(UDMA_CTRL_PER_CG);
|
||||
|
||||
switch (module) {
|
||||
|
||||
case DRIVERS_UDMA_UART:
|
||||
if (instance >= DRIVERS_MAX_UART_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg &= ~(1 << (instance + 0));
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_I2C:
|
||||
if (instance >= DRIVERS_MAX_I2C_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg &= ~(1 << (instance + 10));
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_SPI:
|
||||
if (instance >= DRIVERS_MAX_SPI_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg &= ~(1 << (instance + 3));
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_MAC:
|
||||
if (instance >= DEVICE_MAX_ETH_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg &= ~(1 << (instance + 20));
|
||||
break;
|
||||
|
||||
case DRIVERS_MAX_UDMA_COUNT:
|
||||
break;
|
||||
}
|
||||
|
||||
sys_write32(udma_ctrl_per_cg, UDMA_CTRL_PER_CG);
|
||||
}
|
||||
|
||||
void drivers_udma_busy_delay(uint32_t msec)
|
||||
{
|
||||
uint32_t sec = 250000000;
|
||||
uint32_t millis = (sec / 1000) * msec;
|
||||
|
||||
for (uint32_t i = 0; i < millis; i++) {
|
||||
__asm__("nop");
|
||||
}
|
||||
}
|
||||
|
||||
int32_t drivers_udma_cancel(uint32_t base, uint32_t channel)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
/* clear existing */
|
||||
UDMA_WRITE_REG(base, UDMA_CFG_REG + channel_offset, UDMA_CHANNEL_CFG_CLEAR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_is_ready(uint32_t base, uint32_t channel)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
int32_t isBusy = UDMA_READ_REG(base, UDMA_CFG_REG + channel_offset) & (UDMA_CHANNEL_CFG_EN);
|
||||
|
||||
return isBusy ? 0 : 1;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_wait_for_finished(uint32_t base, uint32_t channel)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
volatile uint32_t timeout = 200;
|
||||
|
||||
while (UDMA_READ_REG(base, UDMA_CFG_REG + channel_offset) & (UDMA_CHANNEL_CFG_EN)) {
|
||||
drivers_udma_busy_delay(1);
|
||||
timeout--;
|
||||
if (timeout == 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_wait_for_status(uint32_t base)
|
||||
{
|
||||
|
||||
volatile uint32_t timeout = 200;
|
||||
|
||||
while (UDMA_READ_REG(base, UDMA_STATUS) & (0x3)) {
|
||||
drivers_udma_busy_delay(1);
|
||||
timeout--;
|
||||
if (timeout == 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_start(uint32_t base, uint32_t channel, uint32_t saddr, uint32_t size,
|
||||
uint32_t optional_cfg)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
UDMA_WRITE_REG(base, UDMA_SADDR_REG + channel_offset, saddr);
|
||||
UDMA_WRITE_REG(base, UDMA_SIZE_REG + channel_offset, size);
|
||||
UDMA_WRITE_REG(base, UDMA_CFG_REG + channel_offset, UDMA_CHANNEL_CFG_EN | optional_cfg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_get_remaining(uint32_t base, uint32_t channel)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
int32_t size = UDMA_READ_REG(base, UDMA_SIZE_REG + channel_offset);
|
||||
|
||||
return size;
|
||||
}
|
151
soc/sensry/ganymed/sy1xx/common/udma.h
Normal file
151
soc/sensry/ganymed/sy1xx/common/udma.h
Normal file
|
@ -0,0 +1,151 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
* Copyright (c) 2024 sensry.io
|
||||
*/
|
||||
|
||||
#ifndef GANYMED_SY1XX_UDMA_H
|
||||
#define GANYMED_SY1XX_UDMA_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <zephyr/arch/common/sys_io.h>
|
||||
#include <soc.h>
|
||||
|
||||
/* UDMA */
|
||||
#define ARCHI_UDMA_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_UDMA_OFFSET)
|
||||
|
||||
#define UDMA_PERIPH_AREA_SIZE_LOG2 7
|
||||
#define UDMA_PERIPH_OFFSET(id) (((id) << UDMA_PERIPH_AREA_SIZE_LOG2))
|
||||
|
||||
#define ARCHI_UDMA_UART_ID(id) (0 + (id))
|
||||
#define ARCHI_UDMA_SPIM_ID(id) (3 + (id))
|
||||
#define ARCHI_UDMA_I2C_ID(id) (10 + (id))
|
||||
#define ARCHI_UDMA_I2S_ID(id) (14 + (id))
|
||||
#define ARCHI_UDMA_HYPER_ID(id) (19 + (id))
|
||||
#define ARCHI_UDMA_TSN_ID(id) (20 + (id))
|
||||
|
||||
#define UDMA_CHANNEL_RX_OFFSET 0x00
|
||||
#define UDMA_CHANNEL_TX_OFFSET 0x10
|
||||
#define UDMA_CHANNEL_CUSTOM_OFFSET 0x20
|
||||
|
||||
/*
|
||||
* For each channel, the RX and TX part have the following registers
|
||||
* The offsets are given relative to the offset of the RX or TX part
|
||||
*/
|
||||
|
||||
/* Start address register */
|
||||
#define UDMA_CHANNEL_SADDR_OFFSET 0x0
|
||||
/* Size register */
|
||||
#define UDMA_CHANNEL_SIZE_OFFSET 0x4
|
||||
/* Configuration register */
|
||||
#define UDMA_CHANNEL_CFG_OFFSET 0x8
|
||||
/* Int configuration register */
|
||||
#define UDMA_CHANNEL_INTCFG_OFFSET 0xC
|
||||
|
||||
/*
|
||||
* The configuration register of the RX and TX parts for each channel can be accessed using the
|
||||
* following bits
|
||||
*/
|
||||
|
||||
#define UDMA_CHANNEL_CFG_SHADOW_BIT (5)
|
||||
#define UDMA_CHANNEL_CFG_CLEAR_BIT (5)
|
||||
#define UDMA_CHANNEL_CFG_EN_BIT (4)
|
||||
#define UDMA_CHANNEL_CFG_SIZE_BIT (1)
|
||||
#define UDMA_CHANNEL_CFG_CONT_BIT (0)
|
||||
|
||||
/* Indicates if a shadow transfer is there */
|
||||
#define UDMA_CHANNEL_CFG_SHADOW (1 << UDMA_CHANNEL_CFG_SHADOW_BIT)
|
||||
/* Stop and clear all pending transfers */
|
||||
#define UDMA_CHANNEL_CFG_CLEAR (1 << UDMA_CHANNEL_CFG_CLEAR_BIT)
|
||||
/* Start a transfer */
|
||||
#define UDMA_CHANNEL_CFG_EN (1 << UDMA_CHANNEL_CFG_EN_BIT)
|
||||
/* Configure for 8-bits transfer */
|
||||
#define UDMA_CHANNEL_CFG_SIZE_8 (0 << UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
/* Configure for 16-bits transfer */
|
||||
#define UDMA_CHANNEL_CFG_SIZE_16 (1 << UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
/* Configure for 32-bits transfer */
|
||||
#define UDMA_CHANNEL_CFG_SIZE_32 (2 << UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
/* Configure for continuous mode */
|
||||
#define UDMA_CHANNEL_CFG_CONT (1 << UDMA_CHANNEL_CFG_CONT_BIT)
|
||||
|
||||
/* Configuration area offset */
|
||||
#define UDMA_CONF_OFFSET 0xF80
|
||||
/* Clock-gating control register */
|
||||
#define UDMA_CONF_CG_OFFSET 0x00
|
||||
|
||||
static inline void plp_udma_cg_set(unsigned int value)
|
||||
{
|
||||
sys_write32(value, ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_UDMA_OFFSET + UDMA_CONF_OFFSET +
|
||||
UDMA_CONF_CG_OFFSET);
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
DRIVERS_UDMA_UART,
|
||||
DRIVERS_UDMA_I2C,
|
||||
DRIVERS_UDMA_SPI,
|
||||
DRIVERS_UDMA_MAC,
|
||||
DRIVERS_MAX_UDMA_COUNT
|
||||
} udma_module_t;
|
||||
|
||||
void drivers_udma_enable_clock(udma_module_t module, uint32_t instance);
|
||||
void drivers_udma_disable_clock(udma_module_t module, uint32_t instance);
|
||||
|
||||
int32_t drivers_udma_cancel(uint32_t base, uint32_t channel);
|
||||
int32_t drivers_udma_is_ready(uint32_t base, uint32_t channel);
|
||||
int32_t drivers_udma_wait_for_finished(uint32_t base, uint32_t channel);
|
||||
int32_t drivers_udma_wait_for_status(uint32_t base);
|
||||
int32_t drivers_udma_start(uint32_t base, uint32_t channel, uint32_t saddr, uint32_t size,
|
||||
uint32_t optional_cfg);
|
||||
int32_t drivers_udma_get_remaining(uint32_t base, uint32_t channel);
|
||||
|
||||
typedef enum {
|
||||
UDMA_SADDR_REG = 0x00,
|
||||
UDMA_SIZE_REG = 0x04,
|
||||
UDMA_CFG_REG = 0x08,
|
||||
|
||||
} udma_regs_t;
|
||||
|
||||
typedef enum {
|
||||
UDMA_RX_SADDR_REG = 0x00,
|
||||
UDMA_RX_SIZE_REG = 0x04,
|
||||
UDMA_RX_CFG_REG = 0x08,
|
||||
|
||||
UDMA_TX_SADDR_REG = 0x10,
|
||||
UDMA_TX_SIZE_REG = 0x14,
|
||||
UDMA_TX_CFG_REG = 0x18,
|
||||
|
||||
UDMA_STATUS = 0x20,
|
||||
UDMA_SETUP_REG = 0x24,
|
||||
} udma_reg_t;
|
||||
|
||||
#define UDMA_RX_DATA_ADDR_INC_SIZE_8 (0x0 << 1)
|
||||
#define UDMA_RX_DATA_ADDR_INC_SIZE_16 (0x1 << 1)
|
||||
#define UDMA_RX_DATA_ADDR_INC_SIZE_32 (0x2 << 1)
|
||||
|
||||
#define UDMA_RX_CHANNEL 0
|
||||
#define UDMA_TX_CHANNEL 1
|
||||
|
||||
#define UDMA_READ_REG(udma_base, reg) sys_read32(udma_base + reg)
|
||||
#define UDMA_WRITE_REG(udma_base, reg, value) sys_write32(value, udma_base + reg)
|
||||
|
||||
#define UDMA_CANCEL_RX(udma_base) drivers_udma_cancel(udma_base, UDMA_RX_CHANNEL)
|
||||
#define UDMA_CANCEL_TX(udma_base) drivers_udma_cancel(udma_base, UDMA_TX_CHANNEL)
|
||||
|
||||
#define UDMA_IS_FINISHED_RX(udma_base) drivers_udma_is_ready(udma_base, UDMA_RX_CHANNEL)
|
||||
#define UDMA_IS_FINISHED_TX(udma_base) drivers_udma_is_ready(udma_base, UDMA_TX_CHANNEL)
|
||||
|
||||
#define UDMA_WAIT_FOR_FINISHED_RX(udma_base) \
|
||||
drivers_udma_wait_for_finished(udma_base, UDMA_RX_CHANNEL)
|
||||
#define UDMA_WAIT_FOR_FINISHED_TX(udma_base) \
|
||||
drivers_udma_wait_for_finished(udma_base, UDMA_TX_CHANNEL)
|
||||
|
||||
#define UDMA_START_RX(base, addr, size, cfg) \
|
||||
drivers_udma_start(base, UDMA_RX_CHANNEL, addr, size, cfg)
|
||||
#define UDMA_START_TX(base, addr, size, cfg) \
|
||||
drivers_udma_start(base, UDMA_TX_CHANNEL, addr, size, cfg)
|
||||
|
||||
#define UDMA_GET_REMAINING_RX(base) drivers_udma_get_remaining(base, UDMA_RX_CHANNEL)
|
||||
#define UDMA_GET_REMAINING_TX(base) drivers_udma_get_remaining(base, UDMA_TX_CHANNEL)
|
||||
|
||||
#define UDMA_WAIT_FOR_STATUS_IDLE(udma_base) drivers_udma_wait_for_status(udma_base)
|
||||
|
||||
#endif /* GANYMED_SY1XX_UDMA_H */
|
14
soc/sensry/ganymed/sy1xx/common/vector_table.ld
Normal file
14
soc/sensry/ganymed/sy1xx/common/vector_table.ld
Normal file
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
* Copyright (c) 2019 Foundries.io Ltd
|
||||
* Copyright (c) 2019 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
|
||||
KEEP(*(.reset.*))
|
||||
KEEP(*(".exception.entry.*")) /* contains _isr_wrapper */
|
||||
*(".exception.other.*")
|
||||
|
||||
KEEP(*(.openocd_debug))
|
||||
KEEP(*(".openocd_debug.*"))
|
10
soc/sensry/soc.yml
Normal file
10
soc/sensry/soc.yml
Normal file
|
@ -0,0 +1,10 @@
|
|||
# Copyright (c) 2024 sensry.io
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
family:
|
||||
- name: ganymed
|
||||
series:
|
||||
- name: sy1xx
|
||||
socs:
|
||||
- name: sy120_gbm
|
||||
- name: sy120_gen1
|
Loading…
Add table
Add a link
Reference in a new issue