26 #define BLOCK_SIZE 512
40 if (BLK_STOP ==
cbd->state) {
41 cbd->state = BLK_READY;
48 if (BLK_STOP !=
cbd->state) {
49 cbd->state = BLK_STOP;
63 cbd->
d.source_read_cb = NULL;
65 uzlib_gzip_parse_header(&
cbd->
d);
74 for (
size_t i = 0; i < blocks_ahead; i++) {
79 uzlib_uncompress(&
cbd->
d);
88 static bool write(
void*, uint32_t,
const uint8_t*, uint32_t) {
93 constexpr
size_t gzSize(
const uint8_t* image,
size_t imageSize) {
95 const uint8_t* pSize = image + imageSize - 1;
96 size_t size = *pSize--;
99 return 256 *
size + *pSize--;
104 if (
cbd->state != BLK_READY) {
111 bdip->blk_num =
size / BLOCK_SIZE;
112 bdip->blk_size = BLOCK_SIZE;
118 if (BLK_READY !=
cbd->state) {
126 static const BaseBlockDeviceVMT
cbdVmt = {
141 cbd->state = BLK_STOP;
147 cbd->state = BLK_READY;
static bool write(void *, uint32_t, const uint8_t *, uint32_t)
constexpr size_t gzSize(const uint8_t *image, size_t imageSize)
static bool is_inserted(void *)
static const BaseBlockDeviceVMT cbdVmt
static bool disconnect(void *instance)
void compressedBlockDeviceObjectInit(CompressedBlockDevice *cbd)
void compressedBlockDeviceStart(CompressedBlockDevice *cbd, const uint8_t *source, size_t sourceSize)
static bool get_info(void *instance, BlockDeviceInfo *bdip)
static bool connect(void *instance)
static bool read(void *instance, uint32_t startblk, uint8_t *buffer, uint32_t)
static bool is_protected(void *)
static bool sync(void *instance)
This file implements a ChibiOS block device backed by a compressed (gzip) store.
static CompressedBlockDevice cbd
uint8_t dictionary[32768]
const BaseBlockDeviceVMT * vmt
_base_block_device_data int32_t lastBlock
static BigBufferHandle buffer