Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
75ffe39
core: update memory_init API declaration and docs
ozan956 Apr 15, 2026
ab1b33f
board: update memory_init signature for pool address
ozan956 Apr 15, 2026
071bc9d
build: split target selection into board, arch and cpu profiles
ozan956 Apr 17, 2026
2bd5918
board: keep board layer focused on memory and board defaults
ozan956 Apr 17, 2026
fcf77eb
device: flatten driver source layout
ozan956 Apr 17, 2026
8016427
imgproc: centralize FFT pipeline and add arch backend hooks
ozan956 Apr 17, 2026
7746603
core: update public config contract for board/arch split
ozan956 Apr 17, 2026
9d593a0
core: bump version to 0.2.0 for board/arch split
ozan956 Apr 17, 2026
036d7f0
wrapper: remove unused Image::ifftshift
ozan956 Apr 18, 2026
70204f6
build: add board and arch profile cmake modules
ozan956 Apr 18, 2026
b243a5e
device/serial: remove legacy commented UART paths and JPEG pacing delay
ozan956 Apr 23, 2026
70664e9
imgproc: add JPEG compression API with libjpeg backend
ozan956 Apr 23, 2026
2383e86
segmentation: replace legacy GrabCut variants with grayscale graph-cut
ozan956 Apr 23, 2026
e1f19f5
imgproc: filter: harden canny and fix edge-thinning threshold stages
ozan956 Apr 23, 2026
43a1e30
imgproc: segmentation: make multi-seed region growing adaptive
ozan956 Apr 23, 2026
61527f3
board/stm32f7: make SDRAM pool start configurable in memory_init
ozan956 Apr 23, 2026
fb47205
imgproc: morph: document first-iteration ping initialization
ozan956 Apr 23, 2026
08e1e5a
style: run clang-format on public headers
ozan956 Apr 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@ CMakeFiles/
cmake_install.cmake
CTestTestfile.cmake
Makefile
*.cmake
!CMakeLists.txt
!cmake/*.cmake
compile_commands.json
.ninja_deps
.ninja_log
Expand Down
151 changes: 90 additions & 61 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,52 @@ project(embedDIP
DESCRIPTION "Portable embedded digital image processing library"
)

set(EMBEDDIP_TARGET_PLATFORM "STM32F7" CACHE STRING "Target platform: STM32F7, ESP32, or HOST")
set_property(CACHE EMBEDDIP_TARGET_PLATFORM PROPERTY STRINGS "STM32F7" "ESP32" "HOST")
set(EMBEDDIP_TARGET_BOARD "" CACHE STRING "Target board (required): STM32F7 or ESP32")
set_property(CACHE EMBEDDIP_TARGET_BOARD PROPERTY STRINGS "STM32F7" "ESP32")

set(EMBEDDIP_ARCH "" CACHE STRING "Architecture family (required): ARM or XTENSA")
set_property(CACHE EMBEDDIP_ARCH PROPERTY STRINGS "ARM" "XTENSA")

set(EMBEDDIP_CPU "" CACHE STRING "CPU variant (required): CORTEX_M7, LX6, LX7")
set_property(CACHE EMBEDDIP_CPU PROPERTY STRINGS "CORTEX_M7" "LX6" "LX7")

option(EMBEDDIP_ENABLE_UART_LOGGING "Enable UART logging" ON)
option(EMBEDDIP_ENABLE_IMAGE_PROCESSING "Enable image processing modules" ON)
option(EMBEDDIP_ENABLE_CAMERA_INPUT "Enable camera input interfaces" ON)
option(EMBEDDIP_ENABLE_DISPLAY_OUTPUT "Enable display output interfaces" ON)
option(EMBEDDIP_BUILD_DOCS "Build documentation with Doxygen" OFF)

if(EMBEDDIP_TARGET_BOARD STREQUAL "")
message(FATAL_ERROR "EMBEDDIP_TARGET_BOARD is required. Supported values: STM32F7, ESP32")
endif()

if(EMBEDDIP_ARCH STREQUAL "")
message(FATAL_ERROR "EMBEDDIP_ARCH is required. Supported values: ARM, XTENSA")
endif()

if(EMBEDDIP_CPU STREQUAL "")
message(FATAL_ERROR "EMBEDDIP_CPU is required. Supported values: CORTEX_M7, LX6, LX7")
endif()

# Explicit compatibility matrix between board, architecture family and CPU
set(_embeddip_pair_valid FALSE)
if(EMBEDDIP_TARGET_BOARD STREQUAL "STM32F7")
if(EMBEDDIP_ARCH STREQUAL "ARM" AND EMBEDDIP_CPU STREQUAL "CORTEX_M7")
set(_embeddip_pair_valid TRUE)
endif()
elseif(EMBEDDIP_TARGET_BOARD STREQUAL "ESP32")
if(EMBEDDIP_ARCH STREQUAL "XTENSA" AND (EMBEDDIP_CPU STREQUAL "LX6" OR EMBEDDIP_CPU STREQUAL "LX7"))
set(_embeddip_pair_valid TRUE)
endif()
endif()

if(NOT _embeddip_pair_valid)
message(FATAL_ERROR
"Invalid board/arch/cpu combination: ${EMBEDDIP_TARGET_BOARD} + ${EMBEDDIP_ARCH} + ${EMBEDDIP_CPU}. "
"Supported: STM32F7+ARM+CORTEX_M7, ESP32+XTENSA+LX6, ESP32+XTENSA+LX7"
)
endif()

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
Expand All @@ -40,6 +77,10 @@ set(IMGPROC_SOURCES
# Main header (includes all sub-modules)
imgproc/pixel.h

# Compression
imgproc/compress.c
imgproc/compress.h

# Color operations
imgproc/color.c
imgproc/color.h
Expand Down Expand Up @@ -85,6 +126,7 @@ set(IMGPROC_SOURCES
imgproc/misc.h

# FFT operations
imgproc/fft.c
imgproc/fft.h
)

Expand All @@ -111,71 +153,53 @@ set(BOARD_COMMON_SOURCES
board/common.h
)

# Platform-specific sources
if(EMBEDDIP_TARGET_PLATFORM STREQUAL "STM32F7")
set(BOARD_SOURCES
${BOARD_COMMON_SOURCES}
board/stm32f7/board_stm32f7_common.c
board/stm32f7/board_stm32f7_fft.c
board/stm32f7/board_stm32f7_memory.c
board/stm32f7/configs.h
)

set(DEVICE_SOURCES
${DEVICE_COMMON_SOURCES}
device/camera/ov5640/stm32_ov5640.c
device/display/rk043fn48h/stm32_rk043fn48h.c
device/serial/stm32_uart/stm32_uart.c
)

set(PLATFORM_DEFINES
STM32F7xx
ARM_MATH_CM7
TARGET_BOARD_STM32F7=1
)

elseif(EMBEDDIP_TARGET_PLATFORM STREQUAL "ESP32")
set(BOARD_SOURCES
${BOARD_COMMON_SOURCES}
board/esp32/board_esp32_common.cpp
board/esp32/board_esp32_fft.cpp
board/esp32/board_esp32_memory.cpp
)

set(DEVICE_SOURCES
${DEVICE_COMMON_SOURCES}
device/camera/ov2640/esp32_ov2640.cpp
device/serial/esp32_uart/esp32_uart.cpp
)
# Load board and architecture profiles (kept next to board/arch source trees
# to make onboarding new ports straightforward).
string(TOLOWER "${EMBEDDIP_TARGET_BOARD}" EMBEDDIP_BOARD_PROFILE)
string(TOLOWER "${EMBEDDIP_ARCH}" EMBEDDIP_ARCH_PROFILE)

set(PLATFORM_DEFINES
ARDUINO_ARCH_ESP32
TARGET_BOARD_ESP32=1
)
set(EMBEDDIP_BOARD_PROFILE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/board/${EMBEDDIP_BOARD_PROFILE}/board_profile.cmake")
set(EMBEDDIP_ARCH_PROFILE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/arch/${EMBEDDIP_ARCH_PROFILE}/arch_profile.cmake")

else()
message(FATAL_ERROR "Unknown platform: ${EMBEDDIP_TARGET_PLATFORM}. Must be STM32F7, ESP32, or HOST")
if(NOT EXISTS "${EMBEDDIP_BOARD_PROFILE_FILE}")
message(FATAL_ERROR "Board profile not found: ${EMBEDDIP_BOARD_PROFILE_FILE}")
endif()
if(NOT EXISTS "${EMBEDDIP_ARCH_PROFILE_FILE}")
message(FATAL_ERROR "Architecture profile not found: ${EMBEDDIP_ARCH_PROFILE_FILE}")
endif()

include("${EMBEDDIP_BOARD_PROFILE_FILE}")
include("${EMBEDDIP_ARCH_PROFILE_FILE}")

# === Create Library Target ===
add_library(embedDIP STATIC
${CORE_SOURCES}
${IMGPROC_SOURCES}
${BOARD_SOURCES}
${DEVICE_SOURCES}
${EMBEDDIP_BOARD_SOURCES}
${EMBEDDIP_ARCH_SOURCES}
${EMBEDDIP_DEVICE_SOURCES}
${WRAPPER_SOURCES}
)

# === Compiler Definitions ===
target_compile_definitions(embedDIP PUBLIC
USE_EMBED_DIP
${PLATFORM_DEFINES}
${EMBEDDIP_BOARD_DEFINES}
${EMBEDDIP_ARCH_DEFINES}
$<$<BOOL:${EMBEDDIP_ENABLE_UART_LOGGING}>:ENABLE_UART_LOGGING=1>
$<$<BOOL:${EMBEDDIP_ENABLE_IMAGE_PROCESSING}>:ENABLE_IMAGE_PROCESSING=1>
$<$<BOOL:${EMBEDDIP_ENABLE_CAMERA_INPUT}>:ENABLE_CAMERA_INPUT=1>
$<$<BOOL:${EMBEDDIP_ENABLE_DISPLAY_OUTPUT}>:ENABLE_DISPLAY_OUTPUT=1>
)

if(EMBEDDIP_ARCH_PRIVATE_DEFINES)
target_compile_definitions(embedDIP PRIVATE ${EMBEDDIP_ARCH_PRIVATE_DEFINES})
endif()

if(EMBEDDIP_ARCH_COMPILE_OPTIONS)
target_compile_options(embedDIP PUBLIC ${EMBEDDIP_ARCH_COMPILE_OPTIONS})
endif()

# === Include Directories ===
target_include_directories(embedDIP PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
Expand All @@ -189,26 +213,40 @@ target_include_directories(embedDIP PUBLIC
$<INSTALL_INTERFACE:include/embedDIP>
)

# Platform-specific includes
if(EMBEDDIP_TARGET_PLATFORM STREQUAL "STM32F7")
# Try to find CMSIS and HAL includes relative to project
if(EMBEDDIP_BOARD_INCLUDE_DIRS)
foreach(_embeddip_board_inc IN LISTS EMBEDDIP_BOARD_INCLUDE_DIRS)
target_include_directories(embedDIP PUBLIC
$<BUILD_INTERFACE:${_embeddip_board_inc}>
)
endforeach()
endif()

# Board-specific include dependencies from parent project layout
if(EMBEDDIP_TARGET_BOARD STREQUAL "STM32F7")
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../Drivers")
target_include_directories(embedDIP PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../Middlewares/Third_Party/LibJPEG/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../LIBJPEG/Target>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/STM32F7xx_HAL_Driver/Inc>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/CMSIS/Device/ST/STM32F7xx/Include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/CMSIS/Core/Include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/CMSIS/DSP/Include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../Core/Inc>
)

if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../Middlewares/Third_Party/LibJPEG/include/jpeglib.h")
target_compile_definitions(embedDIP PUBLIC EMBEDDIP_HAVE_LIBJPEG=1)
else()
message(WARNING "LibJPEG headers not found for embedDIP compression module.")
endif()

# CMSIS-DSP sources for STM32 (C and assembly files)
file(GLOB_RECURSE CMSIS_DSP_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/CMSIS/DSP/Source/*.c
${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/CMSIS/DSP/Source/*.S
)
if(CMSIS_DSP_SOURCES)
target_sources(embedDIP PRIVATE ${CMSIS_DSP_SOURCES})
# CMSIS-DSP needs __FPU_PRESENT defined
set_source_files_properties(${CMSIS_DSP_SOURCES}
PROPERTIES COMPILE_DEFINITIONS "__FPU_PRESENT=1"
)
Expand All @@ -217,15 +255,6 @@ if(EMBEDDIP_TARGET_PLATFORM STREQUAL "STM32F7")
else()
message(WARNING "CMSIS/HAL drivers not found. You may need to specify include paths manually.")
endif()

target_include_directories(embedDIP PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/board/stm32f7>
)

elseif(EMBEDDIP_TARGET_PLATFORM STREQUAL "ESP32")
target_include_directories(embedDIP PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/board/esp32>
)
endif()

# === Link Libraries ===
Expand Down Expand Up @@ -270,7 +299,7 @@ install(EXPORT embedDIPTargets
include(CMakePackageConfigHelpers)

configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/embedDIPConfig.cmake.in
${CMAKE_CURRENT_SOURCE_DIR}/embedDIPConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/embedDIPConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/embedDIP
)
Expand Down
31 changes: 31 additions & 0 deletions arch/arm/arch_profile.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Architecture profile: ARM family

set(EMBEDDIP_ARCH_SOURCES
arch/arm/cm7_common.c
arch/arm/cm7_fft.c
)

set(EMBEDDIP_ARCH_DEFINES
EMBED_DIP_ARCH_ARM=1
)

if(EMBEDDIP_CPU STREQUAL "CORTEX_M7")
list(APPEND EMBEDDIP_ARCH_DEFINES EMBED_DIP_CPU_CORTEX_M7=1)
else()
message(FATAL_ERROR "Unsupported CPU for ARM arch: ${EMBEDDIP_CPU}. Supported: CORTEX_M7")
endif()

list(APPEND EMBEDDIP_ARCH_DEFINES
ARM_MATH_CM7
)

set(EMBEDDIP_ARCH_PRIVATE_DEFINES
__FPU_PRESENT=1
)

set(EMBEDDIP_ARCH_COMPILE_OPTIONS
-mcpu=cortex-m7
-mfpu=fpv5-sp-d16
-mfloat-abi=hard
-mthumb
)
4 changes: 2 additions & 2 deletions board/stm32f7/board_stm32f7_common.c → arch/arm/cm7_common.c
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <embedDIP_configs.h>

#ifdef TARGET_BOARD_STM32F7
#if defined(EMBED_DIP_ARCH_ARM) && defined(EMBED_DIP_CPU_CORTEX_M7)

#include "core/image.h"

Expand Down Expand Up @@ -31,4 +31,4 @@ uint32_t toc()
return DWT->CYCCNT; // Return elapsed cycles
}

#endif
#endif
46 changes: 46 additions & 0 deletions arch/arm/cm7_fft.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2025 EmbedDIP

#include <embedDIP_configs.h>

#if defined(EMBED_DIP_ARCH_ARM) && defined(EMBED_DIP_CPU_CORTEX_M7)

#include "arm_const_structs.h"
#include "arm_math.h"
#include <arch/fft_backend.h>

embeddip_status_t embeddip_fft_backend_init(int n)
{
if (n != 256) {
return EMBEDDIP_ERROR_INVALID_SIZE;
}
return EMBEDDIP_OK;
}

embeddip_status_t embeddip_fft_backend_forward_1d(float *data, int n)
{
if (!data) {
return EMBEDDIP_ERROR_NULL_PTR;
}
if (n != 256) {
return EMBEDDIP_ERROR_INVALID_SIZE;
}

arm_cfft_f32(&arm_cfft_sR_f32_len256, data, 0, 1);
return EMBEDDIP_OK;
}

embeddip_status_t embeddip_fft_backend_inverse_1d(float *data, int n)
{
if (!data) {
return EMBEDDIP_ERROR_NULL_PTR;
}
if (n != 256) {
return EMBEDDIP_ERROR_INVALID_SIZE;
}

arm_cfft_f32(&arm_cfft_sR_f32_len256, data, 1, 1);
return EMBEDDIP_OK;
}

#endif
21 changes: 21 additions & 0 deletions arch/fft_backend.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2025 EmbedDIP

#ifndef EMBEDDIP_ARCH_FFT_BACKEND_H
#define EMBEDDIP_ARCH_FFT_BACKEND_H

#include <core/error.h>

#ifdef __cplusplus
extern "C" {
#endif

embeddip_status_t embeddip_fft_backend_init(int n);
embeddip_status_t embeddip_fft_backend_forward_1d(float *data, int n);
embeddip_status_t embeddip_fft_backend_inverse_1d(float *data, int n);

#ifdef __cplusplus
}
#endif

#endif
21 changes: 21 additions & 0 deletions arch/xtensa/arch_profile.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Architecture profile: Xtensa family

set(EMBEDDIP_ARCH_SOURCES
arch/xtensa/xtensa_common.cpp
arch/xtensa/xtensa_fft.cpp
)

set(EMBEDDIP_ARCH_DEFINES
EMBED_DIP_ARCH_XTENSA=1
)

if(EMBEDDIP_CPU STREQUAL "LX6")
list(APPEND EMBEDDIP_ARCH_DEFINES EMBED_DIP_CPU_LX6=1)
elseif(EMBEDDIP_CPU STREQUAL "LX7")
list(APPEND EMBEDDIP_ARCH_DEFINES EMBED_DIP_CPU_LX7=1)
else()
message(FATAL_ERROR "Unsupported CPU for XTENSA arch: ${EMBEDDIP_CPU}. Supported: LX6, LX7")
endif()

set(EMBEDDIP_ARCH_COMPILE_OPTIONS
)
Loading
Loading