From c9ab750e3e57515d476c20ff991ea02669200738 Mon Sep 17 00:00:00 2001 From: Sanchayan Maity Date: Tue, 2 Aug 2016 11:43:59 +0530 Subject: examples: vf6xx_colibri_m4: rpmsg: Add pingpong and string echo rpmsg examples Add pingpong and string echo rpmsg examples for Vybrid. Signed-off-by: Sanchayan Maity Signed-off-by: Stefan Agner --- .../demo_apps/rpmsg/pingpong/armgcc/CMakeLists.txt | 178 ++++++++++++++++++ .../demo_apps/rpmsg/pingpong/armgcc/build_all.bat | 5 + .../demo_apps/rpmsg/pingpong/armgcc/build_all.sh | 5 + .../rpmsg/pingpong/armgcc/build_debug.bat | 3 + .../demo_apps/rpmsg/pingpong/armgcc/build_debug.sh | 3 + .../rpmsg/pingpong/armgcc/build_release.bat | 3 + .../rpmsg/pingpong/armgcc/build_release.sh | 3 + .../demo_apps/rpmsg/pingpong/armgcc/clean.bat | 3 + .../demo_apps/rpmsg/pingpong/armgcc/clean.sh | 3 + .../demo_apps/rpmsg/pingpong/pingpong.c | 150 +++++++++++++++ .../demo_apps/rpmsg/str_echo/armgcc/CMakeLists.txt | 178 ++++++++++++++++++ .../demo_apps/rpmsg/str_echo/armgcc/build_all.bat | 5 + .../demo_apps/rpmsg/str_echo/armgcc/build_all.sh | 5 + .../rpmsg/str_echo/armgcc/build_debug.bat | 3 + .../demo_apps/rpmsg/str_echo/armgcc/build_debug.sh | 3 + .../rpmsg/str_echo/armgcc/build_release.bat | 3 + .../rpmsg/str_echo/armgcc/build_release.sh | 3 + .../demo_apps/rpmsg/str_echo/armgcc/clean.bat | 3 + .../demo_apps/rpmsg/str_echo/armgcc/clean.sh | 3 + .../demo_apps/rpmsg/str_echo/rpmsg_str_echo.c | 207 +++++++++++++++++++++ 20 files changed, 769 insertions(+) create mode 100644 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/CMakeLists.txt create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_all.bat create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_all.sh create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_debug.bat create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_debug.sh create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_release.bat create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_release.sh create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/clean.bat create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/clean.sh create mode 100644 examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/pingpong.c create mode 100644 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/CMakeLists.txt create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_all.bat create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_all.sh create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_debug.bat create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_debug.sh create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_release.bat create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_release.sh create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/clean.bat create mode 100755 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/clean.sh create mode 100644 examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/rpmsg_str_echo.c diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/CMakeLists.txt b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/CMakeLists.txt new file mode 100644 index 0000000..117a194 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/CMakeLists.txt @@ -0,0 +1,178 @@ +INCLUDE(CMakeForceCompiler) + +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 2.6) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +# DEBUG LINK FILE +#set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -T${ProjDirPath}/../../../../../../platform/devices/VF6XX/linker/gcc/vf6xx_tcm.ld -static") + +# RELEASE LINK FILE +#set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -T${ProjDirPath}/../../../../../../platform/devices/VF6XX/linker/gcc/vf6xx_tcm.ld -static") + +# DEBUG LINK FILE +set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -T${ProjDirPath}/../../../../../../platform/devices/VF6XX/linker/gcc/vf6xx_sysram-sram.ld -static") + +# RELEASE LINK FILE +set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -T${ProjDirPath}/../../../../../../platform/devices/VF6XX/linker/gcc/vf6xx_sysram-sram.ld -static") + +# DEBUG ASM FLAGS +SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -g -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mapcs -std=gnu99") + +# DEBUG C FLAGS +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -MMD -MP -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mapcs -std=gnu99") + +# DEBUG LD FLAGS +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -g -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nano.specs -lm -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mthumb -mapcs -Xlinker --gc-sections -Xlinker -static -Xlinker -z -Xlinker muldefs -Xlinker --defsym=__stack_size__=0x400 -Xlinker --defsym=__heap_size__=0x200") + +# RELEASE ASM FLAGS +SET(CMAKE_ASM_FLAGS_RELEASE "${CMAKE_ASM_FLAGS_RELEASE} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mapcs -std=gnu99") + +# RELEASE C FLAGS +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -MMD -MP -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mapcs -std=gnu99") + +# RELEASE LD FLAGS +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nano.specs -lm -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mthumb -mapcs -Xlinker --gc-sections -Xlinker -static -Xlinker -z -Xlinker muldefs -Xlinker --defsym=__stack_size__=0x400 -Xlinker --defsym=__heap_size__=0x200") + +# ASM MACRO +SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -D__DEBUG") + +# C MACRO +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D__DEBUG") +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DCPU_VF6XX_M4") +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__NDEBUG") +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DCPU_VF6XX_M4") + +# CXX MACRO + +# INCLUDE_DIRECTORIES +IF(CMAKE_BUILD_TYPE MATCHES Debug) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../..) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/GCC/ARM_CM4F) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/CMSIS/Include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices/VF6XX/include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/drivers/inc) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/utilities/inc) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../..) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../middleware/multicore/open-amp) +ELSEIF(CMAKE_BUILD_TYPE MATCHES Release) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../..) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/GCC/ARM_CM4F) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/CMSIS/Include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices/VF6XX/include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/drivers/inc) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/utilities/inc) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../..) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../middleware/multicore/open-amp) +ENDIF() + +# ADD_EXECUTABLE +ADD_EXECUTABLE(rpmsg_pingpong_example + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h" + "${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup/gcc/startup_VF6XX_M4.S" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/MemMang/heap_2.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4/platform.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4/plat_porting.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/rpmsg.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/hil/hil.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/llist/llist.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/shm/sh_mem.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/config/config.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/env/env.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/rpmsg_core.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtio.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtio_ring.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtqueue.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/croutine.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/event_groups.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/FreeRTOS.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/list.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/mpu_wrappers.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/portable.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/projdefs.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/queue.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/semphr.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/StackMacros.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/task.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/timers.h" + "${ProjDirPath}/../../../../../../platform/drivers/inc/ccm_vf6xx.h" + "${ProjDirPath}/../../../../../../platform/drivers/inc/lpuart_vf6xx.h" + "${ProjDirPath}/../../../../../../platform/drivers/inc/sema4.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4/platform.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4/platform_info.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/hil/hil.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/llist/llist.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/shm/sh_mem.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/config/config.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/env/freertos_env.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/remote_device.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/rpmsg.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/rpmsg_core.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtio.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtqueue.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/croutine.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/event_groups.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/list.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/queue.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/tasks.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/timers.c" + "${ProjDirPath}/../../../../../../platform/drivers/src/ccm_vf6xx.c" + "${ProjDirPath}/../../../../../../platform/drivers/src/lpuart_vf6xx.c" + "${ProjDirPath}/../../../../../../platform/drivers/src/sema4.c" + "${ProjDirPath}/../../../../../../platform/utilities/src/debug_console_vf6xx.c" + "${ProjDirPath}/../../../../../../platform/utilities/inc/debug_console_vf6xx.h" + "${ProjDirPath}/../../../../../../platform/utilities/src/debug_console.c" + "${ProjDirPath}/../../../../../../platform/utilities/inc/debug_console.h" + "${ProjDirPath}/../../../../../../platform/utilities/src/print_scan.c" + "${ProjDirPath}/../../../../../../platform/utilities/src/print_scan.h" + "${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup/system_VF6XX_M4.c" + "${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup/system_VF6XX_M4.h" + "${ProjDirPath}/../pingpong.c" +) +SET_TARGET_PROPERTIES(rpmsg_pingpong_example PROPERTIES OUTPUT_NAME "rpmsg_pingpong_example.elf") + +TARGET_LINK_LIBRARIES(rpmsg_pingpong_example -Wl,--start-group) +# LIBRARIES +IF(CMAKE_BUILD_TYPE MATCHES Debug) +ELSEIF(CMAKE_BUILD_TYPE MATCHES Release) +ENDIF() + +# SYSTEM LIBRARIES +TARGET_LINK_LIBRARIES(rpmsg_pingpong_example m) +TARGET_LINK_LIBRARIES(rpmsg_pingpong_example c) +TARGET_LINK_LIBRARIES(rpmsg_pingpong_example gcc) +TARGET_LINK_LIBRARIES(rpmsg_pingpong_example nosys) +TARGET_LINK_LIBRARIES(rpmsg_pingpong_example -Wl,--end-group) + +# MAP FILE +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Xlinker -Map=debug/rpmsg_pingpong_example.map") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Xlinker -Map=release/rpmsg_pingpong_example.map") + +# BIN AND HEX +ADD_CUSTOM_COMMAND(TARGET rpmsg_pingpong_example POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Oihex ${EXECUTABLE_OUTPUT_PATH}/rpmsg_pingpong_example.elf ${EXECUTABLE_OUTPUT_PATH}/rpmsg_pingpong_example.hex) +ADD_CUSTOM_COMMAND(TARGET rpmsg_pingpong_example POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Obinary ${EXECUTABLE_OUTPUT_PATH}/rpmsg_pingpong_example.elf ${EXECUTABLE_OUTPUT_PATH}/rpmsg_pingpong_example.bin) diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_all.bat b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_all.bat new file mode 100755 index 0000000..0cf721f --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_all.bat @@ -0,0 +1,5 @@ +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug . +mingw32-make -j4 +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release . +mingw32-make -j4 +pause diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_all.sh b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_all.sh new file mode 100755 index 0000000..3827529 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_all.sh @@ -0,0 +1,5 @@ +#!/bin/sh +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug . +make -j4 +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release . +make -j4 diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_debug.bat b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_debug.bat new file mode 100755 index 0000000..e9ccfdd --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_debug.bat @@ -0,0 +1,3 @@ +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug . +mingw32-make -j4 +pause diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_debug.sh b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_debug.sh new file mode 100755 index 0000000..effd076 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_debug.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug . +make -j4 diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_release.bat b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_release.bat new file mode 100755 index 0000000..0759349 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_release.bat @@ -0,0 +1,3 @@ +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release . +mingw32-make -j4 +pause diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_release.sh b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_release.sh new file mode 100755 index 0000000..a12067d --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/build_release.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release . +make -j4 diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/clean.bat b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/clean.bat new file mode 100755 index 0000000..ffea088 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q Debug Release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/clean.sh b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/pingpong.c b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/pingpong.c new file mode 100644 index 0000000..2668471 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/pingpong/pingpong.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2016, Toradex AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of Freescale Semiconductor, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" +#include "rpmsg/rpmsg.h" +#include "plat_porting.h" +#include +#include "debug_console_vf6xx.h" + +/* + * APP decided interrupt priority + */ +#define APP_MSCM_IRQ_PRIORITY 3 + +/* Internal functions */ +static void rpmsg_channel_created(struct rpmsg_channel *rp_chnl); +static void rpmsg_channel_deleted(struct rpmsg_channel *rp_chnl); +static void rpmsg_read_cb(struct rpmsg_channel *, void *, int, void *, unsigned long); + +/* Globals */ +static struct remote_device *rdev; +static struct rpmsg_channel *app_chnl; +static uint32_t msg_var; +static SemaphoreHandle_t app_sema; + +/*! + * @brief A basic RPMSG task + */ +void PingPongTask(void *pvParameters) +{ + printf("RPMSG PingPong Demo...\r\n"); + + app_sema = xSemaphoreCreateCounting(2, 0); + + printf("RPMSG Init as Remote\r\n"); + /* + * RPMSG Init as REMOTE + */ + rpmsg_init(0, &rdev, rpmsg_channel_created, rpmsg_channel_deleted, rpmsg_read_cb, RPMSG_MASTER); + + /* + * rpmsg_channel_created will post the first semaphore + */ + xSemaphoreTake(app_sema, portMAX_DELAY); + printf("Name service handshake is done, M4 has setup a rpmsg channel [%d ---> %d]\r\n", app_chnl->src, app_chnl->dst); + + + /* + * pingpong demo loop + */ + for (;;) { + xSemaphoreTake(app_sema, portMAX_DELAY); + printf("Get Data From A5 : %d\r\n", msg_var); + msg_var++; + rpmsg_send(app_chnl, (void*)&msg_var, sizeof(uint32_t)); + } +} + +int main(void) +{ + /* Init Clock Control and UART */ + CCM_GetClocks(); + CCM_ControlGate(ccmCcgrGateUart2, ccmClockNeededAll); + + vf6xx_DbgConsole_Init(UART2, ccmIpgBusClk, 115200); + + printf("Starting RPMSG PingPong Demo...\r\n"); + + /* + * Prepare for the MSCM Interrupt + * MSCM must be initialized before rpmsg init is called + */ + platform_interrupt_enable(); + NVIC_SetPriority(CPU2CPU_INT0_IRQ, APP_MSCM_IRQ_PRIORITY); + NVIC_SetPriority(CPU2CPU_INT1_IRQ, APP_MSCM_IRQ_PRIORITY); + + // Create a demo task which will print Hello world and echo user's input. + xTaskCreate(PingPongTask, "Ping Pong Task", configMINIMAL_STACK_SIZE, + NULL, tskIDLE_PRIORITY+1, NULL); + + // Start FreeRTOS scheduler. + vTaskStartScheduler(); + + // Should never reach this point. + while (true); +} + +/* rpmsg_rx_callback will call into this for a channel creation event*/ +static void rpmsg_channel_created(struct rpmsg_channel *rp_chnl) +{ + /* + * we should give the created rp_chnl handler to app layer + */ + app_chnl = rp_chnl; + + /* + * sync to application layer + */ + xSemaphoreGiveFromISR(app_sema, NULL); +} + +static void rpmsg_channel_deleted(struct rpmsg_channel *rp_chnl) +{ + rpmsg_destroy_ept(rp_chnl->rp_ept); +} + +static void rpmsg_read_cb(struct rpmsg_channel *rp_chnl, void *data, int len, + void * priv, unsigned long src) +{ + msg_var = *(uint32_t*)data; + /* + * sync to application layer + */ + xSemaphoreGiveFromISR(app_sema, NULL); +} +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/CMakeLists.txt b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/CMakeLists.txt new file mode 100644 index 0000000..35ba82c --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/CMakeLists.txt @@ -0,0 +1,178 @@ +INCLUDE(CMakeForceCompiler) + +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 2.6) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +# DEBUG LINK FILE +#set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -T${ProjDirPath}/../../../../../../platform/devices/VF6XX/linker/gcc/vf6xx_tcm.ld -static") + +# RELEASE LINK FILE +#set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -T${ProjDirPath}/../../../../../../platform/devices/VF6XX/linker/gcc/vf6xx_tcm.ld -static") + +# DEBUG LINK FILE +set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -T${ProjDirPath}/../../../../../../platform/devices/VF6XX/linker/gcc/vf6xx_sysram-sram.ld -static") + +# RELEASE LINK FILE +set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -T${ProjDirPath}/../../../../../../platform/devices/VF6XX/linker/gcc/vf6xx_sysram-sram.ld -static") + +# DEBUG ASM FLAGS +SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -g -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mapcs -std=gnu99") + +# DEBUG C FLAGS +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -MMD -MP -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mapcs -std=gnu99") + +# DEBUG LD FLAGS +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -g -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nano.specs -lm -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mthumb -mapcs -Xlinker --gc-sections -Xlinker -static -Xlinker -z -Xlinker muldefs -Xlinker --defsym=__stack_size__=0x400 -Xlinker --defsym=__heap_size__=0x200") + +# RELEASE ASM FLAGS +SET(CMAKE_ASM_FLAGS_RELEASE "${CMAKE_ASM_FLAGS_RELEASE} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mapcs -std=gnu99") + +# RELEASE C FLAGS +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -MMD -MP -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mapcs -std=gnu99") + +# RELEASE LD FLAGS +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nano.specs -lm -Wall -fno-common -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -Os -mthumb -mapcs -Xlinker --gc-sections -Xlinker -static -Xlinker -z -Xlinker muldefs -Xlinker --defsym=__stack_size__=0x400 -Xlinker --defsym=__heap_size__=0x200") + +# ASM MACRO +SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -D__DEBUG") + +# C MACRO +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D__DEBUG") +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DCPU_VF6XX_M4") +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__NDEBUG") +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DCPU_VF6XX_M4") + +# CXX MACRO + +# INCLUDE_DIRECTORIES +IF(CMAKE_BUILD_TYPE MATCHES Debug) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../..) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/GCC/ARM_CM4F) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/CMSIS/Include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices/VF6XX/include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/drivers/inc) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/utilities/inc) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../..) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../middleware/multicore/open-amp) +ELSEIF(CMAKE_BUILD_TYPE MATCHES Release) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../..) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/GCC/ARM_CM4F) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/CMSIS/Include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices/VF6XX/include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/drivers/inc) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../platform/utilities/inc) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../..) + INCLUDE_DIRECTORIES(${ProjDirPath}/../../../../../../middleware/multicore/open-amp) +ENDIF() + +# ADD_EXECUTABLE +ADD_EXECUTABLE(rpmsg_str_echo_example + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h" + "${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup/gcc/startup_VF6XX_M4.S" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/portable/MemMang/heap_2.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4/platform.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4/plat_porting.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/rpmsg.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/hil/hil.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/llist/llist.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/shm/sh_mem.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/config/config.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/env/env.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/rpmsg_core.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtio.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtio_ring.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtqueue.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/croutine.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/event_groups.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/FreeRTOS.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/list.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/mpu_wrappers.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/portable.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/projdefs.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/queue.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/semphr.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/StackMacros.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/task.h" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/include/timers.h" + "${ProjDirPath}/../../../../../../platform/drivers/inc/ccm_vf6xx.h" + "${ProjDirPath}/../../../../../../platform/drivers/inc/lpuart_vf6xx.h" + "${ProjDirPath}/../../../../../../platform/drivers/inc/sema4.h" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4/platform.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/vf6xx_m4/platform_info.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/hil/hil.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/llist/llist.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/common/shm/sh_mem.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/config/config.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/porting/env/freertos_env.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/remote_device.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/rpmsg.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/rpmsg/rpmsg_core.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtio.c" + "${ProjDirPath}/../../../../../../middleware/multicore/open-amp/virtio/virtqueue.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/croutine.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/event_groups.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/list.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/queue.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/tasks.c" + "${ProjDirPath}/../../../../../../rtos/FreeRTOS/Source/timers.c" + "${ProjDirPath}/../../../../../../platform/drivers/src/ccm_vf6xx.c" + "${ProjDirPath}/../../../../../../platform/drivers/src/lpuart_vf6xx.c" + "${ProjDirPath}/../../../../../../platform/drivers/src/sema4.c" + "${ProjDirPath}/../../../../../../platform/utilities/src/debug_console_vf6xx.c" + "${ProjDirPath}/../../../../../../platform/utilities/inc/debug_console_vf6xx.h" + "${ProjDirPath}/../../../../../../platform/utilities/src/debug_console.c" + "${ProjDirPath}/../../../../../../platform/utilities/inc/debug_console.h" + "${ProjDirPath}/../../../../../../platform/utilities/src/print_scan.c" + "${ProjDirPath}/../../../../../../platform/utilities/src/print_scan.h" + "${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup/system_VF6XX_M4.c" + "${ProjDirPath}/../../../../../../platform/devices/VF6XX/startup/system_VF6XX_M4.h" + "${ProjDirPath}/../rpmsg_str_echo.c" +) +SET_TARGET_PROPERTIES(rpmsg_str_echo_example PROPERTIES OUTPUT_NAME "rpmsg_str_echo_example.elf") + +TARGET_LINK_LIBRARIES(rpmsg_str_echo_example -Wl,--start-group) +# LIBRARIES +IF(CMAKE_BUILD_TYPE MATCHES Debug) +ELSEIF(CMAKE_BUILD_TYPE MATCHES Release) +ENDIF() + +# SYSTEM LIBRARIES +TARGET_LINK_LIBRARIES(rpmsg_str_echo_example m) +TARGET_LINK_LIBRARIES(rpmsg_str_echo_example c) +TARGET_LINK_LIBRARIES(rpmsg_str_echo_example gcc) +TARGET_LINK_LIBRARIES(rpmsg_str_echo_example nosys) +TARGET_LINK_LIBRARIES(rpmsg_str_echo_example -Wl,--end-group) + +# MAP FILE +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Xlinker -Map=debug/rpmsg_str_echo_example.map") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Xlinker -Map=release/rpmsg_str_echo_example.map") + +# BIN AND HEX +ADD_CUSTOM_COMMAND(TARGET rpmsg_str_echo_example POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Oihex ${EXECUTABLE_OUTPUT_PATH}/rpmsg_str_echo_example.elf ${EXECUTABLE_OUTPUT_PATH}/rpmsg_str_echo_example.hex) +ADD_CUSTOM_COMMAND(TARGET rpmsg_str_echo_example POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Obinary ${EXECUTABLE_OUTPUT_PATH}/rpmsg_str_echo_example.elf ${EXECUTABLE_OUTPUT_PATH}/rpmsg_str_echo_example.bin) diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_all.bat b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_all.bat new file mode 100755 index 0000000..0cf721f --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_all.bat @@ -0,0 +1,5 @@ +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug . +mingw32-make -j4 +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release . +mingw32-make -j4 +pause diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_all.sh b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_all.sh new file mode 100755 index 0000000..3827529 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_all.sh @@ -0,0 +1,5 @@ +#!/bin/sh +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug . +make -j4 +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release . +make -j4 diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_debug.bat b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_debug.bat new file mode 100755 index 0000000..e9ccfdd --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_debug.bat @@ -0,0 +1,3 @@ +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug . +mingw32-make -j4 +pause diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_debug.sh b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_debug.sh new file mode 100755 index 0000000..effd076 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_debug.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug . +make -j4 diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_release.bat b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_release.bat new file mode 100755 index 0000000..0759349 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_release.bat @@ -0,0 +1,3 @@ +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release . +mingw32-make -j4 +pause diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_release.sh b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_release.sh new file mode 100755 index 0000000..a12067d --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/build_release.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release . +make -j4 diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/clean.bat b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/clean.bat new file mode 100755 index 0000000..ffea088 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q Debug Release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/clean.sh b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/rpmsg_str_echo.c b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/rpmsg_str_echo.c new file mode 100644 index 0000000..38c6c11 --- /dev/null +++ b/examples/vf6xx_colibri_m4/demo_apps/rpmsg/str_echo/rpmsg_str_echo.c @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2016, Toradex AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of Freescale Semiconductor, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" +#include "string.h" +#include "assert.h" +#include "rpmsg/rpmsg.h" +#include "plat_porting.h" +#include +#include "debug_console_vf6xx.h" + +#define MAX_STRING_SIZE 496 /* Maximum size to hold the data A7 gives */ + +/* + * For the most worst case, master will send 3 consecutive messages which remote + * do not process. + * The synchronization between remote and master is that each time endpoint callback + * is called, the MU Receive interrupt is temperorily disabled. Until the next time + * remote consumes the message, the interrupt will not be enabled again. + * When the interrupt is not enabled, Master can not send the notify, it will blocks + * there and can not send further message. + * In the worst case, master send the first message, it triggles the ISR in remote + * side, remote ISR clear the MU status bit so master can send the second message + * and notify again, master can continue to send the 3rd message but will blocks + * when trying to notify. Meanwhile, remote side is still in the first ISR which + * has a loop to receive all the 3 messages. + * Master is blocked and can not send the 4th message, remote side ISR copies all + * this 3 message to app buffer and informs the app layer to consume them. After + * a message is consumed, the ISR is enabled again and the second notify is received. + * This unblocks the master to complete the 3rd notify and send the next message. + * The 4th notify will not complete until remote consumes the second message. + * The situation goes on and we can see application layer need a maximum size 3 + * buffer to hold the unconsumed messages. STRING_BUFFER_CNT is therefore set to 3 + */ +#define STRING_BUFFER_CNT 3 + +/* + * APP decided interrupt priority + */ +#define APP_MSCM_IRQ_PRIORITY 3 + +/* Internal functions */ +static void rpmsg_channel_created(struct rpmsg_channel *rp_chnl); +static void rpmsg_channel_deleted(struct rpmsg_channel *rp_chnl); +static void rpmsg_read_cb(struct rpmsg_channel *, void *, int, void *, unsigned long); + +/* Globals */ +static struct remote_device *rdev; +static struct rpmsg_channel *app_chnl; +static char strVar[STRING_BUFFER_CNT][MAX_STRING_SIZE + 1]; +static uint8_t app_idx = 0; +static uint8_t handler_idx = 0; +static SemaphoreHandle_t app_sema; + +/*! + * @brief A basic RPMSG task + */ +void StrEchoTask(void *pvParameters) +{ + printf("RPMSG String Echo Demo...\r\n"); + + app_sema = xSemaphoreCreateCounting(STRING_BUFFER_CNT + 1, 0); + + printf("RPMSG Init as Remote\r\n"); + /* + * RPMSG Init as REMOTE + */ + rpmsg_init(0, &rdev, rpmsg_channel_created, rpmsg_channel_deleted, rpmsg_read_cb, RPMSG_MASTER); + + /* + * rpmsg_channel_created will post the first semaphore + */ + xSemaphoreTake(app_sema, portMAX_DELAY); + printf("Name service handshake is done, M4 has setup a rpmsg channel [%d ---> %d]\r\n", app_chnl->src, app_chnl->dst); + + + /* + * pingpong demo loop + */ + for (;;) { + xSemaphoreTake(app_sema, portMAX_DELAY); + /* + * Take from next app string buffer + */ + if ((strlen(strVar[app_idx]) == 2) && (strVar[app_idx][0] == 0xd) && (strVar[app_idx][1] == 0xa)) + printf("Get New Line From A7 From Slot %d\r\n", app_idx); + else + printf("Get Message From A7 : \"%s\" [len : %d] from slot %d\r\n", strVar[app_idx], strlen(strVar[app_idx]), app_idx); + + /* + * echo back + */ + rpmsg_send(app_chnl, (void*)strVar[app_idx], strlen(strVar[app_idx])); + app_idx = (app_idx + 1) % STRING_BUFFER_CNT; + /* + * once a message is consumed, the MSCM receive interrupt can be enabled + * again + */ + platform_interrupt_enable(); + } +} + +int main(void) +{ + /* Init Clock Control and UART */ + CCM_GetClocks(); + CCM_ControlGate(ccmCcgrGateUart2, ccmClockNeededAll); + + vf6xx_DbgConsole_Init(UART2, ccmIpgBusClk, 115200); + + printf("Starting RPMSG PingPong Demo...\r\n"); + + /* + * Prepare for the MSCM Interrupt + * MSCM must be initialized before rpmsg init is called + */ + platform_interrupt_enable(); + NVIC_SetPriority(CPU2CPU_INT0_IRQ, APP_MSCM_IRQ_PRIORITY); + NVIC_SetPriority(CPU2CPU_INT1_IRQ, APP_MSCM_IRQ_PRIORITY); + + + // Create a demo task which will print Hello world and echo user's input. + xTaskCreate(StrEchoTask, "String Echo Task", configMINIMAL_STACK_SIZE, + NULL, tskIDLE_PRIORITY+1, NULL); + + // Start FreeRTOS scheduler. + vTaskStartScheduler(); + + // Should never reach this point. + while (true); +} + +/* rpmsg_rx_callback will call into this for a channel creation event*/ +static void rpmsg_channel_created(struct rpmsg_channel *rp_chnl) +{ + /* + * we should give the created rp_chnl handler to app layer + */ + app_chnl = rp_chnl; + + /* + * sync to application layer + */ + xSemaphoreGiveFromISR(app_sema, NULL); +} + +static void rpmsg_channel_deleted(struct rpmsg_channel *rp_chnl) +{ + rpmsg_destroy_ept(rp_chnl->rp_ept); +} + +static void rpmsg_read_cb(struct rpmsg_channel *rp_chnl, void *data, int len, + void * priv, unsigned long src) +{ + /* + * Temperorily Disable MSCM Receive Interrupt to avoid master + * sending too many messages and remote will fail to keep pace + * to consume + */ + platform_interrupt_disable(); + /* + * Copy to next app string buffer + */ + assert(len <= MAX_STRING_SIZE); + memcpy((void*)strVar[handler_idx], data, len); + /* + * Add trailing '\0' + */ + strVar[handler_idx][len] = 0; + handler_idx = (handler_idx + 1) % STRING_BUFFER_CNT; + xSemaphoreGiveFromISR(app_sema, NULL); +} +/******************************************************************************* + * EOF + ******************************************************************************/ -- cgit v1.2.3