#risc-v #spl #cli-file #u-boot #visionfive2

no-std bin+lib spl_tool

Port of StarFive's C spl_tool with default support for VisionFive2

4 releases

0.2.0 Apr 20, 2024
0.1.2 Apr 9, 2024
0.1.1 Nov 25, 2023
0.1.0 Nov 25, 2023

#366 in Hardware support

Download history 20/week @ 2024-07-28 26/week @ 2024-09-29

198 downloads per month

GPL-2.0-or-later

29KB
511 lines

SPL tool (VisionFive2)

NOTE Development has moved to weathered-steel/spl_tool.

Port of the C implementation of StarFive's spl_tool, which is originally written by strlcat.

WARNING This tool is in the very earliest stages of development. It still requires a test suite, fuzzing harnesses for file formats, and real-world testing.

Usage

To use the CLI applicatiom, compile with the cli feature:

$ cd spl_tool
$ cargo run --features cli -- --file <path-to-spl-image> --create-spl-header
# To see a full list of options
$ cargo run --features cli -- --help

Library example

use spl_tool::{crc32, crc32_final, Result, HeaderConf, UbootSplHeader};
use spl_tool::{DEF_CRC32_IV, DEF_CRC32_SV, SPL_HEADER_LEN};

// Dummy example of the U-Boot SPL image size
// Real value should be read from SPL image file
const UBOOT_IMG_SIZE: usize = 0xf00d;

// Dummy data for the SPL image data
let spl = [0xff; UBOOT_IMG_SIZE];

// Calculate the main CRC-32 rounds
let v = crc32(DEF_CRC32_IV, DEF_CRC32_SV, spl.as_ref());
// Calculate the final CRC-32 round
let crc = crc32_final(v);

let conf = HeaderConf::new().with_name("u-boot-spl.bin");

let hdr = UbootSplHeader::new()
    .with_bofs(conf.bofs())
    .with_vers(conf.vers())
    .with_fsiz(UBOOT_IMG_SIZE as u32)
    // Set calculated CRC-32 in the header
    .with_crcs(crc);

// Convert header to bytes
let _hdr_bytes: [u8; SPL_HEADER_LEN] = hdr.into();

// ... do cool stuff with your SPL header
// ... usually, prepend it to the SPL image data in a new SPL image file

Installation

The CLI application requires the cli feature:

$ cd spl_tool
$ cargo install --features cli --path .

no-std compatibility

The library portion of spl_tool is no-std compatible by default, and can be used in embedded/bare-metal contexts.

Alternatives

License

spl_tool Rust is licensed under the same GPLv2+ license as the original C implementation.

Dependencies

~0–7.5MB
~53K SLoC