mirror of
https://github.com/pine64/blisp.git
synced 2026-09-20 14:31:31 +00:00
Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6306a00de7 | ||
|
|
c87a4a092c | ||
|
|
dbd7ee2257 | ||
|
|
05b62d2fa5 | ||
|
|
d25bd65f15 | ||
|
|
ec44c2358b | ||
|
|
c63883bfa7 | ||
|
|
99a30ae9cc | ||
|
|
11c31d6eed | ||
|
|
6724a9c682 | ||
|
|
342a43b071 | ||
|
|
d052d2ebe4 | ||
|
|
9893a49376 | ||
|
|
cf00bedeaf | ||
|
|
013c1d0141 | ||
|
|
98343db387 |
@@ -42,7 +42,7 @@ jobs:
|
||||
- name: Upload results
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: blips-apple-universal.zip
|
||||
name: blips-apple-x86_64.zip
|
||||
path: |
|
||||
build/tools/blisp/blisp
|
||||
if-no-files-found: error
|
||||
|
||||
Generated
-3
@@ -1,7 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CMakePythonSetting">
|
||||
<option name="pythonIntegrationState" value="YES" />
|
||||
</component>
|
||||
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||
</project>
|
||||
+6
-13
@@ -1,8 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE)
|
||||
cmake_minimum_required(VERSION 3.22)
|
||||
project(blisp C)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD 23)
|
||||
|
||||
option(BLISP_BUILD_CLI "Build CLI Tool" OFF)
|
||||
option(BLISP_USE_SYSTEM_LIBRARIES "Use system-installed libraries" "${CMAKE_USE_SYSTEM_LIBRARIES}")
|
||||
@@ -29,14 +28,14 @@ set(BLISP_PUBLIC_HEADERS
|
||||
|
||||
set_target_properties(libblisp PROPERTIES
|
||||
PUBLIC_HEADER "${BLISP_PUBLIC_HEADERS}"
|
||||
VERSION 0.0.4
|
||||
VERSION 0.0.3
|
||||
SOVERSION 1
|
||||
LIBRARY_OUTPUT_DIRECTORY "shared"
|
||||
OUTPUT_NAME "blisp")
|
||||
|
||||
set_target_properties(libblisp_static PROPERTIES
|
||||
PUBLIC_HEADER "${BLISP_PUBLIC_HEADERS}"
|
||||
VERSION 0.0.4
|
||||
VERSION 0.0.3
|
||||
SOVERSION 1
|
||||
ARCHIVE_OUTPUT_DIRECTORY "static"
|
||||
OUTPUT_NAME "blisp")
|
||||
@@ -91,13 +90,7 @@ else()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
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}
|
||||
)
|
||||
install(TARGETS libblisp libblisp_static DESTINATION lib)
|
||||
|
||||
if(BLISP_BUILD_CLI)
|
||||
add_subdirectory(tools/blisp)
|
||||
@@ -106,4 +99,4 @@ endif()
|
||||
|
||||
if(COMPILE_TESTS)
|
||||
add_subdirectory(tools/blisp/src/cmd/dfu/tests)
|
||||
endif(COMPILE_TESTS)
|
||||
endif(COMPILE_TESTS)
|
||||
@@ -1,7 +1,7 @@
|
||||
[](https://github.com/pine64/blisp/wiki/Update-Pinecil-V2)
|
||||
[](https://github.com/pine64/blisp/releases/tag/v0.0.4)
|
||||
[](https://github.com/pine64/blisp/releases/tag/v0.0.3)
|
||||
[](https://discord.com/invite/pine64)
|
||||
[](https://github.com/pine64/blisp/releases/tag/v0.0.4)
|
||||
[](https://github.com/pine64/blisp/releases/tag/v0.0.3)
|
||||
|
||||
<img src="./img/Gradient-white-blue-03.png" align="left" width="60" > <br clear="left" />
|
||||
# BLISP
|
||||
@@ -94,20 +94,3 @@ 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.
|
||||
This is really only useful for debugging systems-level issues withing
|
||||
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
|
||||
```
|
||||
|
||||
@@ -8,10 +8,7 @@
|
||||
struct blisp_easy_transport {
|
||||
uint8_t type; // 0 - memory, 1 - FILE file_handle
|
||||
union {
|
||||
struct {
|
||||
FILE* file_handle;
|
||||
int64_t file_size;
|
||||
} file;
|
||||
FILE* file_handle;
|
||||
struct {
|
||||
void* data_location;
|
||||
uint32_t data_size;
|
||||
|
||||
+5
-9
@@ -19,7 +19,7 @@ static blisp_return_t blisp_easy_transport_read(
|
||||
transport->data.memory.current_position += size;
|
||||
return size;
|
||||
} else {
|
||||
return fread(buffer, size, 1, transport->data.file.file_handle);
|
||||
return fread(buffer, size, 1, transport->data.file_handle);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,13 +28,9 @@ static blisp_return_t blisp_easy_transport_size(
|
||||
if (transport->type == 0) {
|
||||
return transport->data.memory.data_size;
|
||||
} else {
|
||||
if (transport->data.file.file_size == -1) {
|
||||
FILE* handle = transport->data.file.file_handle;
|
||||
fseek(handle, 0, SEEK_END);
|
||||
transport->data.file.file_size = ftell(handle);
|
||||
rewind(handle);
|
||||
}
|
||||
return transport->data.file.file_size;
|
||||
// TODO: Implement
|
||||
printf("%s() Warning: calling non-implemented function\n", __func__);
|
||||
return BLISP_ERR_NOT_IMPLEMENTED;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +43,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 transport = {.type = 1, .data.file.file_handle = file, .data.file.file_size = -1};
|
||||
struct blisp_easy_transport transport = {.type = 1, .data.file_handle = file};
|
||||
return transport;
|
||||
}
|
||||
|
||||
|
||||
@@ -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_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 src/cmd/run.c)
|
||||
add_executable(blisp src/main.c src/cmd/write.c src/util.c src/common.c src/cmd/iot.c)
|
||||
|
||||
add_subdirectory(src/file_parsers)
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ struct cmd {
|
||||
};
|
||||
|
||||
extern struct cmd cmd_write;
|
||||
extern struct cmd cmd_run;
|
||||
extern struct cmd cmd_iot;
|
||||
|
||||
#endif // BLISP_CMD_H
|
||||
|
||||
@@ -22,7 +22,7 @@ blisp_return_t blisp_single_download() {
|
||||
if (ret != BLISP_OK) {
|
||||
return ret;
|
||||
}
|
||||
ret = blisp_common_prepare_flash(&device, true);
|
||||
ret = blisp_common_prepare_flash(&device);
|
||||
if (ret != BLISP_OK) {
|
||||
// TODO: Error handling
|
||||
goto exit1;
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
#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};
|
||||
@@ -174,7 +174,7 @@ blisp_return_t blisp_flash_firmware() {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (blisp_common_prepare_flash(&device, true) != 0) {
|
||||
if (blisp_common_prepare_flash(&device) != 0) {
|
||||
// TODO: Error handling
|
||||
goto exit1;
|
||||
}
|
||||
|
||||
@@ -58,8 +58,7 @@ blisp_return_t blisp_common_init_device(struct blisp_device* device,
|
||||
* Prepares chip to access flash
|
||||
* this means performing handshake, and loading eflash_loader if needed.
|
||||
*/
|
||||
blisp_return_t blisp_common_prepare_flash(struct blisp_device* device,
|
||||
bool goto_eflash_loader) {
|
||||
blisp_return_t blisp_common_prepare_flash(struct blisp_device* device) {
|
||||
blisp_return_t ret = 0;
|
||||
|
||||
printf("Sending a handshake...\n");
|
||||
@@ -85,7 +84,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[6], boot_info.chip_id[7]);
|
||||
|
||||
if (device->chip->load_eflash_loader == NULL || !goto_eflash_loader) {
|
||||
if (device->chip->load_eflash_loader == NULL) {
|
||||
return BLISP_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,8 +6,7 @@
|
||||
#include <blisp.h>
|
||||
#include <argtable3.h>
|
||||
|
||||
blisp_return_t blisp_common_prepare_flash(struct blisp_device* device,
|
||||
bool goto_eflash_loader);
|
||||
int32_t blisp_common_prepare_flash(struct blisp_device* device);
|
||||
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);
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ file(GLOB_RECURSE sources
|
||||
)
|
||||
list(APPEND ADD_SRCS ${sources})
|
||||
|
||||
add_library(file_parsers STATIC
|
||||
add_library(file_parsers
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/bin/bin_file.c"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/dfu/dfu_file.c"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/dfu/dfu_crc.c"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "argtable3.h"
|
||||
#include "cmd.h"
|
||||
|
||||
struct cmd* cmds[] = {&cmd_write, &cmd_run, &cmd_iot};
|
||||
struct cmd* cmds[] = {&cmd_write, &cmd_iot};
|
||||
|
||||
static uint8_t cmds_count = sizeof(cmds) / sizeof(cmds[0]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user