| /* |
| * |
| * Copyright (c) 2021 Project CHIP Authors |
| * All rights reserved. |
| * |
| * 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. |
| */ |
| |
| /** |
| * @file |
| * Implementation of a key-value store using mtb_kvstore lib |
| * |
| */ |
| |
| #include "MTBKeyValueStore.h" |
| #include "cy_serial_flash_qspi.h" |
| #include "cybsp.h" |
| #include "cycfg_qspi_memslot.h" |
| #include "cyhal.h" |
| |
| namespace { |
| mtb_kvstore_bd_t block_device; |
| } // namespace |
| |
| #define MEM_SLOT_NUM (0u) /* Slot number of the memory to use */ |
| #define QSPI_BUS_FREQUENCY_HZ (50000000lu) |
| cy_rslt_t mtb_key_value_store_init(mtb_kvstore_t * kvstore_obj) |
| { |
| uint32_t ext_mem_address = 0x00; |
| size_t sectorSize; |
| // Initialize the block device |
| cy_rslt_t result = |
| cy_serial_flash_qspi_init(smifMemConfigs[MEM_SLOT_NUM], CYBSP_QSPI_D0, CYBSP_QSPI_D1, CYBSP_QSPI_D2, CYBSP_QSPI_D3, NC, NC, |
| NC, NC, CYBSP_QSPI_SCK, CYBSP_QSPI_SS, QSPI_BUS_FREQUENCY_HZ); |
| if (CY_RSLT_SUCCESS != result) |
| { |
| return result; |
| } |
| sectorSize = cy_serial_flash_qspi_get_erase_size(ext_mem_address); |
| uint32_t length = sectorSize * 2; |
| #ifdef P6_OTA |
| // If using OTA set the start address towards the end of the flash area so |
| // an update doesn't clobber the persistent storage. |
| uint32_t start_addr = 0x3000000U; |
| #else |
| uint32_t start_addr = 0; |
| #endif |
| |
| block_device.read = bd_read; |
| block_device.program = bd_program; |
| block_device.erase = bd_erase; |
| block_device.read_size = bd_read_size; |
| block_device.program_size = bd_program_size; |
| block_device.erase_size = bd_erase_size; |
| block_device.context = NULL; |
| |
| // Initialize the kv-store library |
| result = mtb_kvstore_init(kvstore_obj, start_addr, length, &block_device); |
| if (CY_RSLT_SUCCESS != result) |
| { |
| cy_serial_flash_qspi_deinit(); |
| } |
| |
| return result; |
| } |
| |
| uint32_t bd_read_size(void * context, uint32_t addr) |
| { |
| return 1; |
| } |
| |
| uint32_t bd_program_size(void * context, uint32_t addr) |
| { |
| return cy_serial_flash_qspi_get_prog_size(addr); |
| } |
| |
| uint32_t bd_erase_size(void * context, uint32_t addr) |
| { |
| return cy_serial_flash_qspi_get_erase_size(addr); |
| } |
| |
| cy_rslt_t bd_read(void * context, uint32_t addr, uint32_t length, uint8_t * buf) |
| { |
| return cy_serial_flash_qspi_read(addr, length, buf); |
| } |
| |
| cy_rslt_t bd_program(void * context, uint32_t addr, uint32_t length, const uint8_t * buf) |
| { |
| return cy_serial_flash_qspi_write(addr, length, buf); |
| } |
| |
| cy_rslt_t bd_erase(void * context, uint32_t addr, uint32_t length) |
| { |
| return cy_serial_flash_qspi_erase(addr, length); |
| } |