From 62183890928095fc665e93e93e4248680919f1f9 Mon Sep 17 00:00:00 2001 From: Kevin Thomas Date: Sun, 5 Oct 2025 08:30:01 -0700 Subject: [PATCH] Added RA GPIO Output --- 0x000e_floating-point-data-type/.gitignore | 5 +- .../.cortex-debug.peripherals.state.json | 1 - .../.cortex-debug.registers.state.json | 1 - .../.vscode/c_cpp_properties.json | 36 +- .../.vscode/cmake-kits.json | 15 + .../.vscode/extensions.json | 16 +- .../.vscode/launch.json | 104 ++- .../.vscode/settings.json | 54 +- .../.vscode/tasks.json | 127 +++- ...in.c => 0x000e_floating-point-data-type.c} | 0 .../CMakeLists.txt | 54 +- .../pico_sdk_import.cmake | 80 ++- RA-0x0001-GPIO-Output/README.md | 605 ++++++++++++++++++ RA-0x0001-GPIO-Output/build.bat | 78 +++ RA-0x0001-GPIO-Output/gpio16_blink.bin | Bin 0 -> 268 bytes RA-0x0001-GPIO-Output/gpio16_blink.s | 169 +++++ RA-0x0001-GPIO-Output/gpio16_blink.uf2 | Bin 0 -> 1024 bytes RA-0x0001-GPIO-Output/image_def.s | 39 ++ RA-0x0001-GPIO-Output/linker.ld | 104 +++ RA-0x0001-GPIO-Output/review.bat | 69 ++ .../review_reports/bin_hexdump.txt | 0 .../review_reports/nm_symbols.txt | 28 + .../review_reports/objdump_disasm.txt | 101 +++ .../review_reports/objdump_fullhex.txt | 24 + .../review_reports/objdump_headers.txt | 58 ++ .../review_reports/objdump_sections.txt | 13 + .../review_reports/readelf_all.txt | 97 +++ .../review_reports/readelf_header.txt | 20 + .../review_reports/readelf_relocs.txt | 2 + .../review_reports/readelf_sections.txt | 17 + .../review_reports/readelf_symbols.txt | 43 ++ RA-0x0001-GPIO-Output/review_reports/size.txt | 2 + .../review_reports/strings.txt | 43 ++ RA-0x0001-GPIO-Output/uf2conv.py | 365 +++++++++++ RA-0x0001-GPIO-Output/uf2families.json | 382 +++++++++++ 35 files changed, 2592 insertions(+), 160 deletions(-) delete mode 100644 0x000e_floating-point-data-type/.vscode/.cortex-debug.peripherals.state.json delete mode 100644 0x000e_floating-point-data-type/.vscode/.cortex-debug.registers.state.json create mode 100644 0x000e_floating-point-data-type/.vscode/cmake-kits.json rename 0x000e_floating-point-data-type/{main.c => 0x000e_floating-point-data-type.c} (100%) create mode 100644 RA-0x0001-GPIO-Output/README.md create mode 100644 RA-0x0001-GPIO-Output/build.bat create mode 100644 RA-0x0001-GPIO-Output/gpio16_blink.bin create mode 100644 RA-0x0001-GPIO-Output/gpio16_blink.s create mode 100644 RA-0x0001-GPIO-Output/gpio16_blink.uf2 create mode 100644 RA-0x0001-GPIO-Output/image_def.s create mode 100644 RA-0x0001-GPIO-Output/linker.ld create mode 100644 RA-0x0001-GPIO-Output/review.bat create mode 100644 RA-0x0001-GPIO-Output/review_reports/bin_hexdump.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/nm_symbols.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/objdump_disasm.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/objdump_fullhex.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/objdump_headers.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/objdump_sections.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/readelf_all.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/readelf_header.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/readelf_relocs.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/readelf_sections.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/readelf_symbols.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/size.txt create mode 100644 RA-0x0001-GPIO-Output/review_reports/strings.txt create mode 100644 RA-0x0001-GPIO-Output/uf2conv.py create mode 100644 RA-0x0001-GPIO-Output/uf2families.json diff --git a/0x000e_floating-point-data-type/.gitignore b/0x000e_floating-point-data-type/.gitignore index 149d92e..2435c20 100644 --- a/0x000e_floating-point-data-type/.gitignore +++ b/0x000e_floating-point-data-type/.gitignore @@ -1,5 +1,2 @@ -.idea -_deps -cmake-* build -.DS_Store +!.vscode/* diff --git a/0x000e_floating-point-data-type/.vscode/.cortex-debug.peripherals.state.json b/0x000e_floating-point-data-type/.vscode/.cortex-debug.peripherals.state.json deleted file mode 100644 index 0637a08..0000000 --- a/0x000e_floating-point-data-type/.vscode/.cortex-debug.peripherals.state.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/0x000e_floating-point-data-type/.vscode/.cortex-debug.registers.state.json b/0x000e_floating-point-data-type/.vscode/.cortex-debug.registers.state.json deleted file mode 100644 index 0637a08..0000000 --- a/0x000e_floating-point-data-type/.vscode/.cortex-debug.registers.state.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/0x000e_floating-point-data-type/.vscode/c_cpp_properties.json b/0x000e_floating-point-data-type/.vscode/c_cpp_properties.json index ada839e..e80461d 100644 --- a/0x000e_floating-point-data-type/.vscode/c_cpp_properties.json +++ b/0x000e_floating-point-data-type/.vscode/c_cpp_properties.json @@ -1,18 +1,22 @@ { - "configurations": [ - { - "name": "Pico", - "includePath": [ - "${workspaceFolder}/**", - "${env:PICO_SDK_PATH}/**" - ], - "defines": [], - "compilerPath": "${env:PICO_INSTALL_PATH}/gcc-arm-none-eabi/bin/arm-none-eabi-gcc.exe", - "cStandard": "c11", - "cppStandard": "c++11", - "intelliSenseMode": "linux-gcc-arm", - "configurationProvider": "ms-vscode.cmake-tools" - } - ], - "version": 4 + "configurations": [ + { + "name": "Pico", + "includePath": [ + "${workspaceFolder}/**", + "${userHome}/.pico-sdk/sdk/2.2.0/**" + ], + "forcedInclude": [ + "${userHome}/.pico-sdk/sdk/2.2.0/src/common/pico_base_headers/include/pico.h", + "${workspaceFolder}/build/generated/pico_base/pico/config_autogen.h" + ], + "defines": [], + "compilerPath": "${userHome}/.pico-sdk/toolchain/14_2_Rel1/bin/arm-none-eabi-gcc.exe", + "compileCommands": "${workspaceFolder}/build/compile_commands.json", + "cStandard": "c17", + "cppStandard": "c++14", + "intelliSenseMode": "linux-gcc-arm" + } + ], + "version": 4 } diff --git a/0x000e_floating-point-data-type/.vscode/cmake-kits.json b/0x000e_floating-point-data-type/.vscode/cmake-kits.json new file mode 100644 index 0000000..b0f3815 --- /dev/null +++ b/0x000e_floating-point-data-type/.vscode/cmake-kits.json @@ -0,0 +1,15 @@ +[ + { + "name": "Pico", + "compilers": { + "C": "${command:raspberry-pi-pico.getCompilerPath}", + "CXX": "${command:raspberry-pi-pico.getCxxCompilerPath}" + }, + "environmentVariables": { + "PATH": "${command:raspberry-pi-pico.getEnvPath};${env:PATH}" + }, + "cmakeSettings": { + "Python3_EXECUTABLE": "${command:raspberry-pi-pico.getPythonPath}" + } + } +] \ No newline at end of file diff --git a/0x000e_floating-point-data-type/.vscode/extensions.json b/0x000e_floating-point-data-type/.vscode/extensions.json index 03ba0af..a940d7c 100644 --- a/0x000e_floating-point-data-type/.vscode/extensions.json +++ b/0x000e_floating-point-data-type/.vscode/extensions.json @@ -1,9 +1,9 @@ { - "recommendations": [ - "marus25.cortex-debug", - "ms-vscode.cmake-tools", - "ms-vscode.cpptools", - "ms-vscode.cpptools-extension-pack", - "ms-vscode.vscode-serial-monitor" - ] -} + "recommendations": [ + "marus25.cortex-debug", + "ms-vscode.cpptools", + "ms-vscode.cpptools-extension-pack", + "ms-vscode.vscode-serial-monitor", + "raspberry-pi.raspberry-pi-pico" + ] +} \ No newline at end of file diff --git a/0x000e_floating-point-data-type/.vscode/launch.json b/0x000e_floating-point-data-type/.vscode/launch.json index 2b22acf..424aa71 100644 --- a/0x000e_floating-point-data-type/.vscode/launch.json +++ b/0x000e_floating-point-data-type/.vscode/launch.json @@ -1,58 +1,50 @@ { - "version": "0.2.0", - "configurations": [ - { - "name": "Pico Debug (Cortex-Debug)", - "cwd": "${workspaceFolder}", - "executable": "${command:cmake.launchTargetPath}", - "request": "launch", - "type": "cortex-debug", - "servertype": "openocd", - "gdbPath": "arm-none-eabi-gdb", - "device": "RP2040", - "configFiles": [ - "interface/cmsis-dap.cfg", - "target/rp2040.cfg" - ], - "svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd", - "runToEntryPoint": "main", - "openOCDLaunchCommands": [ - "adapter speed 1000" - ] - }, - { - "name": "Pico Debug (Cortex-Debug with external OpenOCD)", - "cwd": "${workspaceFolder}", - "executable": "${command:cmake.launchTargetPath}", - "request": "launch", - "type": "cortex-debug", - "servertype": "external", - "gdbTarget": "localhost:3333", - "gdbPath": "arm-none-eabi-gdb", - "device": "RP2040", - "svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd", - "runToEntryPoint": "main" - }, - { - "name": "Pico Debug (C++ Debugger)", - "type": "cppdbg", - "request": "launch", - "cwd": "${workspaceFolder}", - "program": "${command:cmake.launchTargetPath}", - "MIMode": "gdb", - "miDebuggerPath": "arm-none-eabi-gdb", - "miDebuggerServerAddress": "localhost:3333", - "debugServerPath": "openocd", - "debugServerArgs": "-f interface/cmsis-dap.cfg -f target/rp2040.cfg -c \"adapter speed 1000\"", - "serverStarted": "Listening on port .* for gdb connections", - "filterStderr": true, - "stopAtEntry": true, - "hardwareBreakpoints": { - "require": true, - "limit": 4 - }, - "preLaunchTask": "Flash", - "svdPath": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd" - } - ] + "version": "0.2.0", + "configurations": [ + { + "name": "Pico Debug (Cortex-Debug)", + "cwd": "${userHome}/.pico-sdk/openocd/0.12.0+dev/scripts", + "executable": "${command:raspberry-pi-pico.launchTargetPath}", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "serverpath": "${userHome}/.pico-sdk/openocd/0.12.0+dev/openocd.exe", + "gdbPath": "${command:raspberry-pi-pico.getGDBPath}", + "device": "${command:raspberry-pi-pico.getChipUppercase}", + "configFiles": [ + "interface/cmsis-dap.cfg", + "target/${command:raspberry-pi-pico.getTarget}.cfg" + ], + "svdFile": "${userHome}/.pico-sdk/sdk/2.2.0/src/${command:raspberry-pi-pico.getChip}/hardware_regs/${command:raspberry-pi-pico.getChipUppercase}.svd", + "runToEntryPoint": "main", + // Fix for no_flash binaries, where monitor reset halt doesn't do what is expected + // Also works fine for flash binaries + "overrideLaunchCommands": [ + "monitor reset init", + "load \"${command:raspberry-pi-pico.launchTargetPath}\"" + ], + "openOCDLaunchCommands": [ + "adapter speed 5000" + ] + }, + { + "name": "Pico Debug (Cortex-Debug with external OpenOCD)", + "cwd": "${workspaceRoot}", + "executable": "${command:raspberry-pi-pico.launchTargetPath}", + "request": "launch", + "type": "cortex-debug", + "servertype": "external", + "gdbTarget": "localhost:3333", + "gdbPath": "${command:raspberry-pi-pico.getGDBPath}", + "device": "${command:raspberry-pi-pico.getChipUppercase}", + "svdFile": "${userHome}/.pico-sdk/sdk/2.2.0/src/${command:raspberry-pi-pico.getChip}/hardware_regs/${command:raspberry-pi-pico.getChipUppercase}.svd", + "runToEntryPoint": "main", + // Fix for no_flash binaries, where monitor reset halt doesn't do what is expected + // Also works fine for flash binaries + "overrideLaunchCommands": [ + "monitor reset init", + "load \"${command:raspberry-pi-pico.launchTargetPath}\"" + ] + }, + ] } diff --git a/0x000e_floating-point-data-type/.vscode/settings.json b/0x000e_floating-point-data-type/.vscode/settings.json index 8ad90e8..cdb8e61 100644 --- a/0x000e_floating-point-data-type/.vscode/settings.json +++ b/0x000e_floating-point-data-type/.vscode/settings.json @@ -1,30 +1,40 @@ { - // These settings tweaks to the cmake plugin will ensure - // that you debug using cortex-debug instead of trying to launch - // a Pico binary on the host - "cmake.statusbar.advanced": { - "debug": { - "visibility": "hidden" + "cmake.showSystemKits": false, + "cmake.options.statusBarVisibility": "hidden", + "cmake.options.advanced": { + "build": { + "statusBarVisibility": "hidden" }, "launch": { - "visibility": "hidden" + "statusBarVisibility": "hidden" }, - "build": { - "visibility": "hidden" - }, - "buildTarget": { - "visibility": "hidden" + "debug": { + "statusBarVisibility": "hidden" } }, - "cmake.buildBeforeRun": true, - "cmake.configureOnOpen": true, - "cmake.configureSettings": { - "CMAKE_MODULE_PATH": "${env:PICO_INSTALL_PATH}/pico-sdk-tools" - }, + "cmake.configureOnEdit": false, + "cmake.automaticReconfigure": false, + "cmake.configureOnOpen": false, "cmake.generator": "Ninja", - "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", - "C_Cpp.errorSquiggles": "enabled", - "files.associations": { - "stdlib.h": "c" - } + "cmake.cmakePath": "${userHome}/.pico-sdk/cmake/v3.31.5/bin/cmake", + "C_Cpp.debugShortcut": false, + "terminal.integrated.env.windows": { + "PICO_SDK_PATH": "${env:USERPROFILE}/.pico-sdk/sdk/2.2.0", + "PICO_TOOLCHAIN_PATH": "${env:USERPROFILE}/.pico-sdk/toolchain/14_2_Rel1", + "Path": "${env:USERPROFILE}/.pico-sdk/toolchain/14_2_Rel1/bin;${env:USERPROFILE}/.pico-sdk/picotool/2.2.0/picotool;${env:USERPROFILE}/.pico-sdk/cmake/v3.31.5/bin;${env:USERPROFILE}/.pico-sdk/ninja/v1.12.1;${env:PATH}" + }, + "terminal.integrated.env.osx": { + "PICO_SDK_PATH": "${env:HOME}/.pico-sdk/sdk/2.2.0", + "PICO_TOOLCHAIN_PATH": "${env:HOME}/.pico-sdk/toolchain/14_2_Rel1", + "PATH": "${env:HOME}/.pico-sdk/toolchain/14_2_Rel1/bin:${env:HOME}/.pico-sdk/picotool/2.2.0/picotool:${env:HOME}/.pico-sdk/cmake/v3.31.5/bin:${env:HOME}/.pico-sdk/ninja/v1.12.1:${env:PATH}" + }, + "terminal.integrated.env.linux": { + "PICO_SDK_PATH": "${env:HOME}/.pico-sdk/sdk/2.2.0", + "PICO_TOOLCHAIN_PATH": "${env:HOME}/.pico-sdk/toolchain/14_2_Rel1", + "PATH": "${env:HOME}/.pico-sdk/toolchain/14_2_Rel1/bin:${env:HOME}/.pico-sdk/picotool/2.2.0/picotool:${env:HOME}/.pico-sdk/cmake/v3.31.5/bin:${env:HOME}/.pico-sdk/ninja/v1.12.1:${env:PATH}" + }, + "raspberry-pi-pico.cmakeAutoConfigure": true, + "raspberry-pi-pico.useCmakeTools": false, + "raspberry-pi-pico.cmakePath": "${HOME}/.pico-sdk/cmake/v3.31.5/bin/cmake", + "raspberry-pi-pico.ninjaPath": "${HOME}/.pico-sdk/ninja/v1.12.1/ninja" } diff --git a/0x000e_floating-point-data-type/.vscode/tasks.json b/0x000e_floating-point-data-type/.vscode/tasks.json index a437c2f..f427bf0 100644 --- a/0x000e_floating-point-data-type/.vscode/tasks.json +++ b/0x000e_floating-point-data-type/.vscode/tasks.json @@ -1,29 +1,102 @@ { - "version": "2.0.0", - "tasks": [ - { - "label": "Flash", - "type": "shell", - "command": "openocd", - "args": [ - "-f", - "interface/cmsis-dap.cfg", - "-f", - "target/rp2040.cfg", - "-c", - "adapter speed 1000; program {${command:cmake.launchTargetPath}} verify reset exit" - ], - "problemMatcher": [] - }, - { - "label": "Build", - "type": "cmake", - "command": "build", - "problemMatcher": "$gcc", - "group": { - "kind": "build", - "isDefault": true - } - } - ] + "version": "2.0.0", + "tasks": [ + { + "label": "Compile Project", + "type": "process", + "isBuildCommand": true, + "command": "${userHome}/.pico-sdk/ninja/v1.12.1/ninja", + "args": ["-C", "${workspaceFolder}/build"], + "group": "build", + "presentation": { + "reveal": "always", + "panel": "dedicated" + }, + "problemMatcher": "$gcc", + "windows": { + "command": "${env:USERPROFILE}/.pico-sdk/ninja/v1.12.1/ninja.exe" + } + }, + { + "label": "Run Project", + "type": "process", + "command": "${env:HOME}/.pico-sdk/picotool/2.2.0/picotool/picotool", + "args": [ + "load", + "${command:raspberry-pi-pico.launchTargetPath}", + "-fx" + ], + "presentation": { + "reveal": "always", + "panel": "dedicated" + }, + "problemMatcher": [], + "windows": { + "command": "${env:USERPROFILE}/.pico-sdk/picotool/2.2.0/picotool/picotool.exe" + } + }, + { + "label": "Flash", + "type": "process", + "command": "${userHome}/.pico-sdk/openocd/0.12.0+dev/openocd.exe", + "args": [ + "-s", + "${userHome}/.pico-sdk/openocd/0.12.0+dev/scripts", + "-f", + "interface/cmsis-dap.cfg", + "-f", + "target/${command:raspberry-pi-pico.getTarget}.cfg", + "-c", + "adapter speed 5000; program \"${command:raspberry-pi-pico.launchTargetPath}\" verify reset exit" + ], + "problemMatcher": [], + "windows": { + "command": "${env:USERPROFILE}/.pico-sdk/openocd/0.12.0+dev/openocd.exe", + } + }, + { + "label": "Rescue Reset", + "type": "process", + "command": "${userHome}/.pico-sdk/openocd/0.12.0+dev/openocd.exe", + "args": [ + "-s", + "${userHome}/.pico-sdk/openocd/0.12.0+dev/scripts", + "-f", + "interface/cmsis-dap.cfg", + "-f", + "target/${command:raspberry-pi-pico.getChip}-rescue.cfg", + "-c", + "adapter speed 5000; reset halt; exit" + ], + "problemMatcher": [], + "windows": { + "command": "${env:USERPROFILE}/.pico-sdk/openocd/0.12.0+dev/openocd.exe", + } + }, + { + "label": "Risc-V Reset (RP2350)", + "type": "process", + "command": "${userHome}/.pico-sdk/openocd/0.12.0+dev/openocd.exe", + "args": [ + "-s", + "${userHome}/.pico-sdk/openocd/0.12.0+dev/scripts", + "-c", + "set USE_CORE { rv0 rv1 cm0 cm1 }", + "-f", + "interface/cmsis-dap.cfg", + "-f", + "target/rp2350.cfg", + "-c", + "adapter speed 5000; init;", + "-c", + "write_memory 0x40120158 8 { 0x3 }; echo [format \"Info : ARCHSEL 0x%02x\" [read_memory 0x40120158 8 1]];", + "-c", + "reset halt; targets rp2350.rv0; echo [format \"Info : ARCHSEL_STATUS 0x%02x\" [read_memory 0x4012015C 8 1]]; exit" + ], + "problemMatcher": [], + "windows": { + "command": "${env:USERPROFILE}/.pico-sdk/openocd/0.12.0+dev/openocd.exe", + } + } + ] } diff --git a/0x000e_floating-point-data-type/main.c b/0x000e_floating-point-data-type/0x000e_floating-point-data-type.c similarity index 100% rename from 0x000e_floating-point-data-type/main.c rename to 0x000e_floating-point-data-type/0x000e_floating-point-data-type.c diff --git a/0x000e_floating-point-data-type/CMakeLists.txt b/0x000e_floating-point-data-type/CMakeLists.txt index 6911110..72041a0 100644 --- a/0x000e_floating-point-data-type/CMakeLists.txt +++ b/0x000e_floating-point-data-type/CMakeLists.txt @@ -1,21 +1,57 @@ +# Generated Cmake Pico project file + cmake_minimum_required(VERSION 3.13) -include(pico_sdk_import.cmake) -project(0x000e_floating-point-data-type C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +# Initialise pico_sdk from installed location +# (note this can come from environment, CMake cache etc) + +# == DO NOT EDIT THE FOLLOWING LINES for the Raspberry Pi Pico VS Code Extension to work == +if(WIN32) + set(USERHOME $ENV{USERPROFILE}) +else() + set(USERHOME $ENV{HOME}) +endif() +set(sdkVersion 2.2.0) +set(toolchainVersion 14_2_Rel1) +set(picotoolVersion 2.2.0) +set(picoVscode ${USERHOME}/.pico-sdk/cmake/pico-vscode.cmake) +if (EXISTS ${picoVscode}) + include(${picoVscode}) +endif() +# ==================================================================================== +set(PICO_BOARD pico2 CACHE STRING "Board type") + +# Pull in Raspberry Pi Pico SDK (must be before project) +include(pico_sdk_import.cmake) + +project(0x000e_floating-point-data-type C CXX ASM) + +# Initialise the Raspberry Pi Pico SDK pico_sdk_init() -add_executable(0x000e_floating-point-data-type - main.c -) +# Add executable. Default name is the project name, version 0.1 -pico_enable_stdio_usb(0x000e_floating-point-data-type 1) +add_executable(0x000e_floating-point-data-type 0x000e_floating-point-data-type.c ) + +pico_set_program_name(0x000e_floating-point-data-type "0x000e_floating-point-data-type") +pico_set_program_version(0x000e_floating-point-data-type "0.1") + +# Modify the below lines to enable/disable output over UART/USB pico_enable_stdio_uart(0x000e_floating-point-data-type 1) +pico_enable_stdio_usb(0x000e_floating-point-data-type 0) + +# Add the standard library to the build +target_link_libraries(0x000e_floating-point-data-type + pico_stdlib) + +# Add the standard include files to the build +target_include_directories(0x000e_floating-point-data-type PRIVATE + ${CMAKE_CURRENT_LIST_DIR} +) pico_add_extra_outputs(0x000e_floating-point-data-type) -target_link_libraries(0x000e_floating-point-data-type - pico_stdlib -) diff --git a/0x000e_floating-point-data-type/pico_sdk_import.cmake b/0x000e_floating-point-data-type/pico_sdk_import.cmake index 65f8a6f..d493cc2 100644 --- a/0x000e_floating-point-data-type/pico_sdk_import.cmake +++ b/0x000e_floating-point-data-type/pico_sdk_import.cmake @@ -3,6 +3,28 @@ # This can be dropped into an external project to help locate this SDK # It should be include()ed prior to project() +# Copyright 2020 (c) 2020 Raspberry Pi (Trading) Ltd. +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. 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. +# +# 3. Neither the name of the copyright holder 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. + if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") @@ -18,9 +40,20 @@ if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_P message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") endif () +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_TAG} AND (NOT PICO_SDK_FETCH_FROM_GIT_TAG)) + set(PICO_SDK_FETCH_FROM_GIT_TAG $ENV{PICO_SDK_FETCH_FROM_GIT_TAG}) + message("Using PICO_SDK_FETCH_FROM_GIT_TAG from environment ('${PICO_SDK_FETCH_FROM_GIT_TAG}')") +endif () + +if (PICO_SDK_FETCH_FROM_GIT AND NOT PICO_SDK_FETCH_FROM_GIT_TAG) + set(PICO_SDK_FETCH_FROM_GIT_TAG "master") + message("Using master as default value for PICO_SDK_FETCH_FROM_GIT_TAG") +endif() + set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") +set(PICO_SDK_FETCH_FROM_GIT_TAG "${PICO_SDK_FETCH_FROM_GIT_TAG}" CACHE FILEPATH "release tag for SDK") if (NOT PICO_SDK_PATH) if (PICO_SDK_FETCH_FROM_GIT) @@ -29,25 +62,40 @@ if (NOT PICO_SDK_PATH) if (PICO_SDK_FETCH_FROM_GIT_PATH) get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") endif () - # GIT_SUBMODULES_RECURSE was added in 3.17 - if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0") - FetchContent_Declare( - pico_sdk - GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk - GIT_TAG master - GIT_SUBMODULES_RECURSE FALSE - ) - else () - FetchContent_Declare( - pico_sdk - GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk - GIT_TAG master - ) - endif () + FetchContent_Declare( + pico_sdk + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG ${PICO_SDK_FETCH_FROM_GIT_TAG} + ) if (NOT pico_sdk) message("Downloading Raspberry Pi Pico SDK") - FetchContent_Populate(pico_sdk) + # GIT_SUBMODULES_RECURSE was added in 3.17 + if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0") + FetchContent_Populate( + pico_sdk + QUIET + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG ${PICO_SDK_FETCH_FROM_GIT_TAG} + GIT_SUBMODULES_RECURSE FALSE + + SOURCE_DIR ${FETCHCONTENT_BASE_DIR}/pico_sdk-src + BINARY_DIR ${FETCHCONTENT_BASE_DIR}/pico_sdk-build + SUBBUILD_DIR ${FETCHCONTENT_BASE_DIR}/pico_sdk-subbuild + ) + else () + FetchContent_Populate( + pico_sdk + QUIET + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG ${PICO_SDK_FETCH_FROM_GIT_TAG} + + SOURCE_DIR ${FETCHCONTENT_BASE_DIR}/pico_sdk-src + BINARY_DIR ${FETCHCONTENT_BASE_DIR}/pico_sdk-build + SUBBUILD_DIR ${FETCHCONTENT_BASE_DIR}/pico_sdk-subbuild + ) + endif () + set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) endif () set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) diff --git a/RA-0x0001-GPIO-Output/README.md b/RA-0x0001-GPIO-Output/README.md new file mode 100644 index 0000000..9cb8ea5 --- /dev/null +++ b/RA-0x0001-GPIO-Output/README.md @@ -0,0 +1,605 @@ +# RP2350 GPIO Coprocessor Blink - Detailed Documentation + +## Overview + +This is a **bare-metal assembly program** for the **Raspberry Pi RP2350** microcontroller that demonstrates the use of the **ARM Cortex-M33 coprocessor interface** to control GPIO pins. Unlike traditional GPIO control using direct memory-mapped register writes, this version uses the RP2350's **hardware GPIO coprocessor (CP0)** with **MCRR (Move to Coprocessor from two ARM Registers)** instructions. + +The program blinks an LED connected to **GPIO16** with a 500ms on/off cycle using the specialized coprocessor instructions for high-performance GPIO operations. + +--- + +## What Makes This Special? + +### Traditional GPIO Control vs Coprocessor Control + +**Traditional Method (Direct Register Access):** +```assembly +LDR R0, =SIO_BASE ; Load SIO base address +LDR R1, =GPIO16_BIT ; Load GPIO bit mask +STR R1, [R0, #GPIO_OUT_SET] ; Write to memory-mapped register +``` + +**Coprocessor Method (This Implementation):** +```assembly +MOVS R4, #16 ; GPIO pin number +MOVS R5, #1 ; Value to write +MCRR p0, #4, R4, R5, c0 ; Single coprocessor instruction +``` + +### Advantages of the Coprocessor Approach: +1. **Faster execution** - Single instruction instead of multiple memory operations +2. **More atomic** - Less chance of race conditions +3. **Hardware-accelerated** - Direct hardware interface +4. **Cleaner code** - No need to manage bit masks and base addresses +5. **RP2350-specific** - Takes advantage of advanced features + +--- + +## Hardware Requirements + +- **RP2350-based board** (e.g., Raspberry Pi Pico 2) +- **LED** connected to **GPIO16** (or use built-in LED if available) +- Optional: Current-limiting resistor (typically 330Ω - 1kΩ) +- **USB cable** for programming + +### GPIO16 Connection +``` +RP2350 GPIO16 ----[330Ω]----[LED]---- GND + (Resistor) (Anode to GPIO, Cathode to GND) +``` + +--- + +## Technical Details + +### Coprocessor Interface + +The RP2350 implements a **custom GPIO coprocessor (CP0)** accessible through the ARM Cortex-M33's coprocessor interface. This is documented in the RP2350 datasheet. + +#### MCRR Instruction Format +``` +MCRR p0, #opcode, Rt, Rt2, CRm +``` + +Where: +- `p0` = Coprocessor 0 (GPIO coprocessor) +- `#opcode` = Operation code (4 for GPIO operations) +- `Rt` = First source register (GPIO pin number in R4) +- `Rt2` = Second source register (value in R5) +- `CRm` = Coprocessor register (c0 for OUT, c4 for OE) + +### GPIO Coprocessor Operations Used + +#### 1. `gpioc_bit_out_put(gpio, value)` +**Purpose:** Set or clear a GPIO output pin +**Encoding:** `MCRR p0, #4, R4, R5, c0` +**Parameters:** +- R4 = GPIO pin number (16 in our case) +- R5 = Output value (0 or 1) + +**Example:** +```assembly +MOVS R4, #16 ; GPIO16 +MOVS R5, #1 ; Set HIGH +MCRR p0, #4, R4, R5, c0 +``` + +#### 2. `gpioc_bit_oe_put(gpio, enable)` +**Purpose:** Set output enable for a GPIO pin +**Encoding:** `MCRR p0, #4, R4, R5, c4` +**Parameters:** +- R4 = GPIO pin number (16 in our case) +- R5 = Output enable (1 to enable output) + +**Example:** +```assembly +MOVS R4, #16 ; GPIO16 +MOVS R5, #1 ; Enable output +MCRR p0, #4, R4, R5, c4 +``` + +--- + +## Memory Map & Register Addresses + +### Critical Memory Addresses Used + +| Address | Register | Purpose | +|--------------|-----------------------------------|--------------------------------------| +| `0xE000ED88` | CPACR (Coprocessor Access Control)| Enable CP0 access | +| `0x40038044` | PADS_BANK0_GPIO16 | Pad configuration for GPIO16 | +| `0x40028084` | IO_BANK0_GPIO16_CTRL | Function select for GPIO16 | +| `0x20082000` | STACK_TOP | Initial stack pointer | +| `0x2007A000` | STACK_LIMIT | Stack limit for overflow protection | + +### Register Details + +#### CPACR (Coprocessor Access Control Register) - 0xE000ED88 +``` +Bits [1:0] - CP0 access privileges + 00 = No access + 01 = Privileged access only + 10 = Reserved + 11 = Full access (used in this code) +``` + +#### PADS_BANK0_GPIO16 - 0x40038044 +``` +Bit 8 (ISO) - Isolate pad (0 = normal operation) +Bit 7 (OD) - Output disable (0 = output enabled) +Bit 6 (IE) - Input enable (1 = input buffer enabled) +Bits [5:4] - Drive strength +Bits [3:2] - Slew rate +Bit 1 (PDE) - Pull-down enable +Bit 0 (PUE) - Pull-up enable +``` + +#### IO_BANK0_GPIO16_CTRL - 0x40028084 +``` +Bits [4:0] (FUNCSEL) - Function select + 0 = JTAG (TDI) + 1 = SPI + 2 = UART + 3 = I2C + 4 = PWM + 5 = SIO (Software controlled I/O) ← Used for GPIO + 6-8 = PIO + 9 = USB + 31 = NULL +``` + +--- + +## Code Structure & Execution Flow + +### 1. Vector Table (`.vectors` section) +```assembly +.section .vectors, "ax" +.align 2 +.global _vectors +_vectors: + .word STACK_TOP /* 0x20082000 - Initial Stack Pointer */ + .word Reset_Handler + 1 /* Reset Handler (Thumb bit set) */ +``` + +**Why `+ 1`?** +The Cortex-M33 uses the Thumb instruction set exclusively. The LSB (least significant bit) of function pointers must be set to 1 to indicate Thumb mode. This is automatically handled by the processor. + +### 2. Stack Initialization +```assembly +Reset_Handler: + /* Initialize stack pointers for Cortex-M33 */ + LDR R0, =STACK_TOP + MSR PSP, R0 /* Process Stack Pointer */ + + LDR R0, =STACK_LIMIT + MSR MSPLIM, R0 /* Main Stack Pointer Limit */ + MSR PSPLIM, R0 /* Process Stack Pointer Limit */ + + LDR R0, =STACK_TOP + MSR MSP, R0 /* Main Stack Pointer */ +``` + +**Cortex-M33 Stack Features:** +- **Dual stack pointers:** MSP (Main) and PSP (Process) +- **Stack limit registers:** MSPLIM and PSPLIM for overflow detection +- **Security feature:** Prevents stack overflow from corrupting memory + +### 3. Coprocessor Access Enablement +```assembly + /* Enable coprocessor access - set CP0 to full access */ + LDR R0, =0xE000ED88 /* CPACR address */ + LDR R1, [R0] /* Read current value */ + ORR R1, R1, #0x3 /* Set CP0 bits [1:0] to 11 (full access) */ + STR R1, [R0] /* Write back */ + DSB /* Data Synchronization Barrier */ + ISB /* Instruction Synchronization Barrier */ +``` + +**Critical Step:** Without this, MCRR instructions will trigger a **UsageFault** exception! + +**Memory Barriers:** +- `DSB` - Ensures all memory operations complete before proceeding +- `ISB` - Flushes instruction pipeline to ensure new settings take effect + +### 4. GPIO Pad Configuration +```assembly + /* Configure pad for GPIO16 */ + LDR R3, =0x40038044 /* &pads_bank0_hw->io[16] */ + LDR R2, [R3] /* load current config */ + BIC R2, R2, #0x80 /* clear OD (bit 7) - enable output */ + ORR R2, R2, #0x40 /* set IE (bit 6) - enable input buffer */ + STR R2, [R3] /* store updated config */ +``` + +**What this does:** +- Clears OD (Output Disable) bit → Allows pin to drive output +- Sets IE (Input Enable) bit → Enables input buffer for reading +- Preserves other settings (pull-ups, drive strength, etc.) + +### 5. Function Selection +```assembly + /* Set GPIO16 function to SIO (Software I/O) */ + LDR R3, =0x40028084 /* &io_bank0_hw->io[16].ctrl */ + LDR R2, [R3] /* load current config */ + BIC R2, R2, #0x1F /* clear FUNCSEL bits [4:0] */ + ORR R2, R2, #5 /* set FUNCSEL = 5 (SIO) */ + STR R2, [R3] /* store updated config */ +``` + +**Function 5 (SIO):** +- Routes GPIO to software control +- Required before using coprocessor GPIO operations +- Other functions route to hardware peripherals (UART, SPI, etc.) + +### 6. Pad Isolation +```assembly + /* Un-isolate the pad */ + LDR R3, =0x40038044 /* &pads_bank0_hw->io[16] */ + LDR R2, [R3] /* load current config */ + BIC R2, R2, #0x100 /* clear ISO bit (bit 8) */ + STR R2, [R3] /* store updated config */ +``` + +**ISO bit:** +- When set (1): Pad is isolated from peripherals +- When clear (0): Pad is connected and functional +- Must be cleared for GPIO to work + +### 7. Enable GPIO Output +```assembly + /* Enable output using coprocessor */ + MOVS R4, #16 /* GPIO16 */ + MOVS R5, #1 /* Enable output */ + MCRR p0, #4, R4, R5, c4 /* gpioc_bit_oe_put(16, 1) */ +``` + +**This is the first coprocessor instruction!** +- Sets the Output Enable (OE) bit for GPIO16 +- Makes the pin drive its output value +- Uses coprocessor register c4 (OE control) + +### 8. Main Blink Loop +```assembly +blink_loop: + /* Turn LED ON */ + MOVS R4, #16 /* GPIO16 */ + MOVS R5, #1 /* HIGH */ + MCRR p0, #4, R4, R5, c0 /* gpioc_bit_out_put(16, 1) */ + + /* Delay ~500ms */ + LDR R2, =2000000 /* 2M cycles */ +delay_on: + SUBS R2, R2, #1 /* Decrement */ + BNE delay_on /* Loop until zero */ + + /* Turn LED OFF */ + MOVS R4, #16 /* GPIO16 */ + MOVS R5, #0 /* LOW */ + MCRR p0, #4, R4, R5, c0 /* gpioc_bit_out_put(16, 0) */ + + /* Delay ~500ms */ + LDR R2, =2000000 /* 2M cycles */ +delay_off: + SUBS R2, R2, #1 /* Decrement */ + BNE delay_off /* Loop until zero */ + + B blink_loop /* Repeat forever */ +``` + +**Delay Calculation:** +- 2,000,000 cycles at ~4-12 MHz boot clock +- Approximately 500ms per delay +- Total period: ~1 second (1Hz blink rate) + +--- + +## Build Process + +### Prerequisites +1. **ARM GNU Toolchain** installed and in PATH: + - `arm-none-eabi-as` (Assembler) + - `arm-none-eabi-ld` (Linker) + - `arm-none-eabi-objcopy` (Object copy utility) +2. **Python** (for UF2 conversion) +3. **uf2conv.py** script (located two directories up: `../../uf2conv.py`) + +### Build Script (`build.bat`) +```batch +@echo off +REM Build script for RP2350 GPIO16 blink + +echo Building GPIO16 blink... + +REM Assemble main code +arm-none-eabi-as -mcpu=cortex-m33 -mthumb gpio16_blink.s -o gpio16_blink.o + +REM Assemble image definition +arm-none-eabi-as -mcpu=cortex-m33 -mthumb image_def.s -o image_def.o + +REM Link with linker script +arm-none-eabi-ld -T linker.ld gpio16_blink.o image_def.o -o gpio16_blink.elf + +REM Create raw binary +arm-none-eabi-objcopy -O binary gpio16_blink.elf gpio16_blink.bin + +REM Create UF2 bootloader format +python ..\..\uf2conv.py -b 0x10000000 -f 0xe48bff59 -o gpio16_blink.uf2 gpio16_blink.bin +``` + +### Build Command +```powershell +.\build.bat +``` + +### Build Flags Explained + +**`-mcpu=cortex-m33`** +- Target the Cortex-M33 processor in RP2350 +- Enables M33-specific features (stack limits, DSB/ISB instructions, coprocessor) + +**`-mthumb`** +- Generate Thumb-2 instruction set (mandatory for Cortex-M) +- Provides 16-bit and 32-bit instruction mix for code density + +**`-T linker.ld`** +- Use custom linker script to define memory layout +- Places code at flash start (0x10000000) + +**UF2 Parameters:** +- `-b 0x10000000` - Base address (RP2350 flash start) +- `-f 0xe48bff59` - Family ID for RP2350 +- `-o gpio16_blink.uf2` - Output filename + +--- + +## Flashing Instructions + +### Method 1: UF2 Bootloader (Easiest) + +1. **Disconnect** the RP2350 from USB +2. **Hold the BOOTSEL button** on the board +3. **Connect USB cable** while holding BOOTSEL +4. **Release BOOTSEL** - Board appears as USB mass storage device +5. **Copy** `gpio16_blink.uf2` to the RP2350 drive +6. **Board automatically reboots** and starts running the program + +### Method 2: OpenOCD with Debug Probe + +If you have a debug probe (e.g., Raspberry Pi Debug Probe, CMSIS-DAP): + +```bash +openocd -f interface/cmsis-dap.cfg -f target/rp2350.cfg \ + -c "adapter speed 5000" \ + -c "program gpio16_blink.elf verify reset exit" +``` + +--- + +## Debugging & Troubleshooting + +### Problem: LED doesn't blink + +**Check 1: Coprocessor Access** +- Ensure CPACR is set correctly +- Without this, MCRR triggers UsageFault +- Verify DSB/ISB barriers are present + +**Check 2: GPIO Configuration** +- Verify FUNCSEL is set to 5 (SIO) +- Check OD bit is cleared (output enabled) +- Ensure ISO bit is cleared (pad connected) + +**Check 3: Hardware Connections** +- LED polarity (anode to GPIO, cathode to GND) +- Current-limiting resistor present +- GPIO16 physically connected + +**Check 4: Clock Speed** +- Boot clock may vary (4-12 MHz typical) +- Delay timing depends on actual clock +- Adjust delay constant if needed + +### Problem: Build fails + +**Missing toolchain:** +``` +'arm-none-eabi-as' is not recognized... +``` +Solution: Install ARM GNU Toolchain and add to PATH + +**Missing uf2conv.py:** +``` +python: can't open file 'uf2conv.py' +``` +Solution: Ensure uf2conv.py is in `../../` relative to build directory + +**Assembly errors:** +``` +Error: bad instruction 'mcrr' +``` +Solution: Ensure `-mcpu=cortex-m33` flag is used (M33 supports coprocessor) + +### Problem: Board doesn't appear as USB drive + +**Solution 1:** Try different USB cable (must support data, not just power) +**Solution 2:** Hold BOOTSEL earlier (before connecting USB) +**Solution 3:** Check USB port functionality + +--- + +## Performance Analysis + +### Instruction Cycle Counts (Approximate) + +**Traditional GPIO Write (3-4 instructions):** +```assembly +LDR R0, =SIO_BASE ; 2 cycles +LDR R1, =GPIO16_BIT ; 2 cycles +STR R1, [R0, #offset] ; 2 cycles + ; Total: ~6 cycles + memory latency +``` + +**Coprocessor GPIO Write (2 instructions):** +```assembly +MOVS R4, #16 ; 1 cycle +MOVS R5, #1 ; 1 cycle +MCRR p0, #4, R4, R5, c0 ; 1 cycle (hardware accelerated) + ; Total: ~3 cycles +``` + +**Performance Gain: ~50% faster execution** + +### Memory Usage + +| Section | Size | Location | +|-------------|---------|----------------| +| Vector Table| 8 bytes | 0x10000000 | +| Code (.text)| ~140 bytes | 0x10000008 | +| Total Flash | ~148 bytes | Flash | +| Stack | 32 KB | RAM (0x2007A000-0x20082000) | + +**UF2 File Size:** 512 bytes (minimum UF2 block size) + +--- + +## Advanced Topics + +### Extending to Multiple GPIOs + +To control multiple GPIOs with coprocessor: + +```assembly +; Blink GPIO16 and GPIO17 alternately +blink_multi: + ; Turn GPIO16 ON, GPIO17 OFF + MOVS R4, #16 + MOVS R5, #1 + MCRR p0, #4, R4, R5, c0 + + MOVS R4, #17 + MOVS R5, #0 + MCRR p0, #4, R4, R5, c0 + + ; Delay... + + ; Turn GPIO16 OFF, GPIO17 ON + MOVS R4, #16 + MOVS R5, #0 + MCRR p0, #4, R4, R5, c0 + + MOVS R4, #17 + MOVS R5, #1 + MCRR p0, #4, R4, R5, c0 +``` + +### Reading GPIO with Coprocessor + +The RP2350 also supports GPIO read operations: + +```assembly +; Read GPIO state using MRRC (Move to ARM Registers from Coprocessor) +MOVS R4, #16 ; GPIO to read +MRRC p0, #opcode, R4, R5, c0 ; Result in R5 +``` + +*(Exact opcode may vary - consult RP2350 datasheet)* + +### Interrupt-Driven Delays + +For production code, replace busy-wait delays with timer interrupts: + +```assembly +; Configure SysTick for 1ms interrupts +LDR R0, =0xE000E010 ; SysTick base +LDR R1, =4000 ; Reload value for 1ms at 4MHz +STR R1, [R0, #4] ; SYST_RVR +MOV R1, #7 ; Enable + interrupt + clock +STR R1, [R0, #0] ; SYST_CSR +``` + +--- + +## Reference Documentation + +### Official Documentation +1. **RP2350 Datasheet** - Complete hardware reference + - Section on GPIO Coprocessor (CP0) + - Register maps and bit definitions + - Electrical characteristics + +2. **ARM Cortex-M33 Technical Reference Manual** + - Coprocessor interface specification + - MCRR/MRRC instruction encoding + - Stack limit and security features + +3. **ARM Architecture Reference Manual (ARMv8-M)** + - Thumb-2 instruction set + - System control registers (CPACR, etc.) + - Exception handling + +### Instruction Reference + +**MCRR (Move to Coprocessor from ARM Registers):** +``` +MCRR coproc, opc1, Rt, Rt2, CRm + coproc: p0-p15 (coprocessor number) + opc1: 4-bit operation code + Rt: First source register + Rt2: Second source register + CRm: Coprocessor register +``` + +**DSB (Data Synchronization Barrier):** +- Ensures completion of memory operations +- Required after CPACR modification + +**ISB (Instruction Synchronization Barrier):** +- Flushes instruction pipeline +- Required after system control changes + +--- + +## Version History + +### Version 1.0 (October 2025) +- Initial release +- Implements GPIO16 blink using coprocessor +- 500ms on/off cycle +- CPACR enablement for CP0 access +- Proper initialization sequence + +--- + +## License & Credits + +This code is provided as-is for educational and experimental purposes. + +**Created for:** Bare-metal RP2350 development +**Target Board:** Raspberry Pi Pico 2 (RP2350) +**Architecture:** ARM Cortex-M33 +**Assembly Syntax:** GNU AS (Unified ARM Syntax) + +--- + +## Future Enhancements + +Potential improvements: +1. **Add interrupt-driven timing** instead of busy-wait loops +2. **Implement GPIO read operations** using MRRC +3. **Create PWM effects** using variable duty cycles +4. **Multi-GPIO patterns** (Knight Rider, binary counter, etc.) +5. **Add error handling** for fault exceptions +6. **Clock configuration** for precise timing +7. **Low-power modes** using WFI (Wait For Interrupt) + +--- + +## Contact & Support + +For issues, questions, or contributions related to this coprocessor implementation, please refer to: +- RP2350 community forums +- ARM Cortex-M33 documentation +- Raspberry Pi Pico SDK examples + +**Happy coding with coprocessors!** 🚀 diff --git a/RA-0x0001-GPIO-Output/build.bat b/RA-0x0001-GPIO-Output/build.bat new file mode 100644 index 0000000..3184b63 --- /dev/null +++ b/RA-0x0001-GPIO-Output/build.bat @@ -0,0 +1,78 @@ +@echo off +REM ============================================================================ +REM FILE: build.bat +REM +REM DESCRIPTION: +REM Build script for RP2350 GPIO16 Blink (Coprocessor Version). +REM Automates the process of assembling, linking, and generating UF2 firmware. +REM +REM AUTHOR: Kevin Thomas +REM CREATION DATE: October 5, 2025 +REM UPDATE DATE: October 5, 2025 +REM +REM STEPS: +REM 1. Assemble source files (gpio16_blink.s, image_def.s) +REM 2. Link objects with linker script (linker.ld) +REM 3. Convert ELF to BIN +REM 4. Convert BIN to UF2 with correct family ID (RP2350 = 0xe48bff59) +REM 5. Provide flashing instructions (UF2 drag‑and‑drop or OpenOCD) +REM ============================================================================ + +echo Building GPIO16 blink... + +REM ============================================================================ +REM Assemble source files +REM ============================================================================ +arm-none-eabi-as -mcpu=cortex-m33 -mthumb gpio16_blink.s -o gpio16_blink.o +if errorlevel 1 goto error + +arm-none-eabi-as -mcpu=cortex-m33 -mthumb image_def.s -o image_def.o +if errorlevel 1 goto error + +REM ============================================================================ +REM Link object files into ELF using linker script +REM ============================================================================ +arm-none-eabi-ld -T linker.ld gpio16_blink.o image_def.o -o gpio16_blink.elf +if errorlevel 1 goto error + +REM ============================================================================ +REM Create raw binary from ELF +REM ============================================================================ +arm-none-eabi-objcopy -O binary gpio16_blink.elf gpio16_blink.bin +if errorlevel 1 goto error + +REM ============================================================================ +REM Create UF2 image for RP2350 +REM -b 0x10000000 : base address +REM -f 0xe48bff59 : RP2350 family ID +REM ============================================================================ +python ..\..\uf2conv.py -b 0x10000000 -f 0xe48bff59 -o gpio16_blink.uf2 gpio16_blink.bin +if errorlevel 1 goto error + +REM ============================================================================ +REM Success message and flashing instructions +REM ============================================================================ +echo. +echo ======================================== +echo SUCCESS! Created gpio16_blink.uf2 +echo ======================================== +echo. +echo To flash via UF2: +echo 1. Hold BOOTSEL button +echo 2. Plug in USB +echo 3. Copy gpio16_blink.uf2 to RP2350 drive +echo. +echo To flash via OpenOCD (debug probe): +echo openocd -f interface/cmsis-dap.cfg -f target/rp2350.cfg -c "adapter speed 5000" -c "program gpio16_blink.elf verify reset exit" +echo. +goto end + +REM ============================================================================ +REM Error handling +REM ============================================================================ +:error +echo. +echo BUILD FAILED! +echo. + +:end diff --git a/RA-0x0001-GPIO-Output/gpio16_blink.bin b/RA-0x0001-GPIO-Output/gpio16_blink.bin new file mode 100644 index 0000000000000000000000000000000000000000..11b67ad20c55b89f903b589dbbeb88701c19cd04 GIT binary patch literal 268 zcmZQj;85UXU=U#V!25&YgE$b&1F;bhTLG~#5S#t@_FTrJ;WKB4G?3)#X!y+CApvA@ zbQHKtcra!-eqd%~OxXX~zkmPd{Qd%W5pSssr4J2EP9GeYl)f|+NhJt?MdX1ZtV}?j z3Zts)8yANHcL>V?%whnFfmm!_j8=ay7PvD2-NmqgU7_PG!vmKFW`~vrCWnR=IR-~% z1_p-2)WoDr21ZFBlhrxDs3f&Q*VovXflZLzmy=nKkr*|X@BRPp#Hc9npAl#X5LB89 Gtp)&nJ5s#> literal 0 HcmV?d00001 diff --git a/RA-0x0001-GPIO-Output/gpio16_blink.s b/RA-0x0001-GPIO-Output/gpio16_blink.s new file mode 100644 index 0000000..4dd2a55 --- /dev/null +++ b/RA-0x0001-GPIO-Output/gpio16_blink.s @@ -0,0 +1,169 @@ +/** + * FILE: main.s + * + * DESCRIPTION: + * RP2350 Bare-Metal GPIO16 Blink, Coprocessor Version. + * Minimal bare‑metal LED blink on the RP2350 using direct coprocessor + * (MCRR) instructions to manipulate GPIO control registers. This bypasses + * SDK abstractions and demonstrates register‑level control in assembler. + * + * AUTHOR: Kevin Thomas + * CREATION DATE: October 5, 2025 + * UPDATE DATE: October 5, 2025 + */ + +.syntax unified // use unified assembly syntax +.cpu cortex-m33 // target Cortex-M33 core +.thumb // use Thumb instruction set + +/** + * Memory addresses and constants. + */ +.equ IO_BANK0_BASE, 0x40028000 // base address of IO_BANK0 +.equ PADS_BANK0_BASE, 0x40038000 // base address of PADS_BANK0 +.equ SIO_BASE, 0xD0000000 // base address of SIO block + +.equ GPIO16_CTRL, 0x84 // io[16].ctrl offset +.equ GPIO16_PAD, 0x44 // pads io[16] offset +.equ GPIO16_BIT, (1 << 16) // bit mask for GPIO16 + +.equ GPIO_OUT_SET, 0x18 // SIO->GPIO_OUT_SET offset +.equ GPIO_OUT_XOR, 0x28 // SIO->GPIO_OUT_XOR offset +.equ GPIO_OE_SET, 0x38 // SIO->GPIO_OE_SET offset + +.equ STACK_TOP, 0x20082000 // top of non-secure SRAM +.equ STACK_LIMIT, 0x2007A000 // stack limit (32 KB below top) + +/** + * Vector table section. + */ +.section .vectors, "ax" // vector table section +.align 2 // align to 4 bytes +.global _vectors // export symbol +_vectors: + .word STACK_TOP // initial stack pointer + .word Reset_Handler + 1 // reset handler (Thumb bit set) + +/** + * @brief Reset handler for RP2350. + * @details Entry point after reset. Performs: + * - Stack initialization + * - Coprocessor enable + * - GPIO16 pad/function configuration + * - Infinite blink loop using coprocessor writes + * @param None + * @retval None + */ +.section .text // code section +.align 2 // align functions +.global Reset_Handler // export Reset_Handler +.type Reset_Handler, %function // mark as function + +Reset_Handler: + BL init_stack // initialize MSP/PSP and limits + BL enable_coprocessor // enable CP0 in CPACR for MCRR + BL gpio16_config // configure pads and FUNCSEL for GPIO16 +blink_loop: + BL gpio16_set // set GPIO16 high + BL delay // delay ~500 ms + BL gpio16_clear // set GPIO16 low + BL delay // delay ~500 ms + B blink_loop // loop forever + +.size Reset_Handler, . - Reset_Handler + +/** + * @brief Initialize stack pointers. + * @details Sets Main and Process Stack Pointers (MSP/PSP) and their limits. + * @param None + * @retval None + */ +.type init_stack, %function +init_stack: + LDR R0, =STACK_TOP // load stack top + MSR PSP, R0 // set PSP + LDR R0, =STACK_LIMIT // load stack limit + MSR MSPLIM, R0 // set MSP limit + MSR PSPLIM, R0 // set PSP limit + LDR R0, =STACK_TOP // reload stack top + MSR MSP, R0 // set MSP + BX LR // return + +/** + * @brief Enable coprocessor access. + * @details Grants full access to coprocessor 0 (CP0) via CPACR. + * @param None + * @retval None + */ +.type enable_coprocessor, %function +enable_coprocessor: + LDR R0, =0xE000ED88 // CPACR address + LDR R1, [R0] // read CPACR + ORR R1, R1, #0x3 // set CP0 full access + STR R1, [R0] // write CPACR + DSB // data sync barrier + ISB // instruction sync barrier + BX LR // return + +/** + * @brief Configure GPIO16 for SIO control. + * @details Sets pad control (IE, OD, ISO) and FUNCSEL = 5 (SIO). Enables OE. + * @param None + * @retval None + */ +.type gpio16_config, %function +gpio16_config: + LDR R3, =PADS_BANK0_BASE + GPIO16_PAD // pad control address + LDR R2, [R3] // read pad config + BIC R2, R2, #0x80 // clear OD + ORR R2, R2, #0x40 // set IE + BIC R2, R2, #0x100 // clear ISO + STR R2, [R3] // write pad config + LDR R3, =IO_BANK0_BASE + GPIO16_CTRL // IO control address + LDR R2, [R3] // read IO config + BIC R2, R2, #0x1F // clear FUNCSEL + ORR R2, R2, #5 // set FUNCSEL = 5 + STR R2, [R3] // write IO config + MOVS R4, #16 // GPIO number + MOVS R5, #1 // enable output + MCRR p0, #4, R4, R5, c4 // gpioc_bit_oe_put(16, 1) + BX LR // return + +/** + * @brief Set GPIO16 high. + * @details Drives GPIO16 output = 1 via coprocessor MCRR. + * @param None + * @retval None + */ +.type gpio16_set, %function +gpio16_set: + MOVS R4, #16 // GPIO number + MOVS R5, #1 // logic high + MCRR p0, #4, R4, R5, c0 // gpioc_bit_out_put(16, 1) + BX LR // return + +/** + * @brief Clear GPIO16 (set low). + * @details Drives GPIO16 output = 0 via coprocessor MCRR. + * @param None + * @retval None + */ +.type gpio16_clear, %function +gpio16_clear: + MOVS R4, #16 // GPIO number + MOVS R5, #0 // logic low + MCRR p0, #4, R4, R5, c0 // gpioc_bit_out_put(16, 0) + BX LR // return + +/** + * @brief Busy‑wait delay loop. + * @details Consumes ~2,000,000 cycles to approximate ~500 ms at boot clock. + * @param None + * @retval None + */ +.type delay, %function +delay: + LDR R2, =2000000 // loop count +1:SUBS R2, R2, #1 // decrement + BNE 1b // loop until zero + BX LR // return diff --git a/RA-0x0001-GPIO-Output/gpio16_blink.uf2 b/RA-0x0001-GPIO-Output/gpio16_blink.uf2 new file mode 100644 index 0000000000000000000000000000000000000000..51c3b20301a88490b119d2bc75e997eea31b1f63 GIT binary patch literal 1024 zcmWG_GvW#ljGf1zzyJaQ42)o!feA=O{_lRmpunNP2@?On`-96u3)xFlIP@U}j`Y*#FtTfB)zF{sMOqZ>bEW z4-HIC9~_vJzBCj`B?y2;o%a)lztKO-dmK}i4>|No)sq0&@n^{@?y5$Z8e`~v{l CC}3Lv literal 0 HcmV?d00001 diff --git a/RA-0x0001-GPIO-Output/image_def.s b/RA-0x0001-GPIO-Output/image_def.s new file mode 100644 index 0000000..c34caf4 --- /dev/null +++ b/RA-0x0001-GPIO-Output/image_def.s @@ -0,0 +1,39 @@ +/** + * FILE: image_def.s + * + * DESCRIPTION: + * RP2350 IMAGE_DEF Block. + * A minimum amount of metadata (a valid IMAGE_DEF block) must be embedded in any + * binary for the bootrom to recognise it as a valid program image, as opposed to, + * for example, blank flash contents or a disconnected flash device. This must + * appear within the first 4 kB of a flash image, or anywhere in a RAM or OTP image. + * + * Unlike RP2040, there is no requirement for flash binaries to have a checksummed + * "boot2" flash setup function at flash address 0. The RP2350 bootrom performs a + * simple best‑effort XIP setup during flash scanning, and a flash‑resident program + * can continue executing in this state, or can choose to reconfigure the QSPI + * interface at a later time for best performance. + * + * AUTHOR: Kevin Thomas + * CREATION DATE: October 5, 2025 + * UPDATE DATE: October 5, 2025 + * + * REFERENCE: + * RP2350 Datasheet, Section 5.9.5 Minimum viable image metadata + * + * NOTES: + * In the Pico SDK, this block is generated automatically from + * embedded_start_block.inc.S / embedded_end_block.inc.S. + */ + +.section .picobin_block, "a" // place IMAGE_DEF block in flash + +.word 0xffffded3 // PICOBIN_BLOCK_MARKER_START +.byte 0x42 // PICOBIN_BLOCK_ITEM_1BS_IMAGE_TYPE +.byte 0x1 // item is 1 word in size +.hword 0b0001000000100001 // SECURE mode (0x1021) +.byte 0xff // PICOBIN_BLOCK_ITEM_2BS_LAST +.hword 0x0001 // item is 1 word in size +.byte 0x0 // pad +.word 0x0 // relative pointer to next block (0 = loop to self) +.word 0xab123579 // PICOBIN_BLOCK_MARKER_END diff --git a/RA-0x0001-GPIO-Output/linker.ld b/RA-0x0001-GPIO-Output/linker.ld new file mode 100644 index 0000000..f8aa36d --- /dev/null +++ b/RA-0x0001-GPIO-Output/linker.ld @@ -0,0 +1,104 @@ +/** + * FILE: linker.ld + * + * DESCRIPTION: + * RP2350 Minimal Linker Script for bare‑metal development. + * Ensures the boot ROM accepts and runs the image by: + * - Placing the IMAGE_DEF block first at 0x10000000 + * - Aligning the vector table to a 128‑byte boundary within the first 4 KB + * - Defining a non‑secure stack region in SRAM + * + * AUTHOR: Kevin Thomas + * CREATION DATE: October 5, 2025 + * UPDATE DATE: October 5, 2025 + * + * KEY FEATURES: + * - FLASH origin at 0x10000000 (XIP base), 32 MB length + * - RAM origin at 0x20000000, 512 KB non‑secure window + * - IMAGE_DEF block emitted before all other sections + * - Vector table alignment and assertion to satisfy ROM requirements + * - Symbols for __StackTop, __StackLimit, and __Vectors provided + * + * REFERENCE: + * RP2350 Datasheet, Section 5.9.5 Minimum viable image metadata + * + * NOTES: + * This script is intentionally minimal to support reproducible, + * SDK‑free bare‑metal builds. It pairs with a standalone IMAGE_DEF + * assembly file and a vector table defined in your startup code. + */ + +ENTRY(Reset_Handler) + +/** + * Define memory regions. + */ +__XIP_BASE = 0x10000000; +__XIP_SIZE = 32M; + +__SRAM_BASE = 0x20000000; +__SRAM_SIZE = 512K; /* non-secure window */ +__STACK_SIZE = 32K; + +MEMORY +{ + RAM (rwx) : ORIGIN = __SRAM_BASE, LENGTH = __SRAM_SIZE + FLASH (rx) : ORIGIN = __XIP_BASE, LENGTH = __XIP_SIZE +} + +/** + * Program headers. + */ +PHDRS +{ + text PT_LOAD FLAGS(5); /* RX */ +} + +/** + * Section placement. + */ +SECTIONS +{ + . = ORIGIN(FLASH); + + /** + * Minimal IMAGE_DEF must be first. + */ + .embedded_block : + { + KEEP(*(.embedded_block)) + } > FLASH :text + + /** + * Force the vector table section start to a 128-byte boundary. + */ + .vectors ALIGN(128) : + { + KEEP(*(.vectors)) + } > FLASH :text + + ASSERT(((ADDR(.vectors) - ORIGIN(FLASH)) < 0x1000), + "Vector table must be in first 4KB of flash") + + /** + * Text and read-only data. + */ + .text : + { + . = ALIGN(4); + *(.text*) + *(.rodata*) + KEEP(*(.ARM.attributes)) + } > FLASH :text + + /** + * Non-secure stack symbols. + */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); /* 0x20080000 */ + __StackLimit = __StackTop - __STACK_SIZE; + __stack = __StackTop; + + .stack (NOLOAD) : { . = ALIGN(8); } > RAM + + PROVIDE(__Vectors = ADDR(.vectors)); +} diff --git a/RA-0x0001-GPIO-Output/review.bat b/RA-0x0001-GPIO-Output/review.bat new file mode 100644 index 0000000..bb6ee6c --- /dev/null +++ b/RA-0x0001-GPIO-Output/review.bat @@ -0,0 +1,69 @@ +@echo off +REM ============================================================================ +REM FILE: review.bat +REM +REM DESCRIPTION: +REM Review script for RP2350 ELF and BIN outputs. +REM Runs a suite of GNU binutils tools to inspect ELF and BIN files. +REM Dumps results into text files for easy review. +REM +REM AUTHOR: Kevin Thomas +REM CREATION DATE: October 5, 2025 +REM UPDATE DATE: October 5, 2025 +REM ============================================================================ + +set ELF_FILE=gpio16_blink.elf +set BIN_FILE=gpio16_blink.bin +set OUT_DIR=review_reports + +if not exist %OUT_DIR% mkdir %OUT_DIR% + +echo Reviewing %ELF_FILE% and %BIN_FILE% ... + +REM ============================================================================ +REM ELF inspection tools +REM ============================================================================ +arm-none-eabi-readelf -a %ELF_FILE% > %OUT_DIR%\readelf_all.txt +arm-none-eabi-readelf -h %ELF_FILE% > %OUT_DIR%\readelf_header.txt +arm-none-eabi-readelf -S %ELF_FILE% > %OUT_DIR%\readelf_sections.txt +arm-none-eabi-readelf -s %ELF_FILE% > %OUT_DIR%\readelf_symbols.txt +arm-none-eabi-readelf -r %ELF_FILE% > %OUT_DIR%\readelf_relocs.txt + +arm-none-eabi-objdump -x %ELF_FILE% > %OUT_DIR%\objdump_headers.txt +arm-none-eabi-objdump -d %ELF_FILE% > %OUT_DIR%\objdump_disasm.txt +arm-none-eabi-objdump -s %ELF_FILE% > %OUT_DIR%\objdump_fullhex.txt +arm-none-eabi-objdump -h %ELF_FILE% > %OUT_DIR%\objdump_sections.txt + +arm-none-eabi-nm -n %ELF_FILE% > %OUT_DIR%\nm_symbols.txt +arm-none-eabi-size %ELF_FILE% > %OUT_DIR%\size.txt +arm-none-eabi-strings %ELF_FILE% > %OUT_DIR%\strings.txt + +REM ============================================================================ +REM BIN inspection tools +REM ============================================================================ +xxd -g4 -l 256 %BIN_FILE% > %OUT_DIR%\bin_hexdump.txt + +REM ============================================================================ +REM Summary +REM ============================================================================ +echo. +echo ======================================== +echo REVIEW COMPLETE +echo Reports written to %OUT_DIR%\ +echo ======================================== +echo. +echo Key files: +echo - readelf_all.txt (everything about ELF) +echo - objdump_disasm.txt (disassembly) +echo - nm_symbols.txt (symbols) +echo - size.txt (section sizes) +echo - bin_hexdump.txt (first 256 bytes of BIN) +echo. +goto end + +:error +echo. +echo REVIEW FAILED! +echo. + +:end diff --git a/RA-0x0001-GPIO-Output/review_reports/bin_hexdump.txt b/RA-0x0001-GPIO-Output/review_reports/bin_hexdump.txt new file mode 100644 index 0000000..e69de29 diff --git a/RA-0x0001-GPIO-Output/review_reports/nm_symbols.txt b/RA-0x0001-GPIO-Output/review_reports/nm_symbols.txt new file mode 100644 index 0000000..66bdb82 --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/nm_symbols.txt @@ -0,0 +1,28 @@ +00000018 a GPIO_OUT_SET +00000028 a GPIO_OUT_XOR +00000038 a GPIO_OE_SET +00000044 a GPIO16_PAD +00000084 a GPIO16_CTRL +00008000 A __STACK_SIZE +00010000 a GPIO16_BIT +00080000 A __SRAM_SIZE +02000000 A __XIP_SIZE +10000000 A __XIP_BASE +10000000 T _vectors +10000008 T Reset_Handler +10000014 t blink_loop +10000026 t init_stack +1000003e t enable_coprocessor +10000052 t gpio16_config +1000007c t gpio16_set +10000086 t gpio16_clear +10000090 t delay +20000000 A __SRAM_BASE +20078000 A __StackLimit +2007a000 a STACK_LIMIT +20080000 A __stack +20080000 T __StackTop +20082000 a STACK_TOP +40028000 a IO_BANK0_BASE +40038000 a PADS_BANK0_BASE +d0000000 a SIO_BASE diff --git a/RA-0x0001-GPIO-Output/review_reports/objdump_disasm.txt b/RA-0x0001-GPIO-Output/review_reports/objdump_disasm.txt new file mode 100644 index 0000000..eab22f2 --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/objdump_disasm.txt @@ -0,0 +1,101 @@ + +gpio16_blink.elf: file format elf32-littlearm + + +Disassembly of section .vectors: + +10000000 <_vectors>: +10000000: 20082000 .word 0x20082000 +10000004: 10000009 .word 0x10000009 + +Disassembly of section .text: + +10000008 : +10000008: f000 f80d bl 10000026 +1000000c: f000 f817 bl 1000003e +10000010: f000 f81f bl 10000052 + +10000014 : +10000014: f000 f832 bl 1000007c +10000018: f000 f83a bl 10000090 +1000001c: f000 f833 bl 10000086 +10000020: f000 f836 bl 10000090 +10000024: e7f6 b.n 10000014 + +10000026 : +10000026: 481c ldr r0, [pc, #112] @ (10000098 ) +10000028: f380 8809 msr PSP, r0 +1000002c: 481b ldr r0, [pc, #108] @ (1000009c ) +1000002e: f380 880a msr MSPLIM, r0 +10000032: f380 880b msr PSPLIM, r0 +10000036: 4818 ldr r0, [pc, #96] @ (10000098 ) +10000038: f380 8808 msr MSP, r0 +1000003c: 4770 bx lr + +1000003e : +1000003e: 4818 ldr r0, [pc, #96] @ (100000a0 ) +10000040: 6801 ldr r1, [r0, #0] +10000042: f041 0103 orr.w r1, r1, #3 +10000046: 6001 str r1, [r0, #0] +10000048: f3bf 8f4f dsb sy +1000004c: f3bf 8f6f isb sy +10000050: 4770 bx lr + +10000052 : +10000052: 4b14 ldr r3, [pc, #80] @ (100000a4 ) +10000054: 681a ldr r2, [r3, #0] +10000056: f022 0280 bic.w r2, r2, #128 @ 0x80 +1000005a: f042 0240 orr.w r2, r2, #64 @ 0x40 +1000005e: f422 7280 bic.w r2, r2, #256 @ 0x100 +10000062: 601a str r2, [r3, #0] +10000064: 4b10 ldr r3, [pc, #64] @ (100000a8 ) +10000066: 681a ldr r2, [r3, #0] +10000068: f022 021f bic.w r2, r2, #31 +1000006c: f042 0205 orr.w r2, r2, #5 +10000070: 601a str r2, [r3, #0] +10000072: 2410 movs r4, #16 +10000074: 2501 movs r5, #1 +10000076: ec45 4044 stcl 0, cr4, [r5], {68} @ 0x44 +1000007a: 4770 bx lr + +1000007c : +1000007c: 2410 movs r4, #16 +1000007e: 2501 movs r5, #1 +10000080: ec45 4040 stcl 0, cr4, [r5], {64} @ 0x40 +10000084: 4770 bx lr + +10000086 : +10000086: 2410 movs r4, #16 +10000088: 2500 movs r5, #0 +1000008a: ec45 4040 stcl 0, cr4, [r5], {64} @ 0x40 +1000008e: 4770 bx lr + +10000090 : +10000090: 4a06 ldr r2, [pc, #24] @ (100000ac ) +10000092: 3a01 subs r2, #1 +10000094: d1fd bne.n 10000092 +10000096: 4770 bx lr +10000098: 20082000 .word 0x20082000 +1000009c: 2007a000 .word 0x2007a000 +100000a0: e000ed88 .word 0xe000ed88 +100000a4: 40038044 .word 0x40038044 +100000a8: 40028084 .word 0x40028084 +100000ac: 001e8480 .word 0x001e8480 +100000b0: 00002341 .word 0x00002341 +100000b4: 61656100 .word 0x61656100 +100000b8: 01006962 .word 0x01006962 +100000bc: 00000019 .word 0x00000019 +100000c0: 726f4305 .word 0x726f4305 +100000c4: 2d786574 .word 0x2d786574 +100000c8: 0033334d .word 0x0033334d +100000cc: 4d071106 .word 0x4d071106 +100000d0: 012e0309 .word 0x012e0309 +100000d4: 00002341 .word 0x00002341 +100000d8: 61656100 .word 0x61656100 +100000dc: 01006962 .word 0x01006962 +100000e0: 00000019 .word 0x00000019 +100000e4: 726f4305 .word 0x726f4305 +100000e8: 2d786574 .word 0x2d786574 +100000ec: 0033334d .word 0x0033334d +100000f0: 4d071106 .word 0x4d071106 +100000f4: 012e0309 .word 0x012e0309 diff --git a/RA-0x0001-GPIO-Output/review_reports/objdump_fullhex.txt b/RA-0x0001-GPIO-Output/review_reports/objdump_fullhex.txt new file mode 100644 index 0000000..7757767 --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/objdump_fullhex.txt @@ -0,0 +1,24 @@ + +gpio16_blink.elf: file format elf32-littlearm + +Contents of section .vectors: + 10000000 00200820 09000010 . . .... +Contents of section .text: + 10000008 00f00df8 00f017f8 00f01ff8 00f032f8 ..............2. + 10000018 00f03af8 00f033f8 00f036f8 f6e71c48 ..:...3...6....H + 10000028 80f30988 1b4880f3 0a8880f3 0b881848 .....H.........H + 10000038 80f30888 70471848 016841f0 03010160 ....pG.H.hA....` + 10000048 bff34f8f bff36f8f 7047144b 1a6822f0 ..O...o.pG.K.h". + 10000058 800242f0 400222f4 80721a60 104b1a68 ..B.@."..r.`.K.h + 10000068 22f01f02 42f00502 1a601024 012545ec "...B....`.$.%E. + 10000078 44407047 10240125 45ec4040 70471024 D@pG.$.%E.@@pG.$ + 10000088 002545ec 40407047 064a013a fdd17047 .%E.@@pG.J.:..pG + 10000098 00200820 00a00720 88ed00e0 44800340 . . ... ....D..@ + 100000a8 84800240 80841e00 41230000 00616561 ...@....A#...aea + 100000b8 62690001 19000000 05436f72 7465782d bi.......Cortex- + 100000c8 4d333300 0611074d 09032e01 41230000 M33....M....A#.. + 100000d8 00616561 62690001 19000000 05436f72 .aeabi.......Cor + 100000e8 7465782d 4d333300 0611074d 09032e01 tex-M33....M.... +Contents of section .picobin_block: + 100000f8 d3deffff 42012110 ff010000 00000000 ....B.!......... + 10000108 793512ab y5.. diff --git a/RA-0x0001-GPIO-Output/review_reports/objdump_headers.txt b/RA-0x0001-GPIO-Output/review_reports/objdump_headers.txt new file mode 100644 index 0000000..c3eab23 --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/objdump_headers.txt @@ -0,0 +1,58 @@ + +gpio16_blink.elf: file format elf32-littlearm +gpio16_blink.elf +architecture: armv3m, flags 0x00000112: +EXEC_P, HAS_SYMS, D_PAGED +start address 0x10000009 + +Program Header: + LOAD off 0x00001000 vaddr 0x10000000 paddr 0x10000000 align 2**12 + filesz 0x0000010c memsz 0x0000010c flags r-x +private flags = 0x5000200: [Version5 EABI] [soft-float ABI] + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .vectors 00000008 10000000 10000000 00001000 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .text 000000f0 10000008 10000008 00001008 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .picobin_block 00000014 100000f8 100000f8 000010f8 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .stack 00000000 20000000 20000000 0000110c 2**0 + CONTENTS +SYMBOL TABLE: +10000000 l d .vectors 00000000 .vectors +10000008 l d .text 00000000 .text +100000f8 l d .picobin_block 00000000 .picobin_block +20000000 l d .stack 00000000 .stack +00000000 l df *ABS* 00000000 gpio16_blink.o +40028000 l *ABS* 00000000 IO_BANK0_BASE +40038000 l *ABS* 00000000 PADS_BANK0_BASE +d0000000 l *ABS* 00000000 SIO_BASE +00000084 l *ABS* 00000000 GPIO16_CTRL +00000044 l *ABS* 00000000 GPIO16_PAD +00010000 l *ABS* 00000000 GPIO16_BIT +00000018 l *ABS* 00000000 GPIO_OUT_SET +00000028 l *ABS* 00000000 GPIO_OUT_XOR +00000038 l *ABS* 00000000 GPIO_OE_SET +20082000 l *ABS* 00000000 STACK_TOP +2007a000 l *ABS* 00000000 STACK_LIMIT +10000026 l F .text 00000000 init_stack +1000003e l F .text 00000000 enable_coprocessor +10000052 l F .text 00000000 gpio16_config +10000014 l .text 00000000 blink_loop +1000007c l F .text 00000000 gpio16_set +10000090 l F .text 00000000 delay +10000086 l F .text 00000000 gpio16_clear +00080000 g *ABS* 00000000 __SRAM_SIZE +10000000 g .vectors 00000000 _vectors +20000000 g *ABS* 00000000 __SRAM_BASE +10000008 g F .text 0000001e Reset_Handler +00008000 g *ABS* 00000000 __STACK_SIZE +20080000 g .text 00000000 __StackTop +20080000 g *ABS* 00000000 __stack +20078000 g *ABS* 00000000 __StackLimit +02000000 g *ABS* 00000000 __XIP_SIZE +10000000 g *ABS* 00000000 __XIP_BASE + + diff --git a/RA-0x0001-GPIO-Output/review_reports/objdump_sections.txt b/RA-0x0001-GPIO-Output/review_reports/objdump_sections.txt new file mode 100644 index 0000000..b6080a2 --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/objdump_sections.txt @@ -0,0 +1,13 @@ + +gpio16_blink.elf: file format elf32-littlearm + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .vectors 00000008 10000000 10000000 00001000 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .text 000000f0 10000008 10000008 00001008 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .picobin_block 00000014 100000f8 100000f8 000010f8 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .stack 00000000 20000000 20000000 0000110c 2**0 + CONTENTS diff --git a/RA-0x0001-GPIO-Output/review_reports/readelf_all.txt b/RA-0x0001-GPIO-Output/review_reports/readelf_all.txt new file mode 100644 index 0000000..3ec009b --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/readelf_all.txt @@ -0,0 +1,97 @@ +ELF Header: + Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 + Class: ELF32 + Data: 2's complement, little endian + Version: 1 (current) + OS/ABI: UNIX - System V + ABI Version: 0 + Type: EXEC (Executable file) + Machine: ARM + Version: 0x1 + Entry point address: 0x10000009 + Start of program headers: 52 (bytes into file) + Start of section headers: 5424 (bytes into file) + Flags: 0x5000200, Version5 EABI, soft-float ABI + Size of this header: 52 (bytes) + Size of program headers: 32 (bytes) + Number of program headers: 1 + Size of section headers: 40 (bytes) + Number of section headers: 8 + Section header string table index: 7 + +Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [ 0] NULL 00000000 000000 000000 00 0 0 0 + [ 1] .vectors PROGBITS 10000000 001000 000008 00 AX 0 0 4 + [ 2] .text PROGBITS 10000008 001008 0000f0 00 AX 0 0 4 + [ 3] .picobin_block PROGBITS 100000f8 0010f8 000014 00 A 0 0 1 + [ 4] .stack PROGBITS 20000000 00110c 000000 00 W 0 0 1 + [ 5] .symtab SYMTAB 00000000 00110c 000280 10 6 30 4 + [ 6] .strtab STRTAB 00000000 00138c 000162 00 0 0 1 + [ 7] .shstrtab STRTAB 00000000 0014ee 000040 00 0 0 1 +Key to Flags: + W (write), A (alloc), X (execute), M (merge), S (strings), I (info), + L (link order), O (extra OS processing required), G (group), T (TLS), + C (compressed), x (unknown), o (OS specific), E (exclude), + D (mbind), y (purecode), p (processor specific) + +There are no section groups in this file. + +Program Headers: + Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align + LOAD 0x001000 0x10000000 0x10000000 0x0010c 0x0010c R E 0x1000 + + Section to Segment mapping: + Segment Sections... + 00 .vectors .text .picobin_block + +There is no dynamic section in this file. + +There are no relocations in this file. + +There are no unwind sections in this file. + +Symbol table '.symtab' contains 40 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 00000000 0 NOTYPE LOCAL DEFAULT UND + 1: 10000000 0 SECTION LOCAL DEFAULT 1 .vectors + 2: 10000008 0 SECTION LOCAL DEFAULT 2 .text + 3: 100000f8 0 SECTION LOCAL DEFAULT 3 .picobin_block + 4: 20000000 0 SECTION LOCAL DEFAULT 4 .stack + 5: 00000000 0 FILE LOCAL DEFAULT ABS gpio16_blink.o + 6: 40028000 0 NOTYPE LOCAL DEFAULT ABS IO_BANK0_BASE + 7: 40038000 0 NOTYPE LOCAL DEFAULT ABS PADS_BANK0_BASE + 8: d0000000 0 NOTYPE LOCAL DEFAULT ABS SIO_BASE + 9: 00000084 0 NOTYPE LOCAL DEFAULT ABS GPIO16_CTRL + 10: 00000044 0 NOTYPE LOCAL DEFAULT ABS GPIO16_PAD + 11: 00010000 0 NOTYPE LOCAL DEFAULT ABS GPIO16_BIT + 12: 00000018 0 NOTYPE LOCAL DEFAULT ABS GPIO_OUT_SET + 13: 00000028 0 NOTYPE LOCAL DEFAULT ABS GPIO_OUT_XOR + 14: 00000038 0 NOTYPE LOCAL DEFAULT ABS GPIO_OE_SET + 15: 20082000 0 NOTYPE LOCAL DEFAULT ABS STACK_TOP + 16: 2007a000 0 NOTYPE LOCAL DEFAULT ABS STACK_LIMIT + 17: 10000000 0 NOTYPE LOCAL DEFAULT 1 $d + 18: 10000008 0 NOTYPE LOCAL DEFAULT 2 $t + 19: 10000027 0 FUNC LOCAL DEFAULT 2 init_stack + 20: 1000003f 0 FUNC LOCAL DEFAULT 2 enable_coprocessor + 21: 10000053 0 FUNC LOCAL DEFAULT 2 gpio16_config + 22: 10000014 0 NOTYPE LOCAL DEFAULT 2 blink_loop + 23: 1000007d 0 FUNC LOCAL DEFAULT 2 gpio16_set + 24: 10000091 0 FUNC LOCAL DEFAULT 2 delay + 25: 10000087 0 FUNC LOCAL DEFAULT 2 gpio16_clear + 26: 10000098 0 NOTYPE LOCAL DEFAULT 2 $d + 27: 100000b0 0 NOTYPE LOCAL DEFAULT 2 $d + 28: 100000f8 0 NOTYPE LOCAL DEFAULT 3 $d + 29: 100000d4 0 NOTYPE LOCAL DEFAULT 2 $d + 30: 00080000 0 NOTYPE GLOBAL DEFAULT ABS __SRAM_SIZE + 31: 10000000 0 NOTYPE GLOBAL DEFAULT 1 _vectors + 32: 20000000 0 NOTYPE GLOBAL DEFAULT ABS __SRAM_BASE + 33: 10000009 30 FUNC GLOBAL DEFAULT 2 Reset_Handler + 34: 00008000 0 NOTYPE GLOBAL DEFAULT ABS __STACK_SIZE + 35: 20080000 0 NOTYPE GLOBAL DEFAULT 2 __StackTop + 36: 20080000 0 NOTYPE GLOBAL DEFAULT ABS __stack + 37: 20078000 0 NOTYPE GLOBAL DEFAULT ABS __StackLimit + 38: 02000000 0 NOTYPE GLOBAL DEFAULT ABS __XIP_SIZE + 39: 10000000 0 NOTYPE GLOBAL DEFAULT ABS __XIP_BASE + +No version information found in this file. diff --git a/RA-0x0001-GPIO-Output/review_reports/readelf_header.txt b/RA-0x0001-GPIO-Output/review_reports/readelf_header.txt new file mode 100644 index 0000000..97f0319 --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/readelf_header.txt @@ -0,0 +1,20 @@ +ELF Header: + Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 + Class: ELF32 + Data: 2's complement, little endian + Version: 1 (current) + OS/ABI: UNIX - System V + ABI Version: 0 + Type: EXEC (Executable file) + Machine: ARM + Version: 0x1 + Entry point address: 0x10000009 + Start of program headers: 52 (bytes into file) + Start of section headers: 5424 (bytes into file) + Flags: 0x5000200, Version5 EABI, soft-float ABI + Size of this header: 52 (bytes) + Size of program headers: 32 (bytes) + Number of program headers: 1 + Size of section headers: 40 (bytes) + Number of section headers: 8 + Section header string table index: 7 diff --git a/RA-0x0001-GPIO-Output/review_reports/readelf_relocs.txt b/RA-0x0001-GPIO-Output/review_reports/readelf_relocs.txt new file mode 100644 index 0000000..9a583fb --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/readelf_relocs.txt @@ -0,0 +1,2 @@ + +There are no relocations in this file. diff --git a/RA-0x0001-GPIO-Output/review_reports/readelf_sections.txt b/RA-0x0001-GPIO-Output/review_reports/readelf_sections.txt new file mode 100644 index 0000000..4a033b0 --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/readelf_sections.txt @@ -0,0 +1,17 @@ +There are 8 section headers, starting at offset 0x1530: + +Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [ 0] NULL 00000000 000000 000000 00 0 0 0 + [ 1] .vectors PROGBITS 10000000 001000 000008 00 AX 0 0 4 + [ 2] .text PROGBITS 10000008 001008 0000f0 00 AX 0 0 4 + [ 3] .picobin_block PROGBITS 100000f8 0010f8 000014 00 A 0 0 1 + [ 4] .stack PROGBITS 20000000 00110c 000000 00 W 0 0 1 + [ 5] .symtab SYMTAB 00000000 00110c 000280 10 6 30 4 + [ 6] .strtab STRTAB 00000000 00138c 000162 00 0 0 1 + [ 7] .shstrtab STRTAB 00000000 0014ee 000040 00 0 0 1 +Key to Flags: + W (write), A (alloc), X (execute), M (merge), S (strings), I (info), + L (link order), O (extra OS processing required), G (group), T (TLS), + C (compressed), x (unknown), o (OS specific), E (exclude), + D (mbind), y (purecode), p (processor specific) diff --git a/RA-0x0001-GPIO-Output/review_reports/readelf_symbols.txt b/RA-0x0001-GPIO-Output/review_reports/readelf_symbols.txt new file mode 100644 index 0000000..c196d6b --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/readelf_symbols.txt @@ -0,0 +1,43 @@ + +Symbol table '.symtab' contains 40 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 00000000 0 NOTYPE LOCAL DEFAULT UND + 1: 10000000 0 SECTION LOCAL DEFAULT 1 .vectors + 2: 10000008 0 SECTION LOCAL DEFAULT 2 .text + 3: 100000f8 0 SECTION LOCAL DEFAULT 3 .picobin_block + 4: 20000000 0 SECTION LOCAL DEFAULT 4 .stack + 5: 00000000 0 FILE LOCAL DEFAULT ABS gpio16_blink.o + 6: 40028000 0 NOTYPE LOCAL DEFAULT ABS IO_BANK0_BASE + 7: 40038000 0 NOTYPE LOCAL DEFAULT ABS PADS_BANK0_BASE + 8: d0000000 0 NOTYPE LOCAL DEFAULT ABS SIO_BASE + 9: 00000084 0 NOTYPE LOCAL DEFAULT ABS GPIO16_CTRL + 10: 00000044 0 NOTYPE LOCAL DEFAULT ABS GPIO16_PAD + 11: 00010000 0 NOTYPE LOCAL DEFAULT ABS GPIO16_BIT + 12: 00000018 0 NOTYPE LOCAL DEFAULT ABS GPIO_OUT_SET + 13: 00000028 0 NOTYPE LOCAL DEFAULT ABS GPIO_OUT_XOR + 14: 00000038 0 NOTYPE LOCAL DEFAULT ABS GPIO_OE_SET + 15: 20082000 0 NOTYPE LOCAL DEFAULT ABS STACK_TOP + 16: 2007a000 0 NOTYPE LOCAL DEFAULT ABS STACK_LIMIT + 17: 10000000 0 NOTYPE LOCAL DEFAULT 1 $d + 18: 10000008 0 NOTYPE LOCAL DEFAULT 2 $t + 19: 10000027 0 FUNC LOCAL DEFAULT 2 init_stack + 20: 1000003f 0 FUNC LOCAL DEFAULT 2 enable_coprocessor + 21: 10000053 0 FUNC LOCAL DEFAULT 2 gpio16_config + 22: 10000014 0 NOTYPE LOCAL DEFAULT 2 blink_loop + 23: 1000007d 0 FUNC LOCAL DEFAULT 2 gpio16_set + 24: 10000091 0 FUNC LOCAL DEFAULT 2 delay + 25: 10000087 0 FUNC LOCAL DEFAULT 2 gpio16_clear + 26: 10000098 0 NOTYPE LOCAL DEFAULT 2 $d + 27: 100000b0 0 NOTYPE LOCAL DEFAULT 2 $d + 28: 100000f8 0 NOTYPE LOCAL DEFAULT 3 $d + 29: 100000d4 0 NOTYPE LOCAL DEFAULT 2 $d + 30: 00080000 0 NOTYPE GLOBAL DEFAULT ABS __SRAM_SIZE + 31: 10000000 0 NOTYPE GLOBAL DEFAULT 1 _vectors + 32: 20000000 0 NOTYPE GLOBAL DEFAULT ABS __SRAM_BASE + 33: 10000009 30 FUNC GLOBAL DEFAULT 2 Reset_Handler + 34: 00008000 0 NOTYPE GLOBAL DEFAULT ABS __STACK_SIZE + 35: 20080000 0 NOTYPE GLOBAL DEFAULT 2 __StackTop + 36: 20080000 0 NOTYPE GLOBAL DEFAULT ABS __stack + 37: 20078000 0 NOTYPE GLOBAL DEFAULT ABS __StackLimit + 38: 02000000 0 NOTYPE GLOBAL DEFAULT ABS __XIP_SIZE + 39: 10000000 0 NOTYPE GLOBAL DEFAULT ABS __XIP_BASE diff --git a/RA-0x0001-GPIO-Output/review_reports/size.txt b/RA-0x0001-GPIO-Output/review_reports/size.txt new file mode 100644 index 0000000..71b860f --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/size.txt @@ -0,0 +1,2 @@ + text data bss dec hex filename + 268 0 0 268 10c gpio16_blink.elf diff --git a/RA-0x0001-GPIO-Output/review_reports/strings.txt b/RA-0x0001-GPIO-Output/review_reports/strings.txt new file mode 100644 index 0000000..9b6972a --- /dev/null +++ b/RA-0x0001-GPIO-Output/review_reports/strings.txt @@ -0,0 +1,43 @@ +D@pG +@@pG +@@pG +aeabi +Cortex-M33 +aeabi +Cortex-M33 +gpio16_blink.o +IO_BANK0_BASE +PADS_BANK0_BASE +SIO_BASE +GPIO16_CTRL +GPIO16_PAD +GPIO16_BIT +GPIO_OUT_SET +GPIO_OUT_XOR +GPIO_OE_SET +STACK_TOP +STACK_LIMIT +init_stack +enable_coprocessor +gpio16_config +blink_loop +gpio16_set +delay +gpio16_clear +__SRAM_SIZE +_vectors +__SRAM_BASE +Reset_Handler +__STACK_SIZE +__StackTop +__stack +__StackLimit +__XIP_SIZE +__XIP_BASE +.symtab +.strtab +.shstrtab +.vectors +.text +.picobin_block +.stack diff --git a/RA-0x0001-GPIO-Output/uf2conv.py b/RA-0x0001-GPIO-Output/uf2conv.py new file mode 100644 index 0000000..d6dd7a8 --- /dev/null +++ b/RA-0x0001-GPIO-Output/uf2conv.py @@ -0,0 +1,365 @@ +#!/usr/bin/env python3 +import sys +import struct +import subprocess +import re +import os +import os.path +import argparse +import json +from time import sleep + + +UF2_MAGIC_START0 = 0x0A324655 # "UF2\n" +UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected +UF2_MAGIC_END = 0x0AB16F30 # Ditto + +INFO_FILE = "/INFO_UF2.TXT" + +appstartaddr = 0x2000 +familyid = 0x0 + + +def is_uf2(buf): + w = struct.unpack(" 476: + assert False, "Invalid UF2 data size at " + ptr + newaddr = hd[3] + if (hd[2] & 0x2000) and (currfamilyid == None): + currfamilyid = hd[7] + if curraddr == None or ((hd[2] & 0x2000) and hd[7] != currfamilyid): + currfamilyid = hd[7] + curraddr = newaddr + if familyid == 0x0 or familyid == hd[7]: + appstartaddr = newaddr + padding = newaddr - curraddr + if padding < 0: + assert False, "Block out of order at " + ptr + if padding > 10*1024*1024: + assert False, "More than 10M of padding needed at " + ptr + if padding % 4 != 0: + assert False, "Non-word padding size at " + ptr + while padding > 0: + padding -= 4 + outp.append(b"\x00\x00\x00\x00") + if familyid == 0x0 or ((hd[2] & 0x2000) and familyid == hd[7]): + outp.append(block[32 : 32 + datalen]) + curraddr = newaddr + datalen + if hd[2] & 0x2000: + if hd[7] in families_found.keys(): + if families_found[hd[7]] > newaddr: + families_found[hd[7]] = newaddr + else: + families_found[hd[7]] = newaddr + if prev_flag == None: + prev_flag = hd[2] + if prev_flag != hd[2]: + all_flags_same = False + if blockno == (numblocks - 1): + print("--- UF2 File Header Info ---") + families = load_families() + for family_hex in families_found.keys(): + family_short_name = "" + for name, value in families.items(): + if value == family_hex: + family_short_name = name + print("Family ID is {:s}, hex value is 0x{:08x}".format(family_short_name,family_hex)) + print("Target Address is 0x{:08x}".format(families_found[family_hex])) + if all_flags_same: + print("All block flag values consistent, 0x{:04x}".format(hd[2])) + else: + print("Flags were not all the same") + print("----------------------------") + if len(families_found) > 1 and familyid == 0x0: + outp = [] + appstartaddr = 0x0 + return b"".join(outp) + +def convert_to_carray(file_content): + outp = "const unsigned long bindata_len = %d;\n" % len(file_content) + outp += "const unsigned char bindata[] __attribute__((aligned(16))) = {" + for i in range(len(file_content)): + if i % 16 == 0: + outp += "\n" + outp += "0x%02x, " % file_content[i] + outp += "\n};\n" + return bytes(outp, "utf-8") + +def convert_to_uf2(file_content): + global familyid + datapadding = b"" + while len(datapadding) < 512 - 256 - 32 - 4: + datapadding += b"\x00\x00\x00\x00" + numblocks = (len(file_content) + 255) // 256 + outp = [] + for blockno in range(numblocks): + ptr = 256 * blockno + chunk = file_content[ptr:ptr + 256] + flags = 0x0 + if familyid: + flags |= 0x2000 + hd = struct.pack(b"