From: Aaron Nyholm <aaron.nyh...@southerninnovation.com> --- .../include/bsp/jffs2_xqspipsu.h | 62 ++++++ bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c | 190 ++++++++++++++++++ spec/build/bsps/aarch64/xilinx-versal/grp.yml | 4 + .../aarch64/xilinx-versal/objjffs2qspinor.yml | 20 ++ .../aarch64/xilinx-versal/objxqspiflash.yml | 2 - 5 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h create mode 100644 bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c create mode 100644 spec/build/bsps/aarch64/xilinx-versal/objjffs2qspinor.yml
diff --git a/bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h b/bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h new file mode 100644 index 0000000000..4a1cdac7a6 --- /dev/null +++ b/bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSBSPsAArch64XilinxVersal + * + * @brief Xilinx Versal QSPI JFFS2 flash driver definitions + */ + +/* + * Copyright (C) 2023 Aaron Nyholm + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * 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 THE COPYRIGHT OWNER OR CONTRIBUTORS 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. + */ + +#ifndef LIBBSP_XILINX_VERSAL_JFFS2_XQSPIPSU_H +#define LIBBSP_XILINX_VERSAL_JFFS2_XQSPIPSU_H + +#include <dev/spi/xqspipsu.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @brief Mount jffs2 filesystem. + * + * @param[in] mount_dir The directory to mount the filesystem at. + * @param[in] qspipsu_ptr A pointer to an initialized QSPI instance. + * + * @retval 0 Successful operation. Negative number otherwise. + */ +int xilinx_versal_nor_jffs2_initialize( + const char *mount_dir, + XQspiPsu *qspipsu_ptr +); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBBSP_XILINX_VERSAL_JFFS2_XQSPIPSU_H */ diff --git a/bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c b/bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c new file mode 100644 index 0000000000..c84280b420 --- /dev/null +++ b/bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c @@ -0,0 +1,190 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/* + * Copyright (C) 2023 Aaron Nyholm + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * 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 THE COPYRIGHT OWNER OR CONTRIBUTORS 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. + */ + +#include <string.h> + +#include <bsp/irq.h> +#include <bsp/jffs2_xqspipsu.h> +#include <rtems/jffs2.h> +#include <rtems/libio.h> +#include <xqspipsu-flash-helper.h> + +typedef struct { + rtems_jffs2_flash_control super; + XQspiPsu *qspipsu; +} flash_control; + +#ifndef versal +#define versal +#endif + +/* From the N25Q00A datasheet */ +#define BLOCK_SIZE (128UL * 1024UL) //(64UL * 1024UL) +#define FLASH_SIZE (512UL * BLOCK_SIZE) +#define FLASH_DEVICE_ID 0xbb21 /* Type: 0xbb, Capacity: 0x21 */ + +static flash_control *get_flash_control( rtems_jffs2_flash_control *super ) +{ + return (flash_control *) super; +} + +static int do_read( + rtems_jffs2_flash_control *super, + uint32_t offset, + unsigned char *buffer, + size_t size_of_buffer +) +{ + int Status; + + flash_control *self = get_flash_control( super ); + XQspiPsu *QspiPsuPtr = self->qspipsu; + u8* ReadBuffer = NULL; + + Status = QspiPsu_NOR_Read( + QspiPsuPtr, + offset, + size_of_buffer, + &ReadBuffer + ); + if ( Status != XST_SUCCESS ) { + return Status; + } + + /* + * We have to copy since we can't be sure that buffer is properly aligned. + */ + memcpy( buffer, ReadBuffer, size_of_buffer ); + + return 0; +} + +static int do_write( + rtems_jffs2_flash_control *super, + uint32_t offset, + const unsigned char *buffer, + size_t size_of_buffer +) +{ + int Status; + + flash_control *self = get_flash_control( super ); + XQspiPsu *QspiPsuPtr = self->qspipsu; + + Status = QspiPsu_NOR_Write( + QspiPsuPtr, + offset, + size_of_buffer, + (unsigned char *) buffer + ); + if ( Status != XST_SUCCESS ) { + return Status; + } + + return 0; +} + +static int do_erase( + rtems_jffs2_flash_control *super, + uint32_t offset +) +{ + int Status; + + flash_control *self = get_flash_control( super ); + XQspiPsu *QspiPsuPtr = self->qspipsu; + + Status = QspiPsu_NOR_Erase( + QspiPsuPtr, + offset, + BLOCK_SIZE + ); + if ( Status != XST_SUCCESS ) { + return Status; + } + + return 0; +} + +static void do_destroy( rtems_jffs2_flash_control *super ) +{ + flash_control *self = get_flash_control( super ); + + rtems_interrupt_handler_remove( + VERSAL_IRQ_QSPI, + (rtems_interrupt_handler) XQspiPsu_InterruptHandler, + self->qspipsu + ); +} + +static flash_control flash_instance = { + .super = { + .block_size = BLOCK_SIZE, + .flash_size = FLASH_SIZE, + .read = do_read, + .write = do_write, + .erase = do_erase, + .destroy = do_destroy, + .device_identifier = FLASH_DEVICE_ID + } +}; + +static rtems_jffs2_mount_data mount_data = { + .flash_control = &flash_instance.super, + .compressor_control = NULL +}; + +int xilinx_versal_nor_jffs2_initialize( + const char *mount_dir, + XQspiPsu *qspipsu_ptr +) +{ + int rv = 0; + + flash_instance.qspipsu = qspipsu_ptr; + + rv = QspiPsu_NOR_Initialize( + flash_instance.qspipsu, + VERSAL_IRQ_QSPI + ); + if ( rv != 0 ) { + return rv; + } + + rv = mount_and_make_target_path( + NULL, + mount_dir, + RTEMS_FILESYSTEM_TYPE_JFFS2, + RTEMS_FILESYSTEM_READ_WRITE, + &mount_data + ); + if ( rv != 0 ) { + return rv; + } + + return 0; +} diff --git a/spec/build/bsps/aarch64/xilinx-versal/grp.yml b/spec/build/bsps/aarch64/xilinx-versal/grp.yml index 098a8481db..a7e7a9442e 100644 --- a/spec/build/bsps/aarch64/xilinx-versal/grp.yml +++ b/spec/build/bsps/aarch64/xilinx-versal/grp.yml @@ -24,6 +24,10 @@ links: uid: abi - role: build-dependency uid: obj +- role: build-dependency + uid: ../../objqspipsu +- role: build-dependency + uid: objjffs2qspinor - role: build-dependency uid: objxqspiflash - role: build-dependency diff --git a/spec/build/bsps/aarch64/xilinx-versal/objjffs2qspinor.yml b/spec/build/bsps/aarch64/xilinx-versal/objjffs2qspinor.yml new file mode 100644 index 0000000000..933e377b3e --- /dev/null +++ b/spec/build/bsps/aarch64/xilinx-versal/objjffs2qspinor.yml @@ -0,0 +1,20 @@ +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause +build-type: objects +cflags: [] +copyrights: +- Copyright (C) 2023 Aaron Nyholm +cppflags: [] +cxxflags: [] +enabled-by: true +includes: +- bsps/include/dev/spi/ +- bsps/include/xil/ +- bsps/include/xil/${XIL_SUPPORT_PATH}/ +install: +- destination: ${BSP_INCLUDEDIR}/bsp + source: + - bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h +links: [] +source: + - bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c +type: build diff --git a/spec/build/bsps/aarch64/xilinx-versal/objxqspiflash.yml b/spec/build/bsps/aarch64/xilinx-versal/objxqspiflash.yml index 6d84bfa8cd..4fe5adc44b 100644 --- a/spec/build/bsps/aarch64/xilinx-versal/objxqspiflash.yml +++ b/spec/build/bsps/aarch64/xilinx-versal/objxqspiflash.yml @@ -17,8 +17,6 @@ install: links: - role: build-dependency uid: ../../objxilinxsupport -- role: build-dependency - uid: ../../objqspipsu source: - bsps/aarch64/xilinx-versal/dev/spi/versal_xqspi_flash.c type: build -- 2.25.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel