Skip to content

Commit c211541

Browse files
committed
bus width switch okay
1 parent e85900e commit c211541

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

lib/pbio/drv/mmcsd/mmcsd_ev3.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,50 @@ pbio_error_t ev3_mmcsd_process_thread(pbio_os_state_t *state, void *context) {
154154
// pbdrv_uart_debug_printf("acmd51 %08x %08x\r\n", resp[0], resp[1]);
155155
pbdrv_uart_debug_printf("acmd51 %08x %08x\r\n", data[0], data[1]);
156156

157+
// acmd6
158+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCARGHL) = rca;
159+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCCMD) = (55 << MMCSD_MMCCMD_CMD_SHIFT) | (MMCSD_MMCCMD_RSPFMT_R1 << MMCSD_MMCCMD_RSPFMT_SHIFT) | MMCSD_MMCCMD_PPLEN;
160+
PBIO_OS_AWAIT_UNTIL(state, HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCST0) & MMCSD_MMCST0_RSPDNE);
161+
resp[0] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCRSP45);
162+
resp[1] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCRSP67);
163+
// pbdrv_uart_debug_printf("cmd55 %08x %08x\r\n", resp[0], resp[1]);
164+
165+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCARGHL) = 2;
166+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCCMD) = (6 << MMCSD_MMCCMD_CMD_SHIFT) | (MMCSD_MMCCMD_RSPFMT_R1 << MMCSD_MMCCMD_RSPFMT_SHIFT) | MMCSD_MMCCMD_PPLEN;
167+
PBIO_OS_AWAIT_UNTIL(state, HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCST0) & MMCSD_MMCST0_RSPDNE);
168+
resp[0] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCRSP45);
169+
resp[1] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCRSP67);
170+
// pbdrv_uart_debug_printf("acmd6 %08x %08x\r\n", resp[0], resp[1]);
171+
172+
// switch host to 4-bit mode
173+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCCTL) |= MMCSD_MMCCTL_WIDTH1_WIDTH0_4BIT;
174+
175+
// acmd51 again for testing
176+
177+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCFIFOCTL) = MMCSD_MMCFIFOCTL_FIFORST;
178+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCFIFOCTL) = MMCSD_MMCFIFOCTL_ACCWD_4BYTES | (0 << MMCSD_MMCFIFOCTL_FIFODIR_SHIFT);
179+
180+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCARGHL) = rca;
181+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCCMD) = (55 << MMCSD_MMCCMD_CMD_SHIFT) | (MMCSD_MMCCMD_RSPFMT_R1 << MMCSD_MMCCMD_RSPFMT_SHIFT) | MMCSD_MMCCMD_PPLEN;
182+
PBIO_OS_AWAIT_UNTIL(state, HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCST0) & MMCSD_MMCST0_RSPDNE);
183+
resp[0] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCRSP45);
184+
resp[1] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCRSP67);
185+
// pbdrv_uart_debug_printf("cmd55 %08x %08x\r\n", resp[0], resp[1]);
186+
187+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCBLEN) = 8;
188+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCNBLK) = 1;
189+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCARGHL) = 0;
190+
HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCCMD) = (51 << MMCSD_MMCCMD_CMD_SHIFT) | (MMCSD_MMCCMD_RSPFMT_R1 << MMCSD_MMCCMD_RSPFMT_SHIFT) | MMCSD_MMCCMD_PPLEN | MMCSD_MMCCMD_WDATX;
191+
PBIO_OS_AWAIT_WHILE(state, HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCST1) & MMCSD_MMCST1_FIFOEMP);
192+
data[0] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCDRR);
193+
PBIO_OS_AWAIT_WHILE(state, HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCST1) & MMCSD_MMCST1_FIFOEMP);
194+
data[1] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCDRR);
195+
PBIO_OS_AWAIT_UNTIL(state, HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCST0) & MMCSD_MMCST0_DATDNE);
196+
resp[0] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCRSP45);
197+
resp[1] = HWREG(SOC_MMCSD_0_REGS + MMCSD_MMCRSP67);
198+
// pbdrv_uart_debug_printf("acmd51 %08x %08x\r\n", resp[0], resp[1]);
199+
pbdrv_uart_debug_printf("acmd51 v2 %08x %08x\r\n", data[0], data[1]);
200+
157201
pbdrv_uart_debug_printf("mmcsd init defer end\r\n");
158202

159203
PBIO_OS_ASYNC_END(PBIO_SUCCESS);

0 commit comments

Comments
 (0)