143 lines
3.7 KiB
C
143 lines
3.7 KiB
C
/***************************************************************************
|
|
*
|
|
* Copyright 2015-2019 BES.
|
|
* All rights reserved. All unpublished rights reserved.
|
|
*
|
|
* No part of this work may be used or reproduced in any form or by any
|
|
* means, or stored in a database or retrieval system, without prior written
|
|
* permission of BES.
|
|
*
|
|
* Use of this work is governed by a license granted by BES.
|
|
* This work contains confidential and proprietary information of
|
|
* BES. which is protected by copyright, trade secret,
|
|
* trademark and other intellectual property rights.
|
|
*
|
|
****************************************************************************/
|
|
#include "plat_types.h"
|
|
#include "norflash_drv.h"
|
|
#include "hal_norflaship.h"
|
|
#include "norflash_en25s80b.h"
|
|
#include "hal_trace.h"
|
|
#include "hal_timer.h"
|
|
|
|
static void POSSIBLY_UNUSED en25s80b_en25s80b_reset(void)
|
|
{
|
|
// ip quad mode
|
|
norflaship_quad_mode(1);
|
|
norflaship_busy_wait();
|
|
|
|
hal_sys_timer_delay(20);
|
|
|
|
// quad reset enable
|
|
norflaship_clear_txfifo();
|
|
norflaship_cmd_addr(EN25S80B_CMD_QUAD_RESET_ENABLE, 0);
|
|
norflaship_busy_wait();
|
|
|
|
hal_sys_timer_delay(20);
|
|
|
|
// quad reset
|
|
norflaship_clear_txfifo();
|
|
norflaship_cmd_addr(EN25S80B_CMD_QUAD_RESET, 0);
|
|
norflaship_busy_wait();
|
|
|
|
hal_sys_timer_delay(20);
|
|
|
|
// ip spi mode
|
|
norflaship_quad_mode(0);
|
|
norflaship_hold_pin(0);
|
|
norflaship_wpr_pin(0);
|
|
norflaship_busy_wait();
|
|
|
|
hal_sys_timer_delay(20);
|
|
|
|
// reset enable
|
|
norflaship_clear_txfifo();
|
|
norflaship_cmd_addr(EN25S80B_CMD_SPI_RESET_ENABLE, 0);
|
|
norflaship_busy_wait();
|
|
|
|
hal_sys_timer_delay(20);
|
|
|
|
// reset
|
|
norflaship_clear_txfifo();
|
|
norflaship_cmd_addr(EN25S80B_CMD_SPI_RESET, 0);
|
|
norflaship_busy_wait();
|
|
|
|
hal_sys_timer_delay(20);
|
|
}
|
|
|
|
static void en25s80b_enter_OTP(void)
|
|
{
|
|
norflaship_clear_txfifo();
|
|
norflaship_cmd_addr(EN25S80B_CMD_ENTER_OTP, 0);
|
|
norflash_status_WIP_1_wait(0);
|
|
}
|
|
|
|
static void en25s80b_exit_OTP(void)
|
|
{
|
|
norflaship_clear_txfifo();
|
|
norflaship_cmd_addr(EN25S80B_CMD_EXIT_OTP, 0);
|
|
norflash_status_WIP_1_wait(0);
|
|
}
|
|
|
|
static void en25s80b_write_status_s0_s7(uint8_t status)
|
|
{
|
|
norflash_write_reg(EN25S80B_CMD_WRITE_STATUS, &status, 1);
|
|
}
|
|
|
|
static int en25s80b_write_status(enum DRV_NORFLASH_W_STATUS_T type, uint32_t param)
|
|
{
|
|
uint8_t status;
|
|
|
|
if (type == DRV_NORFLASH_W_STATUS_QE) {
|
|
en25s80b_enter_OTP();
|
|
|
|
status = norflash_read_status_s0_s7();
|
|
|
|
if (param) {
|
|
status |= (EN25S80B_WHDIS_BIT_MASK);
|
|
} else {
|
|
status &= ~(EN25S80B_WHDIS_BIT_MASK);
|
|
}
|
|
|
|
en25s80b_write_status_s0_s7(status);
|
|
|
|
en25s80b_exit_OTP();
|
|
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
const struct NORFLASH_CFG_T en25s80b_cfg = {
|
|
.id = { 0x1C, 0x38, 0x14, },
|
|
.speed_ratio = {
|
|
.s = {
|
|
.std_read = SPEED_RATIO_6_EIGHTH,
|
|
.others = SPEED_RATIO_6_EIGHTH,
|
|
},
|
|
},
|
|
.crm_en_bits = 0xA5,
|
|
.crm_dis_bits = 0xAA,
|
|
.sec_reg_cfg = {
|
|
.s = {
|
|
.enabled = false,
|
|
},
|
|
},
|
|
.page_size = EN25S80B_PAGE_SIZE,
|
|
.sector_size = EN25S80B_SECTOR_SIZE,
|
|
.block_size = EN25S80B_BLOCK_SIZE,
|
|
.total_size = EN25S80B_TOTAL_SIZE,
|
|
.max_speed = 104 * 1000 * 1000,
|
|
.mode = (HAL_NORFLASH_OP_MODE_STAND_SPI |
|
|
HAL_NORFLASH_OP_MODE_FAST_SPI |
|
|
HAL_NORFLASH_OP_MODE_DUAL_OUTPUT |
|
|
HAL_NORFLASH_OP_MODE_DUAL_IO |
|
|
HAL_NORFLASH_OP_MODE_QUAD_OUTPUT |
|
|
HAL_NORFLASH_OP_MODE_QUAD_IO |
|
|
HAL_NORFLASH_OP_MODE_PAGE_PROGRAM |
|
|
HAL_NORFLASH_OP_MODE_QUAD_PAGE_PROGRAM |
|
|
HAL_NORFLASH_OP_MODE_ERASE_IN_STD),
|
|
.write_status = en25s80b_write_status,
|
|
};
|
|
|