📄 fw_cmd.lst
字号:
140 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
141 long fw_readEndpoint(EPx bEndp, UCHAR * buf)
142 {
\ fw_readEndpoint:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 061C MOV R6,R0
\ 00000004 0024 MOV R4,#+0
143 int _NbOctets, _NbOctetsLus = 0;
144 UCHAR* _Buff = buf;
145
146 if(_Buff != NULL)
\ 00000006 0029 CMP R1,#+0
\ 00000008 34D0 BEQ ??fw_readEndpoint_0
147 {
148 _NbOctetsLus = ( ( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) >> 16) &0x7F );
\ 0000000A B000 LSL R0,R6,#+2
\ 0000000C .... LDR R2,??DataTable10 ;; 0xfffb0000
\ 0000000E 1718 ADD R7,R2,R0
\ 00000010 386B LDR R0,[R7, #+48]
\ 00000012 4402 LSL R4,R0,#+9
\ 00000014 640E LSR R4,R4,#+25
149 _NbOctets = _NbOctetsLus;
\ 00000016 201C MOV R0,R4
\ 00000018 02E0 B ??fw_readEndpoint_1
150 while(_NbOctets-- > 0)
151 {
152 *_Buff++ = AT91F_UDP_EpRead( USBDEV_BASE_UDP, bEndp );
\ ??fw_readEndpoint_2:
\ 0000001A 3A6D LDR R2,[R7, #+80]
\ 0000001C 0A70 STRB R2,[R1, #+0]
\ 0000001E 491C ADD R1,R1,#+1
153 }
\ ??fw_readEndpoint_1:
\ 00000020 021C MOV R2,R0
\ 00000022 401E SUB R0,R0,#+1
\ 00000024 012A CMP R2,#+1
\ 00000026 F8DA BGE ??fw_readEndpoint_2
154 if(bEndp == FW_EP_BULK_OUT)
\ 00000028 .... LDR R5,??DataTable10 ;; 0xfffb0000
\ 0000002A 022E CMP R6,#+2
\ 0000002C 12D1 BNE ??fw_readEndpoint_3
155 {
156 // Read data bank 0
157 if(fw_databk == 0)
\ 0000002E 134E LDR R6,??fw_readEndpoint_4 ;; fw_databk
\ 00000030 3068 LDR R0,[R6, #+0]
\ 00000032 0028 CMP R0,#+0
\ 00000034 07D1 BNE ??fw_readEndpoint_5
158 {
159 // Notify USB peripheral device that data has been read in the FIFO bank 0
160 AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK0 );
\ 00000036 0222 MOV R2,#+2
\ 00000038 0221 MOV R1,#+2
\ 0000003A 281C MOV R0,R5
\ 0000003C ........ _BLF AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
161 fw_databk = 1;
\ 00000040 0120 MOV R0,#+1
\ ??fw_readEndpoint_6:
\ 00000042 3060 STR R0,[R6, #+0]
\ 00000044 16E0 B ??fw_readEndpoint_0
162 }
163 else
164 {
165 // Read data bank 1
166 // Notify USB peripheral device that data has been read in the FIFO bank 1
167 AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK1 );
\ ??fw_readEndpoint_5:
\ 00000046 4022 MOV R2,#+64
\ 00000048 0221 MOV R1,#+2
\ 0000004A 281C MOV R0,R5
\ 0000004C ........ _BLF AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
168 fw_databk = 0;
\ 00000050 0020 MOV R0,#+0
\ 00000052 F6E7 B ??fw_readEndpoint_6
169 }
170 }
171 else
172 {
173 if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & USBDEV_UDP_RX_DATA_BK0 )
\ ??fw_readEndpoint_3:
\ 00000054 386B LDR R0,[R7, #+48]
\ 00000056 8007 LSL R0,R0,#+30
\ 00000058 04D5 BPL ??fw_readEndpoint_7
174 {
175 AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK0 );
\ 0000005A 0222 MOV R2,#+2
\ 0000005C 311C MOV R1,R6
\ 0000005E 281C MOV R0,R5
\ 00000060 ........ _BLF AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
176 }
177 if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & USBDEV_UDP_RX_DATA_BK1 )
\ ??fw_readEndpoint_7:
\ 00000064 386B LDR R0,[R7, #+48]
\ 00000066 4006 LSL R0,R0,#+25
\ 00000068 04D5 BPL ??fw_readEndpoint_0
178 {
179 AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK1 );
\ 0000006A 4022 MOV R2,#+64
\ 0000006C 311C MOV R1,R6
\ 0000006E 281C MOV R0,R5
\ 00000070 ........ _BLF AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
180 }
181 }
182 }
183 return( _NbOctetsLus );
\ ??fw_readEndpoint_0:
\ 00000074 201C MOV R0,R4
\ 00000076 F0BC POP {R4-R7}
\ 00000078 02BC POP {R1}
\ 0000007A 0847 BX R1 ;; return
\ ??fw_readEndpoint_4:
\ 0000007C ........ DC32 fw_databk
184 }
185
186
187 /*****************************************************************
188 *
189 * ROUTINE fw_writeEndpoint
190 *
191 *-----------------------------------------------------------------
192 *
193 * Object :
194 * send a set address enable command
195 *
196 * Input parameters : bEndp : number of the EP
197 * buf : data buffer
198 * len : length of the data
199 *
200 * Output parameters : length of write data
201 *
202 * Global variables :
203 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
204 long fw_writeEndpoint(EPx bEndp, UCHAR * buf, UCHAR len)
205 {
\ fw_writeEndpoint:
\ 00000000 F4B5 PUSH {R2,R4-R7,LR}
206 int _i;
207 UCHAR *_pBuffer = buf;
\ 00000002 0C1C MOV R4,R1
208 long _status;
209
210 if(len == 0)
\ 00000004 8100 LSL R1,R0,#+2
\ 00000006 .... LDR R2,??DataTable10 ;; 0xfffb0000
\ 00000008 5618 ADD R6,R2,R1
\ 0000000A 1027 MOV R7,#+16
\ 0000000C 0025 MOV R5,#+0
\ 0000000E 6946 MOV R1,SP
\ 00000010 0978 LDRB R1,[R1, #+0]
\ 00000012 0029 CMP R1,#+0
\ 00000014 03D1 BNE ??fw_writeEndpoint_0
211 {
212 // validate ED
213 AT91F_UDP_EpSet( USBDEV_BASE_UDP, bEndp, AT91C_UDP_TXPKTRDY );
\ 00000016 306B LDR R0,[R6, #+48]
\ 00000018 0743 ORR R7,R0
\ 0000001A 3763 STR R7,[R6, #+48]
\ 0000001C 09E0 B ??fw_writeEndpoint_1
214 _status = 0;
215 }
216 else
217 {
218 if(_pBuffer != NULL)
\ ??fw_writeEndpoint_0:
\ 0000001E 002C CMP R4,#+0
\ 00000020 16D0 BEQ ??fw_writeEndpoint_2
219 {
220 AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, AT91C_UDP_ISOERROR );
\ 00000022 0822 MOV R2,#+8
\ 00000024 011C MOV R1,R0
\ 00000026 .... LDR R0,??DataTable10 ;; 0xfffb0000
\ 00000028 ........ _BLF AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
221 if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & AT91C_UDP_TXPKTRDY)
\ 0000002C 306B LDR R0,[R6, #+48]
\ 0000002E C006 LSL R0,R0,#+27
\ 00000030 01D5 BPL ??fw_writeEndpoint_3
222 {
223 _status = 0; /* test if we can write in fifo */
\ ??fw_writeEndpoint_1:
\ 00000032 0020 MOV R0,#+0
\ 00000034 0EE0 B ??fw_writeEndpoint_4
224 }
225 else
226 {
227 for(_i=0; _i<len; _i++)
\ ??fw_writeEndpoint_3:
\ 00000036 6846 MOV R0,SP
\ 00000038 0078 LDRB R0,[R0, #+0]
\ 0000003A 03E0 B ??fw_writeEndpoint_5
228 {
229 AT91F_UDP_EpWrite( USBDEV_BASE_UDP, bEndp, *_pBuffer++);
\ ??fw_writeEndpoint_6:
\ 0000003C 2178 LDRB R1,[R4, #+0]
\ 0000003E 3165 STR R1,[R6, #+80]
\ 00000040 641C ADD R4,R4,#+1
230 }
\ 00000042 6D1C ADD R5,R5,#+1
\ ??fw_writeEndpoint_5:
\ 00000044 8542 CMP R5,R0
\ 00000046 F9DB BLT ??fw_writeEndpoint_6
231 // validate ED
232 AT91F_UDP_EpSet( USBDEV_BASE_UDP, bEndp, AT91C_UDP_TXPKTRDY );
\ 00000048 316B LDR R1,[R6, #+48]
\ 0000004A 0F43 ORR R7,R1
\ 0000004C 3763 STR R7,[R6, #+48]
233 _status = (long)len;
\ 0000004E 01E0 B ??fw_writeEndpoint_4
234 }
235 }
236 else
237 {
238 _status = -1;
\ ??fw_writeEndpoint_2:
\ 00000050 0020 MOV R0,#+0
\ 00000052 C043 MVN R0,R0 ;; #-1
239 }
240 }
241 return( _status );
\ ??fw_writeEndpoint_4:
\ 00000054 F8BC POP {R3-R7}
\ 00000056 02BC POP {R1}
\ 00000058 0847 BX R1 ;; return
242 }
243
244
245 /*****************************************************************
246 *
247 * ROUTINE fw_changedir
248 *
249 *-----------------------------------------------------------------
250 *
251 * Object :
252 * Change Dir in Control Register for Endpoint Control
253 *
254 * Input parameters :
255 *
256 * Output parameters :
257 *
258 * Global variables :
259 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
260 void fw_changedir(int dir)
261 {
\ fw_changedir:
\ 00000000 10B5 PUSH {R4,LR}
262 if(dir == FW_HOST_TO_DEVICE)
\ 00000002 0A4C LDR R4,??fw_changedir_0 ;; 0xfffb0030
\ 00000004 0028 CMP R0,#+0
\ 00000006 08D1 BNE ??fw_changedir_1
263 {
264 // DIR = 0, OUT
265 AT91F_UDP_EpClear( USBDEV_BASE_UDP, FW_EP_CTRL, AT91C_UDP_DIR );
\ 00000008 8022 MOV R2,#+128
\ 0000000A 0021 MOV R1,#+0
\ 0000000C .... LDR R0,??DataTable10 ;; 0xfffb0000
\ 0000000E ........ _BLF AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
266 while ( ( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & AT91C_UDP_DIR ) );
\ ??fw_changedir_2:
\ 00000012 2068 LDR R0,[R4, #+0]
\ 00000014 0006 LSL R0,R0,#+24
\ 00000016 FCD4 BMI ??fw_changedir_2
\ 00000018 06E0 B ??fw_changedir_3
267 }
268 else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -