OpenCores
URL https://opencores.org/ocsvn/xenie/xenie/trunk

Subversion Repositories xenie

[/] [xenie/] [trunk/] [examples/] [Eth_example/] [mb_fw/] [xenie_eth_test_womtd/] [src/] [spansion_flash.c] - Blame information for rev 4

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 DFC
/******************************************************************************
2
**
3
** (C) Copyright 2017 DFC Design, s.r.o., Brno, Czech Republic
4
** Author: Marek Kvas (m.kvas@dspfpga.com)
5
**
6
****************************************************************************
7
**
8
** This file is part of Xenia Ethernet Example project.
9
**
10
** Xenia Ethernet Example project is free software: you can
11
** redistribute it and/or modify it under the terms of
12
** the GNU Lesser General Public License as published by the Free
13
** Software Foundation, either version 3 of the License, or
14
** (at your option) any later version.
15
**
16
** Xenia Ethernet Example project is distributed in the hope that
17
** it will be useful, but WITHOUT ANY WARRANTY; without even
18
** the implied warranty of MERCHANTABILITY or FITNESS FOR A
19
** PARTICULAR PURPOSE.  See the GNU Lesser General Public License
20
** for more details.
21
**
22
** You should have received a copy of the GNU Lesser General Public
23
** License along with Xenia Ethernet Example project.  If not,
24
** see <http://www.gnu.org/licenses/>.
25
****************************************************************************
26
*/
27
 
28
#include <stdio.h>
29
#include <xspi.h>
30
#include "spansion_flash.h"
31
#include "uprintf.h"
32
 
33
 
34
int spansion_flash_init (struct spansion_flash *sf, XSpi *spi, int slave_num)
35
{
36
        sf->spi = spi;
37
        sf->slave_select = (1<<slave_num);
38
        int res;
39
 
40
        res = XSpi_SetOptions(sf->spi, (XSP_MASTER_OPTION | \
41
                                                XSP_MANUAL_SSELECT_OPTION | \
42
                                                XSP_CLK_PHASE_1_OPTION | \
43
                                                XSP_CLK_ACTIVE_LOW_OPTION));
44
        if(res)
45
                return res;
46
 
47
        res = XSpi_SetSlaveSelect(sf->spi, sf->slave_select);
48
        if(res)
49
                return res;
50
 
51
        res = XSpi_Start(sf->spi);
52
        return res;
53
}
54
 
55
static int spansion_flash_transfer(struct spansion_flash *sf, uint8_t *wr_buf, uint8_t *rd_buf, int len)
56
{
57
        int res;
58
 
59
        res = XSpi_Transfer(sf->spi, wr_buf, rd_buf, len);
60
        if(res)
61
                return res;
62
 
63
        return XST_SUCCESS;
64
}
65
 
66
 
67
/* Get status and control register and set QSPI*/
68
int spansion_flash_quad_mode(struct spansion_flash *sf)
69
{
70
#define SPANSION_CFG_REG_QUAD           (1<<1)
71
        int ret;
72
        u8 rCfgBuf[2];
73
        u8 rStBuf[2];
74
        u8 wCfgBuf[3];
75
        u8 wEnBuf[1];
76
 
77
        rCfgBuf[0] = 0x35;
78
        ret = spansion_flash_transfer(sf, rCfgBuf, rCfgBuf, 2);
79
        if(ret)
80
                return ret;
81
 
82
        rStBuf[0] = 0x05;
83
        ret = spansion_flash_transfer(sf, rStBuf, rStBuf, 2);
84
        if(ret)
85
                return ret;
86
 
87
        wEnBuf[0] = 0x6;
88
        ret = spansion_flash_transfer(sf, wEnBuf, wEnBuf, 1);
89
        if(ret)
90
                return ret;
91
 
92
 
93
        wCfgBuf[0] = 0x01;
94
        wCfgBuf[1] = rStBuf[1];
95
        wCfgBuf[2] = rCfgBuf[1] | SPANSION_CFG_REG_QUAD;
96
 
97
        ret = spansion_flash_transfer(sf, wCfgBuf, wCfgBuf, 3);
98
        if(ret)
99
                return ret;
100
 
101
        /* Reread CFG reg */
102
        rCfgBuf[0] = 0x35;
103
        ret = spansion_flash_transfer(sf, rCfgBuf, rCfgBuf, 2);
104
        if(ret)
105
                return ret;
106
 
107
        return 0;
108
}
109
 
110
/* Set extended addressing mode in Flash and in Xilisf */
111
/* !!! Doesn't work well for quad command 6b */
112
int spansion_flash_extended_addressing(struct spansion_flash *sf, int onOff)
113
{
114
#define SPANSION_BANK_REG_EXT_ADDR              (1<<7)
115
        int ret;
116
        u8 buf[2];
117
        XSpi *spi = sf->spi;
118
 
119
        /* Read bank register*/
120
        buf[0] = 0x16;
121
        ret = XSpi_Transfer(spi, buf, buf, 2);
122
        if(ret)
123
                return ret;
124
 
125
        /* Write bank register with extended addressing setting */
126
        buf[0] = 0x17;
127
        if (onOff) {
128
                buf[1] |=  SPANSION_BANK_REG_EXT_ADDR;
129
        } else {
130
                buf[1] &=  ~SPANSION_BANK_REG_EXT_ADDR;
131
        }
132
        ret = XSpi_Transfer(spi, buf, buf, 2);
133
        if(ret)
134
                return ret;
135
 
136
        /* Read bank register*/
137
        buf[0] = 0x16;
138
        ret = XSpi_Transfer(spi, buf, buf, 2);
139
        if(ret)
140
                return ret;
141
        uprintf("Modified bank register 0x%02x\r\n", buf[1]);
142
 
143
        return 0;
144
}
145
 
146
/*
147
 *  Use Quad IO 4 byte address read command to read block of data.
148
 *  spi - SPI core instance to be used
149
 *  flash_addr - 32 bit start address in flash
150
 *  buf - pointer to buffer where data shall be stored; must be 8 byte longer then length of data
151
 *        rad data are placed at buf+8 address.
152
 *  len - number of bytes to be read from flash; must be 8 bytes lower than true buf len
153
 */
154
int spansion_flash_quad_io_read(struct spansion_flash *sf, uint32_t flash_addr, uint8_t *buf, int len)
155
{
156
        XSpi *spi = sf->spi;
157
        u8 *cmdbuf = buf;
158
 
159
        /* Quad IO read with 32 bit address */
160
        *(cmdbuf++) = 0xec;
161
        /* Address MSB first */
162
        *(cmdbuf++) = flash_addr >> 24;
163
        *(cmdbuf++) = flash_addr >> 16;
164
        *(cmdbuf++) = flash_addr >> 8;
165
        *(cmdbuf++) = flash_addr;
166
        /* 3 Dummy bytes - 6 cycle for latency code 00b */
167
        *(cmdbuf++) = 0;
168
        *(cmdbuf++) = 0;
169
        *(cmdbuf++) = 0;
170
 
171
        return XSpi_Transfer(spi, buf, buf, len + 8);
172
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.