Author SHA1 Message Date
Marek Kraus b583ec46f9 Add run firmware in RAM feature 2024-06-19 18:09:16 +02:00
Andre Fonseca 7a85414ece Enable macOS universal builds (#52)
* enable universal builds (x86_64/arm64) on macOS

* rename macOS build artifact filename

* update README.md
2023-08-28 11:25:41 +02:00
schrobandSchdro c41d128e73 Compile internal file_parsers lib always statically (#51)
Otherwise, depending on BUILD_SHARED_LIBS default, it may be
compiled dynamically. However, the resulting DSO currently would
not be installed, resulting in unusable installed blisp binary.

Co-authored-by: Schdro <>
2023-08-10 14:23:12 +10:00
Robert Lipe d2fef0af22 Merge pull request #49 from neil-forks/master
Add DESTINATION for PUBLIC_HEADERS targets
2023-08-07 22:21:47 -05:00
Neil Hanlon 2203a250e3 Add DESTINATION for PUBLIC_HEADERS targets 2023-08-07 22:49:15 -04:00
Robert Lipe 713e444656 Merge pull request #48 from neil-forks/master
WIP: Use CMAKE_INSTALL_LIBDIR for install destination to respect build forges
2023-08-07 21:24:22 -05:00
Neil Hanlon 3b47993de7 Use CMAKE_INSTALL_LIBDIR for install destination to respect build forges
CMAKE_INSTALL_LIBDIR should be popualted with either lib or lib64,
depending on the architecture. This change makes it so that this flag is
respected by blisp and the library, runtime, and archives are installed
to the location requested by the build.
2023-08-07 21:18:43 -04:00
Marek Kraus f601b6b965 Release v0.0.4 2023-08-03 08:21:21 +02:00
Marc JuulandMarek Kraus 48af2aded0 Adds support for compiling on Ubuntu 20.04 by lowering required cmake… (#44)
* Adds support for compiling on Ubuntu 20.04 by lowering required cmake version to 3.16 (from 3.22) and removing the "set(CMAKE_C_STANDARD 20)" line which is not supported by cmake 3.16

* Adds back the CMAKE_C_STANDARD flag but now sets it to 11, the highest version supported by cmake 3.16

---------

Co-authored-by: Marek Kraus <gamelaster@users.noreply.github.com>
2023-08-01 14:50:32 +02:00
Ben V. BrownandMarek Kraus f1b93a1881 DFU file support (#45)
* DFU file work

Just grabbing first one for now

Expose crc

Update CMakeLists.txt

Test DFU file

Split crc function

Fixup

Zero init struct
Dont null the pointer 🤦
correct fread

Adding tests

Create dfu_file.h

Format

Scratching out more parsing

Basic port parser

Scratching fread wrapper

* Relocate dfu parsing and link in

* Scratching out parsers

* Generic bin parser

* Pull out get file util

Update CMakeLists.txt

* Pull in the generic parser

Fixup

.

* Print flash address

* Rebase address

* stdlib

Update dfu_file.c

* FIXUP! flash offset

* Update dfu_file.c

* Improve logging

* Drop extra erase

* Adjust DFU to avoid goto

* Pragma -> ifndef

* Include Windows headers for missing data types

---------

Co-authored-by: Marek Kraus <gamelaster@outlook.com>
2023-08-01 22:43:56 +10:00
15 changed files with 179 additions and 23 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ jobs:
- name: Upload results - name: Upload results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: blips-apple-x86_64.zip name: blips-apple-universal.zip
path: | path: |
build/tools/blisp/blisp build/tools/blisp/blisp
if-no-files-found: error if-no-files-found: error
+3
View File
@@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CMakePythonSetting">
<option name="pythonIntegrationState" value="YES" />
</component>
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" /> <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
</project> </project>
+13 -6
View File
@@ -1,7 +1,8 @@
cmake_minimum_required(VERSION 3.22) cmake_minimum_required(VERSION 3.16)
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE)
project(blisp C) project(blisp C)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_C_STANDARD 23) set(CMAKE_C_STANDARD 11)
option(BLISP_BUILD_CLI "Build CLI Tool" OFF) option(BLISP_BUILD_CLI "Build CLI Tool" OFF)
option(BLISP_USE_SYSTEM_LIBRARIES "Use system-installed libraries" "${CMAKE_USE_SYSTEM_LIBRARIES}") option(BLISP_USE_SYSTEM_LIBRARIES "Use system-installed libraries" "${CMAKE_USE_SYSTEM_LIBRARIES}")
@@ -28,14 +29,14 @@ set(BLISP_PUBLIC_HEADERS
set_target_properties(libblisp PROPERTIES set_target_properties(libblisp PROPERTIES
PUBLIC_HEADER "${BLISP_PUBLIC_HEADERS}" PUBLIC_HEADER "${BLISP_PUBLIC_HEADERS}"
VERSION 0.0.3 VERSION 0.0.4
SOVERSION 1 SOVERSION 1
LIBRARY_OUTPUT_DIRECTORY "shared" LIBRARY_OUTPUT_DIRECTORY "shared"
OUTPUT_NAME "blisp") OUTPUT_NAME "blisp")
set_target_properties(libblisp_static PROPERTIES set_target_properties(libblisp_static PROPERTIES
PUBLIC_HEADER "${BLISP_PUBLIC_HEADERS}" PUBLIC_HEADER "${BLISP_PUBLIC_HEADERS}"
VERSION 0.0.3 VERSION 0.0.4
SOVERSION 1 SOVERSION 1
ARCHIVE_OUTPUT_DIRECTORY "static" ARCHIVE_OUTPUT_DIRECTORY "static"
OUTPUT_NAME "blisp") OUTPUT_NAME "blisp")
@@ -90,7 +91,13 @@ else()
endif() endif()
endif() endif()
install(TARGETS libblisp libblisp_static DESTINATION lib) include(GNUInstallDirs)
install(TARGETS libblisp libblisp_static
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
if(BLISP_BUILD_CLI) if(BLISP_BUILD_CLI)
add_subdirectory(tools/blisp) add_subdirectory(tools/blisp)
@@ -99,4 +106,4 @@ endif()
if(COMPILE_TESTS) if(COMPILE_TESTS)
add_subdirectory(tools/blisp/src/cmd/dfu/tests) add_subdirectory(tools/blisp/src/cmd/dfu/tests)
endif(COMPILE_TESTS) endif(COMPILE_TESTS)
+19 -2
View File
@@ -1,7 +1,7 @@
[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fpine64%2Fblisp&count_bg=%235791AC&title_bg=%23555555&icon=airplayaudio.svg&icon_color=%23D2D9DD&title=hits&edge_flat=false)](https://github.com/pine64/blisp/wiki/Update-Pinecil-V2) [![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fpine64%2Fblisp&count_bg=%235791AC&title_bg=%23555555&icon=airplayaudio.svg&icon_color=%23D2D9DD&title=hits&edge_flat=false)](https://github.com/pine64/blisp/wiki/Update-Pinecil-V2)
[![GitHub all downloads](https://img.shields.io/github/downloads/pine64/blisp/total?color=5791ac&logo=docusign&logoColor=white)](https://github.com/pine64/blisp/releases/tag/v0.0.3) [![GitHub all downloads](https://img.shields.io/github/downloads/pine64/blisp/total?color=5791ac&logo=docusign&logoColor=white)](https://github.com/pine64/blisp/releases/tag/v0.0.4)
[![Discord](https://img.shields.io/discord/463237927984693259?color=5791ac&logo=discord&logoColor=white)](https://discord.com/invite/pine64) [![Discord](https://img.shields.io/discord/463237927984693259?color=5791ac&logo=discord&logoColor=white)](https://discord.com/invite/pine64)
[![GitHub release](https://img.shields.io/github/v/release/pine64/blisp?color=5791ac)](https://github.com/pine64/blisp/releases/tag/v0.0.3) [![GitHub release](https://img.shields.io/github/v/release/pine64/blisp?color=5791ac)](https://github.com/pine64/blisp/releases/tag/v0.0.4)
<img src="./img/Gradient-white-blue-03.png" align="left" width="60" > <br clear="left" /> <img src="./img/Gradient-white-blue-03.png" align="left" width="60" > <br clear="left" />
# BLISP # BLISP
@@ -94,3 +94,20 @@ Because this is done at the lowest level of serial communication, the
displays aren't packet-aware or know about the chip's command set or such. displays aren't packet-aware or know about the chip's command set or such.
This is really only useful for debugging systems-level issues withing This is really only useful for debugging systems-level issues withing
the device or blisp itself. the device or blisp itself.
## Troubleshooting
### macOS
Depending on your current system security settings, modern versions of macOS requires all software to be notarised before you are able to execute it. This is specially true for software that is downloaded directly from the internet.
If that is the case, you will get an error that looks like the following:
> **“blisp” cannot be opened because the developer cannot be verified.**
>
> macOS cannot verify that this app is free from malware.
In that case, you will need to remove the *quarantine* flag that macOS adds to the executable. After that you should be able to run **blisp** as normal.
```bash
xattr -d com.apple.quarantine blisp
```
+4 -1
View File
@@ -8,7 +8,10 @@
struct blisp_easy_transport { struct blisp_easy_transport {
uint8_t type; // 0 - memory, 1 - FILE file_handle uint8_t type; // 0 - memory, 1 - FILE file_handle
union { union {
FILE* file_handle; struct {
FILE* file_handle;
int64_t file_size;
} file;
struct { struct {
void* data_location; void* data_location;
uint32_t data_size; uint32_t data_size;
+9 -5
View File
@@ -19,7 +19,7 @@ static blisp_return_t blisp_easy_transport_read(
transport->data.memory.current_position += size; transport->data.memory.current_position += size;
return size; return size;
} else { } else {
return fread(buffer, size, 1, transport->data.file_handle); return fread(buffer, size, 1, transport->data.file.file_handle);
} }
} }
@@ -28,9 +28,13 @@ static blisp_return_t blisp_easy_transport_size(
if (transport->type == 0) { if (transport->type == 0) {
return transport->data.memory.data_size; return transport->data.memory.data_size;
} else { } else {
// TODO: Implement if (transport->data.file.file_size == -1) {
printf("%s() Warning: calling non-implemented function\n", __func__); FILE* handle = transport->data.file.file_handle;
return BLISP_ERR_NOT_IMPLEMENTED; fseek(handle, 0, SEEK_END);
transport->data.file.file_size = ftell(handle);
rewind(handle);
}
return transport->data.file.file_size;
} }
} }
@@ -43,7 +47,7 @@ static void blisp_easy_report_progress(blisp_easy_progress_callback callback,
} }
struct blisp_easy_transport blisp_easy_transport_new_from_file(FILE* file) { struct blisp_easy_transport blisp_easy_transport_new_from_file(FILE* file) {
struct blisp_easy_transport transport = {.type = 1, .data.file_handle = file}; struct blisp_easy_transport transport = {.type = 1, .data.file.file_handle = file, .data.file.file_size = -1};
return transport; return transport;
} }
+1 -1
View File
@@ -2,7 +2,7 @@ set(ARGTABLE3_ENABLE_TESTS OFF CACHE BOOL "Enable unit tests")
set(ARGTABLE3_ENABLE_EXAMPLES OFF CACHE BOOL "Enable examples") set(ARGTABLE3_ENABLE_EXAMPLES OFF CACHE BOOL "Enable examples")
#set(ARGTABLE3_REPLACE_GETOPT OFF CACHE BOOL "Replace getopt in the system C library") #set(ARGTABLE3_REPLACE_GETOPT OFF CACHE BOOL "Replace getopt in the system C library")
add_executable(blisp src/main.c src/cmd/write.c src/util.c src/common.c src/cmd/iot.c) add_executable(blisp src/main.c src/cmd/write.c src/util.c src/common.c src/cmd/iot.c src/cmd/run.c)
add_subdirectory(src/file_parsers) add_subdirectory(src/file_parsers)
+1
View File
@@ -13,6 +13,7 @@ struct cmd {
}; };
extern struct cmd cmd_write; extern struct cmd cmd_write;
extern struct cmd cmd_run;
extern struct cmd cmd_iot; extern struct cmd cmd_iot;
#endif // BLISP_CMD_H #endif // BLISP_CMD_H
+1 -1
View File
@@ -22,7 +22,7 @@ blisp_return_t blisp_single_download() {
if (ret != BLISP_OK) { if (ret != BLISP_OK) {
return ret; return ret;
} }
ret = blisp_common_prepare_flash(&device); ret = blisp_common_prepare_flash(&device, true);
if (ret != BLISP_OK) { if (ret != BLISP_OK) {
// TODO: Error handling // TODO: Error handling
goto exit1; goto exit1;
+119
View File
@@ -0,0 +1,119 @@
#include <argtable3.h>
#include <blisp_easy.h>
#include "../cmd.h"
#include "../common.h"
#define REG_EXTENDED 1
#define REG_ICASE (REG_EXTENDED << 1)
static struct arg_rex* cmd;
static struct arg_str *port_name, *chip_type; // TODO: Make this common
static struct arg_lit* reset;
static struct arg_end* end;
static struct arg_file* binary_to_run;
static void* cmd_run_argtable[6];
blisp_return_t cmd_run_args_init() {
cmd_run_argtable[0] = cmd =
arg_rex1(NULL, NULL, "run", NULL, REG_ICASE, NULL);
cmd_run_argtable[1] = chip_type =
arg_str1("c", "chip", "<chip_type>", "Chip Type");
cmd_run_argtable[2] = port_name =
arg_str0("p", "port", "<port_name>",
"Name/Path to the Serial Port (empty for search)");
cmd_run_argtable[3] = reset =
arg_lit0(NULL, "reset", "Reset chip after write");
cmd_run_argtable[4] = binary_to_run =
arg_file1(NULL, NULL, "<input>", "Binary to run");
cmd_run_argtable[5] = end = arg_end(10);
if (arg_nullcheck(cmd_run_argtable) != 0) {
fprintf(stderr, "insufficient memory\n");
return BLISP_ERR_OUT_OF_MEMORY;
}
return BLISP_OK;
}
void cmd_run_args_print_glossary() {
fputs("Usage: blisp", stdout);
arg_print_syntax(stdout, cmd_run_argtable, "\n");
puts("Flashes firmware to RAM and then executes it.");
arg_print_glossary(stdout, cmd_run_argtable, " %-25s %s\n");
}
blisp_return_t blisp_run_firmware() {
struct blisp_device device;
blisp_return_t ret;
ret = blisp_common_init_device(&device, port_name, chip_type);
if (ret != BLISP_OK) {
return ret;
}
FILE* data_file = fopen(binary_to_run->filename[0], "rb");
if (data_file == NULL) {
fprintf(stderr, "Failed to open data file \"%s\".\n",
binary_to_run->filename[0]);
ret = BLISP_ERR_CANT_OPEN_FILE;
goto exit1;
}
if (blisp_common_prepare_flash(&device, false) != 0) {
// TODO: Error handling
goto exit1;
}
struct blisp_easy_transport firmware_transport =
blisp_easy_transport_new_from_file(data_file);
ret = blisp_easy_load_ram_app(&device, &firmware_transport,
blisp_common_progress_callback);
if (ret != BLISP_OK) {
fprintf(stderr, "Failed to load firmware, ret: %d\n", ret);
goto exit1;
}
ret = blisp_device_check_image(&device);
if (ret != 0) {
fprintf(stderr, "Failed to check image.\n");
goto exit1;
}
ret = blisp_device_run_image(&device);
if (ret != BLISP_OK) {
fprintf(stderr, "Failed to run image.\n");
goto exit1;
}
exit2:
if (data_file != NULL)
fclose(data_file);
exit1:
blisp_device_close(&device);
return ret;
}
blisp_return_t cmd_run_parse_exec(int argc, char** argv) {
int errors = arg_parse(argc, argv, cmd_run_argtable);
if (errors == 0) {
blisp_run_firmware();
return BLISP_OK;
} else if (cmd->count == 1) {
cmd_run_args_print_glossary();
return BLISP_OK;
}
return BLISP_ERR_INVALID_COMMAND;
}
void cmd_run_args_print_syntax() {
arg_print_syntax(stdout, cmd_run_argtable, "\n");
}
void cmd_run_free() {
arg_freetable(cmd_run_argtable,
sizeof(cmd_run_argtable) / sizeof(cmd_run_argtable[0]));
}
struct cmd cmd_run = {"run", cmd_run_args_init, cmd_run_parse_exec,
cmd_run_args_print_syntax, cmd_run_free};
+1 -1
View File
@@ -174,7 +174,7 @@ blisp_return_t blisp_flash_firmware() {
return ret; return ret;
} }
if (blisp_common_prepare_flash(&device) != 0) { if (blisp_common_prepare_flash(&device, true) != 0) {
// TODO: Error handling // TODO: Error handling
goto exit1; goto exit1;
} }
+3 -2
View File
@@ -58,7 +58,8 @@ blisp_return_t blisp_common_init_device(struct blisp_device* device,
* Prepares chip to access flash * Prepares chip to access flash
* this means performing handshake, and loading eflash_loader if needed. * this means performing handshake, and loading eflash_loader if needed.
*/ */
blisp_return_t blisp_common_prepare_flash(struct blisp_device* device) { blisp_return_t blisp_common_prepare_flash(struct blisp_device* device,
bool goto_eflash_loader) {
blisp_return_t ret = 0; blisp_return_t ret = 0;
printf("Sending a handshake...\n"); printf("Sending a handshake...\n");
@@ -84,7 +85,7 @@ blisp_return_t blisp_common_prepare_flash(struct blisp_device* device) {
boot_info.chip_id[3], boot_info.chip_id[4], boot_info.chip_id[5], boot_info.chip_id[3], boot_info.chip_id[4], boot_info.chip_id[5],
boot_info.chip_id[6], boot_info.chip_id[7]); boot_info.chip_id[6], boot_info.chip_id[7]);
if (device->chip->load_eflash_loader == NULL) { if (device->chip->load_eflash_loader == NULL || !goto_eflash_loader) {
return BLISP_OK; return BLISP_OK;
} }
+2 -1
View File
@@ -6,7 +6,8 @@
#include <blisp.h> #include <blisp.h>
#include <argtable3.h> #include <argtable3.h>
int32_t blisp_common_prepare_flash(struct blisp_device* device); blisp_return_t blisp_common_prepare_flash(struct blisp_device* device,
bool goto_eflash_loader);
void blisp_common_progress_callback(uint32_t current_value, uint32_t max_value); void blisp_common_progress_callback(uint32_t current_value, uint32_t max_value);
int32_t blisp_common_init_device(struct blisp_device* device, struct arg_str* port_name, struct arg_str* chip_type); int32_t blisp_common_init_device(struct blisp_device* device, struct arg_str* port_name, struct arg_str* chip_type);
+1 -1
View File
@@ -8,7 +8,7 @@ file(GLOB_RECURSE sources
) )
list(APPEND ADD_SRCS ${sources}) list(APPEND ADD_SRCS ${sources})
add_library(file_parsers add_library(file_parsers STATIC
"${CMAKE_CURRENT_SOURCE_DIR}/bin/bin_file.c" "${CMAKE_CURRENT_SOURCE_DIR}/bin/bin_file.c"
"${CMAKE_CURRENT_SOURCE_DIR}/dfu/dfu_file.c" "${CMAKE_CURRENT_SOURCE_DIR}/dfu/dfu_file.c"
"${CMAKE_CURRENT_SOURCE_DIR}/dfu/dfu_crc.c" "${CMAKE_CURRENT_SOURCE_DIR}/dfu/dfu_crc.c"
+1 -1
View File
@@ -5,7 +5,7 @@
#include "argtable3.h" #include "argtable3.h"
#include "cmd.h" #include "cmd.h"
struct cmd* cmds[] = {&cmd_write, &cmd_iot}; struct cmd* cmds[] = {&cmd_write, &cmd_run, &cmd_iot};
static uint8_t cmds_count = sizeof(cmds) / sizeof(cmds[0]); static uint8_t cmds_count = sizeof(cmds) / sizeof(cmds[0]);