📄 ms_rbc.lst
字号:
\ 00000002 051C MOV R5,R0
110 /* Fill the structure */
111 if (mode_sense->allocation_length < sizeof(MODE_SENSE_PARAMETER))
\ 00000004 0079 LDRB R0,[R0, #+4]
\ 00000006 .... LDR R1,??DataTable5 ;; usbms_context
\ 00000008 0C1C MOV R4,R1
\ 0000000A B934 ADD R4,#+185
\ 0000000C 1128 CMP R0,#+17
\ 0000000E 01D2 BCS ??rbc_mode_sense_0
112 {
113 usbms_context.mode_parameter_sense.mode_parameter_head.mode_data_length = (UCHAR)(mode_sense->allocation_length-sizeof(usbms_context.mode_parameter_sense.mode_parameter_head.mode_data_length));
\ 00000010 401E SUB R0,R0,#+1
\ 00000012 00E0 B ??rbc_mode_sense_1
114 }
115 else
116 {
117 usbms_context.mode_parameter_sense.mode_parameter_head.mode_data_length = (UCHAR)(sizeof(MODE_SENSE_PARAMETER)-sizeof(usbms_context.mode_parameter_sense.mode_parameter_head.mode_data_length));
\ ??rbc_mode_sense_0:
\ 00000014 1020 MOV R0,#+16
\ ??rbc_mode_sense_1:
\ 00000016 6070 STRB R0,[R4, #+1]
118 }
119
120 usbms_context.mode_parameter_sense.mode_parameter_head.medium_type = 0;
\ 00000018 0020 MOV R0,#+0
\ 0000001A A070 STRB R0,[R4, #+2]
121 usbms_context.mode_parameter_sense.mode_parameter_head.device_specific_parameter=0;
\ 0000001C E070 STRB R0,[R4, #+3]
122 usbms_context.mode_parameter_sense.mode_parameter_head.block_descriptor_length=0;
\ 0000001E 2071 STRB R0,[R4, #+4]
123
124 if( (mode_sense->page_code == 0x06) /* Reserved */
125 ||(mode_sense->page_code == 0x3F) ) /* Return all pages */
\ 00000020 AA78 LDRB R2,[R5, #+2]
\ 00000022 081C MOV R0,R1
\ 00000024 BA30 ADD R0,#+186
\ 00000026 3F23 MOV R3,#+63
\ 00000028 3F26 MOV R6,#+63
\ 0000002A 1640 AND R6,R2
\ 0000002C 062E CMP R6,#+6
\ 0000002E 02D0 BEQ ??rbc_mode_sense_2
\ 00000030 1340 AND R3,R2
\ 00000032 3F2B CMP R3,#+63
\ 00000034 40D1 BNE ??rbc_mode_sense_3
126 {
127 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.pageCode = 0x06;
128 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.reserved1 = 0x01;
\ ??rbc_mode_sense_2:
\ 00000036 6279 LDRB R2,[R4, #+5]
\ 00000038 C023 MOV R3,#+192
\ 0000003A 1340 AND R3,R2
\ 0000003C 4622 MOV R2,#+70
\ 0000003E 1A43 ORR R2,R3
\ 00000040 6271 STRB R2,[R4, #+5]
129 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.pageLength = 0x0b;
\ 00000042 0B22 MOV R2,#+11
\ 00000044 A271 STRB R2,[R4, #+6]
130 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.writeCacheDisable = 0x01; /* entire command is treated */
\ 00000046 E279 LDRB R2,[R4, #+7]
\ 00000048 0123 MOV R3,#+1
\ 0000004A 1343 ORR R3,R2
\ 0000004C E371 STRB R3,[R4, #+7]
131
132 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.logicalBlockSize[0] = (UCHAR)(usbms_context.usb_lun[usbms_context.current_lun].BlockSize);
\ 0000004E 2278 LDRB R2,[R4, #+0]
\ 00000050 3823 MOV R3,#+56
\ 00000052 5A43 MUL R2,R3
\ 00000054 8918 ADD R1,R1,R2
\ 00000056 0A68 LDR R2,[R1, #+0]
\ 00000058 2272 STRB R2,[R4, #+8]
133 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.logicalBlockSize[1] = (UCHAR)(usbms_context.usb_lun[usbms_context.current_lun].BlockSize>>8);
\ 0000005A 0A68 LDR R2,[R1, #+0]
\ 0000005C 120A LSR R2,R2,#+8
\ 0000005E 6272 STRB R2,[R4, #+9]
134
135 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[0] =
136 (UCHAR)(usbms_context.usb_lun[usbms_context.current_lun].TotBlockNumber>1)?
137 (UCHAR)(usbms_context.usb_lun[usbms_context.current_lun].TotBlockNumber-1):0;
\ 00000060 4A68 LDR R2,[R1, #+4]
\ 00000062 022A CMP R2,#+2
\ 00000064 01D3 BCC ??rbc_mode_sense_4
\ 00000066 521E SUB R2,R2,#+1
\ 00000068 00E0 B ??rbc_mode_sense_5
\ ??rbc_mode_sense_4:
\ 0000006A 0022 MOV R2,#+0
\ ??rbc_mode_sense_5:
\ 0000006C A272 STRB R2,[R4, #+10]
138 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[1] = (UCHAR)(usbms_context.usb_lun[usbms_context.current_lun].TotBlockNumber>>8);
\ 0000006E 4A68 LDR R2,[R1, #+4]
\ 00000070 120A LSR R2,R2,#+8
\ 00000072 E272 STRB R2,[R4, #+11]
139 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[2] = (UCHAR)(usbms_context.usb_lun[usbms_context.current_lun].TotBlockNumber>>16);
\ 00000074 4A68 LDR R2,[R1, #+4]
\ 00000076 120C LSR R2,R2,#+16
\ 00000078 2273 STRB R2,[R4, #+12]
140 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[3] = (UCHAR)(usbms_context.usb_lun[usbms_context.current_lun].TotBlockNumber>>24);
\ 0000007A 4968 LDR R1,[R1, #+4]
\ 0000007C 090E LSR R1,R1,#+24
\ 0000007E 6173 STRB R1,[R4, #+13]
141 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[4] = 0x00;
\ 00000080 0021 MOV R1,#+0
\ 00000082 A173 STRB R1,[R4, #+14]
142
143 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.powerPerformance = 0x00; /* 0x00 energie, 0xFF perf */
\ 00000084 E173 STRB R1,[R4, #+15]
144 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.lockd = 0x00;
145 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.formatd = 0x00;
146 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.writed = 0x00;
147 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.readd = 0x00;
\ 00000086 217C LDRB R1,[R4, #+16]
\ 00000088 F022 MOV R2,#+240
\ 0000008A 0A40 AND R2,R1
\ 0000008C 2274 STRB R2,[R4, #+16]
148 usbms_context.mode_parameter_sense.mode_rbc_device_param_page.reserved4 = 0x00;
\ 0000008E 0021 MOV R1,#+0
\ 00000090 6174 STRB R1,[R4, #+17]
149
150 /* Send the Mode Sense data, always the same zeroed struct */
151 usb_send((char *)&usbms_context.mode_parameter_sense, min(sizeof(MODE_SENSE_PARAMETER),mode_sense->allocation_length));
\ 00000092 2979 LDRB R1,[R5, #+4]
\ 00000094 1229 CMP R1,#+18
\ 00000096 00D3 BCC ??rbc_mode_sense_6
\ 00000098 1121 MOV R1,#+17
\ ??rbc_mode_sense_6:
\ 0000009A ........ _BLF usb_send,??usb_send??rT
152
153 /* update the CSW structure */
154 if (mode_sense->allocation_length<sizeof(MODE_SENSE_PARAMETER))
\ 0000009E 2979 LDRB R1,[R5, #+4]
\ 000000A0 1129 CMP R1,#+17
\ 000000A2 01D2 BCS ??rbc_mode_sense_7
155 {
156 ms_computeCSW(GOOD_STATUS,0);
\ 000000A4 0021 MOV R1,#+0
\ 000000A6 00E0 B ??rbc_mode_sense_8
157 }
158 else
159 {
160 ms_computeCSW(GOOD_STATUS,mode_sense->allocation_length-sizeof(MODE_SENSE_PARAMETER));
\ ??rbc_mode_sense_7:
\ 000000A8 1139 SUB R1,#+17
\ ??rbc_mode_sense_8:
\ 000000AA 0020 MOV R0,#+0
\ 000000AC ........ _BLF ms_computeCSW,??ms_computeCSW??rT
161 }
162 /* update the state */
163 usbms_context.state = USB_SEND_NO_FLASH;
\ 000000B0 0320 MOV R0,#+3
\ 000000B2 A076 STRB R0,[R4, #+26]
164 }
165 else
166 {
167 usb_send((char *)&usbms_context.mode_parameter_sense.mode_parameter_head, sizeof(USBMS_MODE_PARAMETER_HEAD));
168 /* We return an empty structure */
169 /* Update the CSW */
170 ms_computeCSW(GOOD_STATUS, mode_sense->allocation_length);
171 /* update the state */
172 usbms_context.state = USB_SEND_NO_FLASH;
173 }
174
175 TRACE_DEBUG_L( "blo 0 0x%X \n\r", usbms_context.mode_parameter_sense.mode_rbc_device_param_page.logicalBlockSize[0]);
176 TRACE_DEBUG_L( "blo 1 0x%X \n\r", usbms_context.mode_parameter_sense.mode_rbc_device_param_page.logicalBlockSize[1]);
177 TRACE_DEBUG_L( "nu lb 0 0x%X \n\r", usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[0]);
178 TRACE_DEBUG_L( "nu lb 1 0x%X \n\r", usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[1]);
179 TRACE_DEBUG_L( "nu lb 2 0x%X \n\r", usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[2]);
180 TRACE_DEBUG_L( "nu lb 3 0x%X \n\r", usbms_context.mode_parameter_sense.mode_rbc_device_param_page.numberOfLogicalBlocks[3]);
181
182 return USBMS_OK;
\ 000000B4 0020 MOV R0,#+0
\ 000000B6 .... B ?Subroutine11
\ ??rbc_mode_sense_3:
\ 000000B8 0421 MOV R1,#+4
\ 000000BA ........ _BLF usb_send,??usb_send??rT
\ 000000BE 2979 LDRB R1,[R5, #+4]
\ 000000C0 F3E7 B ??rbc_mode_sense_8
183 }
184
185
186 /*****************************************************************
187 *
188 * ROUTINE : rbc_prevent_allow_removal
189 *
190 *-----------------------------------------------------------------
191 *
192 * Purpose : processes the rbc PREVENT_ALLOW_REMOVAL command
193 *
194 * Input Parameters : Structure defining the PREVENT_ALLOW_REMOVAL command
195 * NO EFFECT
196 *
197 * Output Parameters : status of the operation
198 *
199 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
200 USBMS_RETURN rbc_prevent_allow_removal(void)
201 {
202 /* storing the removal capability */
203 /* usbms_context.usb_lun[usbms_context.current_lun].media_state = media_removal->prevent; */
204 return USBMS_OK;
\ rbc_prevent_allow_removal:
\ 00000000 0020 MOV R0,#+0
\ 00000002 7047 BX LR ;; return
205 }
206
207
208 /*****************************************************************
209 *
210 * ROUTINE : rbc_start_stop_unit
211 *
212 *-----------------------------------------------------------------
213 *
214 * Purpose : processes the rbc START_STOP_UNIT command
215 *
216 * Input Parameters : Structure defining the START_STOP_UNIT command
217 *
218 * Output Parameters : status of the operation
219 *
220 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
221 USBMS_RETURN rbc_start_stop_unit( USBMS_START_STOP_UNIT* start_stop_unit )
222 {
223 USBMS_RETURN status = USBMS_ERROR;
224
225 if( start_stop_unit->Flags.bits0.Power_Conditions == 0 )
226 {
227 /* Table 9 - START STOP control bit definitions, rbc-r10a.pdf */
228 /* Power Load/Eject START Description */
229 /* Conditions */
230 /* 1 - 7 X X LOEJ and START ignored */
231 /* 0 0 0 Stop the medium */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -