199 lines
3.3 KiB
ArmAsm
199 lines
3.3 KiB
ArmAsm
|
|
.equ CSYNC, 0x9800000
|
|
.equ SDDIR, 0x8800000
|
|
.equ SDCON, 0x9800000
|
|
.equ SDODA, 0x9000000
|
|
|
|
.TEXT
|
|
.ALIGN
|
|
.CODE 32
|
|
|
|
clkout:
|
|
stmfd r13!,{r0-r1}
|
|
ldr r1,=SDDIR
|
|
mov r0,#0x4
|
|
strh r0,[r1]
|
|
mov r0,r0
|
|
mov r0,r0
|
|
mov r0,#0xc
|
|
strh r0,[r1]
|
|
ldmfd r13!,{r0-r1}
|
|
bx r14
|
|
|
|
clkin:
|
|
stmfd r13!,{r0-r1}
|
|
ldr r1,=SDDIR
|
|
mov r0,#0x0
|
|
strh r0,[r1]
|
|
mov r0,r0
|
|
mov r0,r0
|
|
mov r0,#0x8
|
|
strh r0,[r1]
|
|
ldmfd r13!,{r0-r1}
|
|
bx r14
|
|
|
|
wait_ready:
|
|
stmfd r13!,{r0-r2}
|
|
mov r2,#32
|
|
mov r1,#SDODA
|
|
sd_write_loop2:
|
|
mov r0,#0xff
|
|
strh r0,[r1]
|
|
bl clkout
|
|
subs r2, r2, #1
|
|
bne sd_write_loop2
|
|
|
|
sd_write_busy:
|
|
bl clkin
|
|
ldrh r0,[r1]
|
|
tst r0,#0x100
|
|
beq sd_write_busy
|
|
ldmfd r13!,{r0-r1}
|
|
bx r14
|
|
|
|
@------void SD_crc16(u16* buff,u16 num,u16* crc16buff)
|
|
.global SD_crc16
|
|
SD_crc16:
|
|
stmfd r13!,{r4-r9}
|
|
mov r9,r2
|
|
|
|
mov r3,#0
|
|
mov r4,#0
|
|
mov r5,#0
|
|
mov r6,#0
|
|
|
|
ldr r7,=0x80808080
|
|
ldr r8,=0x1021
|
|
mov r1,r1,lsl #3
|
|
sd_crc16_loop:
|
|
|
|
tst r7,#0x80
|
|
ldrneb r2,[r0],#1
|
|
|
|
mov r3,r3,lsl #1
|
|
tst r3,#0x10000
|
|
eorne r3,r3,r8
|
|
tst r2,r7,lsr #24
|
|
eorne r3,r3,r8
|
|
|
|
mov r4,r4,lsl #1
|
|
tst r4,#0x10000
|
|
eorne r4,r4,r8
|
|
tst r2,r7,lsr #25
|
|
eorne r4,r4,r8
|
|
|
|
mov r5,r5,lsl #1
|
|
tst r5,#0x10000
|
|
eorne r5,r5,r8
|
|
tst r2,r7,lsr #26
|
|
eorne r5,r5,r8
|
|
|
|
mov r6,r6,lsl #1
|
|
tst r6,#0x10000
|
|
eorne r6,r6,r8
|
|
tst r2,r7,lsr #27
|
|
eorne r6,r6,r8
|
|
|
|
mov r7,r7,ror #4
|
|
subs r1,r1,#4
|
|
bne sd_crc16_loop
|
|
|
|
mov r2,r9
|
|
mov r8,#16
|
|
sd_crc16_write_data:
|
|
mov r7,r7,lsl #4
|
|
tst r3,#0x8000
|
|
orrne r7,r7,#8
|
|
tst r4,#0x8000
|
|
orrne r7,r7,#4
|
|
tst r5,#0x8000
|
|
orrne r7,r7,#2
|
|
tst r6,#0x8000
|
|
orrne r7,r7,#1
|
|
|
|
mov r3,r3,lsl #1
|
|
mov r4,r4,lsl #1
|
|
mov r5,r5,lsl #1
|
|
mov r6,r6,lsl #1
|
|
|
|
sub r8,r8,#1
|
|
tst r8,#1
|
|
streqb r7,[r2],#1
|
|
cmp r8,#0
|
|
bne sd_crc16_write_data
|
|
|
|
ldmfd r13!,{r4-r9}
|
|
bx r14
|
|
@------end-----------------------------------
|
|
|
|
@-----------------viod SD_data_write(u16 *buff,u16* crc16buff)-------------------
|
|
.global SD_data_write
|
|
SD_data_write:
|
|
stmfd r13!,{r4-r5,r14}
|
|
mov r5,#512
|
|
mov r2,#SDODA
|
|
sd_data_write_busy:
|
|
bl clkin
|
|
ldrh r3,[r2]
|
|
tst r3,#0x100
|
|
beq sd_data_write_busy
|
|
|
|
mov r3,#0
|
|
strh r3,[r2]
|
|
bl clkout
|
|
|
|
sd_data_write_loop:
|
|
ldrh r4,[r0],#2
|
|
mov r3,r4,lsr#4
|
|
strh r3,[r2]
|
|
bl clkout
|
|
mov r3,r4
|
|
strh r3,[r2]
|
|
bl clkout
|
|
mov r3,r4,lsr#12
|
|
strh r3,[r2]
|
|
bl clkout
|
|
mov r3,r4,lsr#8
|
|
strh r3,[r2]
|
|
bl clkout
|
|
|
|
subs r5, r5, #2
|
|
bne sd_data_write_loop
|
|
|
|
cmp r1,#0
|
|
movne r0,r1
|
|
movne r1,#0
|
|
movne r5,#8
|
|
bne sd_data_write_loop
|
|
|
|
mov r5,#32
|
|
sd_data_write_loop2:
|
|
mov r3,#0xff
|
|
strh r3,[r2]
|
|
bl clkout
|
|
subs r5, r5, #1
|
|
bne sd_data_write_loop2
|
|
|
|
sd_data_write_busy2:
|
|
bl clkin
|
|
ldrh r3,[r2]
|
|
tst r3,#0x100
|
|
beq sd_data_write_busy2
|
|
|
|
ldmfd r13!,{r4-r5,r15}
|
|
|
|
DC_FlushRange:
|
|
add r1, r1, r0
|
|
bic r0, r0, #0x1F
|
|
DC_FlushRangeLoop:
|
|
mcr p15, 0, r0, c7, c14, 1
|
|
mcr p15, 0, r0, c7, c5, 1
|
|
add r0, r0, #0x20
|
|
cmp r0, r1
|
|
blt DC_FlushRangeLoop
|
|
|
|
mov r0,#0
|
|
mcr p15,0x0,r0,c7,c10,4
|
|
bx lr
|
|
@---------------------------------------
|
|
.end
|