add function for send command on card

add function for send command on card
This commit is contained in:
Doczom
2022-06-12 09:55:29 +05:00
committed by GitHub
parent 224766cfca
commit fc012149cc
2 changed files with 139 additions and 25 deletions

View File

@@ -1,28 +1,128 @@
;; Copyright (C) 2022, Michail Frolov(aka Doczom) ;; Copyright (C) 2022, Michail Frolov(aka Doczom)
;; SDHC commands ;; SDHC commands
; in: eax - reg map, esi - struct controller
; ebx - arg 32 bit <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ecx - write/read edx - command reg with flags
proc send_sdhc_command
@@:
test dword[eax + SDHC_PRSNT_STATE], 0x07 ; check cmd_inhid_cmd + cmd_inhibit_dat + DAT Line Active
jnz @b
mov dword[eax + SDHC_CMD_ARG], ebx
;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
shl ecx, 4
shl edx, 16
add edx, ecx
mov dword[esi + SDHCI_CONTROLLER.flag_command_copmlate], -1
DEBUGF 1,"SDHCI: Command send\n"
mov dword[eax + SDHC_CMD_TRN], edx ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@@:
;test dword[esi + SDHCI_CONTROLLER.flag_command_copmlate], -1
test dword[eax + SDHC_INT_STATUS], 0x01
jnz @b
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
;basic commands ;basic commands
;cmd0 - Resets all cards to idle state ;cmd0 - Resets all cards to idle state
proc GO_IDLE_SATTE proc GO_IDLE_SATTE
xor ebx, ebx
mov ecx, 0x00
mov edx, 0x00
call send_sdhc_command
ret
endp
;cmd2 - Asks any card to send the CID numbers on the CMD line
;resp = R2
proc ALL_SEND_CID
ret ret
endp endp
;cmd2 - ;cmd3 - Ask the card to publish a new relative address(RCA)
proc cmd2 ;resp = R6
proc SEND_RCA
ret ret
endp endp
proc cmd3 ;cmd4 - programs the DSR of all cards
proc SET_DSR
ret ret
endp endp
proc cmd4 proc cmd7
ret
endp
;cmd8 -
;resp = R7
proc SEND_IF_COUND
ret ret
endp endp
;acmd41 -
;resp = R3
proc SD_SEND_OP_COND
ret
endp
; block read/write
;cmd16 -
;arg = 0-31 - block Length
;resp = R1
proc SET_BLOCKLEN
ret
endp
; block read ; block read
;cmd17 -
;arg = 0-31 - data address
;resp = R1
proc READ_SIGLE_BLOCK
ret
endp
;cmd18 -
;arg = 0-31 - data address
;resp = R1
proc READ_MULTIPLE_BLOCK
ret
endp
; block write ; block write
;cmd24 -
;arg = 0-31 - data address
;resp = R1
proc WRITE_BLOCK
ret
endp
;cmd25 -
;arg = 0-31 - data address
;resp = R1
proc WRITE_MULTIPLE_BLOCK
ret
endp
;cmd27 - Programming of the programmable bits of the CSD
;resp = R1
proc PROGRAM_CSD
ret
endp
; SDIO mode
;cmd5 - <EFBFBD><EFBFBD><EFBFBD> ACMD41 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> SDIO
proc IO_SEND_OP_COND
ret
endp
;cmd52 -
proc IO_RW_DIRECT
ret
endp
;cmd53 -
proc IO_RW_EXTENDED
ret
endp

View File

@@ -560,6 +560,8 @@ include 'drivers/macros.inc'
include 'drivers/peimport.inc' include 'drivers/peimport.inc'
include 'drivers/fdo.inc' include 'drivers/fdo.inc'
include 'sdhc_cmd.inc'
; structures ; structures
struct SDHCI_CONTROLLER struct SDHCI_CONTROLLER
fd rd 1 ; next controller fd rd 1 ; next controller
@@ -620,7 +622,7 @@ list_controllers:
tmp_void: dd 0 tmp_void: dd 0
proc START c, state:dword, cmdline:dword proc START c, state:dword, cmdline:dword
cmp [state],1 cmp [state], DRV_ENTRY
jne .stop_drv jne .stop_drv
;detect controller ;detect controller
@@ -691,8 +693,8 @@ proc START c, state:dword, cmdline:dword
; free memory for DMA ; free memory for DMA
DEBUGF 1,"SDHCI: Stop working driver\n" DEBUGF 1, "SDHCI: Stop working driver\n"
mov eax, 0 xor eax, eax
ret ret
;DEBUGF 1,"Controller found: class:=%x bus:=%x devfn:=%x \n",[eax + PCIDEV.class],[bus],[dev] ;DEBUGF 1,"Controller found: class:=%x bus:=%x devfn:=%x \n",[eax + PCIDEV.class],[bus],[dev]
@@ -770,6 +772,7 @@ proc sdhci_init
test eax, eax test eax, eax
jz .fail jz .fail
DEBUGF 1,"SDHCI: base address = %x \n", eax
mov [esi + SDHCI_CONTROLLER.base_reg_map], eax mov [esi + SDHCI_CONTROLLER.base_reg_map], eax
mov cl, [eax + SPEC_VERSION] ; get specification version mov cl, [eax + SPEC_VERSION] ; get specification version
mov [esi + SDHCI_CONTROLLER.ver_spec], cl mov [esi + SDHCI_CONTROLLER.ver_spec], cl
@@ -904,7 +907,7 @@ endp
; eax - map reg ; eax - map reg
; ebx - divider Clock base ; ebx - divider Clock base
proc set_SD_clock proc set_SD_clock
and dword[eax + SDHC_CTRL2], 0xffffffff - 0x04 and dword[eax + SDHC_CTRL2], 0xffffffff - 0x04 ; stop clock
and dword[eax + SDHC_CTRL2], 0xffff004f ; clear and dword[eax + SDHC_CTRL2], 0xffff004f ; clear
@@ -933,7 +936,9 @@ endp
; out: ebx = type card 0 - unknow card 1 - sdio 2 - sd card(ver1 ver2 ver2-hsp ), 4 - spi(MMC, eMMC) ; out: ebx = type card 0 - unknow card 1 - sdio 2 - sd card(ver1 ver2 ver2-hsp ), 4 - spi(MMC, eMMC)
proc card_init proc card_init
DEBUGF 1,'SDHCI: Card init\n' DEBUGF 1,'SDHCI: Card init\n'
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<>01
or dword[eax + SDHC_INT_MASK], 0xFFFF0001
or dword[eax + SDHC_SOG_MASK], 0xFFFF0001
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (3.3<EFBFBD> - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (3.3<EFBFBD> - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
; <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov ebx, [esi + SDHCI_CONTROLLER.Capabilities] mov ebx, [esi + SDHCI_CONTROLLER.Capabilities]
@@ -952,24 +957,31 @@ proc card_init
mov ebx, [esi + SDHCI_CONTROLLER.divider400KHz] mov ebx, [esi + SDHCI_CONTROLLER.divider400KHz]
call set_SD_clock call set_SD_clock
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SDHC_CTRL1 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SDHC_CTRL1
and dword[eax + SDHC_CTRL1], 11000b + 0x0f00 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dma <20><><EFBFBD><EFBFBD><EFBFBD> b power control and dword[eax + SDHC_CTRL1], 11000b + 0x0f00 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dma <20><><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> power control
; cmd0 - reset card
;; !!! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> !!!
; cmd0 - reset card
call GO_IDLE_SATTE
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(sd bus, spi) - <20><> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(sd bus, spi) - <20><> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
; cmd8 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; cmd8 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
call SEND_IF_COUND
; cmd5 voltage window = 0 - check sdio ; cmd5 voltage window = 0 - check sdio
call IO_SEND_OP_COND
; if SDIO initialization (cmd5)set voltage window ; if SDIO initialization (cmd5)set voltage window
; acmd41 voltage window = 0 ; acmd41 voltage window = 0
call SD_SEND_OP_COND
;if card supported 2 spec, acmd41 + set hsp=1 ;if card supported 2 spec, acmd41 + set hsp=1
; cmd55 acmd41 - <20><> <20><><EFBFBD><EFBFBD><EFBFBD> ; cmd55 acmd41 - <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
; for no sdio card : cmd2 - get_CID ; for no sdio card : cmd2 - get_CID
call ALL_SEND_CID
; for all init card : cmd3 - get RCA ; for all init card : cmd3 - get RCA
call SEND_RCA
ret ret
.spi: .spi:
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@@ -978,19 +990,20 @@ endp
proc thread_card_detect proc thread_card_detect
;get event with data ;get event with data
invoke Kmalloc, 6*4 invoke Kmalloc, 6*4 ; 6*Dword
test eax, eax test eax, eax
jz .no_malloc jz .no_malloc
mov edi, eax mov edi, eax
push edi push edi
invoke GetEvent invoke GetEvent
pop edi pop edi
DEBUGF 1,'SDHCI: Get event code=%x [edi + 4]=%x, [edi + 8]=%x\n', [edi], [edi + 4], [edi + 8] ;DEBUGF 1,'SDHCI: Get event code=%x [edi + 4]=%x, [edi + 8]=%x\n', [edi], [edi + 4], [edi + 8]
mov ecx,[edi + 4] ; reg map push dword[edi + 4] ; reg map
mov esi,[edi + 8] ;controller struct push dword[edi + 8] ;controller struct
mov eax, edi mov eax, edi
invoke Kfree invoke Kfree
mov eax, ecx pop esi
pop eax
call card_detect call card_detect
.no_malloc: .no_malloc:
; destryct thread ; destryct thread
@@ -999,6 +1012,7 @@ proc thread_card_detect
endp endp
proc card_detect proc card_detect
DEBUGF 1,'SDHCI: eax=%x esi=%x\n', eax, esi
DEBUGF 1,'SDHCI: Card inserted\n' DEBUGF 1,'SDHCI: Card inserted\n'
call card_init call card_init
mov [esi + SDHCI_CONTROLLER.type_card], ebx mov [esi + SDHCI_CONTROLLER.type_card], ebx
@@ -1036,7 +1050,6 @@ endp
proc sdhc_irq proc sdhc_irq
pusha pusha
DEBUGF 1,"SDHCI: call sdhc_irq, esp=%x \n", esp
mov esi, [esp + 4 + 32] ;stdcall mov esi, [esp + 4 + 32] ;stdcall
DEBUGF 1,"SDHCI: get_irq \n" DEBUGF 1,"SDHCI: get_irq \n"
mov eax,[esi + SDHCI_CONTROLLER.base_reg_map] mov eax,[esi + SDHCI_CONTROLLER.base_reg_map]
@@ -1063,11 +1076,11 @@ proc sdhc_irq
mov [.event_struct + 4], ebx ; reg map mov [.event_struct + 4], ebx ; reg map
mov [.event_struct + 8], ecx ; sdhci_controller struct mov [.event_struct + 8], ecx ; sdhci_controller struct
mov esi, .event_struct mov esi, .event_struct
DEBUGF 1,"SDHCI: send event tid=%x code[1]=%x code[2]=%x \n", eax, [.event_struct + 4], [.event_struct + 8] ;DEBUGF 1,"SDHCI: send event tid=%x code[1]=%x code[2]=%x \n", eax, [.event_struct + 4], [.event_struct + 8]
push ecx push ecx
push ebx push ebx
invoke SendEvent invoke SendEvent
DEBUGF 1,"SDHCI: Evend sended, eax=%x uid=%x \n", eax, ebx ;DEBUGF 1,"SDHCI: Evend sended, eax=%x uid=%x \n", eax, ebx
pop eax pop eax
pop esi pop esi
.no_card_inserted: .no_card_inserted:
@@ -1095,7 +1108,7 @@ proc sdhc_irq
test dword[eax + SDHC_INT_STATUS], 0x8000 ; 15 bit test dword[eax + SDHC_INT_STATUS], 0x8000 ; 15 bit
jnz .get_error jnz .get_error
DEBUGF 1,"SDHCI: ret sdhc_irq, esp=%x \n", esp ;DEBUGF 1,"SDHCI: ret sdhc_irq, esp=%x \n", esp
popa popa
ret ret
.get_error: .get_error:
@@ -1130,6 +1143,7 @@ endp
drv_name: db 'SDHCI',0 drv_name: db 'SDHCI',0
sdcard_disk_name: db 'sdcard00',0 sdcard_disk_name: db 'sdcard00',0
mmccard_disk_name: db 'MMCcard00',0
;base_reg_map: dd 0;pointer on base registers comntroller ;base_reg_map: dd 0;pointer on base registers comntroller