blob: 66e7906cca17f7b123433142166409cea317f157 [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
41// A cache must be provided by the user in the config struct. The same cache
42// struct can be shared by multiple SPI flash instances.
43typedef struct _mp_spiflash_cache_t {
44 uint8_t buf[MP_SPIFLASH_ERASE_BLOCK_SIZE] __attribute__((aligned(4)));
45 struct _mp_spiflash_t *user; // current user of buf, for shared use
46 uint32_t block; // current block stored in buf; 0xffffffff if invalid
47} mp_spiflash_cache_t;
48
Damien George4e487002018-03-02 16:01:18 +110049typedef struct _mp_spiflash_config_t {
50 uint32_t bus_kind;
51 union {
52 struct {
53 mp_hal_pin_obj_t cs;
54 void *data;
Damien Georgea739b352018-03-09 17:32:28 +110055 const mp_spi_proto_t *proto;
Damien George4e487002018-03-02 16:01:18 +110056 } u_spi;
57 struct {
58 void *data;
59 const mp_qspi_proto_t *proto;
60 } u_qspi;
61 } bus;
Damien George86fe73b2018-06-07 14:09:10 +100062 mp_spiflash_cache_t *cache;
Damien George4e487002018-03-02 16:01:18 +110063} mp_spiflash_config_t;
64
Damien George784e0232017-01-24 16:56:03 +110065typedef struct _mp_spiflash_t {
Damien George4e487002018-03-02 16:01:18 +110066 const mp_spiflash_config_t *config;
67 volatile uint32_t flags;
Damien George784e0232017-01-24 16:56:03 +110068} mp_spiflash_t;
69
70void mp_spiflash_init(mp_spiflash_t *self);
Damien George4e487002018-03-02 16:01:18 +110071void mp_spiflash_flush(mp_spiflash_t *self);
Damien George784e0232017-01-24 16:56:03 +110072void mp_spiflash_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *dest);
73int mp_spiflash_write(mp_spiflash_t *self, uint32_t addr, size_t len, const uint8_t *src);
74
75#endif // MICROPY_INCLUDED_DRIVERS_MEMORY_SPIFLASH_H