Skip to content

Commit 2ef909f

Browse files
drivers: mtd: s25h: automatically enter 4 byte address mode
To be able to address the full flash memory it's required to enter the 4 byte address mode. This is now done automatically during startup Signed-off-by: Mika Braunschweig <mika.braunschweig@siemens.com>
1 parent bbdc8e9 commit 2ef909f

2 files changed

Lines changed: 55 additions & 4 deletions

File tree

drivers/flash/flash_mspi_infineon_s25h.c

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,8 @@ static int flash_mspi_infineon_s25h_switch_to_quad_transfer(const struct device
597597

598598
ret = flash_mspi_infineon_s25h_verify_jedec_id(dev);
599599
if (ret < 0) {
600-
LOG_ERR("JEDEC ID mismatch after switching to 4 lane MSPI. Communication is broken");
600+
LOG_ERR("JEDEC ID mismatch after switching to 4 lane MSPI. Communication is "
601+
"broken");
601602
return ret;
602603
}
603604

@@ -629,7 +630,8 @@ static int flash_mspi_infineon_s25h_switch_to_quad_transfer(const struct device
629630

630631
ret = flash_mspi_infineon_s25h_verify_jedec_id(dev);
631632
if (ret < 0) {
632-
LOG_ERR("JEDEC ID mismatch after switching to full quad MSPI mode. Communication is broken");
633+
LOG_ERR("JEDEC ID mismatch after switching to full quad MSPI mode. Communication "
634+
"is broken");
633635
return ret;
634636
}
635637

@@ -700,6 +702,49 @@ static int flash_mspi_infineon_s25h_disable_hybrid_sector_mode(const struct devi
700702
return 0;
701703
}
702704

705+
static int flash_mspi_infineon_s25h_enter_4_byte_address_mode(const struct device *dev)
706+
{
707+
int ret = 0;
708+
const struct flash_mspi_infineon_s25h_cfg *config = dev->config;
709+
struct flash_mspi_infineon_s25h_data *data = dev->data;
710+
711+
const struct mspi_xfer_packet enter_4_byte_cmd = {
712+
.dir = MSPI_TX,
713+
.cmd = INF_MSPI_S25H_OPCODE_ENABLE_4_BYTE_ADDR_MODE,
714+
.num_bytes = 0,
715+
};
716+
717+
struct mspi_xfer xfer = {
718+
INF_MSPI_S25H_DEFAULT_XFER_DATA,
719+
.rx_dummy = 0,
720+
.addr_length = 0,
721+
.num_packet = 1,
722+
.packets = &enter_4_byte_cmd,
723+
.timeout = INF_MSPI_S25H_DEFAULT_MSPI_TIMEOUT,
724+
};
725+
726+
ret = mspi_transceive(config->bus, &config->dev_id, &xfer);
727+
if (ret < 0) {
728+
LOG_ERR("Error sending command to enter 4 byte address mode");
729+
return ret;
730+
}
731+
732+
data->mspi_dev_cfg.addr_length = 4;
733+
734+
if (ret < 0) {
735+
LOG_ERR("Error setting up MSPI bus after changing address length");
736+
return ret;
737+
}
738+
739+
ret = flash_mspi_infineon_s25h_verify_jedec_id(dev);
740+
if (ret < 0) {
741+
LOG_ERR("Error verifying JEDEC id after entering 4 byte address mode");
742+
return ret;
743+
}
744+
745+
return 0;
746+
}
747+
703748
static int flash_mspi_infineon_s25h_init(const struct device *dev)
704749
{
705750
int ret = 0;
@@ -735,6 +780,11 @@ static int flash_mspi_infineon_s25h_init(const struct device *dev)
735780
return ret;
736781
}
737782

783+
ret = flash_mspi_infineon_s25h_enter_4_byte_address_mode(dev);
784+
if (ret < 0) {
785+
return ret;
786+
}
787+
738788
ret = flash_mspi_infineon_s25h_switch_to_quad_transfer(dev);
739789
if (ret < 0) {
740790
return ret;

drivers/flash/flash_mspi_infineon_s25h.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
#define INF_MSPI_S25H_DEFAULT_MSPI_TIMEOUT 100
1515

1616
/* opcodes 1-1-1 mode */
17-
#define INF_MSPI_S25H_OPCODE_WRITE_ENABLE 0x06
18-
#define INF_MSPI_S25H_OPCODE_WRITE_DISABLE 0x04
17+
#define INF_MSPI_S25H_OPCODE_WRITE_ENABLE 0x06
18+
#define INF_MSPI_S25H_OPCODE_WRITE_DISABLE 0x04
19+
#define INF_MSPI_S25H_OPCODE_ENABLE_4_BYTE_ADDR_MODE 0xB7
1920

2021
#define INF_MSPI_S25H_OPCODE_READ_ANY_REGISTER 0x65
2122
#define INF_MSPI_S25H_OPCODE_WRITE_ANY_REGISTER 0x71

0 commit comments

Comments
 (0)