QSPIFBlockDevice example
Diff: main.cpp
- Revision:
- 0:5608693b47aa
diff -r 000000000000 -r 5608693b47aa main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Nov 08 16:00:03 2018 +0200 @@ -0,0 +1,118 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "mbed.h" +#include <stdio.h> +#include <algorithm> +#include "QSPIFBlockDevice.h" + + +QSPIFBlockDevice bd(QSPI_FLASH1_IO0, QSPI_FLASH1_IO1, QSPI_FLASH1_IO2, QSPI_FLASH1_IO3, + QSPI_FLASH1_SCK, QSPI_FLASH1_CSN, QSPIF_POLARITY_MODE_0, MBED_CONF_QSPIF_QSPI_FREQ); + +// Entry point for the example +int main() { + printf("--- Mbed OS QSPIF block device example ---\n"); + + // Initialize the block device + int err = bd.init(); + printf("bd.init -> %d\n", err); + + int erase_val = bd.get_erase_value(); + + // Get device geometry + bd_size_t read_size = bd.get_read_size(); + bd_size_t program_size = bd.get_program_size(); + bd_size_t erase_size = bd.get_erase_size(); + bd_size_t size = bd.size(); + + printf("--- Block device geometry ---\n"); + printf("read_size: %lld B\n", read_size); + printf("program_size: %lld B\n", program_size); + printf("erase_size: %lld B\n", erase_size); + printf("size: %lld B\n", size); + printf("---\n"); + + // Allocate a block with enough space for our data, aligned to the + // nearest program_size. This is the minimum size necessary to write + // data to a block. + size_t buffer_size = sizeof("Hello Storage!") + program_size-1; + buffer_size = buffer_size - (buffer_size % program_size); + char *buffer = new char[buffer_size]; + + // Read what is currently stored on the block device. We haven't written + // yet so this may be garbage + printf("bd.read(%p, %d, %d)\n", buffer, 0, buffer_size); + err = bd.read(buffer, 0, buffer_size); + printf("bd.read -> %d\n", err); + + printf("--- Stored data ---\n"); + for (size_t i = 0; i < buffer_size; i += 16) { + for (size_t j = 0; j < 16; j++) { + if (i+j < buffer_size) { + printf("%02x ", buffer[i+j]); + } else { + printf(" "); + } + } + + printf(" %.*s\n", buffer_size - i, &buffer[i]); + } + printf("---\n"); + + // Update buffer with our string we want to store + strncpy(buffer, "Hello Storage!", buffer_size); + + // Write data to first block, write occurs in two parts, + // an erase followed by a program + printf("bd.erase(%d, %lld)\n", 0, erase_size); + err = bd.erase(0, erase_size); + printf("bd.erase -> %d\n", err); + + printf("bd.program(%p, %d, %d)\n", buffer, 0, buffer_size); + err = bd.program(buffer, 0, buffer_size); + printf("bd.program -> %d\n", err); + + // Clobber the buffer so we don't get old data + memset(buffer, 0xcc, buffer_size); + + // Read the data from the first block, note that the program_size must be + // a multiple of the read_size, so we don't have to check for alignment + printf("bd.read(%p, %d, %d)\n", buffer, 0, buffer_size); + err = bd.read(buffer, 0, buffer_size); + printf("bd.read -> %d\n", err); + + printf("--- Stored data ---\n"); + for (size_t i = 0; i < buffer_size; i += 16) { + for (size_t j = 0; j < 16; j++) { + if (i+j < buffer_size) { + printf("%02x ", buffer[i+j]); + } else { + printf(" "); + } + } + + printf(" %.*s\n", buffer_size - i, &buffer[i]); + } + printf("---\n"); + + // Deinitialize the block device + printf("bd.deinit()\n"); + err = bd.deinit(); + printf("bd.deinit -> %d\n", err); + + printf("--- done! ---\n"); +} +