diff options
| author | bhgv <bhgv.empire@gmail.com> | 2020-05-10 02:59:23 +0300 |
|---|---|---|
| committer | bhgv <bhgv.empire@gmail.com> | 2020-05-10 02:59:23 +0300 |
| commit | 31b4edc67b75658ce5e2d41f2fc87331f4b26d49 (patch) | |
| tree | a7b6ea659fe62e0a7239f29170024f524595fb4d /libiot/spiffs/k210_spiffs.c | |
| parent | c76314f0f38f4ed028610a6db4452879a556b35f (diff) | |
a try to add support of FreeRTOS riscV-64 (k210 cpu). first step
Diffstat (limited to 'libiot/spiffs/k210_spiffs.c')
| -rw-r--r-- | libiot/spiffs/k210_spiffs.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/libiot/spiffs/k210_spiffs.c b/libiot/spiffs/k210_spiffs.c new file mode 100644 index 0000000..f87a60c --- /dev/null +++ b/libiot/spiffs/k210_spiffs.c @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2015 - 2018, IBEROXARXA SERVICIOS INTEGRALES, S.L. + * Copyright (C) 2015 - 2018, Jaume Olivé Petrus (jolive@whitecatboard.org) + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the <organization> nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * * The WHITECAT logotype cannot be changed, you can remove it, but you + * cannot change it in any way. The WHITECAT logotype is: + * + * /\ /\ + * / \_____/ \ + * /_____________\ + * W H I T E C A T + * + * * Redistributions in binary form must retain all copyright notices printed + * to any local or remote output device. This include any reference to + * Lua RTOS, whitecatboard.org, Lua, and other copyright notices that may + * appear in the future. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Lua RTOS, spiffs port functions + * + */ + +#include "k210_spiffs.h" +//#include "esp_attr.h" +#include "spiffs.h" +#include "../hal/w25qxx.h" + +#include <stdlib.h> + +#include "../sys/mutex.h" + +#include <devices.h> +//#include <task.h> + + +#define SPI_FLASH_ALIGN 0 + + + + +static handle_t spi3 = 0; + + +s32_t k210_spi_flash_init() { + spi3 = io_open("/dev/spi3"); + if (!spi3) { + return 0; + } + w25qxx_init(spi3); + + return 1; +} + +void spiffs_lock(spiffs *fs) { + mtx_lock(fs->user_data); +} + +void spiffs_unlock(spiffs *fs) { + mtx_unlock(fs->user_data); +} + +s32_t k210_spi_flash_read(u32_t addr, u32_t size, u8_t *dst) { +#if SPI_FLASH_ALIGN + u32_t aaddr; + u8_t *buff = NULL; + u8_t *abuff = NULL; + u32_t asize; + + asize = size; + + // Align address to 4 byte + aaddr = (addr + (4 - 1)) & (u32_t) -4; + if (aaddr != addr) { + aaddr -= 4; + asize += (addr - aaddr); + } + + // Align size to 4 byte + asize = (asize + (4 - 1)) & (u32_t) -4; + + if ((aaddr != addr) || (asize != size)) { + // Align buffer + buff = malloc(asize + 4); + if (!buff) { + return SPIFFS_ERR_INTERNAL; + } + + abuff = (u8_t *) (((ptrdiff_t) buff + (4 - 1)) & (u32_t) -4); + + if (w25qxx_read_data(aaddr, (void *) abuff, asize) != W25QXX_OK) { + free(buff); + return SPIFFS_ERR_INTERNAL; + } + + memcpy(dst, abuff + (addr - aaddr), size); + + free(buff); + } else { +#endif + if (w25qxx_read_data(addr, (void *) dst, size) != W25QXX_OK) { + return SPIFFS_ERR_INTERNAL; + } +#if SPI_FLASH_ALIGN + } +#endif + return SPIFFS_OK; +} + +s32_t k210_spi_flash_write(u32_t addr, u32_t size, const u8_t *src) { +#if SPI_FLASH_ALIGN + u32_t aaddr; + u8_t *buff = NULL; + u8_t *abuff = NULL; + u32_t asize; + + asize = size; + + // Align address to 4 byte + aaddr = (addr + (4 - 1)) & -4; + if (aaddr != addr) { + aaddr -= 4; + asize += (addr - aaddr); + } + + // Align size to 4 byte + asize = (asize + (4 - 1)) & -4; + + if ((aaddr != addr) || (asize != size)) { + // Align buffer + buff = malloc(asize + 4); + if (!buff) { + return SPIFFS_ERR_INTERNAL; + } + + abuff = (u8_t *) (((ptrdiff_t) buff + (4 - 1)) & -4); + + if (w25qxx_read_data(aaddr, (void *) abuff, asize) != W25QXX_OK) { + free(buff); + return SPIFFS_ERR_INTERNAL; + } + + memcpy(abuff + (addr - aaddr), src, size); + + if (w25qxx_write_data(aaddr, (uint8_t *) abuff, asize) != W25QXX_OK) { + free(buff); + return SPIFFS_ERR_INTERNAL; + } + + free(buff); + } else { +#endif + if (w25qxx_write_data(addr, (uint8_t *) src, size) != W25QXX_OK) { + return SPIFFS_ERR_INTERNAL; + } +#if SPI_FLASH_ALIGN + } +#endif + return SPIFFS_OK; +} + +s32_t k210_spi_flash_erase(u32_t addr, u32_t size) { + if (w25qxx_sector_erase(addr >> 12) != W25QXX_OK) { + return SPIFFS_ERR_INTERNAL; + } + + return SPIFFS_OK; +} |
