diff options
author | Nick Brassel <nick@tzarc.org> | 2020-05-19 10:34:00 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-19 10:34:00 +1000 |
commit | 54b04d96651a166088477ccf513fa534b30b2132 (patch) | |
tree | bace05e50e18069f269d6826800dd82dc2d8afbb /drivers/eeprom/eeprom_i2c.c | |
parent | 4604c70c4c1a0cb2cebc010dba34b04e902bd982 (diff) | |
download | qmk_firmware-54b04d96651a166088477ccf513fa534b30b2132.tar.gz qmk_firmware-54b04d96651a166088477ccf513fa534b30b2132.zip |
Add SPI 25xx EEPROM support. (#8780)
Diffstat (limited to 'drivers/eeprom/eeprom_i2c.c')
-rw-r--r-- | drivers/eeprom/eeprom_i2c.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/eeprom/eeprom_i2c.c b/drivers/eeprom/eeprom_i2c.c index 03dbc5e51..88be2be06 100644 --- a/drivers/eeprom/eeprom_i2c.c +++ b/drivers/eeprom/eeprom_i2c.c | |||
@@ -50,7 +50,7 @@ static inline void init_i2c_if_required(void) { | |||
50 | } | 50 | } |
51 | 51 | ||
52 | static inline void fill_target_address(uint8_t *buffer, const void *addr) { | 52 | static inline void fill_target_address(uint8_t *buffer, const void *addr) { |
53 | intptr_t p = (intptr_t)addr; | 53 | uintptr_t p = (uintptr_t)addr; |
54 | for (int i = 0; i < EXTERNAL_EEPROM_ADDRESS_SIZE; ++i) { | 54 | for (int i = 0; i < EXTERNAL_EEPROM_ADDRESS_SIZE; ++i) { |
55 | buffer[EXTERNAL_EEPROM_ADDRESS_SIZE - 1 - i] = p & 0xFF; | 55 | buffer[EXTERNAL_EEPROM_ADDRESS_SIZE - 1 - i] = p & 0xFF; |
56 | p >>= 8; | 56 | p >>= 8; |
@@ -60,11 +60,19 @@ static inline void fill_target_address(uint8_t *buffer, const void *addr) { | |||
60 | void eeprom_driver_init(void) {} | 60 | void eeprom_driver_init(void) {} |
61 | 61 | ||
62 | void eeprom_driver_erase(void) { | 62 | void eeprom_driver_erase(void) { |
63 | #ifdef CONSOLE_ENABLE | ||
64 | uint32_t start = timer_read32(); | ||
65 | #endif | ||
66 | |||
63 | uint8_t buf[EXTERNAL_EEPROM_PAGE_SIZE]; | 67 | uint8_t buf[EXTERNAL_EEPROM_PAGE_SIZE]; |
64 | memset(buf, 0x00, EXTERNAL_EEPROM_PAGE_SIZE); | 68 | memset(buf, 0x00, EXTERNAL_EEPROM_PAGE_SIZE); |
65 | for (intptr_t addr = 0; addr < EXTERNAL_EEPROM_BYTE_COUNT; addr += EXTERNAL_EEPROM_PAGE_SIZE) { | 69 | for (uint32_t addr = 0; addr < EXTERNAL_EEPROM_BYTE_COUNT; addr += EXTERNAL_EEPROM_PAGE_SIZE) { |
66 | eeprom_write_block(buf, (void *)addr, EXTERNAL_EEPROM_PAGE_SIZE); | 70 | eeprom_write_block(buf, (void *)(uintptr_t)addr, EXTERNAL_EEPROM_PAGE_SIZE); |
67 | } | 71 | } |
72 | |||
73 | #ifdef CONSOLE_ENABLE | ||
74 | dprintf("EEPROM erase took %ldms to complete\n", ((long)(timer_read32() - start))); | ||
75 | #endif | ||
68 | } | 76 | } |
69 | 77 | ||
70 | void eeprom_read_block(void *buf, const void *addr, size_t len) { | 78 | void eeprom_read_block(void *buf, const void *addr, size_t len) { |
@@ -72,8 +80,8 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) { | |||
72 | fill_target_address(complete_packet, addr); | 80 | fill_target_address(complete_packet, addr); |
73 | 81 | ||
74 | init_i2c_if_required(); | 82 | init_i2c_if_required(); |
75 | i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE, 100); | 83 | i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((uintptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE, 100); |
76 | i2c_receive(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), buf, len, 100); | 84 | i2c_receive(EXTERNAL_EEPROM_I2C_ADDRESS((uintptr_t)addr), buf, len, 100); |
77 | 85 | ||
78 | #ifdef DEBUG_EEPROM_OUTPUT | 86 | #ifdef DEBUG_EEPROM_OUTPUT |
79 | dprintf("[EEPROM R] 0x%04X: ", ((int)addr)); | 87 | dprintf("[EEPROM R] 0x%04X: ", ((int)addr)); |
@@ -85,14 +93,14 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) { | |||
85 | } | 93 | } |
86 | 94 | ||
87 | void eeprom_write_block(const void *buf, void *addr, size_t len) { | 95 | void eeprom_write_block(const void *buf, void *addr, size_t len) { |
88 | uint8_t complete_packet[EXTERNAL_EEPROM_ADDRESS_SIZE + EXTERNAL_EEPROM_PAGE_SIZE]; | 96 | uint8_t complete_packet[EXTERNAL_EEPROM_ADDRESS_SIZE + EXTERNAL_EEPROM_PAGE_SIZE]; |
89 | uint8_t *read_buf = (uint8_t *)buf; | 97 | uint8_t * read_buf = (uint8_t *)buf; |
90 | intptr_t target_addr = (intptr_t)addr; | 98 | uintptr_t target_addr = (uintptr_t)addr; |
91 | 99 | ||
92 | init_i2c_if_required(); | 100 | init_i2c_if_required(); |
93 | while (len > 0) { | 101 | while (len > 0) { |
94 | intptr_t page_offset = target_addr % EXTERNAL_EEPROM_PAGE_SIZE; | 102 | uintptr_t page_offset = target_addr % EXTERNAL_EEPROM_PAGE_SIZE; |
95 | int write_length = EXTERNAL_EEPROM_PAGE_SIZE - page_offset; | 103 | int write_length = EXTERNAL_EEPROM_PAGE_SIZE - page_offset; |
96 | if (write_length > len) { | 104 | if (write_length > len) { |
97 | write_length = len; | 105 | write_length = len; |
98 | } | 106 | } |
@@ -110,7 +118,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) { | |||
110 | dprintf("\n"); | 118 | dprintf("\n"); |
111 | #endif // DEBUG_EEPROM_OUTPUT | 119 | #endif // DEBUG_EEPROM_OUTPUT |
112 | 120 | ||
113 | i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE + write_length, 100); | 121 | i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((uintptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE + write_length, 100); |
114 | wait_ms(EXTERNAL_EEPROM_WRITE_TIME); | 122 | wait_ms(EXTERNAL_EEPROM_WRITE_TIME); |
115 | 123 | ||
116 | read_buf += write_length; | 124 | read_buf += write_length; |