View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001470 | NBootV210 | SD/MMC | public | 2012-11-29 11:36 | 2015-02-04 15:36 |
Reporter | Keller | Assigned To | |||
Priority | normal | Severity | minor | Reproducibility | always |
Status | assigned | Resolution | open | ||
Product Version | V19 | ||||
Target Version | V20 | ||||
Summary | 0001470: SD-Cards use very low speed | ||||
Description | Normal speed SD-Cards use only 12.8MHz and high speed SD-Cards only 25.6MHz for transfers. This is only a little bit more than half of the possible speed (25MHz and 50MHz). | ||||
Steps To Reproduce | Try to load some bootloader from SD-Card with NBoot command 'c'. Look at the line "Operating Frequency". You'll see the following values. Operating Frequency: 12826923Hz (Normal Speed) Operating Frequency: 25653846Hz (High Speed) | ||||
Additional Information | The base frequency for the MMC/SD controller is derived by dividing the MPLL clock of 667MHz to a frequency below 52MHz. 52 MHz is the maximum speed for High-Speed MMC cards. This results in a divider of 13 and a base frequency of 51.3MHz. Unfortunately all other frequencies now have to be divided from this base frequency by a power of 2 (1, 2, 4, 8, ..., 256). This is a restriction of the SDHC controller specification and Samsung implementation. However High-Speed SD-Cards have a maximum frequency of 50MHz, only MMC cards have 52MHz. So we must use divider 2 for High-Speed and 4 for Normal-Speed, resulting in the above low speeds. It would be much better to check for 50MHz instead of 52MHz when computing the divider for the base clock. This would result in divider 14 and a base frequency of 47,6MHz. This can be used directly for High-Speed cards and half of it (23.8MHz) for Normal-Speed cards. This would bring a much better performance for SD cards and only a minor speed reduction for MMC cards (which are not important for our purposes anyway). In SDHC_OpenMedia() (file lib/s1sdhc.c): Change line while (((uSrcFreq/uClockDivision) > 52000000) && (uClockDivision < 16)) to while (((uSrcFreq/uClockDivision) > 50000000) && (uClockDivision < 16)) | ||||
Forum Link | |||||