.TEXT @--------------------------------sd data-------------------------------- .equ sd_comadd,0x9800000 .equ sd_dataadd,0x9000000 .equ sd_dataradd,0x9100000 @-----------------viod sd_data_write_s(u16 *buff,u16* crc16buff)------------------- .ALIGN .GLOBAL sd_data_write_s .CODE 32 sd_data_write_s: stmfd r13!,{r4-r5} mov r5,#512 mov r2,#sd_dataadd sd_data_write_busy: ldrh r3,[r2] tst r3,#0x100 beq sd_data_write_busy ldrh r3,[r2] mov r3,#0 @star bit strh r3,[r2] sd_data_write_loop: ldrh r3,[r0],#2 add r3,r3,r3,lsl #20 mov r4,r3,lsl #8 stmia r2,{r3-r4} 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 r3,#0xff @end bit strh r3,[r2] sd_data_write_loop2: ldrh r3,[r2] tst r3,#0x100 bne sd_data_write_loop2 ldmia r2,{r3-r4} ldmfd r13!,{r4-r5} bx r14 @-----------------end sd_data_write_s------------------- @----------void sd_data_read_s(u16 *buff)------------- .ALIGN .GLOBAL sd_data_read_s .CODE 32 sd_data_read_s: stmfd r13!,{r4} mov r1,#sd_dataradd sd_data_read_loop1: ldrh r3,[r1] @star bit tst r3,#0x100 bne sd_data_read_loop1 mov r2,#512 sd_data_read_loop: ldmia r1,{r3-r4} mov r3,r4,lsr #16 strh r3 ,[r0],#2 ldmia r1,{r3-r4} mov r3,r4,lsr #16 strh r3 ,[r0],#2 ldmia r1,{r3-r4} mov r3,r4,lsr #16 strh r3 ,[r0],#2 ldmia r1,{r3-r4} mov r3,r4,lsr #16 strh r3 ,[r0],#2 ldmia r1,{r3-r4} mov r3,r4,lsr #16 strh r3 ,[r0],#2 ldmia r1,{r3-r4} mov r3,r4,lsr #16 strh r3 ,[r0],#2 ldmia r1,{r3-r4} mov r3,r4,lsr #16 strh r3 ,[r0],#2 ldmia r1,{r3-r4} mov r3,r4,lsr #16 strh r3 ,[r0],#2 subs r2, r2, #16 bne sd_data_read_loop ldmia r1,{r3-r4} @crc 16 ldmia r1,{r3-r4} ldmia r1,{r3-r4} ldmia r1,{r3-r4} ldrh r3,[r1] @end bit ldmfd r13!,{r4} bx r14 @----------end sd_data_read_s------------- @------void sd_com_crc16_s(u16* buff,u16 num,u16* crc16buff) .ALIGN .GLOBAL sd_crc16_s .CODE 32 sd_crc16_s: 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 sd_com_crc16_s----------------------------------- @--------------u8 sd_crc7_s(u16* buff,u16 num)---------------------------- .ALIGN .GLOBAL sd_crc7_s .CODE 32 sd_crc7_s: stmfd r13!,{r4} mov r3,#0 ldr r4,=0x80808080 mov r1,r1,lsl #3 @ *8 sd_crc7_loop: tst r4,#0x80 ldrneb r2,[r0],#1 mov r3,r3,lsl #1 tst r3,#0x80 eorne r3,r3,#0x9 tst r2,r4,lsr #24 eorne r3,r3,#0x9 mov r4,r4,ror #1 subs r1,r1,#1 bne sd_crc7_loop mov r3,r3,lsl #1 add r0,r3,#1 ldmfd r13!,{r4} bx r14 @--------------end sd_crc7_s---------------------------- @--------------sd_com_read_s(u16* buff,u32 num)------------------ .ALIGN .GLOBAL sd_com_read_s .CODE 32 sd_com_read_s: stmfd r13!,{r4-r6} mov r2,#sd_comadd sd_com_read_loop1: ldrh r3,[r2] @star bit tst r3,#1 bne sd_com_read_loop1 sd_com_read_loop: ldmia r2,{r3-r6} subs r1, r1, #1 bne sd_com_read_loop ldmfd r13!,{r4-r6} bx r14 @--------------end sd_com_read_s------------------ @-------------------void sd_com_write_s(u16* buff,u32 num)----------------- .ALIGN .GLOBAL sd_com_write_s .CODE 32 sd_com_write_s: stmfd r13!,{r4-r6} mov r2,#sd_comadd sd_com_write_busy: ldrh r3,[r2] tst r3,#0x1 beq sd_com_write_busy ldrh r3,[r2] sd_com_write_loop: ldrb r3,[r0],#1 add r3,r3,r3,lsl #17 mov r4,r3,lsl #2 mov r5,r4,lsl #2 mov r6,r5,lsl #2 stmia r2,{r3-r6} subs r1, r1, #1 bne sd_com_write_loop ldmfd r13!,{r4-r6} bx r14 @-------------------end sd_com_write_s----------------- @-----------------void send_clk(u32 num)--------- .ALIGN .GLOBAL send_clk .CODE 32 send_clk: mov r1,#sd_comadd send_clk_loop1: ldrh r3,[r1] subs r0,r0,#1 bne send_clk_loop1 bx r14 @-----------------end send_clk--------- @---------------------------void SDCommand(u8 command,u8 num,u32 sector)-------------------- .ALIGN .GLOBAL SDCommand .CODE 32 @void SDCommand(u8 command,u8 num,u32 sector ) @{ @ u8 databuff[6]; @ register u8 *char1; @ register u8 *char2; @ @ char1=(u8*)(((u32)§or)+3); @ char2=(u8*)databuff; @ *char2++=coma+0x40; @ *char2++=*char1--; @ *char2++=*char1--; @ *char2++=*char1--; @ *char2++=*char1; @ *char2=sd_crc7_s((u32)databuff,5); @ @ sd_com_write_s((u32)databuff,6); @ @} SDCommand: stmfd r13!,{r14} sub r13,r13,#16 add r0,r0,#0x40 strb r0,[r13,#4] mov r1,r2,lsr #24 strb r1,[r13,#5] mov r1,r2,lsr #16 strb r1,[r13,#6] mov r1,r2,lsr #8 strb r1,[r13,#7] strb r2,[r13,#8] add r0,r13,#4 mov r1,#5 bl sd_crc7_s strb r0,[r13,#9] add r0,r13,#4 mov r1,#6 bl sd_com_write_s add r13,r13,#16 ldmfd r13!,{r15} @ bx r14 @---------------------------end SDCommand-------------------- @----------void ReadSector(u16 *buff,u32 sector,u8 readnum)------------- .ALIGN .GLOBAL ReadSector @ r0:Srcp r1:num ok .CODE 32 @void ReadSector(u16 *buff,u32 sector,u8 readnum) @{ @ register u16 i,j; @ i=readnum; @ sectno<<=9; @ SDCommand(18,0,sector); @ for (j=0;j