spi: support 32- and 64-kB erase blocks
Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
		@@ -70,7 +70,8 @@ void spiWriteSecurity(struct ff_spi *spi, uint8_t sr, uint8_t security[256]);
 | 
				
			|||||||
int spiSetType(struct ff_spi *spi, enum spi_type type);
 | 
					int spiSetType(struct ff_spi *spi, enum spi_type type);
 | 
				
			||||||
int spiRead(struct ff_spi *spi, uint32_t addr, uint8_t *data, unsigned int count);
 | 
					int spiRead(struct ff_spi *spi, uint32_t addr, uint8_t *data, unsigned int count);
 | 
				
			||||||
int spiIsBusy(struct ff_spi *spi);
 | 
					int spiIsBusy(struct ff_spi *spi);
 | 
				
			||||||
int spiBeginErase(struct ff_spi *spi, uint32_t erase_addr);
 | 
					int spiBeginErase32(struct ff_spi *spi, uint32_t erase_addr);
 | 
				
			||||||
 | 
					int spiBeginErase64(struct ff_spi *spi, uint32_t erase_addr);
 | 
				
			||||||
int spiBeginWrite(struct ff_spi *spi, uint32_t addr, const void *data, unsigned int count);
 | 
					int spiBeginWrite(struct ff_spi *spi, uint32_t addr, const void *data, unsigned int count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct spi_id spiId(struct ff_spi *spi);
 | 
					struct spi_id spiId(struct ff_spi *spi);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								sw/src/spi.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								sw/src/spi.c
									
									
									
									
									
								
							@@ -32,7 +32,7 @@ static void gpioWrite(int pin, int val) {
 | 
				
			|||||||
        do_mirror |= 1 << pin;
 | 
					        do_mirror |= 1 << pin;
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        do_mirror &= ~(1 << pin);
 | 
					        do_mirror &= ~(1 << pin);
 | 
				
			||||||
    // bbspi_do_write(do_mirror);
 | 
					    bbspi_do_write(do_mirror);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int gpioRead(int pin) {
 | 
					static int gpioRead(int pin) {
 | 
				
			||||||
@@ -40,7 +40,7 @@ static int gpioRead(int pin) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void gpioSync(void) {
 | 
					static void gpioSync(void) {
 | 
				
			||||||
    bbspi_do_write(do_mirror);
 | 
					    // bbspi_do_write(do_mirror);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPI_ONLY_SINGLE
 | 
					#define SPI_ONLY_SINGLE
 | 
				
			||||||
@@ -703,10 +703,10 @@ static int spi_wait_for_not_busy(struct ff_spi *spi) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int spiIsBusy(struct ff_spi *spi) {
 | 
					int spiIsBusy(struct ff_spi *spi) {
 | 
				
			||||||
  return spiReadStatus(spi, 1) & (1 << 0);
 | 
					  	return spiReadStatus(spi, 1) & (1 << 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int spiBeginErase(struct ff_spi *spi, uint32_t erase_addr) {
 | 
					int spiBeginErase32(struct ff_spi *spi, uint32_t erase_addr) {
 | 
				
			||||||
	// Enable Write-Enable Latch (WEL)
 | 
						// Enable Write-Enable Latch (WEL)
 | 
				
			||||||
	spiBegin(spi);
 | 
						spiBegin(spi);
 | 
				
			||||||
	spiCommand(spi, 0x06);
 | 
						spiCommand(spi, 0x06);
 | 
				
			||||||
@@ -721,6 +721,21 @@ int spiBeginErase(struct ff_spi *spi, uint32_t erase_addr) {
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int spiBeginErase64(struct ff_spi *spi, uint32_t erase_addr) {
 | 
				
			||||||
 | 
						// Enable Write-Enable Latch (WEL)
 | 
				
			||||||
 | 
						spiBegin(spi);
 | 
				
			||||||
 | 
						spiCommand(spi, 0x06);
 | 
				
			||||||
 | 
						spiEnd(spi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spiBegin(spi);
 | 
				
			||||||
 | 
						spiCommand(spi, 0xD8);
 | 
				
			||||||
 | 
						spiCommand(spi, erase_addr >> 16);
 | 
				
			||||||
 | 
						spiCommand(spi, erase_addr >> 8);
 | 
				
			||||||
 | 
						spiCommand(spi, erase_addr >> 0);
 | 
				
			||||||
 | 
						spiEnd(spi);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int spiBeginWrite(struct ff_spi *spi, uint32_t addr, const void *v_data, unsigned int count) {
 | 
					int spiBeginWrite(struct ff_spi *spi, uint32_t addr, const void *v_data, unsigned int count) {
 | 
				
			||||||
	uint8_t write_cmd = 0x02;
 | 
						uint8_t write_cmd = 0x02;
 | 
				
			||||||
	const uint8_t *data = v_data;
 | 
						const uint8_t *data = v_data;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user