📄 bulkonly.s
字号:
.module BulkOnly.C
.area text(rom, con, rel)
.dbfile D:\AvrUSB\BulkOnly.C
.dbfunc e Bulk_CBWHandler _Bulk_CBWHandler fV
.even
_Bulk_CBWHandler::
sbiw R28,2
.dbline -1
.dbline 23
; #include <iom162v.h>
; #include <macros.h>
;
; #include "BulkOnly.H"
; #include "D12CI.H"
; #include "MAIN.H"
;
;
; extern CONTROL_XFER ControlData;
; extern EPPFLAGS bEPPflags;
; BULK_STRUCT Bulk_Block;
;
; extern BULK_CONTROL Bulk_Control_r;
; extern BULK_CONTROL Bulk_Control_w;
; extern unsigned char PageBuf[512];
;
; #define Bulk_CBW Bulk_Block.cbw
; #define Bulk_CSW Bulk_Block.csw
; #define CBW_bCBWCBLength Bulk_Block.cbw.dCBWDataTransferLength
; #define CSW_dCSWDataResidue Bulk_Block.csw.dCSWDataResidue
;
; void Bulk_CBWHandler( void )
; {
.dbline 24
; if(sizeof(CBW)==D12_ReadEndpoint(4,EP2_PACKET_SIZE,(unsigned char*)&Bulk_CBW))
ldi R24,<_Bulk_Block
ldi R25,>_Bulk_Block
std y+1,R25
std y+0,R24
ldi R18,64
ldi R16,4
xcall _D12_ReadEndpoint
cpi R16,31
brne L2
.dbline 25
; {
.dbline 26
; if(IsCBWValid())
xcall _IsCBWValid
tst R16
breq L4
.dbline 27
; {
.dbline 28
; RBC_Hander();
xcall _RBC_Hander
.dbline 29
; return;
xjmp L1
L4:
.dbline 31
; }
; }
L2:
.dbline 32
; Bulk_ErrorHandler(CSW_PHASE_ERROR,0);
clr R18
clr R19
ldi R16,2
xcall _Bulk_ErrorHandler
.dbline 33
; Bulk_CSWHandler();
xcall _Bulk_CSWHandler
.dbline -2
.dbline 34
; }
L1:
adiw R28,2
.dbline 0 ; func end
ret
.dbend
.dbfunc e Bulk_CSWHandler _Bulk_CSWHandler fV
.even
_Bulk_CSWHandler::
sbiw R28,2
.dbline -1
.dbline 36
; void Bulk_CSWHandler( void )
; {
.dbline 37
; D12_WriteEndpoint(5,sizeof(CSW),(unsigned char *)&Bulk_CSW);
ldi R24,<_Bulk_Block
ldi R25,>_Bulk_Block
std y+1,R25
std y+0,R24
ldi R18,13
ldi R16,5
xcall _D12_WriteEndpoint
.dbline 38
; bEPPflags.bits.bulk_state=BULK_IDLE;
lds R24,_bEPPflags+2
andi R24,248
sts _bEPPflags+2,R24
.dbline -2
.dbline 39
; }
L6:
adiw R28,2
.dbline 0 ; func end
ret
.dbend
.dbfunc e Bulk_code_transmit _Bulk_code_transmit fV
; len -> R12,R13
; pRomData -> R10,R11
.even
_Bulk_code_transmit::
xcall push_gset4
movw R12,R18
movw R10,R16
sbiw R28,2
.dbline -1
.dbline 41
; void Bulk_code_transmit(const unsigned char * pRomData,unsigned short len)
; {
.dbline 42
; ControlData.wCount=0;
clr R2
clr R3
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 43
; ControlData.pCData=pRomData;
sts _ControlData+14+1,R11
sts _ControlData+14,R10
.dbline 44
; ControlData.wLength=len;
sts _ControlData+8+1,R13
sts _ControlData+8,R12
.dbline 45
; if(ControlData.wLength>=CBW_bCBWCBLength)
lds R4,_Bulk_Block+8+2
lds R5,_Bulk_Block+8+2+1
lds R2,_Bulk_Block+8
lds R3,_Bulk_Block+8+1
movw R6,R12
clr R8
clr R9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L12
.dbline 46
; ControlData.wLength=CBW_bCBWCBLength;
sts _ControlData+8+1,R3
sts _ControlData+8,R2
L12:
.dbline 47
; Bulk_ErrorHandler(CSW_GOOD,ControlData.wLength);
lds R18,_ControlData+8
lds R19,_ControlData+8+1
clr R16
xcall _Bulk_ErrorHandler
.dbline 48
; if(ControlData.wLength>=EP2_PACKET_SIZE)
lds R24,_ControlData+8
lds R25,_ControlData+8+1
cpi R24,64
ldi R30,0
cpc R25,R30
brlo L19
.dbline 49
; {
.dbline 50
; D12_CWriteEndpoint(5,EP2_PACKET_SIZE,ControlData.pCData);
lds R2,_ControlData+14
lds R3,_ControlData+14+1
std y+1,R3
std y+0,R2
ldi R18,64
ldi R19,0
ldi R16,5
ldi R17,0
xcall _D12_CWriteEndpoint
.dbline 51
; ControlData.wCount+=EP2_PACKET_SIZE;
lds R24,_ControlData+10
lds R25,_ControlData+10+1
subi R24,192 ; offset = 64
sbci R25,255
sts _ControlData+10+1,R25
sts _ControlData+10,R24
.dbline 52
; bEPPflags.bits.bulk_state=BULK_REQEST_TRANS;
lds R24,_bEPPflags+2
andi R24,248
ori R24,3
sts _bEPPflags+2,R24
.dbline 53
; }
xjmp L20
L19:
.dbline 55
.dbline 56
std y+1,R11
std y+0,R10
lds R18,_ControlData+8
lds R19,_ControlData+8+1
ldi R16,5
ldi R17,0
xcall _D12_CWriteEndpoint
.dbline 57
lds R2,_ControlData+8
lds R3,_ControlData+8+1
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
sts _ControlData+10+1,R5
sts _ControlData+10,R4
.dbline 58
lds R24,_bEPPflags+2
andi R24,248
ori R24,2
sts _bEPPflags+2,R24
.dbline 59
L20:
.dbline -2
.dbline 60
; else
; {
; D12_CWriteEndpoint(5,ControlData.wLength,pRomData);
; ControlData.wCount+=ControlData.wLength;
; bEPPflags.bits.bulk_state=BULK_DATA_END;
; }
; }
L8:
adiw R28,2
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r len 12 s
.dbsym r pRomData 10 pkc
.dbend
.dbfunc e IsCBWValid _IsCBWValid fc
.even
_IsCBWValid::
xcall push_gset2
.dbline -1
.dbline 62
; BOOLEAN IsCBWValid(void)
; {
.dbline 63
; if((Bulk_CBW.dCBWSignature==CBW_SIGNATURE)&&
ldi R20,85
ldi R21,83
ldi R22,66
ldi R23,67
lds R4,_Bulk_Block+2
lds R5,_Bulk_Block+2+1
lds R2,_Bulk_Block
lds R3,_Bulk_Block+1
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L30
ldi R24,1
lds R2,_Bulk_Block+13
cp R24,R2
brlo L30
ldi R24,16
lds R2,_Bulk_Block+14
cp R24,R2
brlo L30
.dbline 66
; (Bulk_CBW.bCBWLUN<=1)&&
; (Bulk_CBW.bCBWCBLength<=MAX_CDBLEN))
; return TRUE;
ldi R16,1
xjmp L29
L30:
.dbline 68
; else
; return FALSE;
clr R16
.dbline -2
L29:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbend
.dbfunc e Bulk_ErrorHandler _Bulk_ErrorHandler fV
; wByteCount -> R18,R19
; CSWStatus -> R16
.even
_Bulk_ErrorHandler::
xcall push_gset2
.dbline -1
.dbline 71
; }
; void Bulk_ErrorHandler(unsigned char CSWStatus,unsigned int wByteCount)
; {
.dbline 72
; Bulk_CSW.dCSWDataResidue=Bulk_CBW.dCBWDataTransferLength-wByteCount;
movw R2,R18
clr R4
clr R5
lds R8,_Bulk_Block+8+2
lds R9,_Bulk_Block+8+2+1
lds R6,_Bulk_Block+8
lds R7,_Bulk_Block+8+1
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
sts _Bulk_Block+8+1,R7
sts _Bulk_Block+8,R6
sts _Bulk_Block+8+2+1,R9
sts _Bulk_Block+8+2,R8
.dbline 73
; Bulk_CSW.dCSWSignature=CSW_SIGNATURE;
ldi R20,85
ldi R21,83
ldi R22,66
ldi R23,83
sts _Bulk_Block+1,R21
sts _Bulk_Block,R20
sts _Bulk_Block+2+1,R23
sts _Bulk_Block+2,R22
.dbline 74
; Bulk_CSW.bCSWStatus=CSWStatus;
sts _Bulk_Block+12,R16
.dbline -2
.dbline 75
; }
L34:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r wByteCount 18 i
.dbsym r CSWStatus 16 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\AvrUSB\BulkOnly.C
_Bulk_Block::
.blkb 31
.dbsym e Bulk_Block _Bulk_Block X
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -