Mam problem dość niszowy, w niepopularnej tutaj architekturze (pic32mz) ale może ktoś mądry skojarzy z opisu problemu coś z własnego doświadczenia z SDHOST na innym mcu bo SDHOST jest pewnym standardem sprzętowym i jego rejestry (oraz inicjalizacja) są analogiczne bez względu na architekturę.
W jednym projekcie potrzebuję napisać driver do SDHOST, posiłkuję się sterownikiem z Harmony 2.06 ale niestety on ma jakiś problem z działaniem. Sterownik napisany na jego podstawie inicjuje kartę prawidłowo ale tylko do momentu przełączenia jej na szynę 4-bit. Od tego momentu DMA przestaje zwracać dane z dalszego procesu inicjalizacji karty (timeoutuje). Jak się wyłączy przełączanie i zostawi kartę w trybie 1-bit to inicjacja przebiega do końca prawidłowo ale za to próba odczytu bloku 0 nie działa, tzn. DMA nie wypełnia wskazanego bufora zawartością sektora 0. Nie zwraca też żadnych błędów, wywoływane jest przerwanie DMA sygnalizujące koniec transferu (oczywiście kwestie d-cache i DMA są ogarnięte).
Cały proces inicjalizacji wygląda prawidłowo od strony kodu, jest z godny z tym co zaleca SD Association w swojej dokumentacji do SDHOST.
Przyjrzałem się też kodu z Harmony 3 ale (pomijając zaciemnianie tego kodu przez wstawki do konfiguratora) jest on podobny do tego z Harmony 2.x choć ma już rozszerzenia dla protokołu MMC a kod dot. SD jest analogiczny do tego z Harmony 2.x. Jaka może być przyczyna, że przełączanie karty w tryb 4-bit psuje DMA? Karta zwraca zgodność w trybie 4-bit. U-boot prawidłowo czyta tą kartę na tej konkretnej płytce uruchomieniowej , więc to nie problem sprzętowy... Kod U-Boota jest też analogiczny (co do sekwencji inicjalizacji) ale akurat na tej platformie nie korzysta z DMA tylko z pio.