1 /*
2  * This file is part of the MicroPython project, http://micropython.org/
3  *
4  * The MIT License (MIT)
5  *
6  * Copyright (c) 2016-2018 Damien P. George
7  *
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  */
26 #ifndef MICROPY_INCLUDED_DRIVERS_MEMORY_SPIFLASH_H
27 #define MICROPY_INCLUDED_DRIVERS_MEMORY_SPIFLASH_H
28 
29 #include "drivers/bus/spi.h"
30 #include "drivers/bus/qspi.h"
31 
32 #define MP_SPIFLASH_ERASE_BLOCK_SIZE (4096) // must be a power of 2
33 
34 enum {
35     MP_SPIFLASH_BUS_SPI,
36     MP_SPIFLASH_BUS_QSPI,
37 };
38 
39 struct _mp_spiflash_t;
40 
41 #if MICROPY_HW_SPIFLASH_ENABLE_CACHE
42 // 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.
44 typedef 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;
49 #endif
50 
51 typedef struct _mp_spiflash_config_t {
52     uint32_t bus_kind;
53     union {
54         struct {
55             mp_hal_pin_obj_t cs;
56             void *data;
57             const mp_spi_proto_t *proto;
58         } u_spi;
59         struct {
60             void *data;
61             const mp_qspi_proto_t *proto;
62         } u_qspi;
63     } bus;
64     #if MICROPY_HW_SPIFLASH_ENABLE_CACHE
65     mp_spiflash_cache_t *cache; // can be NULL if cache functions not used
66     #endif
67 } mp_spiflash_config_t;
68 
69 typedef struct _mp_spiflash_t {
70     const mp_spiflash_config_t *config;
71     volatile uint32_t flags;
72 } mp_spiflash_t;
73 
74 void mp_spiflash_init(mp_spiflash_t *self);
75 void mp_spiflash_deepsleep(mp_spiflash_t *self, int value);
76 
77 // These functions go direct to the SPI flash device
78 int mp_spiflash_erase_block(mp_spiflash_t *self, uint32_t addr);
79 void mp_spiflash_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *dest);
80 int mp_spiflash_write(mp_spiflash_t *self, uint32_t addr, size_t len, const uint8_t *src);
81 
82 #if MICROPY_HW_SPIFLASH_ENABLE_CACHE
83 // These functions use the cache (which must already be configured)
84 void mp_spiflash_cache_flush(mp_spiflash_t *self);
85 void mp_spiflash_cached_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *dest);
86 int mp_spiflash_cached_write(mp_spiflash_t *self, uint32_t addr, size_t len, const uint8_t *src);
87 #endif
88 
89 #endif // MICROPY_INCLUDED_DRIVERS_MEMORY_SPIFLASH_H
90