@@ -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+
162241int __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 ();
0 commit comments