Skip to content

Commit 0857b31

Browse files
committed
[GPIO] Clean up pin config.
1 parent d4354e0 commit 0857b31

3 files changed

Lines changed: 81 additions & 40 deletions

File tree

src/common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ typedef volatile int64_t vs64;
2929
#define SDIO_D1 6
3030
#define SDIO_D2 7
3131
#define SDIO_D3 8
32+
#define SDIO_PIN_MASK ((1u<<SDIO_D3) | (1u<<SDIO_D2) | (1u<<SDIO_D1) | (1u<<SDIO_D0) | (1u<<SDIO_CMD) | (1u<<SDIO_CLK))
3233

3334
#define PIN_RST 9
3435
#define PIN_CEB 10

src/main.cpp

Lines changed: 80 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,85 @@ static void tryRebootToBootsel(void)
159159
}
160160
}
161161

162+
static inline void earlyGpioInit(void)
163+
{
164+
// Set all GPIOs to inputs.
165+
// Note that we rely on hardware reset having enabled pull-downs.
166+
gpio_init_mask(0xFFFFFFFFu);
167+
168+
// Set NTRCARD IRQ pin low.
169+
// This needs to happen immediately.
170+
gpio_put(PIN_IRQ, false);
171+
gpio_set_dir(PIN_IRQ, GPIO_OUT);
172+
gpio_disable_pulls(PIN_IRQ);
173+
174+
// SDIO CLK pin needs to be low before init.
175+
gpio_put(SDIO_CLK, false);
176+
gpio_set_dir(SDIO_CLK, true);
177+
178+
// Set SDIO and NTRCARD pin drive strengths.
179+
// 4 mA is the default after reset. 2 mA is enough.
180+
gpio_set_drive_strength(SDIO_CLK, GPIO_DRIVE_STRENGTH_2MA);
181+
gpio_set_drive_strength(SDIO_CMD, GPIO_DRIVE_STRENGTH_2MA);
182+
gpio_set_drive_strength(SDIO_D0, GPIO_DRIVE_STRENGTH_2MA);
183+
gpio_set_drive_strength(SDIO_D1, GPIO_DRIVE_STRENGTH_2MA);
184+
gpio_set_drive_strength(SDIO_D2, GPIO_DRIVE_STRENGTH_2MA);
185+
gpio_set_drive_strength(SDIO_D3, GPIO_DRIVE_STRENGTH_2MA);
186+
187+
gpio_set_drive_strength(PIN_D0, GPIO_DRIVE_STRENGTH_2MA);
188+
gpio_set_drive_strength(PIN_D1, GPIO_DRIVE_STRENGTH_2MA);
189+
gpio_set_drive_strength(PIN_D2, GPIO_DRIVE_STRENGTH_2MA);
190+
gpio_set_drive_strength(PIN_D3, GPIO_DRIVE_STRENGTH_2MA);
191+
gpio_set_drive_strength(PIN_D4, GPIO_DRIVE_STRENGTH_2MA);
192+
gpio_set_drive_strength(PIN_D5, GPIO_DRIVE_STRENGTH_2MA);
193+
gpio_set_drive_strength(PIN_D6, GPIO_DRIVE_STRENGTH_2MA);
194+
gpio_set_drive_strength(PIN_D7, GPIO_DRIVE_STRENGTH_2MA);
195+
196+
// Setup SDIO and NTRCARD pin pulls.
197+
// SDIO CMD/DAT required when there are no external pull-ups.
198+
gpio_disable_pulls(SDIO_CLK);
199+
#if 0
200+
gpio_pull_up(SDIO_CMD);
201+
gpio_pull_up(SDIO_D0);
202+
gpio_pull_up(SDIO_D1);
203+
gpio_pull_up(SDIO_D2);
204+
gpio_pull_up(SDIO_D3);
205+
#endif
206+
207+
gpio_pull_down(PIN_RST);
208+
gpio_pull_up(PIN_CEB);
209+
gpio_pull_up(PIN_WREB);
210+
gpio_disable_pulls(PIN_D0);
211+
gpio_disable_pulls(PIN_D1);
212+
gpio_disable_pulls(PIN_D2);
213+
gpio_disable_pulls(PIN_D3);
214+
gpio_disable_pulls(PIN_D4);
215+
gpio_disable_pulls(PIN_D5);
216+
gpio_disable_pulls(PIN_D6);
217+
gpio_disable_pulls(PIN_D7);
218+
gpio_pull_up(PIN_CS2);
219+
220+
// Set SDIO and NTRCARD DAT pin slew rate.
221+
// Default slew rate after reset is slow. Good enough for 25 MHz.
222+
#if 0
223+
gpio_set_slew_rate(SDIO_CLK, GPIO_SLEW_RATE_FAST);
224+
gpio_set_slew_rate(SDIO_CMD, GPIO_SLEW_RATE_FAST);
225+
gpio_set_slew_rate(SDIO_D0, GPIO_SLEW_RATE_FAST);
226+
gpio_set_slew_rate(SDIO_D1, GPIO_SLEW_RATE_FAST);
227+
gpio_set_slew_rate(SDIO_D2, GPIO_SLEW_RATE_FAST);
228+
gpio_set_slew_rate(SDIO_D3, GPIO_SLEW_RATE_FAST);
229+
230+
gpio_set_slew_rate(PIN_D0, GPIO_SLEW_RATE_FAST);
231+
gpio_set_slew_rate(PIN_D1, GPIO_SLEW_RATE_FAST);
232+
gpio_set_slew_rate(PIN_D2, GPIO_SLEW_RATE_FAST);
233+
gpio_set_slew_rate(PIN_D3, GPIO_SLEW_RATE_FAST);
234+
gpio_set_slew_rate(PIN_D4, GPIO_SLEW_RATE_FAST);
235+
gpio_set_slew_rate(PIN_D5, GPIO_SLEW_RATE_FAST);
236+
gpio_set_slew_rate(PIN_D6, GPIO_SLEW_RATE_FAST);
237+
gpio_set_slew_rate(PIN_D7, GPIO_SLEW_RATE_FAST);
238+
#endif
239+
}
240+
162241
int __time_critical_func(main)()
163242
{
164243
bi_decl(bi_program_description("Ntr card emulator"));
@@ -196,39 +275,7 @@ int __time_critical_func(main)()
196275

197276
multicore_launch_core1(core1_entry);
198277

199-
gpio_init_mask(PIN_INPUT_MASK);
200-
gpio_set_dir_in_masked(PIN_INPUT_MASK);
201-
gpio_init(PIN_IRQ);
202-
gpio_put(PIN_IRQ, 0);
203-
gpio_set_dir(PIN_IRQ, GPIO_OUT);
204-
gpio_disable_pulls(PIN_D0);
205-
gpio_disable_pulls(PIN_D1);
206-
gpio_disable_pulls(PIN_D2);
207-
gpio_disable_pulls(PIN_D3);
208-
gpio_disable_pulls(PIN_D4);
209-
gpio_disable_pulls(PIN_D5);
210-
gpio_disable_pulls(PIN_D6);
211-
gpio_disable_pulls(PIN_D7);
212-
gpio_set_slew_rate(PIN_D0, GPIO_SLEW_RATE_FAST);
213-
gpio_set_slew_rate(PIN_D1, GPIO_SLEW_RATE_FAST);
214-
gpio_set_slew_rate(PIN_D2, GPIO_SLEW_RATE_FAST);
215-
gpio_set_slew_rate(PIN_D3, GPIO_SLEW_RATE_FAST);
216-
gpio_set_slew_rate(PIN_D4, GPIO_SLEW_RATE_FAST);
217-
gpio_set_slew_rate(PIN_D5, GPIO_SLEW_RATE_FAST);
218-
gpio_set_slew_rate(PIN_D6, GPIO_SLEW_RATE_FAST);
219-
gpio_set_slew_rate(PIN_D7, GPIO_SLEW_RATE_FAST);
220-
gpio_pull_up(PIN_CEB);
221-
gpio_pull_up(PIN_WREB);
222-
gpio_pull_down(PIN_RST);
223-
gpio_pull_up(PIN_CS2);
224-
gpio_set_drive_strength(PIN_D0, GPIO_DRIVE_STRENGTH_2MA);
225-
gpio_set_drive_strength(PIN_D1, GPIO_DRIVE_STRENGTH_2MA);
226-
gpio_set_drive_strength(PIN_D2, GPIO_DRIVE_STRENGTH_2MA);
227-
gpio_set_drive_strength(PIN_D3, GPIO_DRIVE_STRENGTH_2MA);
228-
gpio_set_drive_strength(PIN_D4, GPIO_DRIVE_STRENGTH_2MA);
229-
gpio_set_drive_strength(PIN_D5, GPIO_DRIVE_STRENGTH_2MA);
230-
gpio_set_drive_strength(PIN_D6, GPIO_DRIVE_STRENGTH_2MA);
231-
gpio_set_drive_strength(PIN_D7, GPIO_DRIVE_STRENGTH_2MA);
278+
earlyGpioInit();
232279

233280
#ifdef DETECT_CONSOLE_TYPE
234281
setRomToDsiRom();

src/sd/rp2040_sdio.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -821,13 +821,6 @@ void rp2040_sdio_init(int clock_divider)
821821
gpio_set_function(SDIO_D2, GPIO_FUNC_PIO1);
822822
gpio_set_function(SDIO_D3, GPIO_FUNC_PIO1);
823823

824-
gpio_set_slew_rate(SDIO_CMD, GPIO_SLEW_RATE_FAST);
825-
gpio_set_slew_rate(SDIO_CLK, GPIO_SLEW_RATE_FAST);
826-
gpio_set_slew_rate(SDIO_D0, GPIO_SLEW_RATE_FAST);
827-
gpio_set_slew_rate(SDIO_D1, GPIO_SLEW_RATE_FAST);
828-
gpio_set_slew_rate(SDIO_D2, GPIO_SLEW_RATE_FAST);
829-
gpio_set_slew_rate(SDIO_D3, GPIO_SLEW_RATE_FAST);
830-
831824
// Set up IRQ handler when DMA completes.
832825
irq_set_exclusive_handler(DMA_IRQ_1, rp2040_sdio_irq);
833826
irq_set_enabled(DMA_IRQ_1, true);

0 commit comments

Comments
 (0)