mirror of
https://github.com/Doczom/SDHCI_driver_for_Kolibrios.git
synced 2025-09-21 02:50:10 +02:00
add set power voltage in function card_init
add set power voltage in function card_init and other update code
This commit is contained in:
86
sdhci.asm
86
sdhci.asm
@@ -584,7 +584,7 @@ struct SDHCI_CONTROLLER
|
||||
divider50MHz rd 1
|
||||
timeout_reg rd 1 ; offset 0x2e in reg map
|
||||
|
||||
type_card rd 1 ; 0 - no card 1 - standart flash card 2 - MMC(eMMC) 3+ - other
|
||||
type_card rd 1 ; 0 - no card 1 - SDIO 2 - MMC(eMMC) 4 - standart flash card 5+ - other
|
||||
card_mode rd 1 ; 1 - spi 2 - sd bus 3+ - other
|
||||
dma_mode rd 1 ; 0-no dma 1-sdma 2-adma1 3 adma2
|
||||
|
||||
@@ -810,19 +810,21 @@ proc sdhci_init
|
||||
dec ecx
|
||||
@@:
|
||||
mov [esi + SDHCI_CONTROLLER.dma_mode], ecx
|
||||
DEBUGF 1,"SDHCI: DMA mode: %x \n", [esi + SDHCI_CONTROLLER.dma_mode]
|
||||
test ecx, ecx
|
||||
jz @f
|
||||
dec ecx
|
||||
@@:
|
||||
shl ecx, 3
|
||||
;and ecx, not 0x111 ;<3B><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> shl ecx,3 <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>
|
||||
or dword[eax + SDHC_CTRL1], ecx
|
||||
DEBUGF 1,"SDHCI: DMA mode: %x \n", [esi + SDHCI_CONTROLLER.dma_mode]
|
||||
; <20><><EFBFBD><EFBFBD> 0x28 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
push eax
|
||||
mov eax, [esi + SDHCI_CONTROLLER.Capabilities]
|
||||
shr eax, 8
|
||||
and eax, 111111b ; 11 1111
|
||||
and eax, 11111111b ; 1111 1111
|
||||
mov ebx, 25
|
||||
xor edx, edx
|
||||
div ebx ; 25 <20><><EFBFBD>
|
||||
@@ -857,8 +859,8 @@ proc sdhci_init
|
||||
pop eax
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMA
|
||||
;mov eax, [esi + SDHCI_CONTROLLER.base_reg_map]
|
||||
or dword[eax + SDHC_INT_MASK], -1
|
||||
or word[eax + SDHC_SOG_MASK], -1
|
||||
or dword[eax + SDHC_INT_MASK], 0x40 or 0x80
|
||||
or word[eax + SDHC_SOG_MASK], 0x40 or 0x80
|
||||
DEBUGF 1,'SDHCI: Set maximum int mask and mask signal\n'
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> Host Control Register
|
||||
; <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -867,8 +869,11 @@ proc sdhci_init
|
||||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> host control 2
|
||||
;set 0x2e
|
||||
|
||||
;test
|
||||
mov dword[eax + SDHC_INT_STATUS], 0x00
|
||||
|
||||
; set Wekeup_control
|
||||
;or byte[Wekeup_control], 111b
|
||||
or byte[Wekeup_control], 111b
|
||||
; save and attach IRQ
|
||||
invoke PciRead8, dword [esi + SDHCI_CONTROLLER.bus], dword [esi + SDHCI_CONTROLLER.dev], PCI_IRQ_LINE ;al=irq
|
||||
;DEBUGF 1,'Attaching to IRQ %x\n',al
|
||||
@@ -879,9 +884,10 @@ proc sdhci_init
|
||||
invoke AttachIntHandler, eax, sdhc_irq, esi ;esi = pointre to controller
|
||||
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
mov eax, [esi + SDHCI_CONTROLLER.base_reg_map]
|
||||
test dword[eax + SDHC_PRSNT_STATE], 0x10000 ; check 16 bit in SDHC_PRSNT_STATE.CARD_INS
|
||||
jz @f
|
||||
call card_init ; eax - REGISTER MAP esi - SDHCI_CONTROLLER
|
||||
call card_detect ; eax - REGISTER MAP esi - SDHCI_CONTROLLER
|
||||
@@:
|
||||
|
||||
xor eax, eax
|
||||
@@ -893,11 +899,20 @@ proc sdhci_init
|
||||
endp
|
||||
|
||||
proc card_init
|
||||
DEBUGF 1,'SDHCI: Card inserted\n'
|
||||
DEBUGF 1,'SDHCI: Card init\n'
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (3.3<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>
|
||||
mov ebx, [esi + SDHCI_CONTROLLER.Capabilities]
|
||||
shr ebx, 24
|
||||
and ebx, 111b ;26bit - 1.8 25bit - 3.0 24bit - 3.3
|
||||
bsf ecx, ebx
|
||||
mov edx, 111b
|
||||
sub edx, ecx
|
||||
shr edx, 1
|
||||
or edx, 0x01 ; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
or dword[eax + SDHC_CTRL1], edx
|
||||
; cmd0 - reset card
|
||||
|
||||
;<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>
|
||||
@@ -905,18 +920,33 @@ proc card_init
|
||||
; 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>
|
||||
|
||||
; cmd55 acmd41 - <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
.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>
|
||||
ret
|
||||
endp
|
||||
proc card_detect
|
||||
DEBUGF 1,'SDHCI: Card inserted\n'
|
||||
call card_init
|
||||
|
||||
; <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
; <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(SD memory, eMMC, SPI), <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, else set flag SDIO device
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
.memory_card:
|
||||
call add_card_disk
|
||||
|
||||
ret
|
||||
.SDIO:
|
||||
mov [esi + SDHCI_CONTROLLER.type_card], 1 ; sdio card
|
||||
ret
|
||||
endp
|
||||
|
||||
proc card_destryct
|
||||
DEBUGF 1,'SDHCI: Card removed\n'
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
test ebx, 110b
|
||||
jz .no_memory_card
|
||||
|
||||
call del_card_disk
|
||||
.no_memory_card:
|
||||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
ret
|
||||
@@ -933,7 +963,7 @@ proc sdhc_irq
|
||||
jz .no_card_inserted
|
||||
|
||||
or dword[eax + SDHC_INT_STATUS], 0x40
|
||||
call card_init
|
||||
call card_detect
|
||||
.no_card_inserted:
|
||||
test dword[eax + SDHC_INT_STATUS], 0x80
|
||||
jz .no_card_removed
|
||||
@@ -941,16 +971,42 @@ proc sdhc_irq
|
||||
or dword[eax + SDHC_INT_STATUS], 0x80
|
||||
call card_destryct
|
||||
.no_card_removed:
|
||||
test dword[eax + SDHC_INT_STATUS], 0x01 ; check zero bit - Command Complete
|
||||
jz .no_command_complate
|
||||
|
||||
or dword[eax + SDHC_INT_STATUS], 0x01
|
||||
DEBUGF 1,"Get command complete, CLR flag stop running \n"
|
||||
;and [esi + ], 0x00
|
||||
.no_command_complate:
|
||||
test dword[eax + SDHC_INT_STATUS], 0x02
|
||||
jz .no_transfer_commplate
|
||||
|
||||
or dword[eax + SDHC_INT_STATUS], 0x02
|
||||
DEBUGF 1,"Get transfer complete, CLR flag stop running \n"
|
||||
;and [esi + ], 0x00
|
||||
.no_transfer_commplate:
|
||||
|
||||
test dword[eax + SDHC_INT_STATUS], 0x8000 ; 15 bit
|
||||
jnz .get_error
|
||||
|
||||
sti
|
||||
ret
|
||||
.get_error:
|
||||
DEBUGF 1,"SDHCI: get error irq, \n"
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
proc add_card_disk
|
||||
|
||||
ret
|
||||
endp
|
||||
proc del_card_disk
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
|
||||
; This function for working drivers and programs worked
|
||||
; with SDIO interface.
|
||||
proc service_proc stdcall, ioctl:dword
|
||||
|
Reference in New Issue
Block a user