blob: 5ccf7d44c97de13978f746a434e72cc38a57fa8a [file] [log] [blame]
Damien George784e0232017-01-24 16:56:03 +11001/*
2 * This file is part of the MicroPython project, http://micropython.org/
3 *
4 * The MIT License (MIT)
5 *
Damien George4e487002018-03-02 16:01:18 +11006 * Copyright (c) 2016-2018 Damien P. George
Damien George784e0232017-01-24 16:56:03 +11007 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * THE SOFTWARE.
25 */
Damien George784e0232017-01-24 16:56:03 +110026#ifndef MICROPY_INCLUDED_DRIVERS_MEMORY_SPIFLASH_H
27#define MICROPY_INCLUDED_DRIVERS_MEMORY_SPIFLASH_H
28
Damien Georgea739b352018-03-09 17:32:28 +110029#include "drivers/bus/spi.h"
Damien George4e487002018-03-02 16:01:18 +110030#include "drivers/bus/qspi.h"
Damien George784e0232017-01-24 16:56:03 +110031
Damien George86fe73b2018-06-07 14:09:10 +100032#define MP_SPIFLASH_ERASE_BLOCK_SIZE (4096) // must be a power of 2
33
Damien George4e487002018-03-02 16:01:18 +110034enum {
35 MP_SPIFLASH_BUS_SPI,
36 MP_SPIFLASH_BUS_QSPI,
37};
38
Damien George86fe73b2018-06-07 14:09:10 +100039struct _mp_spiflash_t;
40
Damien Georgee43a74a2020-12-17 16:59:54 +110041#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
Damien George86fe73b2018-06-07 14:09:10 +100042// A cache must be provided by the user in the config struct. The same cache
43// struct can be shared by multiple SPI flash instances.
44typedef struct _mp_spiflash_cache_t {
45 uint8_t buf[MP_SPIFLASH_ERASE_BLOCK_SIZE] __attribute__((aligned(4)));
46 struct _mp_spiflash_t *user; // current user of buf, for shared use
47 uint32_t block; // current block stored in buf; 0xffffffff if invalid
48} mp_spiflash_cache_t;
Damien Georgee43a74a2020-12-17 16:59:54 +110049#endif
Damien George86fe73b2018-06-07 14:09:10 +100050
Damien George4e487002018-03-02 16:01:18 +110051typedef struct _mp_spiflash_config_t {
52 uint32_t bus_kind;
53 union {
54 struct {
55 mp_hal_pin_obj_t cs;
56 void *data;
Damien Georgea739b352018-03-09 17:32:28 +110057 const mp_spi_proto_t *proto;
Damien George4e487002018-03-02 16:01:18 +110058 } u_spi;
59 struct {
60 void *data;
61 const mp_qspi_proto_t *proto;
62 } u_qspi;
63 } bus;
Damien Georgee43a74a2020-12-17 16:59:54 +110064 #if MICROPY_HW_SPIFLASH_ENABLE_CACHE
Damien Georgeb78ca322018-06-07 15:39:46 +100065 mp_spiflash_cache_t *cache; // can be NULL if cache functions not used
Damien Georgee43a74a2020-12-17 16:59:54 +110066 #endif
Damien George4e487002018-03-02 16:01:18 +110067} mp_spiflash_config_t;
68
Damien George784e0232017-01-24 16:56:03 +110069typedef struct _mp_spiflash_t {
Damien George4e487002018-03-02 16:01:18 +110070 const mp_spiflash_config_t *config;
71 volatile uint32_t flags;
Damien George784e0232017-01-24 16:56:03 +110072} mp_spiflash_t;
73
74void mp_spiflash_init(mp_spiflash_t *self);
Damien George8cde5fa2019-07-03 01:03:25 +100075void mp_spiflash_deepsleep(mp_spiflash_t *self, int value);
Damien Georgecc5a9402018-06-07 15:36:27 +100076
Damien Georgeb78ca322018-06-07 15:39:46 +100077// These functions go direct to the SPI flash device
78int mp_spiflash_erase_block(mp_spiflash_t *self, uint32_t addr);
Andrew Leech7ee5afe2021-03-05 10:15:29 +110079int mp_spiflash_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *dest);
Damien Georgeb78ca322018-06-07 15:39:46 +100080int mp_spiflash_write(mp_spiflash_t *self, uint32_t addr, size_t len, const uint8_t *src);
81
Damien Georgee43a74a2020-12-17 16:59:54 +110082#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
Damien Georgecc5a9402018-06-07 15:36:27 +100083// These functions use the cache (which must already be configured)
Andrew Leech7ee5afe2021-03-05 10:15:29 +110084int mp_spiflash_cache_flush(mp_spiflash_t *self);
85int mp_spiflash_cached_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *dest);
Damien Georgecc5a9402018-06-07 15:36:27 +100086int mp_spiflash_cached_write(mp_spiflash_t *self, uint32_t addr, size_t len, const uint8_t *src);
Damien Georgee43a74a2020-12-17 16:59:54 +110087#endif
Damien George784e0232017-01-24 16:56:03 +110088
89#endif // MICROPY_INCLUDED_DRIVERS_MEMORY_SPIFLASH_H