📄 mci_sd.lst
字号:
\ 00000008 0A20 MOV R0,#+0xA
\ 0000000A 2060 STR R0,[R4, #+0]
\ 0000000C .... LDR R0,??DataTable4 ;; 0xfffac048
\ 0000000E 0021 MOV R1,#+0
\ 00000010 C943 MVN R1,R1 ;; #-1
\ 00000012 0160 STR R1,[R0, #+0]
\ 00000014 1948 LDR R0,??MCI_Init_0+0x4 ;; 0xfffac008
\ 00000016 3121 MOV R1,#+0x31
\ 00000018 0160 STR R1,[R0, #+0]
\ 0000001A .... LDR R0,??DataTable14 ;; 0xfffac004
\ 0000001C 1849 LDR R1,??MCI_Init_0+0x8 ;; 0x4008001
\ 0000001E 0160 STR R1,[R0, #+0]
\ 00000020 1849 LDR R1,??MCI_Init_0+0xC ;; 0xfffac00c
\ 00000022 0022 MOV R2,#+0
\ 00000024 0A60 STR R2,[R1, #+0]
\ 00000026 0521 MOV R1,#+0x5
\ 00000028 2160 STR R1,[R4, #+0]
61 AT91F_MCI_CfgFrequency(AT91C_BASE_MCI,48,12) ;
\ 0000002A 0168 LDR R1,[R0, #+0]
\ 0000002C FF22 MOV R2,#+0xFF
\ 0000002E 9143 BIC R1,R2
\ 00000030 0160 STR R1,[R0, #+0]
\ 00000032 0125 MOV R5,#+0x1
\ 00000034 0168 LDR R1,[R0, #+0]
\ 00000036 2943 ORR R1,R5
\ 00000038 0160 STR R1,[R0, #+0]
62 AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_MCI,7,0,MCI_Int_Handler) ;
\ 0000003A 1349 LDR R1,??MCI_Init_0+0x10 ;; 0xfffff0a4
\ 0000003C 0868 LDR R0,[R1, #+0]
\ 0000003E 6802 LSL R0,R5,#+0x9
\ 00000040 124A LDR R2,??MCI_Init_0+0x14 ;; 0xfffff124
\ 00000042 1060 STR R0,[R2, #+0]
\ 00000044 124A LDR R2,??MCI_Init_0+0x18 ;; MCI_Int_Handler
\ 00000046 0A60 STR R2,[R1, #+0]
\ 00000048 1249 LDR R1,??MCI_Init_0+0x1C ;; 0xfffff024
\ 0000004A 0722 MOV R2,#+0x7
\ 0000004C 0A60 STR R2,[R1, #+0]
\ 0000004E 1249 LDR R1,??MCI_Init_0+0x20 ;; 0xfffff128
\ 00000050 0860 STR R0,[R1, #+0]
63 AT91F_MCI_EnableIt(pMCI,//AT91C_MCI_CMDRDY|AT91C_MCI_RXRDY|AT91C_MCI_TXRDY |AT91C_MCI_ENDTX
64 AT91C_MCI_ENDRX) ;
\ 00000052 .... LDR R0,??DataTable6 ;; 0xfffac044
\ 00000054 4021 MOV R1,#+0x40
\ 00000056 0160 STR R1,[R0, #+0]
65 //AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_MCI) ;
66 //set pdc value ,
67 AT91F_PDC_EnableTx(AT91C_BASE_PDC_MCI) ;
\ 00000058 .... LDR R0,??DataTable16 ;; 0xfffac120
\ 0000005A C031 ADD R1,#+0xC0
\ 0000005C 0160 STR R1,[R0, #+0]
68 AT91F_PDC_EnableRx(AT91C_BASE_PDC_MCI) ;
\ 0000005E 0560 STR R5,[R0, #+0]
69 AT91F_PDC_Open(AT91C_BASE_PDC_MCI) ;
\ 00000060 .... LDR R6,??DataTable8 ;; 0xfffac100
\ 00000062 301C MOV R0,R6
\ 00000064 ........ _BLF AT91F_PDC_Open,AT91F_PDC_Open??rT
70 AT91C_BASE_MCI->MCI_RPR=*getresData ;
\ 00000068 0C48 LDR R0,??MCI_Init_0+0x24 ;; getresData
\ 0000006A 0068 LDR R0,[R0, #+0]
\ 0000006C 0068 LDR R0,[R0, #+0]
\ 0000006E 3060 STR R0,[R6, #+0]
71 AT91F_MCI_Enable(AT91C_BASE_MCI) ;
\ 00000070 2560 STR R5,[R4, #+0]
72 }
\ 00000072 70BC POP {R4-R6}
\ 00000074 01BC POP {R0}
\ 00000076 0047 BX R0 ;; return
\ ??MCI_Init_0:
\ 00000078 00C0FAFF DC32 0xfffac000
\ 0000007C 08C0FAFF DC32 0xfffac008
\ 00000080 01800004 DC32 0x4008001
\ 00000084 0CC0FAFF DC32 0xfffac00c
\ 00000088 A4F0FFFF DC32 0xfffff0a4
\ 0000008C 24F1FFFF DC32 0xfffff124
\ 00000090 ........ DC32 MCI_Int_Handler
\ 00000094 24F0FFFF DC32 0xfffff024
\ 00000098 28F1FFFF DC32 0xfffff128
\ 0000009C ........ DC32 getresData
73 //******************************************************************************************
\ In segment CODE, align 4, keep-with-next
74 void Read_CMD_Respond(unsigned int respond_Type) //得到命令响应
75 {
\ Read_CMD_Respond:
\ 00000000 60B5 PUSH {R5,R6,LR}
76 unsigned int TTT ;
77 CMD_Responed_Type *Buffer ;
78 Buffer=&Get_Respond_Buffer ;
79
80 if(respond_Type==No_Respond)
\ 00000002 0028 CMP R0,#+0
\ 00000004 03D1 BNE ??Read_CMD_Respond_0
81 {
82 Get_Respond_Buffer.data[63]=0 ; //串职空
\ 00000006 1148 LDR R0,??Read_CMD_Respond_1 ;; Get_Respond_Buffer + 63
\ 00000008 0021 MOV R1,#+0
\ 0000000A 0170 STRB R1,[R0, #+0]
83 Buffer=0 ;
\ 0000000C 1AE0 B ??Read_CMD_Respond_2
84 }
85 else if(respond_Type==Respond_Len_48)
\ ??Read_CMD_Respond_0:
\ 0000000E 104D LDR R5,??Read_CMD_Respond_1+0x4 ;; _Stdout
\ 00000010 104E LDR R6,??Read_CMD_Respond_1+0x8 ;; `?<Constant "____GetRSP0Reg____">`
\ 00000012 1149 LDR R1,??Read_CMD_Respond_1+0xC ;; 0xfffac020
\ 00000014 0128 CMP R0,#+0x1
\ 00000016 02D1 BNE ??Read_CMD_Respond_3
86 {
87 Buffer=0 ;
88 Buffer+=AT91F_MCI_GetRSP0Reg(AT91C_BASE_MCI) ;
\ 00000018 0868 LDR R0,[R1, #+0]
89 Buffer+=AT91F_MCI_GetRSP1Reg(AT91C_BASE_MCI) ;
\ 0000001A 0868 LDR R0,[R1, #+0]
90 TRACE_INFO("____GetRSP0Reg____") ;
\ 0000001C 08E0 B ??Read_CMD_Respond_4
91 TRACE_INFO("\r\n%d\r\n " ,TTT) ;
^
Warning[Pe549]: variable "TTT" is used before its value is set
92
93 }
94 else if(respond_Type==Respond_Len_136)
\ ??Read_CMD_Respond_3:
\ 0000001E 0228 CMP R0,#+0x2
\ 00000020 10D1 BNE ??Read_CMD_Respond_2
95 {
96 Buffer=0 ;
97 Buffer+=AT91C_BASE_MCI->MCI_RSPR[0] ;
\ 00000022 0868 LDR R0,[R1, #+0]
98 Buffer+=AT91C_BASE_MCI->MCI_RSPR[1] ;
\ 00000024 0D48 LDR R0,??Read_CMD_Respond_1+0x10 ;; 0xfffac024
\ 00000026 0068 LDR R0,[R0, #+0]
99 Buffer+=AT91C_BASE_MCI->MCI_RSPR[2] ;
\ 00000028 0D48 LDR R0,??Read_CMD_Respond_1+0x14 ;; 0xfffac028
\ 0000002A 0068 LDR R0,[R0, #+0]
100 Buffer+=AT91C_BASE_MCI->MCI_RSPR[3] ;
\ 0000002C 0D48 LDR R0,??Read_CMD_Respond_1+0x18 ;; 0xfffac02c
\ 0000002E 0068 LDR R0,[R0, #+0]
101 TRACE_INFO("____GetRSP0Reg____") ;
\ ??Read_CMD_Respond_4:
\ 00000030 311C MOV R1,R6
\ 00000032 281C MOV R0,R5
\ 00000034 ........ _BLF fprintf,fprintf??rT
102 TRACE_INFO("\r\n%d\r\n " ,TTT) ;
\ 00000038 221C MOV R2,R4
\ 0000003A 1436 ADD R6,#+0x14
\ 0000003C 311C MOV R1,R6
\ 0000003E 281C MOV R0,R5
\ 00000040 ........ _BLF fprintf,fprintf??rT
103 //数据长度136bit 大于 4个响应寄存器的值,how can i do ? 不过在128位的时候就可以把CSD读全
104 //Buffer+=AT91C_BASE_MCI->MCI_RSPR[4] ;
105 }
106 }
\ ??Read_CMD_Respond_2:
\ 00000044 60BC POP {R5,R6}
\ 00000046 01BC POP {R0}
\ 00000048 0047 BX R0 ;; return
\ 0000004A C046 NOP
\ ??Read_CMD_Respond_1:
\ 0000004C ........ DC32 Get_Respond_Buffer + 63
\ 00000050 ........ DC32 _Stdout
\ 00000054 ........ DC32 `?<Constant "____GetRSP0Reg____">`
\ 00000058 20C0FAFF DC32 0xfffac020
\ 0000005C 24C0FAFF DC32 0xfffac024
\ 00000060 28C0FAFF DC32 0xfffac028
\ 00000064 2CC0FAFF DC32 0xfffac02c
107 /*************************** MCI 接口和SD卡的 命令通讯,参数意义如下: ******************************/
108 // CommandNum :命令序号,祥件SD卡协议 ; CMDParameter :命令所需携带的参数,每个命令不定
109 // Responed_Type :响应类型,0:无响应 1:48 bit响应 ,2:136 bit .具体信息见SD协议
110 // TRDIR :数据发送还是接受 0:写 , 1:读 //和下一个参数一样,只在传输命令中有效
111 // TRTYP :数据读写模式 0:单块 , 1:多块 ,2:流 ,3: 保留
112 /*********************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
113 int MCI_SendCommand( unsigned int CommandNum, //命令序号
114 unsigned long int CMDParameter ,unsigned int Responed_Type //发送的数据 ,响应
115 ,unsigned int SpecCMD) //是否特殊命令
116 {
\ MCI_SendCommand:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 141C MOV R4,R2
117 unsigned int GetState ;
118 unsigned long int CMDR_param ;
119 /**当MCI_SR 中CMDRDY 为0 且无中断命令发送( 位SPCMD) 时,该寄存器写保护,即当前执行命令不能被中断或修改。**/
120 //while((AT91C_BASE_MCI->MCI_SR & AT91C_MCI_CMDRDY)==0); //等待CMDRDY
121 AT91C_BASE_MCI->MCI_ARGR =CMDParameter ;
\ 00000004 1E4A LDR R2,??MCI_SendCommand_0 ;; 0xfffac010
\ 00000006 1160 STR R1,[R2, #+0]
122 CMDR_param= (CommandNum<<0) ;
123 if(SpecCMD==1)
\ 00000008 012B CMP R3,#+0x1
\ 0000000A 03D1 BNE ??MCI_SendCommand_1
124 CMDR_param |=AT91C_MCI_SPCMD_SYNC ; //??????
\ 0000000C 8021 MOV R1,#+0x80
\ 0000000E 8900 LSL R1,R1,#+0x2 ;; #+0x200
\ 00000010 0143 ORR R1,R0
\ 00000012 05E0 B ??MCI_SendCommand_2
125 else
126 {
127 if(CommandNum==0)
\ ??MCI_SendCommand_1:
\ 00000014 0028 CMP R0,#+0
\ 00000016 02D1 BNE ??MCI_SendCommand_3
128 CMDR_param |=AT91C_MCI_SPCMD_INIT ;
\ 00000018 8021 MOV R1,#+0x80
\ 0000001A 4900 LSL R1,R1,#+0x1 ;; #+0x100
\ 0000001C 00E0 B ??MCI_SendCommand_2
129 else
130 CMDR_param &=(0xFFFFFFFF & AT91C_MCI_TRCMD_NO ) ; //不破坏数据
\ ??MCI_SendCommand_3:
\ 0000001E 0021 MOV R1,#+0
131 }
132 //AT91F_MCI_CfgCMDReg() ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -