📄 mci_sd.lst
字号:
67 AT91C_MCI_ENDRX) ;
\ 0000003A 4021 MOV R1,#+0x40
\ 0000003C 201C MOV R0,R4
\ 0000003E ........ _BLF AT91F_MCI_EnableIt,AT91F_MCI_EnableIt??rT
68 //AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_MCI) ;
69 //set pdc value ,
70 //AT91F_PDC_EnableTx(AT91C_BASE_PDC_MCI) ;
71 //AT91F_PDC_EnableRx(AT91C_BASE_PDC_MCI) ;
72 //AT91F_PDC_Open(AT91C_BASE_PDC_MCI) ;
73 //AT91C_BASE_MCI->MCI_RPR=*getresData ;
74 AT91F_MCI_Enable(AT91C_BASE_MCI) ;
\ 00000042 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 00000044 ........ _BLF AT91F_MCI_Enable,AT91F_MCI_Enable??rT
75 }
\ 00000048 10BC POP {R4}
\ 0000004A 01BC POP {R0}
\ 0000004C 0047 BX R0 ;; return
\ 0000004E C046 NOP
\ ??MCI_Init_0:
\ 00000050 03800004 DC32 0x4008003
\ 00000054 ........ DC32 MCI_Int_Handler
\ 00000058 00F0FFFF DC32 0xfffff000
76 //******************************************************************************************
\ In segment CODE, align 4, keep-with-next
77 void Read_CMD_Respond(unsigned int respond_Type) //得到命令响应
78 {
\ Read_CMD_Respond:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 041C MOV R4,R0
79 CMD_Responed_Type *Buffer ;
80 Buffer=&Get_Respond_Buffer ;
\ 00000004 1C48 LDR R0,??Read_CMD_Respond_0 ;; Get_Respond_Buffer
\ 00000006 051C MOV R5,R0
81 while((AT91C_BASE_MCI->MCI_SR & AT91C_MCI_CMDRDY)==0) ;
\ ??Read_CMD_Respond_1:
\ 00000008 .... LDR R0,??DataTable17 ;; 0xfffac040
\ 0000000A 0068 LDR R0,[R0, #+0]
\ 0000000C C007 LSL R0,R0,#+0x1F
\ 0000000E FBD5 BPL ??Read_CMD_Respond_1
82 if(respond_Type==No_Respond)
\ 00000010 002C CMP R4,#+0
\ 00000012 05D1 BNE ??Read_CMD_Respond_2
83 {
84 Get_Respond_Buffer.data[63]=0 ; //串职空
\ 00000014 1948 LDR R0,??Read_CMD_Respond_0+0x4 ;; Get_Respond_Buffer + 63
\ 00000016 0021 MOV R1,#+0
\ 00000018 0170 STRB R1,[R0, #+0]
85 Buffer=0 ;
\ 0000001A 0020 MOV R0,#+0
\ 0000001C 051C MOV R5,R0
\ 0000001E 28E0 B ??Read_CMD_Respond_3
86 }
87 else if(respond_Type==Respond_Len_48)
\ ??Read_CMD_Respond_2:
\ 00000020 012C CMP R4,#+0x1
\ 00000022 0ED1 BNE ??Read_CMD_Respond_4
88 {
89 Buffer=0 ;
\ 00000024 0020 MOV R0,#+0
\ 00000026 051C MOV R5,R0
90 Buffer+=AT91F_MCI_GetRSP0Reg(AT91C_BASE_MCI) ;
\ 00000028 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 0000002A ........ _BLF AT91F_MCI_GetRSP0Reg,AT91F_MCI_GetRSP0Reg??rT
\ 0000002E 4021 MOV R1,#+0x40
\ 00000030 4843 MUL R0,R1
\ 00000032 2D18 ADD R5,R5,R0
91 Buffer+=AT91F_MCI_GetRSP1Reg(AT91C_BASE_MCI) ;
\ 00000034 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 00000036 ........ _BLF AT91F_MCI_GetRSP1Reg,AT91F_MCI_GetRSP1Reg??rT
\ 0000003A 4021 MOV R1,#+0x40
\ 0000003C 4843 MUL R0,R1
\ 0000003E 2D18 ADD R5,R5,R0
\ 00000040 17E0 B ??Read_CMD_Respond_3
92 }
93 else if(respond_Type==Respond_Len_136)
\ ??Read_CMD_Respond_4:
\ 00000042 022C CMP R4,#+0x2
\ 00000044 15D1 BNE ??Read_CMD_Respond_3
94 {
95 Buffer=0 ;
\ 00000046 0020 MOV R0,#+0
\ 00000048 051C MOV R5,R0
96 Buffer+=AT91C_BASE_MCI->MCI_RSPR[0] ;
\ 0000004A .... LDR R0,??DataTable34 ;; 0xfffac020
\ 0000004C 0068 LDR R0,[R0, #+0]
\ 0000004E 4021 MOV R1,#+0x40
\ 00000050 4843 MUL R0,R1
\ 00000052 2D18 ADD R5,R5,R0
97 Buffer+=AT91C_BASE_MCI->MCI_RSPR[1] ;
\ 00000054 .... LDR R0,??DataTable40 ;; 0xfffac024
\ 00000056 0068 LDR R0,[R0, #+0]
\ 00000058 4021 MOV R1,#+0x40
\ 0000005A 4843 MUL R0,R1
\ 0000005C 2D18 ADD R5,R5,R0
98 Buffer+=AT91C_BASE_MCI->MCI_RSPR[2] ;
\ 0000005E .... LDR R0,??DataTable46 ;; 0xfffac028
\ 00000060 0068 LDR R0,[R0, #+0]
\ 00000062 4021 MOV R1,#+0x40
\ 00000064 4843 MUL R0,R1
\ 00000066 2D18 ADD R5,R5,R0
99 Buffer+=AT91C_BASE_MCI->MCI_RSPR[3] ;
\ 00000068 .... LDR R0,??DataTable52 ;; 0xfffac02c
\ 0000006A 0068 LDR R0,[R0, #+0]
\ 0000006C 4021 MOV R1,#+0x40
\ 0000006E 4843 MUL R0,R1
\ 00000070 2D18 ADD R5,R5,R0
100 //数据长度136bit 大于 4个响应寄存器的值,how can i do ? 不过在128位的时候就可以把CSD读全
101 //Buffer+=AT91C_BASE_MCI->MCI_RSPR[4] ;
102 }
103 }
\ ??Read_CMD_Respond_3:
\ 00000072 30BC POP {R4,R5}
\ 00000074 01BC POP {R0}
\ 00000076 0047 BX R0 ;; return
\ ??Read_CMD_Respond_0:
\ 00000078 ........ DC32 Get_Respond_Buffer
\ 0000007C ........ DC32 Get_Respond_Buffer + 63
104 /*************************** MCI 接口和SD卡的 命令通讯,参数意义如下: ******************************/
105 // CommandNum :命令序号,祥件SD卡协议 ; CMDParameter :命令所需携带的参数,每个命令不定
106 // Responed_Type :响应类型,0:无响应 1:48 bit响应 ,2:136 bit .具体信息见SD协议
107 // TRDIR :数据发送还是接受 0:写 , 1:读 //和下一个参数一样,只在传输命令中有效
108 // TRTYP :数据读写模式 0:单块 , 1:多块 ,2:流 ,3: 保留
109 /*********************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
110 int MCI_SendCommand( unsigned int CommandNum, //命令序号
111 unsigned long int CMDParameter ,unsigned int Responed_Type //发送的数据 ,响应
112 ,unsigned int SpecCMD) //是否特殊命令
113 {
\ MCI_SendCommand:
\ 00000000 FAB5 PUSH {R1,R3-R7,LR}
\ 00000002 81B0 SUB SP,#+0x4
\ 00000004 041C MOV R4,R0
\ 00000006 151C MOV R5,R2
114 unsigned int GetState ;
115 unsigned long int CMDR_param=0x0;
\ 00000008 0020 MOV R0,#+0
\ 0000000A 061C MOV R6,R0
116 unsigned int Try_time=0 ;
\ 0000000C 0020 MOV R0,#+0
\ 0000000E 071C MOV R7,R0
117 /**当MCI_SR 中CMDRDY 为0 且无中断命令发送( 位SPCMD) 时,该寄存器写保护,即当前执行命令不能被中断或修改。**/
118 //while((AT91C_BASE_MCI->MCI_SR & AT91C_MCI_CMDRDY)==0); //等待CMDRDY
119 AT91C_BASE_MCI->MCI_ARGR =CMDParameter ;
\ 00000010 5B48 LDR R0,??MCI_SendCommand_0 ;; 0xfffac010
\ 00000012 0199 LDR R1,[SP, #+0x4]
\ 00000014 0160 STR R1,[R0, #+0]
120 CMDR_param= (CommandNum<<0) ;
\ 00000016 261C MOV R6,R4
121 if(SpecCMD==1)
\ 00000018 0298 LDR R0,[SP, #+0x8]
\ 0000001A 0128 CMP R0,#+0x1
\ 0000001C 0BD1 BNE ??MCI_SendCommand_1
122 {
123 if(CommandNum==41)
\ 0000001E 292C CMP R4,#+0x29
\ 00000020 04D1 BNE ??MCI_SendCommand_2
124 CMDR_param |=AT91C_MCI_SPCMD_INIT ;
\ 00000022 301C MOV R0,R6
\ 00000024 8026 MOV R6,#+0x80
\ 00000026 7600 LSL R6,R6,#+0x1 ;; #+0x100
\ 00000028 0643 ORR R6,R0
\ 0000002A 04E0 B ??MCI_SendCommand_3
125
126 else
127 CMDR_param |=AT91C_MCI_SPCMD_SYNC ; //??????
\ ??MCI_SendCommand_2:
\ 0000002C 301C MOV R0,R6
\ 0000002E 8026 MOV R6,#+0x80
\ 00000030 B600 LSL R6,R6,#+0x2 ;; #+0x200
\ 00000032 0643 ORR R6,R0
\ 00000034 FFE7 B ??MCI_SendCommand_3
128 }
129 else
130 {
131 //if(CommandNum==0)
132 // CMDR_param |=AT91C_MCI_SPCMD_INIT ;
133 // else
134 CMDR_param |=(0xFFFFFFFF & AT91C_MCI_TRCMD_NO ) ; //不破坏数据
135 }
136 //AT91F_MCI_CfgCMDReg() ;
137 //CMDR_param |= AT91C_MCI_OPDCMD ;//推拉输出。。。。
138 if(Responed_Type !=No_Respond)
\ ??MCI_SendCommand_1:
\ ??MCI_SendCommand_3:
\ 00000036 002D CMP R5,#+0
\ 00000038 02D0 BEQ ??MCI_SendCommand_4
139 CMDR_param |= (Responed_Type<<6) ; // MCI_CMDR不可读
\ 0000003A 301C MOV R0,R6
\ 0000003C AE01 LSL R6,R5,#+0x6
\ 0000003E 0643 ORR R6,R0
140 CMDR_param |= AT91C_MCI_TRCMD_START ;
\ ??MCI_SendCommand_4:
\ 00000040 301C MOV R0,R6
\ 00000042 8026 MOV R6,#+0x80
\ 00000044 7602 LSL R6,R6,#+0x9 ;; #+0x10000
\ 00000046 0643 ORR R6,R0
141 //while((AT91C_BASE_MCI->MCI_SR & AT91C_MCI_CMDRDY)==0) ; //等待发送数据
142
143 while((AT91C_BASE_MCI->MCI_SR & AT91C_MCI_CMDRDY)==0)
\ ??MCI_SendCommand_5:
\ 00000048 .... LDR R0,??DataTable17 ;; 0xfffac040
\ 0000004A 0068 LDR R0,[R0, #+0]
\ 0000004C C007 LSL R0,R0,#+0x1F
\ 0000004E 04D4 BMI ??MCI_SendCommand_6
144 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -