From fa31228f40feb14699cac8fd79239286dd0f99a6 Mon Sep 17 00:00:00 2001 From: Chun-Chieh Li Date: Tue, 16 Jul 2019 15:36:09 +0800 Subject: [PATCH] Support NUMAKER_PFM_M487 Based on mbed-os-pelion-example master/mbed-bootloader 4.1.0/mbed-cloud-client 4.0.0, support Nuvoton targets: 1. Support Nuvoton targets: - NUMAKER_PFM_M487 2. Change storage to NUSD (SD card in SDIO bus mode) from SD (SD card SPI bus mode) (1) Add COMPONENT_NUSD.lib. (2) Add component NUSD (target.components_add). (3) Change default BlockDevice to NUSD: Override BlockDevice::get_default_instance (nusd.provide-default-blockdevice). Required since mbed-cloud-client 2.1.0 (arm_uc_blockdevice_ext) or in: mbed-bootloader/modules/storage/pal-blockdevice/source/arm_uc_pal_blockdevice_mbed.cpp (4) Enable kvstore with blockdevice type being "other". i) Override get_other_blockdevice() (nusd.provide-kvstore-other-blockdevice). ii) Configure storage type to "FILESYSTEM". iii)Configure file system type to "LITTLE". vi) Configure block device type to "other". v) Configure external size to 64MiB, which cannot overlap with update-client. storage-address/update-client.storage-size. 3. Requirements for mbed-os version: - mbed-os 5.13.0 (or afterwards) to support kvstore with block device type being "other" - mbed-os 5.13.1 (or afterwards) to fix 'undefined pal_plat_osEntropyInject(...)' error --- README.md | 1 + ...oader-m487-block_device-kvstore-v4.1.0.bin | Bin 0 -> 45272 bytes drivers/storage/COMPONENT_NUSD.lib | 1 + mbed_app.json | 24 ++++++++++++++++++ 4 files changed, 26 insertions(+) create mode 100644 bootloader/mbed-bootloader-m487-block_device-kvstore-v4.1.0.bin create mode 100644 drivers/storage/COMPONENT_NUSD.lib diff --git a/README.md b/README.md index 2f4f408..613bed0 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Board | Connectivity | Storage for credentials and `ST NUCLEO_F411RE` | Wi-Fi ESP8266 | SD card | `Ublox UBLOX_EVK_ODIN_W2` | Wi-Fi | SD card | `ST DISCO_L475VG_IOT01A` | Wi-Fi | QSPIF | +`Nuvoton NUMAKER_PFM_M487` | Ethernet | SD card (NUSD) | Build-only = This target is currently verified only via compilation, and is not verified at runtime. diff --git a/bootloader/mbed-bootloader-m487-block_device-kvstore-v4.1.0.bin b/bootloader/mbed-bootloader-m487-block_device-kvstore-v4.1.0.bin new file mode 100644 index 0000000000000000000000000000000000000000..feeae15949804cfe2af0ce515d938bbfaf3604c9 GIT binary patch literal 45272 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 literal 0 HcmV?d00001 diff --git a/drivers/storage/COMPONENT_NUSD.lib b/drivers/storage/COMPONENT_NUSD.lib new file mode 100644 index 0000000..e880349 --- /dev/null +++ b/drivers/storage/COMPONENT_NUSD.lib @@ -0,0 +1 @@ +https://github.com/OpenNuvoton/NuMaker-mbed-SD-driver/#56406071a4468a8302c0717a4467a241d152ade2 diff --git a/mbed_app.json b/mbed_app.json index b1d560e..e8dce13 100644 --- a/mbed_app.json +++ b/mbed_app.json @@ -133,6 +133,30 @@ "esp8266.cts" : "PA_11", "esp8266.provide-default" : true }, + "NUMAKER_PFM_M487": { + "target.network-default-interface-type" : "ETHERNET", + "target.bootloader_img" : "bootloader/mbed-bootloader-m487-block_device-kvstore-v4.1.0.bin", + "bootloader-size" : "(64*1024)", + "target.header_offset" : "0x12000", + "target.app_offset" : "0x12400", + "target.components_add" : ["NUSD"], + "nusd.provide-default-blockdevice" : true, + "nusd.provide-kvstore-other-blockdevice" : true, + "update-client.bootloader-details" : "0x0", + "update-client.application-details" : "0x12000", + "update-client.storage-address" : "(1024*1024*64)", + "update-client.storage-size" : "((MBED_ROM_START + MBED_ROM_SIZE - APPLICATION_ADDR) * MBED_CONF_UPDATE_CLIENT_STORAGE_LOCATIONS)", + "update-client.storage-locations" : 1, + "mbed-cloud-client.update-storage" : "ARM_UCP_FLASHIAP_BLOCKDEVICE", + "storage.storage_type" : "FILESYSTEM", + "storage_filesystem.filesystem" : "LITTLE", + "storage_filesystem.blockdevice" : "other", + "storage_filesystem.internal_base_address" : "(MBED_ROM_START + MBED_BOOTLOADER_SIZE)", + "storage_filesystem.rbp_internal_size" : "(2*4*1024)", + "storage_filesystem.external_base_address" : "(0x0)", + "storage_filesystem.external_size" : "(1024*1024*64)", + "target.macros_add" : ["MBEDTLS_USER_CONFIG_FILE=\"mbedTLSConfig_mbedOS.h\""] + }, "DISCO_L475VG_IOT01A": { "target.macros_add" : ["MBEDTLS_USER_CONFIG_FILE=\"mbedTLSConfig_mbedOS.h\""], "target.network-default-interface-type" : "WIFI",