Read and write from SD card #31

Closed
pca006132 wants to merge 37 commits from pca006132:sdio into master

The SD card driver now supports reading and writing by block address using 32bit ADMA2.
Currently tested on cora-z7-10 only.

The SD card driver now supports reading and writing by block address using 32bit ADMA2. Currently tested on cora-z7-10 only.
sb10q reviewed 2020-06-04 18:26:19 +08:00
@ -180,3 +227,1 @@
Err(_) =>
Poll::Ready((i + 1, None))
};
let name = stream

Could you move unrelated changes (style etc.) to a separate PR?

Could you move unrelated changes (style etc.) to a separate PR?
sb10q reviewed 2020-06-04 18:26:59 +08:00
@ -1 +1,2 @@
/target
.scripts

What is that for?

What is that for?

That is for my personal scripts, or should I move that into .git/info/exclude?

That is for my personal scripts, or should I move that into `.git/info/exclude`?

Yes, move to .git/info/exclude.

The rule here is that anything that isn't generated by the build scripts or instructions committed to the repository should not appear in .gitignore.

Yes, move to ``.git/info/exclude``. The rule here is that anything that isn't generated by the build scripts or instructions committed to the repository should not appear in ``.gitignore``.

Thanks, looks excellent!

Thanks, looks excellent!

@astro can you take a look?

@astro can you take a look?

Card detection does not work on ZC706.

Card detection does not work on ZC706.

Using libboard_zynq::sdio::SDIO::sdio0(false); works around the problem, then it works:

