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

26
blk/381
View File

@ -1,10 +1,16 @@
( Then comes the CMD8. We send it with a 0x01aa argument and : SDC$
expect a 0x01aa argument back, along with a 0x01 R1 10 0 DO _idle DROP LOOP
response. ) 0 ( dummy ) 10 0 DO ( r )
0x48 0 0x1aa ( CMD8 ) DROP 0x40 0 0 SDCMDR1 ( CMD0 )
SDCMDR7 ( r arg1 arg2 ) DUP 0x01 = IF LEAVE THEN
0x1aa = NOT IF _err THEN ( arg2 check ) LOOP 0x01 = NOT IF _err THEN
0 = NOT IF _err THEN ( arg1 check ) 0x48 0 0x1aa ( CMD8 ) SDCMDR7 ( r arg1 arg2 )
0x01 = NOT IF _err THEN ( r check ) 0x1aa = NOT IF _err THEN ( arg2 check )
0 = NOT IF _err THEN ( arg1 check )
( cont. ) 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