📄 usb_scsi.txt
字号:
000004 2912 CMP r1,#0x12
000006 d900 BLS |L7.10|
;;;173 {
;;;174 Request_Sense_data_Length = CBW.CB[4];
;;;175 }
;;;176 else
;;;177 {
;;;178 Request_Sense_data_Length = REQUEST_SENSE_DATA_LEN;
000008 2112 MOVS r1,#0x12
|L7.10|
;;;179 }
;;;180 Transfer_Data_Request(Scsi_Sense_Data, Request_Sense_data_Length);
00000a 4802 LDR r0,|L7.20|
00000c f7ffbffe B.W Transfer_Data_Request
;;;181 }
;;;182
ENDP
|L7.16|
000010 00000000 DCD ||CBW||
|L7.20|
000014 00000000 DCD Scsi_Sense_Data
AREA ||i.SCSI_Start_Stop_Unit_Cmd||, CODE, READONLY, ALIGN=1
SCSI_Start_Stop_Unit_Cmd PROC
;;;205 {
;;;206 Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
000000 2101 MOVS r1,#1
000002 2000 MOVS r0,#0
000004 f7ffbffe B.W Set_CSW
;;;207 }
;;;208
ENDP
AREA ||i.SCSI_Address_Management||, CODE, READONLY, ALIGN=2
SCSI_Address_Management PROC
;;;397 bool SCSI_Address_Management(u8 lun , u8 Cmd , u32 LBA , u32 BlockNbr)
;;;398 {
000000 b570 PUSH {r4-r6,lr}
;;;399
;;;400 if ((LBA + BlockNbr) > Mass_Block_Count[lun] )
000002 4c16 LDR r4,|L9.92|
000004 441a ADD r2,r2,r3
000006 f8546020 LDR r6,[r4,r0,LSL #2]
00000a 2505 MOVS r5,#5
00000c 4c14 LDR r4,|L9.96|
00000e 42b2 CMP r2,r6
000010 d90a BLS |L9.40|
;;;401 {
;;;402 if (Cmd == SCSI_WRITE10)
000012 292a CMP r1,#0x2a
000014 d102 BNE |L9.28|
;;;403 {
;;;404 Bot_Abort(BOTH_DIR);
000016 2002 MOVS r0,#2
000018 f7fffffe BL Bot_Abort
|L9.28|
;;;405 }
;;;406 Bot_Abort(DIR_IN);
00001c 2000 MOVS r0,#0
00001e f7fffffe BL Bot_Abort
000022 70a5 STRB r5,[r4,#2] ; Scsi_Sense_Data
000024 2021 MOVS r0,#0x21
;;;407 Set_Scsi_Sense_Data(lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE);
;;;408 Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
;;;409 return (FALSE);
000026 e010 B |L9.74|
|L9.40|
;;;410 }
;;;411
;;;412
;;;413 if (CBW.dDataLength != BlockNbr * Mass_Block_Size[lun])
000028 4e0f LDR r6,|L9.104|
00002a 4a0e LDR r2,|L9.100|
00002c f8560020 LDR r0,[r6,r0,LSL #2]
000030 6892 LDR r2,[r2,#8] ; CBW
000032 4358 MULS r0,r3,r0
000034 4282 CMP r2,r0
000036 d00f BEQ |L9.88|
;;;414 {
;;;415 if (Cmd == SCSI_WRITE10)
000038 292a CMP r1,#0x2a
00003a d101 BNE |L9.64|
;;;416 {
;;;417 Bot_Abort(BOTH_DIR);
00003c 2002 MOVS r0,#2
00003e e000 B |L9.66|
|L9.64|
;;;418 }
;;;419 else
;;;420 {
;;;421 Bot_Abort(DIR_IN);
000040 2000 MOVS r0,#0
|L9.66|
000042 f7fffffe BL Bot_Abort
000046 70a5 STRB r5,[r4,#2] ; Scsi_Sense_Data
000048 2024 MOVS r0,#0x24
|L9.74|
00004a 7320 STRB r0,[r4,#0xc] ; Scsi_Sense_Data
;;;422 }
;;;423 Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
;;;424 Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
00004c 2100 MOVS r1,#0
00004e 2001 MOVS r0,#1
000050 f7fffffe BL Set_CSW
;;;425 return (FALSE);
000054 2000 MOVS r0,#0
;;;426 }
;;;427 return (TRUE);
;;;428 }
000056 bd70 POP {r4-r6,pc}
|L9.88|
000058 2001 MOVS r0,#1 ;427
00005a bd70 POP {r4-r6,pc}
;;;429 /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
ENDP
|L9.92|
00005c 00000000 DCD Mass_Block_Count
|L9.96|
000060 00000000 DCD Scsi_Sense_Data
|L9.100|
000064 00000000 DCD ||CBW||
|L9.104|
000068 00000000 DCD Mass_Block_Size
AREA ||i.SCSI_Read10_Cmd||, CODE, READONLY, ALIGN=2
SCSI_Read10_Cmd PROC
;;;216 void SCSI_Read10_Cmd(u8 lun , u32 LBA , u32 BlockNbr)
;;;217 {
000000 e92d41f0 PUSH {r4-r8,lr}
;;;218
;;;219 if (Bot_State == BOT_IDLE)
000004 4d16 LDR r5,|L10.96|
000006 4606 MOV r6,r0 ;217
000008 7828 LDRB r0,[r5,#0] ; Bot_State
00000a 460f MOV r7,r1 ;217
00000c 4690 MOV r8,r2 ;217
00000e b9e0 CBNZ r0,|L10.74|
;;;220 {
;;;221 if (!(SCSI_Address_Management(CBW.bLUN, SCSI_READ10, LBA, BlockNbr)))/*address out of range*/
000010 4c14 LDR r4,|L10.100|
000012 4643 MOV r3,r8
000014 7b60 LDRB r0,[r4,#0xd] ; CBW
000016 463a MOV r2,r7
000018 2128 MOVS r1,#0x28
00001a f7fffffe BL SCSI_Address_Management
00001e 2800 CMP r0,#0
000020 d01c BEQ |L10.92|
;;;222 {
;;;223 return;
;;;224 }
;;;225
;;;226 if ((CBW.bmFlags & 0x80) != 0)
000022 7b20 LDRB r0,[r4,#0xc] ; CBW
000024 0600 LSLS r0,r0,#24
;;;227 {
;;;228 Bot_State = BOT_DATA_IN;
000026 f04f0002 MOV r0,#2
00002a d501 BPL |L10.48|
00002c 7028 STRB r0,[r5,#0] ; Bot_State
;;;229 Read_Memory(lun, LBA , BlockNbr);
00002e e00e B |L10.78|
|L10.48|
;;;230 }
;;;231 else
;;;232 {
;;;233 Bot_Abort(BOTH_DIR);
000030 f7fffffe BL Bot_Abort
000034 480c LDR r0,|L10.104|
000036 2105 MOVS r1,#5
000038 7081 STRB r1,[r0,#2] ; Scsi_Sense_Data
00003a 2124 MOVS r1,#0x24
00003c 7301 STRB r1,[r0,#0xc] ; Scsi_Sense_Data
;;;234 Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
;;;235 Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE);
00003e e8bd41f0 POP {r4-r8,lr}
000042 2101 MOVS r1,#1
000044 4608 MOV r0,r1
000046 f7ffbffe B.W Set_CSW
|L10.74|
;;;236 }
;;;237 return;
;;;238 }
;;;239 else if (Bot_State == BOT_DATA_IN)
00004a 2802 CMP r0,#2
00004c d106 BNE |L10.92|
|L10.78|
;;;240 {
;;;241 Read_Memory(lun , LBA , BlockNbr);
00004e 4642 MOV r2,r8
000050 4639 MOV r1,r7
000052 4630 MOV r0,r6
000054 e8bd41f0 POP {r4-r8,lr}
000058 f7ffbffe B.W Read_Memory
|L10.92|
;;;242 }
;;;243 }
00005c e8bd81f0 POP {r4-r8,pc}
;;;244
ENDP
|L10.96|
000060 00000000 DCD Bot_State
|L10.100|
000064 00000000 DCD ||CBW||
|L10.104|
000068 00000000 DCD Scsi_Sense_Data
AREA ||i.SCSI_Write10_Cmd||, CODE, READONLY, ALIGN=2
SCSI_Write10_Cmd PROC
;;;252 void SCSI_Write10_Cmd(u8 lun , u32 LBA , u32 BlockNbr)
;;;253 {
000000 b570 PUSH {r4-r6,lr}
;;;254
;;;255 if (Bot_State == BOT_IDLE)
000002 4d16 LDR r5,|L11.92|
000004 782c LDRB r4,[r5,#0] ; Bot_State
000006 bb14 CBNZ r4,|L11.78|
;;;256 {
;;;257 if (!(SCSI_Address_Management(CBW.bLUN, SCSI_WRITE10 , LBA, BlockNbr)))/*address out of range*/
000008 4c15 LDR r4,|L11.96|
00000a 4613 MOV r3,r2
00000c 460a MOV r2,r1
00000e 7b60 LDRB r0,[r4,#0xd] ; CBW
000010 212a MOVS r1,#0x2a
000012 f7fffffe BL SCSI_Address_Management
000016 2800 CMP r0,#0
000018 d01f BEQ |L11.90|
;;;258 {
;;;259 return;
;;;260 }
;;;261
;;;262 if ((CBW.bmFlags & 0x80) == 0)
00001a 7b20 LDRB r0,[r4,#0xc] ; CBW
00001c 0600 LSLS r0,r0,#24
00001e d408 BMI |L11.50|
;;;263 {
;;;264 Bot_State = BOT_DATA_OUT;
000020 2001 MOVS r0,#1
000022 7028 STRB r0,[r5,#0] ; Bot_State
;;;265 SetEPRxStatus(ENDP2, EP_RX_VALID);
000024 e8bd4070 POP {r4-r6,lr}
000028 f44f5140 MOV r1,#0x3000
00002c 2002 MOVS r0,#2
00002e f7ffbffe B.W SetEPRxStatus
|L11.50|
;;;266 }
;;;267 else
;;;268 {
;;;269 Bot_Abort(DIR_IN);
000032 2000 MOVS r0,#0
000034 f7fffffe BL Bot_Abort
000038 480a LDR r0,|L11.100|
00003a 2105 MOVS r1,#5
00003c 7081 STRB r1,[r0,#2] ; Scsi_Sense_Data
00003e 2124 MOVS r1,#0x24
000040 7301 STRB r1,[r0,#0xc] ; Scsi_Sense_Data
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -