aboutsummaryrefslogtreecommitdiff
path: root/src/flash/nor/dw-spi-helper.h
blob: d3537557b628fd328df14418bdb4a70bc88c01c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/* SPDX-License-Identifier: GPL-2.0-or-later */
/**
 * @file
 * Driver for SPI NOR flash chips connected via DesignWare SPI Core.
 *
 * In order to avoid using stack, all helper function arguments are packed
 * into a single struct, passed by pointer.
 *
 * Pointers are represented by 64 bit integers to make structs compatible
 * with 64 bit targets.
 *
 * This file contains helper function argument structures.
 */

#ifndef OPENOCD_FLASH_NOR_DW_SPI_HELPER_H
#define OPENOCD_FLASH_NOR_DW_SPI_HELPER_H

#include <stdint.h>

/**
 * @brief Arguments for transaction helper function.
 */
struct dw_spi_transaction {
	uint64_t buffer;
	///< Pointer to data buffer to send over SPI.
	///< Return values are stored in place of output data when
	///< dw_spi_transaction::read_flag is 1.
	uint32_t size; ///< Size of dw_spi_transaction::buffer.
	uint64_t status_reg; ///< Pointer to SR register.
	uint64_t data_reg; ///< Pointer to DR register.
	uint8_t read_flag;
	///< When 1, store RX FIFO data to dw_spi_transaction::buffer.
} __attribute__((packed));

/**
 * @brief Arguments for check_fill helper function.
 */
struct dw_spi_check_fill {
	uint32_t address; ///< Starting address. Sector aligned.
	uint32_t sector_size; ///< Sector size.
	uint32_t sector_count; ///< Number of sectors to check.
	uint64_t status_reg; ///< Pointer to SR register.
	uint64_t data_reg; ///< Pointer to DR register.
	uint64_t fill_status_array;
	///< Pointer to array describing sectors fill status.
	///< 1 if filled, 0 if not filled.
	uint8_t pattern; ///< Fill pattern.
	uint8_t read_cmd; ///< Read data command.
	uint8_t four_byte_mode; ///< Four byte addressing mode flag.
} __attribute__((packed));

/**
 * @brief Arguments for erase helper function.
 */
struct dw_spi_erase {
	uint32_t address; ///< First sector address. Sector aligned.
	uint32_t sector_size; ///< Sector size.
	uint32_t sector_count; ///< Number of sectors to erase.
	uint64_t status_reg; ///< Pointer to SR register.
	uint64_t data_reg; ///< Pointer to DR register.
	uint8_t read_status_cmd; ///< Read status command.
	uint8_t write_enable_cmd; ///< Write enable command.
	uint8_t erase_sector_cmd; ///< Erase sector command.
	uint8_t write_enable_mask; ///< Write enable mask.
	uint8_t busy_mask; ///< Busy mask.
	uint8_t four_byte_mode; ///< Four byte addressing mode flag.
} __attribute__((packed));

/**
 * @brief Arguments for program helper function.
 */
struct dw_spi_program {
	uint32_t address;
	///< First page address. Page aligned when write is crossing
	///< the page boundary.
	uint32_t page_size; ///< Page size.
	uint64_t buffer; ///< Data buffer pointer.
	uint32_t buffer_size; ///< Size of dw_spi_program::buffer.
	uint64_t status_reg; ///< Pointer to SR register.
	uint64_t data_reg; ///< Pointer to DR register.
	uint8_t read_status_cmd; ///< Read status command.
	uint8_t write_enable_cmd; ///< Write enable command.
	uint8_t program_cmd; ///< Program command.
	uint8_t write_enable_mask; ///< Write enable mask.
	uint8_t busy_mask; ///< Busy mask.
	uint8_t four_byte_mode; ///< Four byte addressing mode flag.
} __attribute__((packed));

/**
 * @brief Arguments for read helper function.
 */
struct dw_spi_read {
	uint32_t address; ///< First sector address.
	uint64_t buffer; ///< Data buffer pointer.
	uint32_t buffer_size; ///< Size of dw_spi_read::buffer.
	uint64_t status_reg; ///< Pointer to SR register.
	uint64_t data_reg; ///< Pointer to DR register.
	uint8_t read_cmd; ///< Read data command.
	uint8_t four_byte_mode; ///< Four byte addressing mode flag.
} __attribute__((packed));

#endif /* OPENOCD_FLASH_NOR_DW_SPI_HELPER_H */