From b06ea7fe9647252fbe389e0ed87fa53ec2027e71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eckhart=20K=C3=B6ppen?= Date: Mon, 4 May 2026 15:50:37 +0300 Subject: [PATCH] Fetch REx drivers dependencies automatically Use CMake to fetch the NCT headers, DCL, and tntk to enable building the REx drivers in one go. Restructure the CMake file to build host and target portions separately. --- .github/workflows/rex.yml | 30 +--- Drivers/CMakeLists.txt | 157 ++++++------------ Drivers/Einstein.rex.src | 1 + Drivers/EinsteinPortEnabler/CMakeLists.txt | 38 ++++- Drivers/EinsteinPortEnabler/portenabler.newt | 5 +- Drivers/EinsteinPortEnabler/portenabler.pkg | Bin 7704 -> 7632 bytes Drivers/README.md | 50 +++--- Drivers/host/CMakeLists.txt | 30 ++++ Drivers/target/CMakeLists.txt | 99 +++++++++++ Resources/Base.lproj/Einstein.xib | 81 ++++----- .../Xcode/Einstein.xcodeproj/project.pbxproj | 35 ++-- _Data_/Einstein.rex | Bin 289840 -> 296180 bytes 12 files changed, 302 insertions(+), 224 deletions(-) create mode 100644 Drivers/host/CMakeLists.txt create mode 100644 Drivers/target/CMakeLists.txt diff --git a/.github/workflows/rex.yml b/.github/workflows/rex.yml index 66cd43569..5ccafc572 100644 --- a/.github/workflows/rex.yml +++ b/.github/workflows/rex.yml @@ -11,7 +11,6 @@ on: env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) BUILD_TYPE: Release - NCT_PROJECTS: ${{ github.workspace }}/NCT_Projects jobs: build: @@ -19,41 +18,14 @@ jobs: steps: - name: Get dependencies run: sudo apt-get install -y gcc-arm-none-eabi cmake make - - name: Get NCT_Projects headers - uses: actions/checkout@v4 - with: - repository: ekoeppen/NCT_Projects - path: NCT_Projects - - name: Get tntk - uses: actions/checkout@v4 - with: - repository: ekoeppen/tntk - path: tntk - submodules: recursive - - name: Compile tntk - run: | - cmake -S tntk -B tntk/build - cmake --build tntk/build - sudo cmake --install tntk/build - - name: Get DCL - uses: actions/checkout@v4 - with: - repository: pguyot/DCL - path: DCL - - name: Compile DCL - run: | - cmake -S DCL -B DCL/build - cmake --build DCL/build - sudo cmake --install DCL/build - name: Get Einstein sources uses: actions/checkout@v4 with: path: Einstein - name: Compile the REx run: | - cmake -S Einstein/Drivers -B Einstein/Drivers/build -DCMAKE_TOOLCHAIN_FILE=cmake/newton-cross.cmake + cmake -S Einstein/Drivers -B Einstein/Drivers/build cmake --build Einstein/Drivers/build - cmake --install Einstein/Drivers/build - name: Store the REx uses: actions/upload-artifact@v4 with: diff --git a/Drivers/CMakeLists.txt b/Drivers/CMakeLists.txt index ba40e1837..d1be126f8 100644 --- a/Drivers/CMakeLists.txt +++ b/Drivers/CMakeLists.txt @@ -1,104 +1,53 @@ -cmake_minimum_required(VERSION 3.10) -enable_language(ASM) - -set(NCT_PROJECTS $ENV{NCT_PROJECTS}) - -set(LINK_OPTIONS - -L ${CMAKE_SOURCE_DIR} - -Tprotocol.ld --version-script=protocol.map) - -set(INCLUDE_DIRECTORIES - . - ${CMAKE_SOURCE_DIR}/.. - ${NCT_PROJECTS}/DDKIncludes - ${NCT_PROJECTS}/DDKIncludes/Bootstrap - ${NCT_PROJECTS}/DDKIncludes/CLibrary - ${NCT_PROJECTS}/DDKIncludes/CommAPI - ${NCT_PROJECTS}/DDKIncludes/Communications - ${NCT_PROJECTS}/DDKIncludes/Frames - ${NCT_PROJECTS}/DDKIncludes/HAL - ${NCT_PROJECTS}/DDKIncludes/Lantern - ${NCT_PROJECTS}/DDKIncludes/OS600 - ${NCT_PROJECTS}/DDKIncludes/Packages - ${NCT_PROJECTS}/DDKIncludes/Power - ${NCT_PROJECTS}/DDKIncludes/QD - ${NCT_PROJECTS}/DDKIncludes/Toolbox - ${NCT_PROJECTS}/DDKIncludes/UtilityClasses - ${NCT_PROJECTS}/DDKIncludes/PCMCIA - ${NCT_PROJECTS}/Includes - ${NCT_PROJECTS}/Includes/CLibrary - ${NCT_PROJECTS}/Includes/Frames - ${NCT_PROJECTS}/Includes/Utilities - ${NCT_PROJECTS}/LanternDriver_DDK/Includes - ${NCT_PROJECTS}/NSandDDK - ${NCT_PROJECTS}) - -file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/obj) - -# -- Shared runtime, containing the NewtonOS APIs and additional glue code - -project(Runtime) -add_library(Runtime - Glue.s UGlue.cpp NewtonRuntime/NewtonRuntime.cpp NewtonRuntime/NewtonPublicAPIs.s NativePrimitives.s) -target_include_directories(Runtime PRIVATE ${INCLUDE_DIRECTORIES}) -target_link_options(Runtime PRIVATE ${LINK_OPTIONS}) - -# -- Drivers to interface with the Einstein emulator and host system - -macro(define_driver DRIVER) - project(${DRIVER}) - add_executable(${DRIVER} ${ARGN}) - add_dependencies(${DRIVER} Runtime) - target_link_libraries(${DRIVER} Runtime) - target_include_directories(${DRIVER} PRIVATE ${INCLUDE_DIRECTORIES}) - target_link_options(${DRIVER} PRIVATE ${LINK_OPTIONS}) - add_custom_command(TARGET ${DRIVER} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_SOURCE_DIR}/obj/$.pkg - COMMAND ELFtoPKG -o ${CMAKE_SOURCE_DIR}/obj/$.pkg $:Einstein -protocol - $ -autoLoad -autoRemove) -endmacro() - -define_driver(EinsteinBatteryDriver PMainBatteryDriver.cpp PMainBatteryDriver.impl.s PMainBatteryDriverPrims.s) -define_driver(EinsteinStartupDriver TMainStartupDriver.cpp TMainStartupDriver.impl.s) -define_driver(EinsteinPlatformDriver TMainPlatformDriver.cpp TMainPlatformDriver.impl.s TMainPlatformDriverPrims.s) -define_driver(EinsteinSoundDriver PMainSoundDriver.cpp PMainSoundDriver.impl.s PMainSoundDriverPrims.s) -define_driver(EinsteinScreenDriver TMainDisplayDriver.cpp TMainDisplayDriver.impl.s TMainDisplayDriverPrims.s) -define_driver(EinsteinTabletDriver TMainTabletDriver.cpp TMainTabletDriver.impl.s TMainTabletDriverPrims.s) -define_driver(EinsteinVersionString TMainVersionString.cpp TMainVersionString.impl.s) -define_driver(EinsteinSerialVoyager TSerialChipVoyager.cpp TSerialChipVoyager.impl.s TSerialChipVoyagerPrims.s) -define_driver(EinsteinInTranslator PEinsteinInTranslator.cpp PEinsteinInTranslator.impl.s PEinsteinInTranslatorPrims.s) -define_driver(EinsteinOutTranslator PEinsteinOutTranslator.cpp PEinsteinOutTranslator.impl.s PEinsteinOutTranslatorPrims.s) -define_driver(EinsteinNativeCalls TEinsteinNativeCalls.cpp TEinsteinNativeCalls.impl.s TEinsteinNativeCallsPrims.s) -define_driver(EinsteinSerialDriver TSerialChipEinstein.cpp TSerialChipEinstein.impl.s TSerialChipEinsteinPrims.s) -define_driver(EinsteinFlashDriver TEinsteinFlashDriver.cpp TEinsteinFlashDriver.impl.s TEinsteinFlashDriverPrims.s) -add_custom_command(TARGET EinsteinFlashDriver POST_BUILD - COMMAND ${OBJCOPY} -O binary $ ${CMAKE_SOURCE_DIR}/obj/$.bin) - -# -- Additional packages - -add_subdirectory(EinsteinPortEnabler) - -# -- Custom target to create the REx, will be always built and installed to the _Data_ directory - -project(Einstein) -add_custom_target(Einstein ALL) -add_dependencies(Einstein - EinsteinBatteryDriver - EinsteinStartupDriver - EinsteinFlashDriver - EinsteinPlatformDriver - EinsteinSoundDriver - EinsteinScreenDriver - EinsteinTabletDriver - EinsteinVersionString - EinsteinSerialDriver - EinsteinSerialVoyager - EinsteinInTranslator - EinsteinOutTranslator - EinsteinNativeCalls - portenabler) -add_custom_command(TARGET Einstein - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E rm -f Einstein.rex - COMMAND Rex -o Einstein.rex Einstein.rex.src) -install(FILES ${CMAKE_SOURCE_DIR}/Einstein.rex DESTINATION ${CMAKE_SOURCE_DIR}/../_Data_/) +cmake_minimum_required(VERSION 3.14) +project(EinsteinDrivers) + +include(ExternalProject) +include(FetchContent) + +# -- Check for ARM toolchain +find_program(ARM_GCC arm-none-eabi-gcc) +if (ARM_GCC) + get_filename_component(ARM_GCC_PATH ${ARM_GCC} DIRECTORY) + message(STATUS "Found ARM GCC at: ${ARM_GCC_PATH}") + message(STATUS "Newton drivers will be built.") + + # -- Fetch NCT_Projects (Headers and platform file) + FetchContent_Declare( + nct_projects + GIT_REPOSITORY https://github.com/ekoeppen/NCT_Projects.git + GIT_TAG main + ) + FetchContent_MakeAvailable(nct_projects) + set(NCT_PROJECTS_DIR ${nct_projects_SOURCE_DIR}) + + # -- Setup Host Tools (DCL tools and tntk) + add_subdirectory(host) + + # -- Build REx + ExternalProject_Add(drivers_target + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/target + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/target-build + # We depend on the tools targets defined in the host sub-project + DEPENDS dcl_host tntk_host + CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/newton-cross.cmake + -DREX_TOOL=${DCL_BIN_DIR}/Rex + -DELFTOPKG_TOOL=${DCL_BIN_DIR}/ELFtoPKG + -DELFTONTK_TOOL=${DCL_BIN_DIR}/ELFtoNTK + -DTNTK_TOOL=${TNTK_BIN_DIR}/tntk + -DNCT_PROJECTS=${NCT_PROJECTS_DIR} + -DEINSTEIN_ROOT=${CMAKE_CURRENT_SOURCE_DIR}/.. + INSTALL_COMMAND "" + BUILD_ALWAYS 1 + ) + + # Expose the final artifact to the parent project + add_custom_target(EinsteinDrivers ALL) + add_dependencies(EinsteinDrivers drivers_target) + + # Copy the finished REx to the build dir so the root can find it + add_custom_command(TARGET EinsteinDrivers POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Einstein.rex ${CMAKE_CURRENT_SOURCE_DIR}/../_Data_/Einstein.rex) +else() + message(STATUS "ARM toolchain NOT found. Skipping driver and host tool build.") +endif() diff --git a/Drivers/Einstein.rex.src b/Drivers/Einstein.rex.src index b1e054270..4475a5046 100644 --- a/Drivers/Einstein.rex.src +++ b/Drivers/Einstein.rex.src @@ -35,6 +35,7 @@ package "obj/EinsteinSerialVoyager.pkg" package "obj/EinsteinInTranslator.pkg" package "obj/EinsteinOutTranslator.pkg" package "obj/EinsteinNativeCalls.pkg" +package "EinsteinPortEnabler/portenabler.pkg" package "PrinterDriver/printerDriver.pkg" // Handlers & NS runtime. package "NSRuntime/Einstein NS Runtime.pkg" diff --git a/Drivers/EinsteinPortEnabler/CMakeLists.txt b/Drivers/EinsteinPortEnabler/CMakeLists.txt index 11dd1dbeb..78fed1c70 100644 --- a/Drivers/EinsteinPortEnabler/CMakeLists.txt +++ b/Drivers/EinsteinPortEnabler/CMakeLists.txt @@ -1,17 +1,41 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.14) project(portenabler) set(CMAKE_EXECUTABLE_SUFFIX ".elf") enable_language(ASM) -find_program(TNTK tntk) -if(${TNTK} STREQUAL "TNTK-NOTFOUND") - message("tntk not found, using precompiled package") +# Resolve tntk: prefer passed tool, then fetched binary, then system PATH +if(DEFINED TNTK_TOOL) + set(TNTK ${TNTK_TOOL}) +elseif(DEFINED TNTK_BINARY_DIR) + set(TNTK ${TNTK_BINARY_DIR}/tntk) + message(STATUS "portenabler: will use fetched tntk at ${TNTK}") +else() + find_program(TNTK tntk) +endif() + +# Resolve ELFtoNTK: prefer passed tool, then fetched DCL binary, then system PATH +if(DEFINED ELFTONTK_TOOL) + set(ELFTONTK ${ELFTONTK_TOOL}) +elseif(DEFINED DCL_BINARY_DIR) + set(ELFTONTK ${DCL_BINARY_DIR}/ELFtoNTK) +else() + find_program(ELFTONTK ELFtoNTK) +endif() + +# If tntk is unavailable even after the above, fall back to precompiled package +if(NOT TNTK) + message(STATUS "tntk not found, using precompiled package") add_custom_target(portenabler ALL) return() endif() -set(NCT_PROJECTS $ENV{NCT_PROJECTS}) add_executable(portenabler main.cpp ../NewtonRuntime/NewtonPublicAPIs.s ../NewtonRuntime/NewtonPrivateAPIs.s) +if (TARGET tntk_ext) + add_dependencies(portenabler tntk_ext) +endif() +if (TARGET dcl) + add_dependencies(portenabler dcl) +endif() target_include_directories(portenabler PRIVATE ${NCT_PROJECTS}/DDKIncludes ${NCT_PROJECTS}/DDKIncludes/Bootstrap @@ -50,8 +74,8 @@ target_link_options(portenabler PRIVATE --no-allow-shlib-undefined --no-export-dynamic --no-undefined -x -Tportenabler.ld --version-script=portenabler.ver) add_custom_command(TARGET portenabler POST_BUILD - COMMAND rm -f ${PROJECT_SOURCE_DIR}/portenabler.ntkc - COMMAND ELFtoNTK -via ${PROJECT_SOURCE_DIR}/portenabler.exp -o ${PROJECT_SOURCE_DIR}/portenabler.ntkc $) + COMMAND ${CMAKE_COMMAND} -E rm -f ${PROJECT_SOURCE_DIR}/portenabler.ntkc + COMMAND ${ELFTONTK} -via ${PROJECT_SOURCE_DIR}/portenabler.exp -o ${PROJECT_SOURCE_DIR}/portenabler.ntkc $) add_custom_command(TARGET portenabler POST_BUILD WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${TNTK} -c -P ${NCT_PROJECTS}/Platforms portenabler.nprj) diff --git a/Drivers/EinsteinPortEnabler/portenabler.newt b/Drivers/EinsteinPortEnabler/portenabler.newt index c1bd05392..fa319d2f1 100644 --- a/Drivers/EinsteinPortEnabler/portenabler.newt +++ b/Drivers/EinsteinPortEnabler/portenabler.newt @@ -65,6 +65,7 @@ constant enablerTemplate := { prefsEntry := GetAppPrefs(kAppSymbol, kPrefsFrame); foreach port, default in kPrefsFrame do if prefsEntry.(port) then partFrame:enable(SPrintObject(port), nil, nil); + return removeFrame; end, devRemoveScript: func (partFrame) begin @@ -73,8 +74,6 @@ constant enablerTemplate := { end, InstallScript: func (partFrame) begin - local removeFrame := EnsureInternal ({ removeScript: partFrame.devRemoveScript }); - partFrame:devInstallScript (partFrame, removeFrame); - return removeFrame; + return partFrame:devInstallScript (partFrame, EnsureInternal ({ removeScript: partFrame.devRemoveScript })); end, }; diff --git a/Drivers/EinsteinPortEnabler/portenabler.pkg b/Drivers/EinsteinPortEnabler/portenabler.pkg index 3c4708b77a92186723f16b95b8bf6f5011cc1ba0..03804ec19767f855fddac246fc1ca0254003d521 100644 GIT binary patch delta 962 zcmah|Pe>F|82@H=+?H*@(G=EoHwFzVP#UO1W~rzl#fLqx(7-Q9W9i*h|wmkNUE_qk(vYvA$T`~LiX-}`;v%;c+m)4RKJ z)lc2lF#Y?gIBJb+4qJ{EouOFKmZ#Q6rJ%eLc0vi$RKjYjhv7!x*#!Fx>?y2iETc|T z4_u;Mo~^aRo*^<3GY$J2HA^P;YT!8}9ZQ$O+#@F_?tiZ=eO#$%{`<-kANADk^c$Hl z{ME=S(sLyoBT8OXvvw*NA!-F^C(#On!Ix00&OXGsAb9G#WF(2YrD#41TNb_&_TTWm zmae;1To%Q(gM{t#jDh_z@LlPcy6@GRq^OL@;w1I06B%;S)&Lv}yqcyqEDZ!F{BPD$ zfQnJ=k6;XF0?7@)QUnNKJIe)w?68`nueA~+B3h8HL%`_8`IeeB4c~Lw{?PYK@;z$8 zd0x6E6mcslU0mt2l+AZ z4Qwj1lW1=wNxFPLZuM^)U-LiXI}Vf`n7jlecnfsCH{<+n`DZ+?=}B5j9Bb7smXBx7 q8#J!#%L|!HdU-f&cXl|9|1h~&D5URo+{o-NbRN<5m-xzOa)m#jK6&o| delta 1020 zcmZuvPe>F|9RAJtb}=)1+Ge`z%8*8XC>Y2H(!-D*mO>f|FZPGJNOTgS(=M!{kx&nf z^$@|bQ+Vl?+AU%=JQO8tc$b|wJ}C8I6x1QuzPCG3R0EIq-uL_7@6R`1srOOeOy|MQ zw)OV4yY%}j;b_#Z$rMpCHSb)g%Z|#y^;RjUM+uuL!5fvZ_*SK|9e6eYp8;NvHHAf6 zL|cJNw9m7R{lMcy9GofOZ&aQdv6rN7rwCZnj0#=ME)9o?q4D*kH=7h zQ@m37CPlXT_+|KbRpssa0HhWqO%N>yo{CMe%BP=xtA z)m3gC{IHwqNmbz^_$~3PpUj89|Pe$=X?50 zEQ?D)x}2JE!NiZHxZaIG6!-&Gusn3yQJ%KU5Su_Dtq4aG4mh{<@2D%=6cP3SiZ_AZ z18xK{fg%x=x2lD39}m20Q@3;z7@!+i_KxmCiuKlyuf|4oVt^w`(7+}mqQ;-qG9c$43_>C!!;jeYes@ZT_~;% zH2BK{n8wzR)v6r>ehTt2-*dHmL!o?nN>~5$W{)!{7=eQ4q;T6p1^S@i6cpj1f|`F) z4}v{aRbw~N;c&W0ZZ>KSz`p!H_GN$Bm(}b`8Dxq=hPN15pZDVYZt;6GYM8rr7V6Ko z7&mhL@vF=%7K@8>@ewnc{6LIYj_)~^NIGy6zJ~d9+r#$p_|ds^CY?A#8Pm)SCDUC* YR)39={EXfFcXj9PClU>{2r3kR0$2Zfe*gdg diff --git a/Drivers/README.md b/Drivers/README.md index cc374567b..d23496d76 100644 --- a/Drivers/README.md +++ b/Drivers/README.md @@ -1,48 +1,60 @@ # Einstein ROM Extension -This directory contains the ROM extension (REx) for Einstein, which implements the protocols to interface with the -host OS. The REx is by default part of the Einstein application. The extension contains native parts which implement -NewtonOS protocols, as well as mixed NewtonScript/native extensions in the form of NewtonOS autoparts. +This directory contains the ROM extension (REx) for Einstein, which implements +the protocols to interface with the host OS. The REx is by default part of the +Einstein application. The extension contains native parts which implement +NewtonOS protocols, as well as mixed NewtonScript/native extensions in the +form of NewtonOS autoparts. ## Prerequisites -The REx is a collection of NewtonOS binaries (wrapped into NewtonOS packages), and thus the sources need to be cross -compiled with a NewtonOS compatible tool chain. Compilation also requires NewtonOS specific tools. +The REx is a collection of NewtonOS binaries (wrapped into NewtonOS packages), +and thus the sources need to be cross-compiled with a NewtonOS-compatible tool +chain. Compilation also requires NewtonOS-specific tools. + +CMake will fetch missing dependencies automatically except for GCC. If GCC is +not found, the build will be skipped. ### GCC -GCC up to version 12.x as an ARM cross compiler, e.g. [gcc-arm-none-eabi](https://packages.ubuntu.com/search?keywords=gcc-arm-none-eabi&searchon=names) +GCC with support for `armv4` as an ARM cross compiler, e.g. [gcc-arm-none-eabi](https://packages.ubuntu.com/search?keywords=gcc-arm-none-eabi&searchon=names) for an Ubuntu package, [GNU Arm Embedded Toolchain](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) -for the general ARM provided downloads, or a [brew tap](https://github.com/armmbed/homebrew-formulae) for installation +for the general ARM-provided downloads, or a +[brew tap](https://github.com/armmbed/homebrew-formulae) for installation via Homebrew. ### DCL -Conversion of the compiles binaries requires the `Rex` and `ELFtoPKG` tools. It can be installed by compiling and installing the [DCL](https://github.com/pguyot/DCL). +Conversion of the compiled binaries requires the `Rex` and `ELFtoPKG` tools +provided by [DCL](https://github.com/pguyot/DCL). ### NCT and DDK Headers -The C++ headers can be obtained by cloning this [repository](https://github.com/ekoeppen/NCT_Projects). - -The environment variable `NCT_PROJECTS` needs to point to the location of the directory containing the `Includes` and `DDKIncludes` directories. +The C++ headers and Newton Platform file are obtained by cloning this +[repository](https://github.com/ekoeppen/NCT_Projects). ### tntk -[tntk](https://github.com/ekoeppen/tntk) is an optional prerequisite to compile NewtonScript packages. If it not installed, the precompiled +[tntk](https://github.com/ekoeppen/tntk) is an optional prerequisite to +compile NewtonScript packages. If it is not installed, the precompiled packages are included in the REx. ## Building -After installing GCC and the DCL tools, and setting `NCT_PROJECTS` correctly, the REx can be built with `cmake`: +The CMake script will pull in the dependencies and build first the DCL, then +tntk using the CMake file in `./host`, followed by compiling the REx using the +CMake file in `./target`. This is driven by the top level CMake file, e.g. +executing in the directory here: - cmake -S Drivers -B Drivers/build -DCMAKE_TOOLCHAIN_FILE=cmake/newton-cross.cmake - cmake --build Drivers/build - cmake --install Drivers/build + cmake -S . -B build + cmake --build build ## Components -- Protocols: The NewtonOS to host implementation is provided as NewtonOS protocol implementations, which will either - handle the calls directly natively, or will invoke the Einstein drivers via coprocessor instructions +- Protocols: The NewtonOS to host implementation is provided as NewtonOS + protocol implementations, which will either handle the calls directly + natively, or will invoke the Einstein drivers via coprocessor instructions - NSRuntime: Helper package -- EinsteinPortEnabler: Autopart which will initialize serial drivers when enabled via the Newton preferences app +- EinsteinPortEnabler: Autopart which will initialize serial drivers when + enabled via the Newton preferences app - Additional packages in the `packages` directory can be included in the REx diff --git a/Drivers/host/CMakeLists.txt b/Drivers/host/CMakeLists.txt new file mode 100644 index 000000000..d0f74297c --- /dev/null +++ b/Drivers/host/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.14) +project(EinsteinHostTools) + +include(ExternalProject) + +# 1. Build DCL (Host Tools) +ExternalProject_Add(dcl_host + GIT_REPOSITORY https://github.com/pguyot/DCL.git + GIT_TAG master + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dcl-install +) + +# 2. Build tntk (Host Tools) +ExternalProject_Add(tntk_host + GIT_REPOSITORY https://github.com/ekoeppen/tntk.git + GIT_TAG master + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_INSTALL_RPATH=${CMAKE_CURRENT_BINARY_DIR}/dcl-install/lib + INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/tntk-install + DEPENDS dcl_host +) + +# Export variables to parent scope +set(DCL_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/dcl-install/bin PARENT_SCOPE) +set(TNTK_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/tntk-install/bin PARENT_SCOPE) diff --git a/Drivers/target/CMakeLists.txt b/Drivers/target/CMakeLists.txt new file mode 100644 index 000000000..520572f73 --- /dev/null +++ b/Drivers/target/CMakeLists.txt @@ -0,0 +1,99 @@ +cmake_minimum_required(VERSION 3.14) +project(EinsteinDriversTarget) +enable_language(ASM) + +# These variables should be passed from the parent Drivers project +# REX_TOOL, ELFTOPKG_TOOL, ELFTONTK_TOOL, TNTK_TOOL, NCT_PROJECTS + +set(LINK_OPTIONS + -L ${CMAKE_CURRENT_SOURCE_DIR}/.. + -T ${CMAKE_CURRENT_SOURCE_DIR}/../protocol.ld --version-script=${CMAKE_CURRENT_SOURCE_DIR}/../protocol.map) + +set(INCLUDE_DIRECTORIES + . + ${EINSTEIN_ROOT} + ${EINSTEIN_ROOT}/Drivers + ${NCT_PROJECTS}/DDKIncludes + ${NCT_PROJECTS}/DDKIncludes/Bootstrap + ${NCT_PROJECTS}/DDKIncludes/CLibrary + ${NCT_PROJECTS}/DDKIncludes/CommAPI + ${NCT_PROJECTS}/DDKIncludes/Communications + ${NCT_PROJECTS}/DDKIncludes/Frames + ${NCT_PROJECTS}/DDKIncludes/HAL + ${NCT_PROJECTS}/DDKIncludes/Lantern + ${NCT_PROJECTS}/DDKIncludes/OS600 + ${NCT_PROJECTS}/DDKIncludes/Packages + ${NCT_PROJECTS}/DDKIncludes/Power + ${NCT_PROJECTS}/DDKIncludes/QD + ${NCT_PROJECTS}/DDKIncludes/Toolbox + ${NCT_PROJECTS}/DDKIncludes/UtilityClasses + ${NCT_PROJECTS}/DDKIncludes/PCMCIA + ${NCT_PROJECTS}/Includes + ${NCT_PROJECTS}/Includes/CLibrary + ${NCT_PROJECTS}/Includes/Frames + ${NCT_PROJECTS}/Includes/Utilities + ${NCT_PROJECTS}/LanternDriver_DDK/Includes + ${NCT_PROJECTS}/NSandDDK + ${NCT_PROJECTS}) + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../obj) + +# -- Shared runtime +add_library(Runtime STATIC + ../Glue.s ../UGlue.cpp ../NewtonRuntime/NewtonRuntime.cpp ../NewtonRuntime/NewtonPublicAPIs.s ../NativePrimitives.s) +target_include_directories(Runtime PRIVATE ${INCLUDE_DIRECTORIES}) +target_link_options(Runtime PRIVATE ${LINK_OPTIONS}) + +macro(define_driver DRIVER) + add_executable(${DRIVER} ${ARGN}) + target_link_libraries(${DRIVER} Runtime) + target_include_directories(${DRIVER} PRIVATE ${INCLUDE_DIRECTORIES}) + target_link_options(${DRIVER} PRIVATE ${LINK_OPTIONS}) + add_custom_command(TARGET ${DRIVER} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_SOURCE_DIR}/../obj/$.pkg + COMMAND ${ELFTOPKG_TOOL} -o ${CMAKE_CURRENT_SOURCE_DIR}/../obj/$.pkg $:Einstein -protocol + $ -autoLoad -autoRemove) +endmacro() + +define_driver(EinsteinBatteryDriver ../PMainBatteryDriver.cpp ../PMainBatteryDriver.impl.s ../PMainBatteryDriverPrims.s) +define_driver(EinsteinStartupDriver ../TMainStartupDriver.cpp ../TMainStartupDriver.impl.s) +define_driver(EinsteinPlatformDriver ../TMainPlatformDriver.cpp ../TMainPlatformDriver.impl.s ../TMainPlatformDriverPrims.s) +define_driver(EinsteinSoundDriver ../PMainSoundDriver.cpp ../PMainSoundDriver.impl.s ../PMainSoundDriverPrims.s) +define_driver(EinsteinScreenDriver ../TMainDisplayDriver.cpp ../TMainDisplayDriver.impl.s ../TMainDisplayDriverPrims.s) +define_driver(EinsteinTabletDriver ../TMainTabletDriver.cpp ../TMainTabletDriver.impl.s ../TMainTabletDriverPrims.s) +define_driver(EinsteinVersionString ../TMainVersionString.cpp ../TMainVersionString.impl.s) +define_driver(EinsteinSerialVoyager ../TSerialChipVoyager.cpp ../TSerialChipVoyager.impl.s ../TSerialChipVoyagerPrims.s) +define_driver(EinsteinInTranslator ../PEinsteinInTranslator.cpp ../PEinsteinInTranslator.impl.s ../PEinsteinInTranslatorPrims.s) +define_driver(EinsteinOutTranslator ../PEinsteinOutTranslator.cpp ../PEinsteinOutTranslator.impl.s ../PEinsteinOutTranslatorPrims.s) +define_driver(EinsteinNativeCalls ../TEinsteinNativeCalls.cpp ../TEinsteinNativeCalls.impl.s ../TEinsteinNativeCallsPrims.s) +define_driver(EinsteinSerialDriver ../TSerialChipEinstein.cpp ../TSerialChipEinstein.impl.s ../TSerialChipEinsteinPrims.s) +define_driver(EinsteinFlashDriver ../TEinsteinFlashDriver.cpp ../TEinsteinFlashDriver.impl.s ../TEinsteinFlashDriverPrims.s) +add_custom_command(TARGET EinsteinFlashDriver POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O binary $ ${CMAKE_CURRENT_SOURCE_DIR}/../obj/$.bin) + +# -- PortEnabler (Uses TNTK) +# Note: EinsteinPortEnabler CMakeLists would need to be updated to use variables passed from here. +# For now, we call the custom target. +add_subdirectory(../EinsteinPortEnabler ${CMAKE_CURRENT_BINARY_DIR}/portenabler) + +add_custom_target(Einstein ALL) +add_dependencies(Einstein + EinsteinBatteryDriver + EinsteinStartupDriver + EinsteinFlashDriver + EinsteinPlatformDriver + EinsteinSoundDriver + EinsteinScreenDriver + EinsteinTabletDriver + EinsteinVersionString + EinsteinSerialDriver + EinsteinSerialVoyager + EinsteinInTranslator + EinsteinOutTranslator + EinsteinNativeCalls + portenabler) + +add_custom_command(TARGET Einstein POST_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/.. + COMMAND ${CMAKE_COMMAND} -E rm -f Einstein.rex + COMMAND ${REX_TOOL} -o Einstein.rex Einstein.rex.src) diff --git a/Resources/Base.lproj/Einstein.xib b/Resources/Base.lproj/Einstein.xib index d095a58ce..a2fab10a3 100644 --- a/Resources/Base.lproj/Einstein.xib +++ b/Resources/Base.lproj/Einstein.xib @@ -1,8 +1,8 @@ - + - + @@ -306,12 +306,13 @@ + - + @@ -321,11 +322,11 @@ - + -