[     0.001003s] DEBUG(libboard_zynq::sdio): Reset SDIO!
[     0.005951s] DEBUG(libboard_zynq::sdio): Change clock frequency to 400000
[     0.022003s] DEBUG(libboard_zynq::sdio): Send Cmd CMD0
[     0.027265s] DEBUG(libboard_zynq::sdio): Send Cmd CMD1
[     0.032716s] DEBUG(libboard_zynq::sdio): Send Cmd CMD0
[     0.037976s] DEBUG(libboard_zynq::sdio): Send Cmd CMD8
[     0.043304s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.048792s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.054378s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.059790s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.065373s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.070870s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.076451s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.081950s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.087536s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.093029s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.098610s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.104109s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.109687s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.115189s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.120770s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.126268s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.131846s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.137348s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.142852s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.148346s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.153929s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.159425s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.165004s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.170505s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.176009s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.181503s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.187086s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.192582s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.198161s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.203662s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.209246s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.214742s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41
[     0.220320s] DEBUG(libboard_zynq::sdio): Send Cmd CMD2
[     0.225955s] DEBUG(libboard_zynq::sdio): Send Cmd CMD3
[     0.231372s] DEBUG(libboard_zynq::sdio): Send Cmd CMD9
[     0.237024s] DEBUG(libboard_zynq::sdio::sd_card): CSD[0] = 800A4040
[     0.243271s] DEBUG(libboard_zynq::sdio::sd_card): CSD[1] = 3B377F
[     0.249347s] DEBUG(libboard_zynq::sdio::sd_card): CSD[2] = 325B5900
[     0.255596s] DEBUG(libboard_zynq::sdio::sd_card): CSD[3] = 400E00
[     0.261672s] DEBUG(libboard_zynq::sdio): Change clock frequency to 25000000
[     0.268618s] DEBUG(libboard_zynq::sdio): Send Cmd CMD7
[     0.273665s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.278951s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD42
[     0.284255s] DEBUG(libboard_zynq::sdio::sd_card): Getting bus width
[     0.290507s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55
[     0.295723s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD51
[     0.300947s] DEBUG(libboard_zynq::sdio::sd_card): Wait for transfer complete
[     0.308050s] DEBUG(libboard_zynq::sdio::sd_card): Clearing transfer complete
[     0.315081s] DEBUG(libboard_zynq::sdio::sd_card): [58733826, 0, 0, 0, 0, 0, 0, 0]
[     0.322545s] DEBUG(libboard_zynq::sdio): Set block size to 512
[     0.328360s] DEBUG(libboard_zynq::sdio): Send Cmd CMD16
[     0.333576s]  INFO(experiments): OK!
[     0.337158s] DEBUG(libboard_zynq::sdio): Send Cmd CMD25
[     0.342368s] DEBUG(libboard_zynq::sdio::sd_card): Wait for transfer complete
[     0.349401s] DEBUG(libboard_zynq::sdio::sd_card): Clearing transfer complete
[     0.356451s] DEBUG(libboard_zynq::sdio): Send Cmd CMD18
[     0.361663s] DEBUG(libboard_zynq::sdio::sd_card): Wait for transfer complete
[     0.368697s] DEBUG(libboard_zynq::sdio::sd_card): Clearing transfer complete
[     0.375731s]  INFO(experiments): buffer[0] = 0
[     0.380154s]  INFO(experiments): buffer[1] = 1
[     0.384581s]  INFO(experiments): buffer[2] = 2
[     0.389008s]  INFO(experiments): buffer[3] = 3
[     0.393434s]  INFO(experiments): buffer[4] = 4
[     0.397861s]  INFO(experiments): buffer[5] = 5
[     0.402288s]  INFO(experiments): buffer[6] = 6
[     0.406715s]  INFO(experiments): buffer[7] = 7
[     0.411142s]  INFO(experiments): buffer[8] = 8
[     0.415569s]  INFO(experiments): buffer[9] = 9
[     0.419995s]  INFO(experiments): buffer[10] = 10
[     0.424596s]  INFO(experiments): buffer[11] = 11
[     0.429196s]  INFO(experiments): buffer[12] = 12
[     0.433797s]  INFO(experiments): buffer[13] = 13
[     0.438397s]  INFO(experiments): buffer[14] = 14
[     0.442997s]  INFO(experiments): buffer[15] = 15
[     0.447598s]  INFO(experiments): buffer[16] = 0
[     0.452112s]  INFO(experiments): buffer[17] = 1
[     0.456625s]  INFO(experiments): buffer[18] = 2
...
[     1.543447s]  INFO(experiments): buffer[255] = 0
[     1.548048s]  INFO(experiments): End


Confirmed that the data matches on the SD card with another reader.

Well done!

Using ``libboard_zynq::sdio::SDIO::sdio0(false);`` works around the problem, then it works: ```text [ 0.001003s] DEBUG(libboard_zynq::sdio): Reset SDIO! [ 0.005951s] DEBUG(libboard_zynq::sdio): Change clock frequency to 400000 [ 0.022003s] DEBUG(libboard_zynq::sdio): Send Cmd CMD0 [ 0.027265s] DEBUG(libboard_zynq::sdio): Send Cmd CMD1 [ 0.032716s] DEBUG(libboard_zynq::sdio): Send Cmd CMD0 [ 0.037976s] DEBUG(libboard_zynq::sdio): Send Cmd CMD8 [ 0.043304s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.048792s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.054378s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.059790s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.065373s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.070870s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.076451s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.081950s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.087536s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.093029s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.098610s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.104109s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.109687s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.115189s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.120770s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.126268s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.131846s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.137348s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.142852s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.148346s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.153929s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.159425s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.165004s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.170505s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.176009s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.181503s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.187086s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.192582s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.198161s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.203662s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.209246s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.214742s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD41 [ 0.220320s] DEBUG(libboard_zynq::sdio): Send Cmd CMD2 [ 0.225955s] DEBUG(libboard_zynq::sdio): Send Cmd CMD3 [ 0.231372s] DEBUG(libboard_zynq::sdio): Send Cmd CMD9 [ 0.237024s] DEBUG(libboard_zynq::sdio::sd_card): CSD[0] = 800A4040 [ 0.243271s] DEBUG(libboard_zynq::sdio::sd_card): CSD[1] = 3B377F [ 0.249347s] DEBUG(libboard_zynq::sdio::sd_card): CSD[2] = 325B5900 [ 0.255596s] DEBUG(libboard_zynq::sdio::sd_card): CSD[3] = 400E00 [ 0.261672s] DEBUG(libboard_zynq::sdio): Change clock frequency to 25000000 [ 0.268618s] DEBUG(libboard_zynq::sdio): Send Cmd CMD7 [ 0.273665s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.278951s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD42 [ 0.284255s] DEBUG(libboard_zynq::sdio::sd_card): Getting bus width [ 0.290507s] DEBUG(libboard_zynq::sdio): Send Cmd CMD55 [ 0.295723s] DEBUG(libboard_zynq::sdio): Send Cmd ACMD51 [ 0.300947s] DEBUG(libboard_zynq::sdio::sd_card): Wait for transfer complete [ 0.308050s] DEBUG(libboard_zynq::sdio::sd_card): Clearing transfer complete [ 0.315081s] DEBUG(libboard_zynq::sdio::sd_card): [58733826, 0, 0, 0, 0, 0, 0, 0] [ 0.322545s] DEBUG(libboard_zynq::sdio): Set block size to 512 [ 0.328360s] DEBUG(libboard_zynq::sdio): Send Cmd CMD16 [ 0.333576s] INFO(experiments): OK! [ 0.337158s] DEBUG(libboard_zynq::sdio): Send Cmd CMD25 [ 0.342368s] DEBUG(libboard_zynq::sdio::sd_card): Wait for transfer complete [ 0.349401s] DEBUG(libboard_zynq::sdio::sd_card): Clearing transfer complete [ 0.356451s] DEBUG(libboard_zynq::sdio): Send Cmd CMD18 [ 0.361663s] DEBUG(libboard_zynq::sdio::sd_card): Wait for transfer complete [ 0.368697s] DEBUG(libboard_zynq::sdio::sd_card): Clearing transfer complete [ 0.375731s] INFO(experiments): buffer[0] = 0 [ 0.380154s] INFO(experiments): buffer[1] = 1 [ 0.384581s] INFO(experiments): buffer[2] = 2 [ 0.389008s] INFO(experiments): buffer[3] = 3 [ 0.393434s] INFO(experiments): buffer[4] = 4 [ 0.397861s] INFO(experiments): buffer[5] = 5 [ 0.402288s] INFO(experiments): buffer[6] = 6 [ 0.406715s] INFO(experiments): buffer[7] = 7 [ 0.411142s] INFO(experiments): buffer[8] = 8 [ 0.415569s] INFO(experiments): buffer[9] = 9 [ 0.419995s] INFO(experiments): buffer[10] = 10 [ 0.424596s] INFO(experiments): buffer[11] = 11 [ 0.429196s] INFO(experiments): buffer[12] = 12 [ 0.433797s] INFO(experiments): buffer[13] = 13 [ 0.438397s] INFO(experiments): buffer[14] = 14 [ 0.442997s] INFO(experiments): buffer[15] = 15 [ 0.447598s] INFO(experiments): buffer[16] = 0 [ 0.452112s] INFO(experiments): buffer[17] = 1 [ 0.456625s] INFO(experiments): buffer[18] = 2 ... [ 1.543447s] INFO(experiments): buffer[255] = 0 [ 1.548048s] INFO(experiments): End ``` Confirmed that the data matches on the SD card with another reader. Well done!
astro requested changes 2020-06-05 03:33:06 +08:00
@ -0,0 +208,4 @@
cache::dcci_slice(buffer);
let (cmd, mode) = if block_cnt == 1 {
(

Not sure these tuples are well readable, rustfmt would align them differently.

Not sure these tuples are well readable, `rustfmt` would align them differently.

I merged the commits into two commits in another branch, now closing this and open another PR.

I merged the commits into two commits in another branch, now closing this and open another PR.
pca006132 closed this pull request 2020-06-05 11:58:54 +08:00

Pull request closed

Sign in to join this conversation.
No reviewers
No Label
No Milestone
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: M-Labs/zynq-rs#31
There is no content yet.