Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

stm32h7: sdmmc: write DCTRL after DTIMER/DLENR for non-data commands

According to RM0433 the DCTRL register needs to be written
after DLENR and DTIMER. This is respected for data transfer
commands but not for non-data commands. Nothing bad seems
to be happening because of this, but it seems wise to rectify
the issue.

Change-Id: I55d8f2c1994bff747e5978847fda57445f001b02

authored by

Aidan MacDonald and committed by
Solomon Peachy
55183c0b 65bf8d41

+9 -11
+9 -11
firmware/target/arm/stm32/sdmmc-stm32h7.c
··· 260 260 uint32_t maskr = CMD_ERROR_BITS; 261 261 uint32_t cmdr = __reg_orf(SDMMC_CMDR, CPSMEN(1), CMDINDEX(cmd->command)); 262 262 uint32_t cmd_wait = WAIT_CMD; 263 + uint32_t dctrl = 0, dtimer = 0, dlenr = 0; 263 264 264 265 void *buff_addr = cmd->buffer; 265 266 size_t buff_size = cmd->nr_blocks * cmd->block_len; ··· 317 318 panicf("%s: buffer too big", __func__); 318 319 319 320 /* Set block size */ 320 - uint32_t dctrl = 0; 321 321 uint32_t dblocksize = find_first_set_bit(cmd->block_len); 322 322 if (dblocksize > 14 || (cmd->block_len & (cmd->block_len - 1))) 323 323 panicf("%s: incorrect block size", __func__); ··· 341 341 reg_assignlf(ctl->regs, SDMMC_IDMACTRLR, IDMAEN(1)); 342 342 343 343 /* Use a 10 second timeout (DTIMER is in units of bus clocks) */ 344 - reg_varl(ctl->regs, SDMMC_DTIMER) = 10 * ctl->bus_freq; 345 - reg_varl(ctl->regs, SDMMC_DLENR) = buff_size; 346 - 347 - /* DCTRL must be written last */ 348 - reg_varl(ctl->regs, SDMMC_DCTRL) = dctrl; 344 + dtimer = 10 * ctl->bus_freq; 345 + dlenr = buff_size; 349 346 350 347 /* Enable data phase */ 351 348 reg_vwritef(cmdr, SDMMC_CMDR, CMDTRANS(1)); ··· 356 353 { 357 354 /* Disable data transfer */ 358 355 reg_assignlf(ctl->regs, SDMMC_IDMACTRLR, IDMAEN(0)); 359 - reg_varl(ctl->regs, SDMMC_DLENR) = 0; 360 - reg_varl(ctl->regs, SDMMC_DCTRL) = 0; 361 356 362 357 /* DTIMER is the wait time for the busy signal */ 363 358 if (cmd->flags & SDMMC_RESP_BUSY) 364 - reg_varl(ctl->regs, SDMMC_DTIMER) = 1 * ctl->bus_freq; 365 - else 366 - reg_varl(ctl->regs, SDMMC_DTIMER) = 0; 359 + dtimer = 1 * ctl->bus_freq; 367 360 } 361 + 362 + /* Set data transfer registers */ 363 + reg_varl(ctl->regs, SDMMC_DLENR) = dlenr; 364 + reg_varl(ctl->regs, SDMMC_DTIMER) = dtimer; 365 + reg_varl(ctl->regs, SDMMC_DCTRL) = dctrl; 368 366 369 367 /* 370 368 * Set CMDSTOP bit for CMD12 (stop transmission) command;