Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:5608693b47aa, committed 2018-11-08
- Comitter:
- Offir Kochalsky
- Date:
- Thu Nov 08 16:00:03 2018 +0200
- Commit message:
- QSPIFBlockDevice example
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- /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");
+}
+