Newer
Older
mbed-os / hal / tests / TESTS / mbed_hal / ospi / ospi_test_utils.h
@rogeryou rogeryou on 15 Sep 2020 6 KB add opsi driver
/* mbed Microcontroller Library
 * Copyright (c) 2018-2020 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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.
 */
#ifndef MBED_OSPI_TEST_UTILS_H
#define MBED_OSPI_TEST_UTILS_H

#include "flash_configs/flash_configs.h"
#include "unity/unity.h"
#include "hal/ospi_api.h"
#define OSPI_NONE (-1)

enum OspiStatus {
    sOK,
    sError,
    sTimeout,
    sUnknown
};

class OspiCommand {
public:
    void configure(ospi_bus_width_t inst_width, ospi_bus_width_t addr_width, ospi_bus_width_t data_width,
                   ospi_bus_width_t alt_width, ospi_address_size_t addr_size, ospi_alt_size_t alt_size,
                   int dummy_cycles = 0);

    void set_dummy_cycles(int dummy_cycles);

    void build(int instruction, int address = OSPI_NONE, int alt = OSPI_NONE);

    ospi_command_t *get();

private:
    ospi_command_t _cmd;
};

struct Ospi {
    ospi_t handle;
    OspiCommand cmd;
};

// MODE_Command_Address_Data_Alt
#define MODE_1_1_1      OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_SINGLE
#define MODE_1_1_2      OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_DUAL,   OSPI_CFG_BUS_DUAL
#define MODE_1_2_2      OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_DUAL,   OSPI_CFG_BUS_DUAL,   OSPI_CFG_BUS_DUAL
#define MODE_2_2_2      OSPI_CFG_BUS_DUAL,   OSPI_CFG_BUS_DUAL,   OSPI_CFG_BUS_DUAL,   OSPI_CFG_BUS_DUAL
#define MODE_1_1_4      OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_QUAD,   OSPI_CFG_BUS_QUAD
#define MODE_1_4_4      OSPI_CFG_BUS_SINGLE, OSPI_CFG_BUS_QUAD,   OSPI_CFG_BUS_QUAD,   OSPI_CFG_BUS_QUAD
#define MODE_4_4_4      OSPI_CFG_BUS_QUAD,   OSPI_CFG_BUS_QUAD,   OSPI_CFG_BUS_QUAD,   OSPI_CFG_BUS_QUAD
#define MODE_8_8_8      OSPI_CFG_BUS_OCTA,   OSPI_CFG_BUS_OCTA,   OSPI_CFG_BUS_OCTA,   OSPI_CFG_BUS_OCTA
#define MODE_8D_8D_8D   OSPI_CFG_BUS_OCTA_DTR, OSPI_CFG_BUS_OCTA_DTR, OSPI_CFG_BUS_OCTA_DTR, OSPI_CFG_BUS_OCTA_DTR


#define WRITE_1_1_1     MODE_1_1_1, OSPI_CMD_WRITE_1IO
#ifdef OSPI_CMD_WRITE_2IO
#define WRITE_1_2_2     MODE_1_2_2, OSPI_CMD_WRITE_2IO
#endif
#ifdef OSPI_CMD_WRITE_1I4O      // Quad page program - command: 0x32
#define WRITE_1_1_4     MODE_1_1_4, OSPI_CMD_WRITE_1I4O
#endif
#ifdef OSPI_CMD_WRITE_4IO
#define WRITE_1_4_4     MODE_1_4_4, OSPI_CMD_WRITE_4IO
#endif
#ifdef OSPI_CMD_WRITE_DPI
#define WRITE_2_2_2     MODE_2_2_2, OSPI_CMD_WRITE_DPI
#endif
#ifdef OSPI_CMD_WRITE_QPI
#define WRITE_4_4_4     MODE_4_4_4, OSPI_CMD_WRITE_QPI
#endif
#ifdef OSPI_CMD_WRITE_OPI
#define WRITE_8_8_8     MODE_8_8_8, OSPI_CMD_WRITE_OPI
#endif
#ifdef OSPI_CMD_WRITE_OPI
#define WRITE_8D_8D_8D  MODE_8D_8D_8D, OSPI_CMD_WRITE_OPI
#endif

#define READ_1_1_1      MODE_1_1_1, OSPI_CMD_READ_1IO,  OSPI_READ_1IO_DUMMY_CYCLE
#ifdef OSPI_CMD_READ_1I2O
#define READ_1_1_2      MODE_1_1_2, OSPI_CMD_READ_1I2O, OSPI_READ_1I2O_DUMMY_CYCLE
#endif
#ifdef OSPI_CMD_READ_2IO
#define READ_1_2_2      MODE_1_2_2, OSPI_CMD_READ_2IO,  OSPI_READ_2IO_DUMMY_CYCLE
#endif
#ifdef OSPI_CMD_READ_1I4O
#define READ_1_1_4      MODE_1_1_4, OSPI_CMD_READ_1I4O, OSPI_READ_1I4O_DUMMY_CYCLE
#endif
#ifdef OSPI_CMD_READ_4IO
#define READ_1_4_4      MODE_1_4_4, OSPI_CMD_READ_4IO,  OSPI_READ_4IO_DUMMY_CYCLE
#endif
#ifdef OSPI_CMD_READ_OPI
#define READ_8_8_8      MODE_8_8_8, OSPI_CMD_READ_OPI,  OSPI_READ_8IO_DUMMY_CYCLE
#endif
#ifdef OSPI_CMD_READ_DOPI
#define READ_8D_8D_8D   MODE_8D_8D_8D, OSPI_CMD_READ_DOPI,  OSPI_READ_8IO_DUMMY_CYCLE
#endif

