
	.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
