P2 SD Testing

in Propeller 2
Dilema...
SD is booting fine on the P2.
However, in order for the SD routines to work not only at the RC speed which is ~30MHz max, but to also work with user code that may be running up to ~200MHz max for us overclockers if we can get away with it. To satisfy this, the timeout of 1s needs to be calculated for the fastest speed (200MHz). This gives around 10s timeout at 20MHz (the current testing FPGA RC speed). Under normal circumstances, this is an SD card issue, and nothing we do will speed up the card.
But the problem lies if there is a pull-up on P60 (the CSn pin of the SD card) but no card. Chip revealed this during testing of the pullups recently. We decided to pass at that point. The SD card is providing the internal pullup - we are recommending using the SD's internal pull-up for circuitry, so why would there be a pullup present without an SD card. Well, it's possible the SD card has failed. How possible? I don't know.
So, if an SD card is present, but it is failing to respond to the initialisation sequence, the 1s timeout at the fastest speed will give around 7s at the RC Boot speed of the P2. This means that before the serial can take over upon an SD boot failure, around 7s may have elapsed. Note that this is a faulty SD hardware problem. Easy solution is to remove or replace the SD card and the problem is solved. Note if the boot sectors or boot files are not found, the SD boot code will return as fast as the SD responds which is usually ~25-100ms.
While the final ROM window remains open, I would like to try a few solutions. BUT, I need as many of you as possible to test as many SD cards as you can, just to ensure I don't break something.
So, what is your best hardware to do this?
a) P2 - Again I can give you the source to recompile. But what FPGA boards and FPGA code? I am presuming the full P2 version 32a/b. A couple of the early v32 and prior have the SD cards mapped to P58-62 and these should work fine for this testing. The test rom code we are testing with is only available for 123 A9 and BeMicroCV-A9 boards.
b) P1 - I can give you source to recompile to any pins and xtal
I am not even certain I will have the time to do this, but perhaps its worth a try.
SD is booting fine on the P2.
However, in order for the SD routines to work not only at the RC speed which is ~30MHz max, but to also work with user code that may be running up to ~200MHz max for us overclockers if we can get away with it. To satisfy this, the timeout of 1s needs to be calculated for the fastest speed (200MHz). This gives around 10s timeout at 20MHz (the current testing FPGA RC speed). Under normal circumstances, this is an SD card issue, and nothing we do will speed up the card.
But the problem lies if there is a pull-up on P60 (the CSn pin of the SD card) but no card. Chip revealed this during testing of the pullups recently. We decided to pass at that point. The SD card is providing the internal pullup - we are recommending using the SD's internal pull-up for circuitry, so why would there be a pullup present without an SD card. Well, it's possible the SD card has failed. How possible? I don't know.
So, if an SD card is present, but it is failing to respond to the initialisation sequence, the 1s timeout at the fastest speed will give around 7s at the RC Boot speed of the P2. This means that before the serial can take over upon an SD boot failure, around 7s may have elapsed. Note that this is a faulty SD hardware problem. Easy solution is to remove or replace the SD card and the problem is solved. Note if the boot sectors or boot files are not found, the SD boot code will return as fast as the SD responds which is usually ~25-100ms.
While the final ROM window remains open, I would like to try a few solutions. BUT, I need as many of you as possible to test as many SD cards as you can, just to ensure I don't break something.
So, what is your best hardware to do this?
a) P2 - Again I can give you the source to recompile. But what FPGA boards and FPGA code? I am presuming the full P2 version 32a/b. A couple of the early v32 and prior have the SD cards mapped to P58-62 and these should work fine for this testing. The test rom code we are testing with is only available for 123 A9 and BeMicroCV-A9 boards.
b) P1 - I can give you source to recompile to any pins and xtal
I am not even certain I will have the time to do this, but perhaps its worth a try.
Comments
The booter will only ever run on the RC Clock, but if you want to allow users to call the ROM code at any SysCLK speed, why not have a defined location that sets the clock speed for timing ?
You already will be defining the entry points for the routines, so one that sets SysCLK is easy to manage ?
The booter could check the config registers, but that does not tell it the crystal frequency, so a user call that can change the default value seems the simplest and most flexible ?
If you have a routine like SysClks_per_10ms, that defaults to 200000 for 20MHz.
The code shows a ~ 5us time, so that means values above 500k~1M should be ignored.
Noisy environments could pose a problem ?
But, it's not that simple to provide a register to set because...
1. No spare registers ATM - I use a nice even 32 already.
2. No spare code space. Yes, it's only a few more longs. But Peter is on the scrounge
Now, why can't I abort on CMD0? Well, the response of $FF is legitimate, and if that is seen, then the code needs to look further for a response. How many $FF's are legitimate on a CMD0? I don't know as the spec does not say. Sorry Peter, even SanDisk cards reply with $FF to any of the commands!!! And I have seen other responses as well, some of which are obviously invalid. But a retry of the command fixes the problem. It seems the card must be missing some clocks as it does not respond quickly enough, and it gets out of sync. It is an SD requirement that $FF is a stall code, not a retransmit code! The normal use of the $FF is for delaying the read/write of a sector/registers once the CMD17, CMD24, and a few others, which is then followed by an $FE to indicate the send/receive block is now ready to proceed.
Now it's also a requirement that CMD0 has a retry count suggested to be 10. Just another counter that is required. But you cannot retry the CMD0 if you receive an $FF reply. It not in the spec and from what I have seen it does not work reliably, if at all.
And one last thing. This code has been squashed to a minimum, so the routines are general purpose. It's not so easy to modify the lowest level, and not be sure you don't break something at a higher level.
Peter, just the pullup resistor responds with $FF. But how many is legitimate and how many is not? And how do you pass this information to the low level without using any more code and any more registers?
So, that was my purpose to get some more testing results to confirm if I could get away with not conforming to the spec, and shorten the timeout.
Yep.
Here is how you boot without the 10s timeout in the case your SD card is dead, or you incorrectly designed your hardware and put a pullup on P60.
"> " ' set autobaud <Ctl-D> ' goto the monitor 1DF- xxxxxxxx <cr> ' set 32-bit timeout value of 1s for the current clock Gfc558<cr> ' call SD routine to boot from SD card
I needed an extra register for this, so I now require cog registers $1BF-$1DF for the SD booting. Not quite as neat as $1C0-$1DF
The above looks good.
What is the command sequence to AutoBaud + Change SysCLK(enable PLL) + AutoBaud again + Set32b_1sec timeout ?
No matter what card I plug into TAQOZ, if I do a 0 0 CMD I almost invariably get a 01 response first time after inserting into a running system. One comes back with $3F $C1 before 01, but just that card
Using this quick check (the crc reverts to $95)
: INIT BEGIN 0 0 CMD DUP .BYTE SPACE 1 = UNTIL ;
Here are 3 different cards but all the others just came back immediately with a valid response.TAQOZ# INIT 3F C1 01 ok TAQOZ# INIT 01 ok TAQOZ# INIT 01 ok
Not one card ever came back with $FF which is actually just the master SPI reading an empty slave SPI register that hasn't yet been written. This is the same reason we can clock in $FF to a card without problems.btw - timing this from the very first CMD0 until a positive response:
2787 cycles = 34.837us
This is coded for 80MHz timing but still it is under 150us so a simple retry counter is all that is needed but almost invariably the response is immediate.So no, I am not going to ignore the FF because I have seen it. We have to cater for what is out there. This is the ROM Boot code, so it has to cater for as many cases as possible.
Here is a SanDisk 4GB card trace
SD testing v111a SD card type: 3 = SDHC/SD V2(block) (passed) 4404: CS1 CLK0 ; 4408: CS1 CLK0 0 00000040 00000000 00000095 000000FF (1) 00000001 ; 4430: CS1 CLK0 8 00000048 000001AA 00000087 000000FF (1) 00000001 000001AA ; 445C: CS1 CLK0 55 00000077 00000000 00000087 000000FF (1) 00000001 ; 4484: CS0 CLK0 41 00000069 40000000 00000087 000000FF (1) 00000000 (1887) (11805016 clocks) 147ms ; 44BC: CS1 CLK0 58 0000007A 00000000 00000087 000000FF (1) 00000000 C0FF8000 ; 44E8: CS1 CLK0 16 00000050 00000200 00000087 000000FF (1) 00000000 ; 4510: CS1 CLK0 9 00000049 00000000 00000087 000000FF (2) 00000000 000000FF (1) 000000FE ; 4548: (16 bytes) CRC: 0000008C 00000004 ; 4558: CS1 CLK0 10 0000004A 00000000 00000087 000000FF (2) 00000000 000000FF (1) 000000FE ; 4590: (16 bytes) CRC: 0000001F 000000BA ; 45A0: CS1 CLK0 17 00000051 00000000 00000087 000000FF (2) 00000000 000000FF (2758) 000000FE ; 45D8: (512 bytes) CRC: 0000002B 000000B1 ; 45E8: CS1 CLK0 17 00000051 00000001 00000087 000000FF (2) 00000000 000000FF (330) 000000FE ; 4620: (512 bytes) CRC: 00000000 00000000 ; 4630: <eof> (13442692 clocks) 168ms CSD register... 0000: 40 0E 00 32 5B 59 00 00 1D 8A 7F 80 0A 40 40 B9 @..2[Y.......@@. CID register... 0000: 03 53 44 53 55 30 34 47 80 A1 3D D0 99 00 C6 7F .SDSU04G..=..... MBR/VBR sector 0 ... Valid MBR
and a SanDisk 32GB cardSD testing v111a SD card type: 3 = SDHC/SD V2(block) (passed) 4404: CS1 CLK0 ; 4408: CS1 CLK0 0 00000040 00000000 00000095 000000FF (1) 00000001 ; 4430: CS1 CLK0 8 00000048 000001AA 00000087 000000FF (1) 00000001 000001AA ; 445C: CS1 CLK0 55 00000077 00000000 00000087 000000FF (1) 00000001 ; 4484: CS0 CLK0 41 00000069 40000000 00000087 000000FF (1) 00000000 (1887) (11805016 clocks) 147ms ; 44BC: CS1 CLK0 58 0000007A 00000000 00000087 000000FF (1) 00000000 C0FF8000 ; 44E8: CS1 CLK0 16 00000050 00000200 00000087 000000FF (1) 00000000 ; 4510: CS1 CLK0 9 00000049 00000000 00000087 000000FF (2) 00000000 000000FF (1) 000000FE ; 4548: (16 bytes) CRC: 0000008C 00000004 ; 4558: CS1 CLK0 10 0000004A 00000000 00000087 000000FF (2) 00000000 000000FF (1) 000000FE ; 4590: (16 bytes) CRC: 0000001F 000000BA ; 45A0: CS1 CLK0 17 00000051 00000000 00000087 000000FF (2) 00000000 000000FF (2758) 000000FE ; 45D8: (512 bytes) CRC: 0000002B 000000B1 ; 45E8: CS1 CLK0 17 00000051 00000001 00000087 000000FF (2) 00000000 000000FF (330) 000000FE ; 4620: (512 bytes) CRC: 00000000 00000000 ; 4630: <eof> (13442692 clocks) 168ms CSD register... 0000: 40 0E 00 32 5B 59 00 00 1D 8A 7F 80 0A 40 40 B9 @..2[Y.......@@. CID register... 0000: 03 53 44 53 55 30 34 47 80 A1 3D D0 99 00 C6 7F .SDSU04G..=..... MBR/VBR sector 0 ...
A long timeout is totally avoidable.
Every time I insert a card it times the CMD0 operation which is typically 37us but that is dependent upon the SPI bus speed. The second line times not only the card initialization that is required but also mounting it as FAT32. The internal serial number and ID is printed including the optional name when the card is mounted.
CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD .SDSU32G 432A_2B70 NO NAME 32k 30,432M 623377 cycles = 7.792ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD .SDSU32G 432A_2B70 NO NAME 32k 30,432M 3010113 cycles = 37.626ms CHECKING CARD CMD0 2931 cycles = 36.637us CHECKING CARD CMD0 333219 cycles = 4.165ms MOUNTING CARD .SDSS16G F16B_22ED TACHYON 32k 15,189M 2828545 cycles = 35.356ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD 'PHSD32G 690B_541A TAQOZ 32k 30,168M 4935225 cycles = 61.690ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD 'PHSD32G 690B_541A TAQOZ 32k 30,168M 2428137 cycles = 30.351ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD 'PHSD32G 690B_541A TAQOZ 32k 30,168M 2406145 cycles = 30.76ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD .SDSU08G 3437_3130 NO NAME 32k 7,576M 2790993 cycles = 34.887ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD ...SDC 2F1E_66F1 IOT5500 4k 3,932M 5958481 cycles = 74.481ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD ...SDC 2F1E_66F1 IOT5500 4k 3,932M 5914497 cycles = 73.931ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD .SDSL16G 6131_6232 NO NAME 32k 15,189M 2781017 cycles = 34.762ms CHECKING CARD CMD0 333219 cycles = 4.165ms MOUNTING CARD .SM00000 F184_E94B WIDGET 4k 3,758M 339737 cycles = 4.246ms CHECKING CARD CMD0 333219 cycles = 4.165ms MOUNTING CARD .SM00000 F184_E94B WIDGET 4k 3,758M 339729 cycles = 4.246ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD ...NCard 2E0E_36DA NO NAME 32k 7,655M 6324681 cycles = 79.58ms CHECKING CARD CMD0 2931 cycles = 36.637us MOUNTING CARD ...NCard 2E0E_36DA NO NAME 32k 7,655M 6324681 cycles = 79.58ms CHECKING CARD CMD0 2931 cycles = 36.637us CHECKING CARD .SDSL08G 2545_ADF1 TAQOZ 32k 7,576M 2830449 cycles = 35.380ms CHECKING CARD CMD0 663507 cycles = 8.293ms MOUNTING CARD ...SDC F84E_1690 NO NAME 32k 3,929M 7770249 cycles = 97.128ms CHECKING CARD CMD0 19641171 cycles = 245.514ms MOUNTING CARD ...SDC F84E_1690 NO NAME 32k 3,929M 336953 cycles = 4.211ms CHECKING CARD CMD0 67852659 cycles = 311.287ms MOUNTING CARD ...SDC F84E_1690 NO NAME 32k 3,929M 336953 cycles = 4.211ms ok TAQOZ# $FF HUBSET �^ ok CHECKING CARD CMD0 18075516 cycles = 225.943ms MOUNTING CARD 12470457 cycles = 155.880ms - CHECKING CARD CMD0 2916 cycles = 36.450us CHECKING CARD ...SDC F84E_1690 NO NAME 32k 3,929M 31237009 cycles = 390.462ms | CHECKING CARD CMD0 333196 cycles = 4.164ms MOUNTING CARD .SDSL08G 6338_3533 NO NAME 32k 7,576M 2562473 cycles = 32.30ms | CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD ...NCard 2E0E_36DA NO NAME 32k 7,655M 6350553 cycles = 79.381ms \ CHECKING CARD CMD0 333196 cycles = 4.164ms CHECKING CARD .SM00000 F184_E94B WIDGET 4k 3,758M 322017 cycles = 4.25ms \ CHECKING CARD CMD0 333196 cycles = 4.164ms MOUNTING CARD .SDSU08G 3437_3130 NO NAME 32k 7,576M 2772601 cycles = 34.657ms \ CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD .SDSU08G 3437_3130 NO NAME 32k 7,576M 2772601 cycles = 34.657ms \ CHECKING CARD CMD0 2916 cycles = 36.450us CHECKING CARD .SDSL16G 6131_6232 NO NAME 32k 15,189M 2761585 cycles = 34.519ms - CHECKING CARD CMD0 333196 cycles = 4.164ms MOUNTING CARD .SDSU32G 432A_2B70 NO NAME 32k 30,432M 2990817 cycles = 37.385ms | CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD .SDSU32G 432A_2B70 NO NAME 32k 30,432M 2990489 cycles = 37.381ms - CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD 'PHSD32G 3248_DC0D NO NAME 32k 30,168M 1989833 cycles = 24.872ms \ CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD .SDSU04G 3434_6461 NO NAME 32k 3,777M 2080121 cycles = 26.1ms - CHECKING CARD CMD0 2916 cycles = 36.450us CHECKING CARD .SDSU04G 3863_3738 WIDGET2 32k 3,777M 2170337 cycles = 27.129ms \ CHECKING CARD CMD0 663476 cycles = 8.293ms MOUNTING CARD ...NCard 0012_D687 NO NAME 32k 7,654M 8219585 cycles = 102.744ms - CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD ...NCard 0012_D687 NO NAME 32k 7,654M 8219585 cycles = 102.744ms | CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD sBGNCard E443_6D2C NO NAME 32k 7,646M 7534737 cycles = 94.184ms \ CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD ...NCard 8391_23A1 DAWN 32k 7,655M 7076001 cycles = 88.450ms - CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD ...SDC 2F1E_66F1 IOT5500 4k 3,932M 6028953 cycles = 75.361ms \ CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD 'PHSD32G 690B_541A TAQOZ 32k 30,168M 2408897 cycles = 30.111ms | CHECKING CARD CMD0 2916 cycles = 36.450us CHECKING CARD .SDSU32G 32FE_D582 BOOT 32k 30,432M 3008969 cycles = 37.612ms \ CHECKING CARD CMD0 333196 cycles = 4.164ms MOUNTING CARD .SDSL08G 6130_6430 NO NAME 32k 7,576M 2623657 cycles = 32.795ms | CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD .SDSL08G 6338_6430 WIDGET 32k 7,576M 2872129 cycles = 35.901ms / CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD .SDSD04G 74C0_22AC V ^ 64k 3,780M 2583905 cycles = 32.298ms / CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD .SDSU04G 3264_3565 NO NAME 32k 3,777M 2166681 cycles = 27.83ms \ CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD ...SDC F84E_1690 NO NAME 32k 3,929M 8303057 cycles = 103.788ms | CHECKING CARD CMD0 2916 cycles = 36.450us CHECKING CARD ...SDC F84E_1690 NO NAME 32k 3,929M 8457001 cycles = 105.712ms \ CHECKING CARD CMD0 333196 cycles = 4.164ms MOUNTING CARD .SDSL08G 2545_ADF1 TAQOZ 32k 7,576M 2812017 cycles = 35.150ms - CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD .SDSL08G 2545_ADF1 TAQOZ 32k 7,576M 2812017 cycles = 35.150ms \ CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD .SDSL08G 5E5F_7F14 TAQOZ 32k 7,576M 2811689 cycles = 35.146ms / CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD 'PHSD64G 0000_0000 xH 0k 0M 4665321 cycles = 58.316ms | CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD 'PHSD64G 0000_0000 xH 0k 0M 1498473 cycles = 18.730ms / CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD 'PHSD64G 0000_0000 xH 0k 0M 1498473 cycles = 18.730ms | ( REFORMAT 64G TO FAT32 ) CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD 'PHSD64G 8192_C438 FAT32 32k 59,648M 4542353 cycles = 56.779ms / CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD 'PHSD64G 8192_C438 FAT32 32k 59,648M 1595425 cycles = 19.942ms / CHECKING CARD CMD0 2916 cycles = 36.450us MOUNTING CARD 'PHSD64G 8192_C438 FAT32 32k 59,648M 1595425 cycles = 19.942ms -
Why the large variation here, up to 311ms ? - but most common is 2916, or 2031 cycles
Did you try the equivalent of a cold-power-up test ? IIRC, some SD cards have a boot procedure themselves, so the first power-up is slower than all others.
Does that CMD0 always test for 01 return value - Could Cluso try the same tests on his cards ?
I have a reset switch which I use and it may be a bit noisy so I will look at making it a clean signal next and then checking boot. I've attached my TAQOZ.BIN which I rename to a _P2_BOOT.BIX or BIY or course. This image starts up at 115200 baud 80MHz with an earlier version of TAQOZ that can run in 32k RAM, so it starts immediately with the splash and prompt.
Cold start ---------------------------------------------------------------- Parallax P2 .:.:--TAQOZ--:.:. V1.0--141 180528-0130 ---------------------------------------------------------------- TAQOZ#
What worries me now is why does the SD booter take as long as it does? It seems to be busy clocking the SD for 700ms which is way over the top and way too slow for a 32k image. I'm going to grab all this on an analyzer but the boot routines need improving. This is with the latest SD booter code. A random sector read takes less than 2ms at 20MHz in TAQOZ and timing my SD init routines from a cold start shows this is actually taking 120ms. So 128+120+ say another 22ms should be around 270ms although an SD multiple sector read is much faster than that.
I changed to 80MHz in TAQOZ and freshly initialized a card (removed and inserted) and it still took 120ms, so this init code is not introducing any extra unnecessary timeouts, it's mainly the ACM41 where the card takes its time to clean up and respond.
Isn't anybody actually testing and measuring real world SD booting?
You can't see my chip select going low from high but it's there, whereas I can't ever see the SD boot code do it. But then again, it might be finger trouble as I check further.....something to ponder.
EDIT - looks like the chip select was on the RESET trace - so I will get put it back and get the LA to resynch to it.
That $48 on the right of the capture is the CMD8.
I've reconfigured the LA since it was clocking on the falling edge but I will continue to look. But as you can see, the 01 response is immediate. I'm panicking because there hasn't been enough testing done at this level and I've been busy and still busy with TAQOZ. Can anyone help?