#ifdef OSPI_CMD_READ_DPI
#define READ_2_2_2      MODE_2_2_2, OSPI_CMD_READ_DPI,  OSPI_READ_2IO_DUMMY_CYCLE
#endif
#ifdef OSPI_CMD_READ_QPI
#define READ_4_4_4      MODE_4_4_4, OSPI_CMD_READ_QPI,  OSPI_READ_4IO_DUMMY_CYCLE
#endif

#define ADDR_SIZE_8  OSPI_CFG_ADDR_SIZE_8
#define ADDR_SIZE_16 OSPI_CFG_ADDR_SIZE_16
#define ADDR_SIZE_24 OSPI_CFG_ADDR_SIZE_24
#define ADDR_SIZE_32 OSPI_CFG_ADDR_SIZE_32

#define ALT_SIZE_8  OSPI_CFG_ALT_SIZE_8
#define ALT_SIZE_16 OSPI_CFG_ALT_SIZE_16
#define ALT_SIZE_24 OSPI_CFG_ALT_SIZE_24
#define ALT_SIZE_32 OSPI_CFG_ALT_SIZE_32

#define STATUS_REG      OSPI_CMD_RDSR
#define CONFIG_REG0      OSPI_CMD_RDCR0
#ifdef OSPI_CMD_RDCR1
#define CONFIG_REG1      OSPI_CMD_RDCR1
#endif
#ifdef OSPI_CMD_RDCR2
#define CONFIG_REG2      OSPI_CMD_RDCR2
#endif
#define SECURITY_REG    OSPI_CMD_RDSCUR

#ifndef OSPI_CONFIG_REG_1_SIZE
#define OSPI_CONFIG_REG_1_SIZE 0
#endif

#ifndef OSPI_CONFIG_REG_2_SIZE
#define OSPI_CONFIG_REG_2_SIZE 0
#endif


#define SECTOR_ERASE  OSPI_CMD_ERASE_SECTOR
#define BLOCK_ERASE   OSPI_CMD_ERASE_BLOCK_64


#define SECTOR_ERASE_MAX_TIME   OSPI_ERASE_SECTOR_MAX_TIME
#define BLOCK32_ERASE_MAX_TIME  OSPI_ERASE_BLOCK_32_MAX_TIME
#define BLOCK64_ERASE_MAX_TIME  OSPI_ERASE_BLOCK_64_MAX_TIME
#define PAGE_PROG_MAX_TIME      OSPI_PAGE_PROG_MAX_TIME
#define WRSR_MAX_TIME           OSPI_WRSR_MAX_TIME
#define WAIT_MAX_TIME           OSPI_WAIT_MAX_TIME



ospi_status_t read_register(uint32_t cmd, uint8_t *buf, uint32_t size, Ospi &q);
ospi_status_t write_register(uint32_t cmd, uint8_t *buf, uint32_t size, Ospi &q);

OspiStatus flash_wait_for(uint32_t time_us, Ospi &ospi);

void flash_init(Ospi &ospi);

ospi_status_t write_enable(Ospi &ospi);
ospi_status_t write_disable(Ospi &ospi);

void log_register(uint32_t cmd, uint32_t reg_size, Ospi &ospi, const char *str = NULL);

ospi_status_t mode_enable(Ospi &ospi, ospi_bus_width_t inst_width, ospi_bus_width_t addr_width, ospi_bus_width_t data_width);
ospi_status_t mode_disable(Ospi &ospi, ospi_bus_width_t inst_width, ospi_bus_width_t addr_width, ospi_bus_width_t data_width);

ospi_status_t fast_mode_enable(Ospi &ospi);
ospi_status_t fast_mode_disable(Ospi &ospi);

ospi_status_t erase(uint32_t erase_cmd, uint32_t flash_addr, Ospi &ospi);

bool is_extended_mode(ospi_bus_width_t inst_width, ospi_bus_width_t addr_width, ospi_bus_width_t data_width);
bool is_dual_mode(ospi_bus_width_t inst_width, ospi_bus_width_t addr_width, ospi_bus_width_t data_width);
bool is_quad_mode(ospi_bus_width_t inst_width, ospi_bus_width_t addr_width, ospi_bus_width_t data_width);
bool is_octa_mode(ospi_bus_width_t inst_width, ospi_bus_width_t addr_width, ospi_bus_width_t data_width);
bool is_octa_dtr_mode(ospi_bus_width_t inst_width, ospi_bus_width_t addr_width, ospi_bus_width_t data_width);

#define  WAIT_FOR(timeout, q)   TEST_ASSERT_EQUAL_MESSAGE(sOK, flash_wait_for(timeout, q), "flash_wait_for failed!!!")


#endif // MBED_OSPI_TEST_UTILS_H