Skip to content

Commit e1aa218

Browse files
committed
bit-bang SPI impl for SD panic
1 parent fbf0639 commit e1aa218

File tree

6 files changed

+112
-18
lines changed

6 files changed

+112
-18
lines changed

main/dmesg.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,12 @@ void codal_vdmesg(const char *format, va_list ap) {
5454
logwriten(tmp, len + 1);
5555
}
5656

57-
#endif
58-
59-
#if 1
60-
6157
extern int int_level;
6258
void panic_print_char(const char c);
6359
void panic_print_str(const char *str);
6460
void panic_print_dec(int d);
65-
void __real_esp_panic_handler(void *);
66-
void __wrap_esp_panic_handler(void *info) {
61+
62+
void panic_dump_dmesg(void) {
6763
panic_print_str(LOG_COLOR(LOG_COLOR_RED) "\r\nDMESG:\r\n");
6864
for (unsigned i = 0; i < codalLogStore.ptr; ++i) {
6965
char c = codalLogStore.buffer[i];
@@ -74,8 +70,12 @@ void __wrap_esp_panic_handler(void *info) {
7470
panic_print_str("END DMESG\r\nInt: ");
7571
panic_print_dec(int_level);
7672
panic_print_str("\r\n" LOG_RESET_COLOR);
73+
}
7774

75+
void __real_esp_panic_handler(void *);
76+
void __wrap_esp_panic_handler(void *info) {
77+
panic_dump_dmesg();
7878
__real_esp_panic_handler(info);
7979
}
80+
#endif
8081

81-
#endif

main/jd_user_config.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
#define PIN_PWR_EN 2 // active lo
2525
#define PIN_PWR_FAULT 13
2626

27+
// only pins 32+ are supported currently
28+
#define PIN_SD_MISO 37
29+
#define PIN_SD_MOSI 35
30+
#define PIN_SD_SCK 36
31+
#define PIN_SD_CS 38
32+
2733
#define JD_RAW_FRAME 1
2834

2935
#define JD_FLASH_PAGE_SIZE 1024

main/jdesp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "jacscript/jacscript.h"
77
#include "services/jd_services.h"
88
#include "services/interfaces/jd_pins.h"
9+
#include "services/interfaces/jd_pwm.h"
910

1011
#include "nvs_flash.h"
1112

main/led.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
#include "jdesp.h"
2-
#include "services/interfaces/jd_pins.h"
3-
#include "services/interfaces/jd_pwm.h"
42

53
#include "driver/ledc.h"
64

main/sdcard.c

Lines changed: 97 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
#include "sdmmc_cmd.h"
44

5+
#include "hal/gpio_ll.h"
56
#include "driver/sdspi_host.h"
67
#include "driver/sdmmc_host.h"
78
#include "diskio_impl.h"
89
#include "diskio_sdmmc.h"
910

1011
static const char *TAG = "sd";
1112

12-
#define PIN_NUM_MISO 37
13-
#define PIN_NUM_MOSI 35
14-
#define PIN_NUM_CLK 36
15-
#define PIN_NUM_CS 38
13+
#define SET_SCK() gpio_ll_set_level(&GPIO, PIN_SD_SCK, 1)
14+
#define CLR_SCK() gpio_ll_set_level(&GPIO, PIN_SD_SCK, 0)
15+
#define GET_MISO() gpio_ll_get_level(&GPIO, PIN_SD_MISO)
1616

1717
#if CONFIG_IDF_TARGET_ESP32S2
1818
#define SPI_DMA_CHAN host.slot
@@ -22,6 +22,64 @@ static const char *TAG = "sd";
2222
#define SPI_DMA_CHAN 1
2323
#endif
2424

25+
#define SPI_TX_BIT(n) \
26+
gpio_ll_set_level(&GPIO, PIN_SD_MOSI, b &(1 << n)); \
27+
SET_SCK(); \
28+
CLR_SCK()
29+
30+
#define SPI_RX_BIT(n) \
31+
SET_SCK(); \
32+
if (GET_MISO()) \
33+
b |= (1 << n); \
34+
CLR_SCK()
35+
36+
void spi_bb_init(void) {
37+
pin_setup_analog_input(PIN_SD_SCK);
38+
pin_setup_output(PIN_SD_SCK);
39+
pin_setup_analog_input(PIN_SD_MOSI);
40+
pin_setup_output(PIN_SD_MOSI);
41+
pin_setup_analog_input(PIN_SD_MISO);
42+
pin_setup_input(PIN_SD_MISO, PIN_PULL_UP);
43+
44+
pin_setup_analog_input(PIN_SD_CS);
45+
pin_setup_output(PIN_SD_CS);
46+
}
47+
48+
void spi_bb_tx(const void *data, unsigned len) {
49+
const uint8_t *p = data;
50+
while (len--) {
51+
uint32_t b = *p++;
52+
SPI_TX_BIT(7);
53+
SPI_TX_BIT(6);
54+
SPI_TX_BIT(5);
55+
SPI_TX_BIT(4);
56+
SPI_TX_BIT(3);
57+
SPI_TX_BIT(2);
58+
SPI_TX_BIT(1);
59+
SPI_TX_BIT(0);
60+
}
61+
}
62+
63+
void spi_bb_rx(void *data, unsigned len) {
64+
uint8_t *p = data;
65+
// keep MOSI high
66+
gpio_ll_set_level(&GPIO, PIN_SD_MOSI, 1);
67+
while (len--) {
68+
uint32_t b = 0;
69+
SPI_RX_BIT(7);
70+
SPI_RX_BIT(6);
71+
SPI_RX_BIT(5);
72+
SPI_RX_BIT(4);
73+
SPI_RX_BIT(3);
74+
SPI_RX_BIT(2);
75+
SPI_RX_BIT(1);
76+
SPI_RX_BIT(0);
77+
*p++ = b;
78+
}
79+
}
80+
81+
void panic_dump_dmesg(void);
82+
2583
void init_sdcard(void) {
2684
esp_err_t ret;
2785

@@ -30,9 +88,9 @@ void init_sdcard(void) {
3088

3189
sdmmc_host_t host = SDSPI_HOST_DEFAULT();
3290
spi_bus_config_t bus_cfg = {
33-
.mosi_io_num = PIN_NUM_MOSI,
34-
.miso_io_num = PIN_NUM_MISO,
35-
.sclk_io_num = PIN_NUM_CLK,
91+
.mosi_io_num = PIN_SD_MOSI,
92+
.miso_io_num = PIN_SD_MISO,
93+
.sclk_io_num = PIN_SD_SCK,
3694
.quadwp_io_num = -1,
3795
.quadhd_io_num = -1,
3896
.max_transfer_sz = 4000,
@@ -41,7 +99,7 @@ void init_sdcard(void) {
4199
CHK(spi_bus_initialize(host.slot, &bus_cfg, SPI_DMA_CHAN));
42100

43101
sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
44-
slot_config.gpio_cs = PIN_NUM_CS;
102+
slot_config.gpio_cs = PIN_SD_CS;
45103
slot_config.host_id = host.slot;
46104

47105
BYTE pdrv = FF_DRV_NOT_USED;
@@ -66,4 +124,35 @@ void init_sdcard(void) {
66124
ESP_LOGI(TAG, "SD card initialized");
67125

68126
jd_lstore_init();
127+
128+
#if 0
129+
for (int i = 99; i > 0; i--) {
130+
char buf[200];
131+
jd_sprintf(buf, sizeof(buf),
132+
"%d bottles of beer on the wall! %d bottles of beer, take one down, pass it "
133+
"around, %d bottles of beer.\n",
134+
i, i, i - 1);
135+
jd_lstore_panic_print_str(buf);
136+
}
137+
jd_lstore_panic_print_str(
138+
"This is a very long text "
139+
"A_0123456789:B_0123456789:C_0123456789:D_0123456789:E_0123456789:F_0123456789:"
140+
"xA_0123456789:xB_0123456789:xC_0123456789:xD_0123456789:xE_0123456789:xF_0123456789:"
141+
"A_0123456789:B_0123456789:C_0123456789:D_0123456789:E_0123456789:F_0123456789:"
142+
"xA_0123456789:xB_0123456789:xC_0123456789:xD_0123456789:xE_0123456789:xF_0123456789:"
143+
"A_0123456789:B_0123456789:C_0123456789:D_0123456789:E_0123456789:F_0123456789:"
144+
"xA_0123456789:xB_0123456789:xC_0123456789:xD_0123456789:xE_0123456789:xF_0123456789:"
145+
"\n");
146+
jd_lstore_panic_print_str("The end!\n");
147+
jd_lstore_panic_flush();
148+
149+
panic_dump_dmesg();
150+
reboot_to_uf2();
151+
#endif
69152
}
153+
154+
/*
155+
TODO:
156+
* add emergency_flush in lstor (enables bit banging)
157+
* wrap print_char
158+
*/

0 commit comments

Comments
 (0)