📄 mci_sd.lst
字号:
68 //set pdc value ,
69 //AT91F_PDC_EnableTx(AT91C_BASE_PDC_MCI) ;
70 //AT91F_PDC_EnableRx(AT91C_BASE_PDC_MCI) ;
71 //AT91F_PDC_Open(AT91C_BASE_PDC_MCI) ;
72 //AT91C_BASE_MCI->MCI_RPR=*getresData ;
73 AT91F_MCI_Enable(AT91C_BASE_MCI) ;
\ 00000042 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 00000044 ........ _BLF AT91F_MCI_Enable,AT91F_MCI_Enable??rT
74 }
\ 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
75 //******************************************************************************************
\ In segment CODE, align 4, keep-with-next
76 void Read_CMD_Respond(unsigned int respond_Type) //得到命令响应
77 {
\ Read_CMD_Respond:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 041C MOV R4,R0
78 CMD_Responed_Type *Buffer ;
79 Buffer=&Get_Respond_Buffer ;
\ 00000004 1C48 LDR R0,??Read_CMD_Respond_0 ;; Get_Respond_Buffer
\ 00000006 051C MOV R5,R0
80 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
81 if(respond_Type==No_Respond)
\ 00000010 002C CMP R4,#+0
\ 00000012 05D1 BNE ??Read_CMD_Respond_2
82 {
83 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]
84 Buffer=0 ;
\ 0000001A 0020 MOV R0,#+0
\ 0000001C 051C MOV R5,R0
\ 0000001E 28E0 B ??Read_CMD_Respond_3
85 }
86 else if(respond_Type==Respond_Len_48)
\ ??Read_CMD_Respond_2:
\ 00000020 012C CMP R4,#+0x1
\ 00000022 0ED1 BNE ??Read_CMD_Respond_4
87 {
88 Buffer=0 ;
\ 00000024 0020 MOV R0,#+0
\ 00000026 051C MOV R5,R0
89 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
90 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
91 }
92 else if(respond_Type==Respond_Len_136)
\ ??Read_CMD_Respond_4:
\ 00000042 022C CMP R4,#+0x2
\ 00000044 15D1 BNE ??Read_CMD_Respond_3
93 {
94 Buffer=0 ;
\ 00000046 0020 MOV R0,#+0
\ 00000048 051C MOV R5,R0
95 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
96 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
97 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
98 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
99 //数据长度136bit 大于 4个响应寄存器的值,how can i do ? 不过在128位的时候就可以把CSD读全
100 //Buffer+=AT91C_BASE_MCI->MCI_RSPR[4] ;
101 }
102 }
\ ??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
103 /*************************** MCI 接口和SD卡的 命令通讯,参数意义如下: ******************************/
104 // CommandNum :命令序号,祥件SD卡协议 ; CMDParameter :命令所需携带的参数,每个命令不定
105 // Responed_Type :响应类型,0:无响应 1:48 bit响应 ,2:136 bit .具体信息见SD协议
106 // TRDIR :数据发送还是接受 0:写 , 1:读 //和下一个参数一样,只在传输命令中有效
107 // TRTYP :数据读写模式 0:单块 , 1:多块 ,2:流 ,3: 保留
108 /*********************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
109 int MCI_SendCommand( unsigned int CommandNum, //命令序号
110 unsigned long int CMDParameter ,unsigned int Responed_Type //发送的数据 ,响应
111 ,unsigned int SpecCMD) //是否特殊命令
112 {
\ MCI_SendCommand:
\ 00000000 FAB5 PUSH {R1,R3-R7,LR}
\ 00000002 81B0 SUB SP,#+0x4
\ 00000004 041C MOV R4,R0
\ 00000006 151C MOV R5,R2
113 unsigned int GetState ;
114 unsigned long int CMDR_param=0x0;
\ 00000008 0020 MOV R0,#+0
\ 0000000A 061C MOV R6,R0
115 unsigned int Try_time=0 ;
\ 0000000C 0020 MOV R0,#+0
\ 0000000E 071C MOV R7,R0
116 /**当MCI_SR 中CMDRDY 为0 且无中断命令发送( 位SPCMD) 时,该寄存器写保护,即当前执行命令不能被中断或修改。**/
117 //while((AT91C_BASE_MCI->MCI_SR & AT91C_MCI_CMDRDY)==0); //等待CMDRDY
118 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]
119 CMDR_param= (CommandNum<<0) ;
\ 00000016 261C MOV R6,R4
120 if(SpecCMD==1)
\ 00000018 0298 LDR R0,[SP, #+0x8]
\ 0000001A 0128 CMP R0,#+0x1
\ 0000001C 0BD1 BNE ??MCI_SendCommand_1
121 {
122 if(CommandNum==41)
\ 0000001E 292C CMP R4,#+0x29
\ 00000020 04D1 BNE ??MCI_SendCommand_2
123 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
124
125 else
126 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
127 }
128 else
129 {
130 //if(CommandNum==0)
131 // CMDR_param |=AT91C_MCI_SPCMD_INIT ;
132 // else
133 CMDR_param |=(0xFFFFFFFF & AT91C_MCI_TRCMD_NO ) ; //不破坏数据
134 }
135 //AT91F_MCI_CfgCMDReg() ;
136 //CMDR_param |= AT91C_MCI_OPDCMD ;//推拉输出。。。。
137 if(Responed_Type !=No_Respond)
\ ??MCI_SendCommand_1:
\ ??MCI_SendCommand_3:
\ 00000036 002D CMP R5,#+0
\ 00000038 02D0 BEQ ??MCI_SendCommand_4
138 CMDR_param |= (Responed_Type<<6) ; // MCI_CMDR不可读
\ 0000003A 301C MOV R0,R6
\ 0000003C AE01 LSL R6,R5,#+0x6
\ 0000003E 0643 ORR R6,R0
139 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
140 //while((AT91C_BASE_MCI->MCI_SR & AT91C_MCI_CMDRDY)==0) ; //等待发送数据
141
142 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
143 {
144 if( Try_time++ >Try_Time_Max)
\ 00000050 381C MOV R0,R7
\ 00000052 071C MOV R7,R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -