diff --git a/sdhc_cmd.inc b/sdhc_cmd.inc index 3874215..684eaed 100644 --- a/sdhc_cmd.inc +++ b/sdhc_cmd.inc @@ -18,9 +18,9 @@ proc send_sdhc_command @@: ;test dword[esi + SDHCI_CONTROLLER.flag_command_copmlate], -1 test dword[eax + SDHC_INT_STATUS], 0x01 - jnz @b + jz @b + DEBUGF 1,"SDHCI: Command is out INT_STAT=%x\n", [eax + SDHC_INT_STATUS] or dword[eax + SDHC_INT_STATUS], 0x01 - DEBUGF 1,"SDHCI: Command is out\n" DEBUGF 1,"SDHCI: resp1=%x resp2=%x \n", [eax + SDHC_RESP1_0], [eax + SDHC_RESP3_2] ret endp @@ -30,8 +30,8 @@ endp ;cmd0 - Resets all cards to idle state proc GO_IDLE_SATTE xor ebx, ebx - mov ecx, 0x00 - mov edx, 0x00 + mov ecx, 0x02 ; read mull + mov edx, 0x0220 call send_sdhc_command ret endp diff --git a/sdhci.asm b/sdhci.asm index 7c4db8d..1b1aa8e 100644 --- a/sdhci.asm +++ b/sdhci.asm @@ -939,6 +939,7 @@ proc card_init ;включаем прерывания 0х01 or dword[eax + SDHC_INT_MASK], 0xFFFF0001 or dword[eax + SDHC_SOG_MASK], 0xFFFF0001 + DEBUGF 1,'SDHCI: INT_MASK = %x\n',[eax + SDHC_INT_MASK] ; Включить питание (3.3В - не всегда) максимально возможное для хоста ; дай бог чтоб не сгорело ничего mov ebx, [esi + SDHCI_CONTROLLER.Capabilities] @@ -955,6 +956,7 @@ proc card_init ; включить генератор частот контроллера и установим базовые значения регистров ; генератор на 400 КГц mov ebx, [esi + SDHCI_CONTROLLER.divider400KHz] + mov ebx, [esi + SDHCI_CONTROLLER.divider25MHz] call set_SD_clock ; очищает SDHC_CTRL1 and dword[eax + SDHC_CTRL1], 11000b + 0x0f00 ;оставляем только dma режим и power control @@ -1031,6 +1033,9 @@ proc card_detect DEBUGF 1,'SDHCI: Card init - SDIO card\n' ret .unknowe: + and dword[eax + SDHC_CTRL1], not 0x0100 ; stop power + and dword[eax + SDHC_CTRL2], not 0x04 ; stop SD clock + DEBUGF 1,'SDHCI: Card not init\n' ret endp diff --git a/sdhci.sys b/sdhci.sys new file mode 100644 index 0000000..4d30450 Binary files /dev/null and b/sdhci.sys differ