tests: add test_sdc

The SD card driver is a bit too slow to be bearable. I'll write
_crc16 in z80 and see how it goes.
This commit is contained in:
Virgil Dupras 2020-04-24 18:23:29 -04:00
parent b5c370a936
commit 8d78ca9dac
4 changed files with 40 additions and 37 deletions

28
blk/380
View File

@ -1,16 +1,16 @@
: _err _sdcDesel ABORT" SDerr" ;
( Initialize a SD card. This should be called at least 1ms
after the powering up of the card. )
: SDC$
( Wake the SD card up. After power up, a SD card has to receive
at least 74 dummy clocks with CS and DI high. We send 80. )
10 0 DO _idle DROP LOOP
( call cmd0 and expect a 0x01 response (card idle)
this should be called multiple times. we're actually
expected to. let's call this for a maximum of 10 times. )
0 ( dummy )
10 0 DO ( r )
DROP 0x40 0 0 SDCMDR1 ( CMD0 )
DUP 0x01 = IF LEAVE THEN
LOOP 0x01 = NOT IF _err THEN ( cont. )
( Tight definition ahead, pre-comment.
Initialize a SD card. This should be called at least 1ms
after the powering up of the card. We begin by waking up the
SD card. After power up, a SD card has to receive at least
74 dummy clocks with CS and DI high. We send 80.
Then send cmd0 for a maximum of 10 times, success is when
we get 0x01. Then comes the CMD8. We send it with a 0x01aa
argument and expect a 0x01aa argument back, along with a
0x01 R1 response. After that, we need to repeatedly run
CMD55+CMD41 (0x40000000) until the card goes out of idle
mode, that is, when it stops sending us 0x01 response and
send us 0x00 instead. Any other response means that
initialization failed. )

26
blk/381
View File

@ -1,10 +1,16 @@
( Then comes the CMD8. We send it with a 0x01aa argument and
expect a 0x01aa argument back, along with a 0x01 R1
response. )
0x48 0 0x1aa ( CMD8 )
SDCMDR7 ( r arg1 arg2 )
0x1aa = NOT IF _err THEN ( arg2 check )
0 = NOT IF _err THEN ( arg1 check )
0x01 = NOT IF _err THEN ( r check )
( cont. )
: SDC$
10 0 DO _idle DROP LOOP
0 ( dummy ) 10 0 DO ( r )
DROP 0x40 0 0 SDCMDR1 ( CMD0 )
DUP 0x01 = IF LEAVE THEN
LOOP 0x01 = NOT IF _err THEN
0x48 0 0x1aa ( CMD8 ) SDCMDR7 ( r arg1 arg2 )
0x1aa = NOT IF _err THEN ( arg2 check )
0 = NOT IF _err THEN ( arg1 check )
0x01 = NOT IF _err THEN ( r check )
BEGIN
0x77 0 0 SDCMDR1 ( CMD55 )
0x01 = NOT IF _err THEN
0x69 0x4000 0x0000 SDCMDR1 ( CMD41 )
DUP 0x01 > IF _err THEN
NOT UNTIL ; ( out of idle mode, success! )

13
blk/382
View File

@ -1,13 +0,0 @@
( Now we need to repeatedly run CMD55+CMD41 (0x40000000)
until the card goes out of idle mode, that is, when it stops
sending us 0x01 response and send us 0x00 instead. Any other
response means that initialization failed. )
BEGIN
0x77 0 0 SDCMDR1 ( CMD55 )
0x01 = NOT IF _err THEN
0x69 0x4000 0x0000 SDCMDR1 ( CMD41 )
DUP 0x01 > IF _err THEN
NOT UNTIL
( Out of idle mode! Success! )
;

10
tests/forth/test_sdc.fs Normal file
View File

@ -0,0 +1,10 @@
212 LOAD ( z80a )
: SDC_SPI 4 ;
: SDC_CSLOW 5 ;
: SDC_CSHIGH 6 ;
372 LOAD ( sdc.z80 )
374 LOAD ( sdc.fs )
0x0000 0x0000 _crc16 0x0000 #eq
0x0000 0x0001 _crc16 0x1021 #eq
0x5678 0x1234 _crc16 0x43c4 #eq