2
2
3
3
#include "sdmmc_cmd.h"
4
4
5
+ #include "hal/gpio_ll.h"
5
6
#include "driver/sdspi_host.h"
6
7
#include "driver/sdmmc_host.h"
7
8
#include "diskio_impl.h"
8
9
#include "diskio_sdmmc.h"
9
10
10
11
static const char * TAG = "sd" ;
11
12
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)
16
16
17
17
#if CONFIG_IDF_TARGET_ESP32S2
18
18
#define SPI_DMA_CHAN host.slot
@@ -22,6 +22,64 @@ static const char *TAG = "sd";
22
22
#define SPI_DMA_CHAN 1
23
23
#endif
24
24
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
+
25
83
void init_sdcard (void ) {
26
84
esp_err_t ret ;
27
85
@@ -30,9 +88,9 @@ void init_sdcard(void) {
30
88
31
89
sdmmc_host_t host = SDSPI_HOST_DEFAULT ();
32
90
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 ,
36
94
.quadwp_io_num = -1 ,
37
95
.quadhd_io_num = -1 ,
38
96
.max_transfer_sz = 4000 ,
@@ -41,7 +99,7 @@ void init_sdcard(void) {
41
99
CHK (spi_bus_initialize (host .slot , & bus_cfg , SPI_DMA_CHAN ));
42
100
43
101
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 ;
45
103
slot_config .host_id = host .slot ;
46
104
47
105
BYTE pdrv = FF_DRV_NOT_USED ;
@@ -66,4 +124,35 @@ void init_sdcard(void) {
66
124
ESP_LOGI (TAG , "SD card initialized" );
67
125
68
126
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
69
152
}
153
+
154
+ /*
155
+ TODO:
156
+ * add emergency_flush in lstor (enables bit banging)
157
+ * wrap print_char
158
+ */
0 commit comments