Fix W25M (stacked die SPI flash) support (#9021)

Fix W25M (stacked die SPI flash) support
This commit is contained in:
Michael Keller 2019-10-18 03:39:28 +13:00 committed by GitHub
commit 20306a6440
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 39 additions and 7 deletions

View File

@ -43,12 +43,14 @@
#include "flash_m25p16.h"
#include "flash_w25m.h"
#include "flash_w25n01g.h"
#include "pg/flash.h"
#define W25M_INSTRUCTION_SOFTWARE_DIE_SELECT 0xC2
#define JEDEC_ID_WINBOND_W25M512 0xEF7119 // W25Q256 x 2
#define JEDEC_ID_WINBOND_W25M02G 0xEFAB21 // W25N01G x 2
static const flashVTable_t w25m_vTable;
@ -108,6 +110,7 @@ bool w25m_detect(flashDevice_t *fdevice, uint32_t chipID)
{
switch (chipID) {
#ifdef USE_FLASH_W25M512
case JEDEC_ID_WINBOND_W25M512:
// W25Q256 x 2
dieCount = 2;
@ -121,6 +124,23 @@ bool w25m_detect(flashDevice_t *fdevice, uint32_t chipID)
fdevice->geometry.flashType = FLASH_TYPE_NOR;
break;
#endif
#ifdef USE_FLASH_W25M02G
case JEDEC_ID_WINBOND_W25M02G:
// W25N01G x 2
dieCount = 2;
for (int die = 0 ; die < dieCount ; die++) {
w25m_dieSelect(fdevice->io.handle.busdev, die);
dieDevice[die].io.handle.busdev = fdevice->io.handle.busdev;
dieDevice[die].io.mode = fdevice->io.mode;
w25n01g_detect(&dieDevice[die], JEDEC_ID_WINBOND_W25N01GV);
}
fdevice->geometry.flashType = FLASH_TYPE_NAND;
break;
#endif
default:
// Not a valid W25M series device
@ -131,7 +151,7 @@ bool w25m_detect(flashDevice_t *fdevice, uint32_t chipID)
return false;
}
fdevice->geometry.sectors = dieDevice[0].geometry.sectors;
fdevice->geometry.sectors = dieDevice[0].geometry.sectors * dieCount;
fdevice->geometry.sectorSize = dieDevice[0].geometry.sectorSize;
fdevice->geometry.pagesPerSector = dieDevice[0].geometry.pagesPerSector;
fdevice->geometry.pageSize = dieDevice[0].geometry.pageSize;

View File

@ -50,9 +50,6 @@ serialPort_t *debugSerialPort = NULL;
#define DPRINTF(x)
#endif
// JEDEC ID
#define JEDEC_ID_WINBOND_W25N01GV 0xEFAA21
// Device size parameters
#define W25N01G_PAGE_SIZE 2048
#define W25N01G_PAGES_PER_BLOCK 64

View File

@ -22,4 +22,7 @@
#pragma once
// JEDEC ID
#define JEDEC_ID_WINBOND_W25N01GV 0xEFAA21
bool w25n01g_detect(flashDevice_t *fdevice, uint32_t chipID);

View File

@ -133,6 +133,16 @@
#define SDCARD_SPI_CS_PIN SPI4_NSS_PIN
#define SPI4_TX_DMA_OPT 0 // DMA 2 Stream 1 Channel 4
#define USE_FLASHFS
#define USE_FLASH_CHIP
#define USE_FLASH_M25P16
#define USE_FLASH_W25N01G // 1Gb NAND flash support
#define USE_FLASH_W25M // Stacked die support
#define USE_FLASH_W25M512 // 512Kb (256Kb x 2 stacked) NOR flash support
#define USE_FLASH_W25M02G // 2Gb (1Gb x 2 stacked) NAND flash support
#define FLASH_SPI_INSTANCE SPI4
#define FLASH_CS_PIN PE10
#define USE_I2C
#define USE_I2C_DEVICE_1
#define I2C_DEVICE (I2CDEV_1)

View File

@ -1,5 +1,5 @@
F7X6XG_TARGETS += $(TARGET)
FEATURES += SDCARD_SPI VCP
FEATURES += SDCARD_SPI ONBOARDFLASH VCP
TARGET_SRC = \
drivers/accgyro/accgyro_fake.c \

View File

@ -72,8 +72,10 @@
#define USE_FLASHFS
#define USE_FLASH_M25P16
#define USE_FLASH_W25M
#define USE_FLASH_W25N01G // 1G NAND flash support
#define USE_FLASH_W25N01G // 1Gb NAND flash support
#define USE_FLASH_W25M // Stacked die support
#define USE_FLASH_W25M512 // 512Kb (256Kb x 2 stacked) NOR flash support
#define USE_FLASH_W25M02G // 2Gb (1Gb x 2 stacked) NAND flash support
#define USE_MAX7456