From 6be6f7310e181a026f3646a1acc9d614425ae71f Mon Sep 17 00:00:00 2001 From: sverben <59171289+sverben@users.noreply.github.com> Date: Wed, 22 May 2024 18:20:22 +0200 Subject: [PATCH] fix: proper build --- .github/workflows/publish.yml | 2 +- .gitignore | 2 +- build.sh | 14 +-- package.json | 2 +- simduino/ATmegaBOOT_168_atmega328.ihex | 125 +++++++++++++++++++ simduino/simduino.c | 163 +++++++++++++++++++++++++ src/board.ts | 2 +- 7 files changed, 297 insertions(+), 13 deletions(-) create mode 100644 simduino/ATmegaBOOT_168_atmega328.ihex create mode 100644 simduino/simduino.c diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b962271..c1e5e5f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@v2 - name: Install dependencies - run: sudo apt update && sudo apt install gcc-avr avr-libc freeglut3-dev arduino-core-avr + run: sudo apt update && sudo apt install gcc-avr avr-libc freeglut3-dev arduino-core-avr libsimavr-dev libsimavrparts1 - name: Setup NodeJS uses: actions/setup-node@v4 diff --git a/.gitignore b/.gitignore index 8cb63e5..0b9ef2a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .idea build -build_assets +simduino/simduino node_modules dist diff --git a/build.sh b/build.sh index 4573667..fc3b6c2 100755 --- a/build.sh +++ b/build.sh @@ -1,14 +1,10 @@ set -e -rm -rf build_assets build +rm -rf build BUILD_PATH=$(realpath build) -mkdir build_assets build && cd build_assets -git clone https://github.com/buserror/simavr -cd simavr +cd simduino +gcc -I /usr/include/simavr -I /usr/include/simavr/parts simduino.c -lsimavr -lsimavrparts -o simduino -make -j8 -cd examples/board_simduino - -EXECUTABLE=$(find . | grep simduino.elf) -cp ATmegaBOOT_168_atmega328.ihex "${EXECUTABLE}" "${BUILD_PATH}" +mkdir "${BUILD_PATH}" +cp simduino ATmegaBOOT_168_atmega328.ihex "${BUILD_PATH}" diff --git a/package.json b/package.json index ba24a40..a2c0847 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@leaphy-robotics/playwright-arduino", - "version": "1.0.1", + "version": "1.0.2", "license": "LGPL-3.0-only", "main": "./dist/index.js", "type": "module", diff --git a/simduino/ATmegaBOOT_168_atmega328.ihex b/simduino/ATmegaBOOT_168_atmega328.ihex new file mode 100644 index 0000000..b1f0416 --- /dev/null +++ b/simduino/ATmegaBOOT_168_atmega328.ihex @@ -0,0 +1,125 @@ +:107800000C94343C0C94513C0C94513C0C94513CE1 +:107810000C94513C0C94513C0C94513C0C94513CB4 +:107820000C94513C0C94513C0C94513C0C94513CA4 +:107830000C94513C0C94513C0C94513C0C94513C94 +:107840000C94513C0C94513C0C94513C0C94513C84 +:107850000C94513C0C94513C0C94513C0C94513C74 +:107860000C94513C0C94513C11241FBECFEFD8E036 +:10787000DEBFCDBF11E0A0E0B1E0ECE9FFE702C060 +:1078800005900D92A230B107D9F712E0A2E0B1E065 +:1078900001C01D92AD30B107E1F70E942D3D0C945F +:1078A000CC3F0C94003C982F959595959595959582 +:1078B000905D8F708A307CF0282F295A8091C0000B +:1078C00085FFFCCF9093C6008091C00085FFFCCF60 +:1078D0002093C6000895282F205DF0CF982F809127 +:1078E000C00085FFFCCF9093C6000895EF92FF92F1 +:1078F0000F931F93EE24FF2487018091C00087FD22 +:1079000017C00894E11CF11C011D111D81E4E8164B +:1079100082E4F8068FE0080780E0180770F3E09132 +:107920000401F091050109958091C00087FFE9CF1E +:107930008091C6001F910F91FF90EF9008950E94D3 +:10794000763C982F8091C00085FFFCCF9093C600B5 +:1079500091362CF490330CF09053892F089597555D +:10796000892F08951F930E949F3C182F0E949F3CCF +:107970001295107F810F1F9108951F93182F882350 +:1079800021F00E94763C1150E1F71F9108951F935A +:10799000182F0E94763C803249F0809103018F5F5E +:1079A000809303018530C1F01F9108958091C0003C +:1079B00085FFFCCF84E18093C6008091C00085FFE5 +:1079C000FCCF1093C6008091C00085FFFCCF80E102 +:1079D0008093C6001F910895E0910401F091050184 +:1079E00009951F9108950E94763C803241F0809164 +:1079F00003018F5F80930301853081F008958091AA +:107A0000C00085FFFCCF84E18093C6008091C00058 +:107A100085FFFCCF80E18093C6000895E0910401CA +:107A2000F09105010995089540E951E08823A1F0FE +:107A30002D9A28EE33E0FA013197F1F721503040CA +:107A4000D1F72D9828EE33E0FA013197F1F7215064 +:107A50003040D1F7815061F708953F924F925F9285 +:107A60006F927F928F929F92AF92BF92CF92DF924E +:107A7000EF92FF920F931F93CF93DF93000080E16B +:107A80008093C4001092C50088E18093C10086E015 +:107A90008093C2005098589A259A81E00E94143D24 +:107AA00024E1F22E9EE1E92E85E9D82E0FE0C02ECA +:107AB00010E1B12EAA24A394B1E49B2EA6E58A2E50 +:107AC000F2E57F2EE0E26E2E79E4572E63E5462E36 +:107AD00050E5352E0E94763C8033B1F18133B9F107 +:107AE000803409F46FC0813409F476C0823409F41B +:107AF00085C0853409F488C0803531F1823521F1A3 +:107B0000813511F1853509F485C0863509F48DC0BC +:107B1000843609F496C0843709F403C1853709F423 +:107B200072C1863709F466C0809103018F5F80932C +:107B30000301853079F6E0910401F0910501099582 +:107B40000E94763C803351F60E94F33CC3CF0E94E2 +:107B5000763C803249F78091C00085FFFCCFF092DF +:107B6000C6008091C00085FFFCCF9092C600809136 +:107B7000C00085FFFCCF8092C6008091C00085FFC9 +:107B8000FCCF7092C6008091C00085FFFCCF609250 +:107B9000C6008091C00085FFFCCF5092C600809146 +:107BA000C00085FFFCCF4092C6008091C00085FFD9 +:107BB000FCCF3092C6008091C00085FFFCCFB09210 +:107BC000C60088CF0E94763C863808F4BDCF0E945C +:107BD000763C0E94F33C7ECF0E94763C803809F4CC +:107BE0009CC0813809F40BC1823809F43CC1883942 +:107BF00009F48FC080E00E94C73C6CCF84E10E94F2 +:107C0000BD3C0E94F33C66CF85E00E94BD3C0E94D3 +:107C1000F33C60CF0E94763C809306010E94763C44 +:107C2000809307010E94F33C55CF0E94763C80333D +:107C300009F41DC183E00E94BD3C80E00E94C73C66 +:107C400049CF0E94763C809309020E94763C809343 +:107C5000080280910C028E7F80930C020E94763C79 +:107C6000853409F415C18091080290910902892B8D +:107C700089F000E010E00E94763CF801E85FFE4FDA +:107C800080830F5F1F4F80910802909109020817AF +:107C9000190788F30E94763C803209F045CF809125 +:107CA0000C0280FF01C16091060170910701660F0F +:107CB000771F7093070160930601A0910802B091AD +:107CC00009021097C9F0E8E0F1E09B01AD014E0F09 +:107CD0005F1FF999FECF32BD21BD819180BDFA9A17 +:107CE000F99A2F5F3F4FE417F50799F76A0F7B1F4B +:107CF00070930701609306018091C00085FFFCCF5F +:107D0000F092C6008091C00085FFFCCFB092C60003 +:107D1000E1CE83E00E94C73CDDCE82E00E94C73CFA +:107D2000D9CE0E94763C809309020E94763C8093D3 +:107D300008028091060190910701880F991F909386 +:107D40000701809306010E94763C853409F4A6C0A1 +:107D500080910C028E7F80930C020E94763C8032D0 +:107D600009F0B8CE8091C00085FFFCCFF092C6002C +:107D7000609108027091090261157105B9F140E046 +:107D800050E080910C02A82FA170B82FB27011C0E2 +:107D9000BB2309F45CC0E0910601F0910701319624 +:107DA000F0930701E09306014F5F5F4F46175707B7 +:107DB000E8F4AA2369F3F999FECF209106013091E6 +:107DC000070132BD21BDF89A90B58091C00085FFB2 +:107DD000FCCF9093C6002F5F3F4F30930701209355 +:107DE00006014F5F5F4F4617570718F38091C00099 +:107DF00085FDE5CE8091C00085FFF8CFE0CE81E023 +:107E00000E94C73C67CE0E94763C803209F08CCE3F +:107E10008091C00085FFFCCFF092C6008091C00029 +:107E200085FFFCCFE092C6008091C00085FFFCCFAB +:107E3000D092C6008091C00085FFFCCFC092C600E2 +:107E40008091C00085FFFCCFB092C60043CEE09188 +:107E50000601F091070194918091C00085FFFCCF4D +:107E60009093C6009CCF80E10E94C73C33CE0E9415 +:107E7000763C0E94763C182F0E94763C112309F430 +:107E800083C0113009F484C08FE00E94C73C22CE29 +:107E900080910C02816080930C02E5CE80910C02EF +:107EA000816080930C0259CF809107018823880F4D +:107EB000880B8A2180930B02809106019091070123 +:107EC000880F991F90930701809306018091080203 +:107ED00080FF09C080910802909109020196909359 +:107EE000090280930802F894F999FECF1127E091D6 +:107EF0000601F0910701C8E0D1E08091080290915D +:107F00000902103091F40091570001700130D9F34B +:107F100003E000935700E89500915700017001308D +:107F2000D9F301E100935700E89509901990009169 +:107F3000570001700130D9F301E000935700E89534 +:107F40001395103498F011270091570001700130FB +:107F5000D9F305E000935700E895009157000170B0 +:107F60000130D9F301E100935700E895329602976A +:107F700009F0C7CF103011F00296E5CF112480919F +:107F8000C00085FFB9CEBCCE8EE10E94C73CA2CD19 +:0C7F900085E90E94C73C9ECDF894FFCF0D +:027F9C00800063 +:040000030000780081 +:00000001FF \ No newline at end of file diff --git a/simduino/simduino.c b/simduino/simduino.c new file mode 100644 index 0000000..3f93529 --- /dev/null +++ b/simduino/simduino.c @@ -0,0 +1,163 @@ +/* + simduino.c + + Copyright 2008, 2009 Michel Pollet + + This file is part of simavr. + + simavr is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simavr is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with simavr. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "sim_avr.h" +#include "avr_ioport.h" +#include "sim_elf.h" +#include "sim_hex.h" +#include "sim_gdb.h" +#include "uart_pty.h" +#include "sim_vcd_file.h" + +uart_pty_t uart_pty; +avr_t * avr = NULL; +avr_vcd_t vcd_file; + +struct avr_flash { + char avr_flash_path[1024]; + int avr_flash_fd; +}; + +// avr special flash initalization +// here: open and map a file to enable a persistent storage for the flash memory +void avr_special_init( avr_t * avr, void * data) +{ + struct avr_flash *flash_data = (struct avr_flash *)data; + + printf("%s\n", __func__); + // open the file + flash_data->avr_flash_fd = open(flash_data->avr_flash_path, + O_RDWR|O_CREAT, 0644); + if (flash_data->avr_flash_fd < 0) { + perror(flash_data->avr_flash_path); + exit(1); + } + // resize and map the file the file + (void)ftruncate(flash_data->avr_flash_fd, avr->flashend + 1); + ssize_t r = read(flash_data->avr_flash_fd, avr->flash, avr->flashend + 1); + if (r != avr->flashend + 1) { + fprintf(stderr, "unable to load flash memory\n"); + perror(flash_data->avr_flash_path); + exit(1); + } +} + +// avr special flash deinitalization +// here: cleanup the persistent storage +void avr_special_deinit( avr_t* avr, void * data) +{ + struct avr_flash *flash_data = (struct avr_flash *)data; + + printf("%s\n", __func__); + lseek(flash_data->avr_flash_fd, SEEK_SET, 0); + ssize_t r = write(flash_data->avr_flash_fd, avr->flash, avr->flashend + 1); + if (r != avr->flashend + 1) { + fprintf(stderr, "unable to load flash memory\n"); + perror(flash_data->avr_flash_path); + } + close(flash_data->avr_flash_fd); + uart_pty_stop(&uart_pty); +} + +int main(int argc, char *argv[]) +{ + struct avr_flash flash_data; + char boot_path[1024] = "ATmegaBOOT_168_atmega328.ihex"; + uint32_t boot_base, boot_size; + char * mmcu = "atmega328p"; + uint32_t freq = 16000000; + int debug = 0; + int verbose = 0; + + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i] + strlen(argv[i]) - 4, ".hex")) + strncpy(boot_path, argv[i], sizeof(boot_path)); + else if (!strcmp(argv[i], "-d")) + debug++; + else if (!strcmp(argv[i], "-v")) + verbose++; + else { + fprintf(stderr, "%s: invalid argument %s\n", argv[0], argv[i]); + exit(1); + } + } + + uint8_t * boot = read_ihex_file(boot_path, &boot_size, &boot_base); + if (!boot) { + fprintf(stderr, "%s: Unable to load %s\n", argv[0], boot_path); + exit(1); + } + if (boot_base > 32*1024*1024) { + mmcu = "atmega2560"; + freq = 20000000; + } + printf("%s bootloader 0x%05x: %d bytes\n", mmcu, boot_base, boot_size); + + avr = avr_make_mcu_by_name(mmcu); + if (!avr) { + fprintf(stderr, "%s: Error creating the AVR core\n", argv[0]); + exit(1); + } + + snprintf(flash_data.avr_flash_path, sizeof(flash_data.avr_flash_path), + "simduino_%s_flash.bin", mmcu); + flash_data.avr_flash_fd = 0; + // register our own functions + avr->custom.init = avr_special_init; + avr->custom.deinit = avr_special_deinit; + avr->custom.data = &flash_data; + avr_init(avr); + avr->frequency = freq; + + memcpy(avr->flash + boot_base, boot, boot_size); + free(boot); + avr->pc = boot_base; + /* end of flash, remember we are writing /code/ */ + avr->codeend = avr->flashend; + avr->log = 1 + verbose; + + // even if not setup at startup, activate gdb if crashing + avr->gdb_port = 1234; + if (debug) { + avr->state = cpu_Stopped; + avr_gdb_init(avr); + } + + uart_pty_init(avr, &uart_pty); + uart_pty_connect(&uart_pty, '0'); + + while (1) { + int state = avr_run(avr); + if ( state == cpu_Done || state == cpu_Crashed) + break; + } + +} \ No newline at end of file diff --git a/src/board.ts b/src/board.ts index 5d822d7..c68bc3e 100644 --- a/src/board.ts +++ b/src/board.ts @@ -6,7 +6,7 @@ class Board { public port = '/tmp/simavr-uart0' constructor() { - this.process = spawn('./simduino.elf', { + this.process = spawn('./simduino', { cwd: `${import.meta.dirname}/../build` }) }