From b3bf7c5ea75bfcefd570aaf3e999b386d8d10183 Mon Sep 17 00:00:00 2001 From: Chun-Chieh Li Date: Tue, 16 Jul 2019 15:36:09 +0800 Subject: [PATCH] Support NUMAKER_IOT_M487 1. Support Nuvoton targets: - NUMAKER_IOT_M487 V1.3 Compared to V1.2, V1.3 adds support for ESP8266 RTS/CTS/RST pins. V1.3 is incompatible with V1.2 on ESP8266. 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. Change back UARTSerial tx/rx buffer size from 1024/1024 to 256/256. This can reduce memory footprint by (1024 - 256) * 2 = 1.5KiB. Because this configuration influences both ESP8266 and default console (platfrom/mbed_retarget.cpp), memory reduction can achieve 1.5KiB x 2 = 3KiB. 4. Enlarge ESP8266 'send tcp data' timeout on Nuvoton targets Pelion connection has some failure rate with this. Enlarging ESP8266_SEND_TIMEOUT can just relieve the issue. A ticket has raised to address it: https://github.com/ARMmbed/mbed-os/issues/11544 --- README.md | 1 + ...r-m487_iot-block_device-kvstore-v4.1.0.bin | Bin 0 -> 44820 bytes drivers/storage/COMPONENT_NUSD.lib | 1 + mbed_app.json | 31 ++++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 bootloader/mbed-bootloader-m487_iot-block_device-kvstore-v4.1.0.bin create mode 100644 drivers/storage/COMPONENT_NUSD.lib diff --git a/README.md b/README.md index e2f8185..5f83a4b 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Board | Connectivity | Storage for credentials and `Embedded Planet EP_AGORA` | Cellular | SPIF | Build-only `ST NUCLEO_H743ZI2` | Ethernet | Internal Flash | Build-only `ST NUCLEO_L4R5ZI` | Wi-Fi ESP8266 | Internal Flash | Build-only +`Nuvoton NUMAKER_IOT_M487` | Wi-Fi ESP8266 | SD card (NUSD) | Build-only Build-only = This target is currently verified only via compilation, and is not verified at runtime. diff --git a/bootloader/mbed-bootloader-m487_iot-block_device-kvstore-v4.1.0.bin b/bootloader/mbed-bootloader-m487_iot-block_device-kvstore-v4.1.0.bin new file mode 100644 index 0000000000000000000000000000000000000000..08d13f6b8ec33286110a983455e67a64ac41704b GIT binary patch literal 44820 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 Ka6?Q`@c#jHnGAaX 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 c0e38b7..07bf149 100644 --- a/mbed_app.json +++ b/mbed_app.json @@ -182,6 +182,37 @@ "esp8266.cts" : "PA_11", "esp8266.provide-default" : true }, + "NUMAKER_IOT_M487": { + "target.extra_labels_add" : ["PSA"], + "target.network-default-interface-type" : "WIFI", + "target.bootloader_img" : "bootloader/mbed-bootloader-m487_iot-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)", + "esp8266.tx" : "PH_8", + "esp8266.rx" : "PH_9", + "esp8266.rts" : "A2", + "esp8266.cts" : "A3", + "esp8266.rst" : "PH_3", + "esp8266.provide-default" : true, + "target.macros_add" : ["MBEDTLS_USER_CONFIG_FILE=\"mbedTLSConfig_mbedOS_SW_TRNG_PSA.h\"", "MBEDTLS_PSA_CRYPTO_C", "MBEDTLS_ENTROPY_NV_SEED", "PAL_USE_HW_TRNG=0", "ESP8266_SEND_TIMEOUT=8000"] + }, "DISCO_L475VG_IOT01A": { "target.macros_add" : ["MBEDTLS_USER_CONFIG_FILE=\"mbedTLSConfig_mbedOS.h\""], "target.network-default-interface-type" : "WIFI",