4 #ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_SPI_DEVICE_H_
5 #define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_SPI_DEVICE_H_
11 #include "sw/device/silicon_creator/lib/error.h"
22 #define SPI_DEVICE_DEV_ID_CHIP_REV_FIELD \
23 ((bitfield_field32_t){.mask = 0x7, .index = 0})
24 #define SPI_DEVICE_DEV_ID_ROM_BOOTSTRAP_BIT 3
25 #define SPI_DEVICE_DEV_ID_CHIP_GEN_FIELD \
26 ((bitfield_field32_t){.mask = 0xf, .index = 4})
27 #define SPI_DEVICE_DEV_ID_DENSITY_FIELD \
28 ((bitfield_field32_t){.mask = 0xff, .index = 8})
34 kSpiDeviceJedecContCode = 0x7f,
35 kSpiDeviceJedecContCodeCount = 12,
36 kSpiDeviceJedecManufId = 0xef,
42 kSpiDeviceJedecDensity = 20,
46 kSpiDeviceBfptNumWords = 23,
50 kSpiDeviceSfdpTableNumWords = 27,
57 kSpiDeviceNoAddress = UINT32_MAX,
67 kSpiDeviceSfdpAreaNumBytes = 256,
71 kSpiDeviceSfdpAreaOffset = 0xc00,
75 kSpiDevicePayloadAreaOffset = 0x0,
79 kSpiDevicePayloadAreaNumBytes = 256,
83 kSpiDevicePayloadAreaNumWords =
84 kSpiDevicePayloadAreaNumBytes /
sizeof(uint32_t),
102 typedef enum spi_device_opcode {
109 kSpiDeviceOpcodeReadStatus = 0x05,
118 kSpiDeviceOpcodeReadJedecId = 0x9f,
126 kSpiDeviceOpcodeReadSfdp = 0x5a,
133 kSpiDeviceOpcodeChipErase = 0xc7,
141 kSpiDeviceOpcodeSectorErase = 0x20,
150 kSpiDeviceOpcodePageProgram = 0x02,
158 kSpiDeviceOpcodeReset = 0x99,
165 kSpiDeviceOpcodeWriteEnable = 0x06,
172 kSpiDeviceOpcodeWriteDisable = 0x04,
174 } spi_device_opcode_t;
256 uint32_t data[kSpiDeviceBfptNumWords];
260 kSpiDeviceBfptNumWords *
sizeof(uint32_t),
261 "`kSpiDeviceBfptNumWords` is incorrect");
285 "SFDP table must fit in the space provided by spi_device");
287 kSpiDeviceSfdpTableNumWords *
sizeof(uint32_t),
288 "`kSpiDeviceSfdpTableNumWords` is incorrect");
305 void spi_device_init(
void);
333 alignas(uint32_t) uint8_t
payload[kSpiDevicePayloadAreaNumBytes];
354 void spi_device_flash_status_clear(
void);
360 uint32_t spi_device_flash_status_get(
void);