📄 isr.s
字号:
.module ISR.C
.area vector(rom, abs)
.org 4
jmp _usb_isr
.area text(rom, con, rel)
.dbfile D:\AvrUSB\ISR.C
.dbfunc e usb_isr _usb_isr fV
; x -> R20,R21
.even
_usb_isr::
xcall push_lset
xcall push_gset1
.dbline -1
.dbline 30
; #include <iom162v.h>
; #include <macros.h>
; #include <stdio.h>
; #include <string.h>
;
; #include "D12CI.h"
; #include "MAIN.h"
; #include "USB100.h"
; #include "BulkOnly.H"
;
; void bus_reset(void);
;
; void ep0_txdone(void);
; void ep0_rxdone(void);
; void ep1_txdone(void);
; void ep1_rxdone(void);
; void main_txdone(void);
; void main_rxdone(void);
;
; EPPFLAGS bEPPflags;
; extern CONTROL_XFER ControlData;
; IO_REQUEST ioRequest;
; extern BULK_CONTROL Bulk_Control_r;
; extern BULK_CONTROL Bulk_Control_w;
; extern BULK_STRUCT Bulk_Block;
; extern unsigned char PageBuf[512];
;
; #pragma interrupt_handler usb_isr:iv_INT0
; void usb_isr(void)
; {
.dbline 32
; unsigned int x;
; bEPPflags.bits.in_isr=1;
lds R24,_bEPPflags
ori R24,16
sts _bEPPflags,R24
.dbline 33
; x=D12_ReadInterruptRegister();
xcall _D12_ReadInterruptRegister
mov R20,R16
clr R21
.dbline 34
; if(x!=0)
cpi R20,0
cpc R20,R21
breq L2
X0:
.dbline 35
; {
.dbline 36
; if(x&D12_INT_BUSRESET)
sbrs R20,6
rjmp L4
.dbline 37
; {
.dbline 38
; bus_reset();
xcall _bus_reset
.dbline 39
; bEPPflags.bits.bus_reset=1;
lds R24,_bEPPflags
ori R24,1
sts _bEPPflags,R24
.dbline 40
; }
L4:
.dbline 43
; //if(x&D12_INT_EOT)
; // dma_eot();
; if(x&D12_INT_SUSPENDCHANGE)
sbrs R20,7
rjmp L6
.dbline 44
; bEPPflags.bits.suspend=1;
lds R24,_bEPPflags
ori R24,2
sts _bEPPflags,R24
L6:
.dbline 45
; if(x&D12_INT_ENDP0IN)
sbrs R20,1
rjmp L8
.dbline 46
; ep0_txdone();
xcall _ep0_txdone
L8:
.dbline 47
; if(x&D12_INT_ENDP0OUT)
sbrs R20,0
rjmp L10
.dbline 48
; ep0_rxdone();
xcall _ep0_rxdone
L10:
.dbline 49
; if(x&D12_INT_ENDP1IN)
sbrs R20,3
rjmp L12
.dbline 50
; ep1_txdone();
xcall _ep1_txdone
L12:
.dbline 51
; if(x&D12_INT_ENDP1OUT)
sbrs R20,2
rjmp L14
.dbline 52
; ep1_rxdone();
xcall _ep1_rxdone
L14:
.dbline 53
; if(x&D12_INT_ENDP2IN)
sbrs R20,5
rjmp L16
.dbline 54
; main_txdone();
xcall _main_txdone
L16:
.dbline 55
; if(x&D12_INT_ENDP2OUT)
sbrs R20,4
rjmp L18
.dbline 57
; // bEPPflags.bits.main_txdone=1;
; main_rxdone();
xcall _main_rxdone
L18:
.dbline 58
; }
L2:
.dbline 59
; bEPPflags.bits.in_isr=0;
lds R24,_bEPPflags
andi R24,239
sts _bEPPflags,R24
.dbline -2
.dbline 60
; }
L1:
xcall pop_gset1
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r x 20 i
.dbend
.dbfunc e bus_reset _bus_reset fV
.even
_bus_reset::
.dbline -1
.dbline 62
; void bus_reset(void)
; {
.dbline -2
.dbline 63
; }
L20:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ep0_rxdone _ep0_rxdone fV
; i -> R20
; ep_last -> R20
.even
_ep0_rxdone::
xcall push_gset1
sbiw R28,2
.dbline -1
.dbline 65
; void ep0_rxdone(void)
; {
.dbline 67
; unsigned char ep_last,i;
; ep_last=D12_ReadLastTransactionStatus(0);
clr R16
xcall _D12_ReadLastTransactionStatus
mov R20,R16
.dbline 68
; if(ep_last&D12_SETUPPACKET)
sbrs R16,5
rjmp L22
.dbline 69
; {
.dbline 70
; ControlData.wLength=0;
clr R2
clr R3
sts _ControlData+8+1,R3
sts _ControlData+8,R2
.dbline 71
; ControlData.wCount=0;
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 72
; if(D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),
ldi R24,<_ControlData
ldi R25,>_ControlData
std y+1,R25
std y+0,R24
ldi R18,8
clr R16
xcall _D12_ReadEndpoint
cpi R16,8
breq L26
.dbline 74
; (unsigned char *)(&(ControlData.DeviceRequest)))!=sizeof(DEVICE_REQUEST))
; {
.dbline 75
; D12_SetEndpointStatus(0,1);
ldi R18,1
clr R16
xcall _D12_SetEndpointStatus
.dbline 76
; D12_SetEndpointStatus(1,1);
ldi R18,1
ldi R16,1
xcall _D12_SetEndpointStatus
.dbline 77
; bEPPflags.bits.control_state=USB_IDLE;
lds R24,_bEPPflags
andi R24,159
sts _bEPPflags,R24
.dbline 78
; return;
xjmp L21
L26:
.dbline 80
; }
; D12_AcknowledgeEndpoint(0);
clr R16
xcall _D12_AcknowledgeEndpoint
.dbline 81
; D12_AcknowledgeEndpoint(1);
ldi R16,1
xcall _D12_AcknowledgeEndpoint
.dbline 82
; ControlData.wLength=ControlData.DeviceRequest.wLength;
lds R2,_ControlData+6
lds R3,_ControlData+6+1
sts _ControlData+8+1,R3
sts _ControlData+8,R2
.dbline 83
; ControlData.wCount=0;
clr R2
clr R3
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 84
; if(ControlData.DeviceRequest.bmRequestType&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
lds R2,_ControlData
sbrs R2,7
rjmp L31
.dbline 85
; {
.dbline 86
; bEPPflags.bits.setup_packet=1;
lds R24,_bEPPflags
ori R24,4
sts _bEPPflags,R24
.dbline 87
; bEPPflags.bits.control_state=USB_IDLE;
andi R24,159
sts _bEPPflags,R24
.dbline 88
; }
xjmp L23
L31:
.dbline 90
; else
; {
.dbline 91
; if(ControlData.DeviceRequest.wLength==0)
lds R2,_ControlData+6
lds R3,_ControlData+6+1
tst R2
brne L33
tst R3
brne L33
X1:
.dbline 92
; {
.dbline 93
; bEPPflags.bits.setup_packet=1;
lds R24,_bEPPflags
ori R24,4
sts _bEPPflags,R24
.dbline 94
; bEPPflags.bits.control_state=USB_IDLE;
andi R24,159
sts _bEPPflags,R24
.dbline 95
; }
xjmp L23
L33:
.dbline 97
; else
; {
.dbline 98
; if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
ldi R24,8
ldi R25,0
lds R2,_ControlData+6
lds R3,_ControlData+6+1
cp R24,R2
cpc R25,R3
brsh L36
.dbline 99
; {
.dbline 100
; bEPPflags.bits.control_state=USB_IDLE;
lds R24,_bEPPflags
andi R24,159
sts _bEPPflags,R24
.dbline 101
; D12_SetEndpointStatus(0,1);
ldi R18,1
clr R16
xcall _D12_SetEndpointStatus
.dbline 102
; D12_SetEndpointStatus(1,1);
ldi R18,1
ldi R16,1
xcall _D12_SetEndpointStatus
.dbline 103
; }
xjmp L23
L36:
.dbline 105
; else
; {
.dbline 106
; bEPPflags.bits.control_state=USB_RECEIVE;
lds R24,_bEPPflags
andi R24,159
ori R24,64
sts _bEPPflags,R24
.dbline 107
; }
.dbline 108
; }
.dbline 109
; }
.dbline 110
; }
xjmp L23
L22:
.dbline 111
; else if(bEPPflags.bits.control_state==USB_RECEIVE)
lds R24,_bEPPflags
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
andi R24,3
cpi R24,2
brne L39
.dbline 112
; {
.dbline 113
; i=D12_ReadEndpoint(0,EP0_PACKET_SIZE,ControlData.dataBuffer+ControlData.wCount);
ldi R24,<_ControlData+16
ldi R25,>_ControlData+16
lds R2,_ControlData+10
lds R3,_ControlData+10+1
add R2,R24
adc R3,R25
std y+1,R3
std y+0,R2
ldi R18,16
clr R16
xcall _D12_ReadEndpoint
mov R20,R16
.dbline 114
; ControlData.wCount+=i;
mov R2,R20
clr R3
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 115
; if(i!=EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength)
cpi R16,16
brne L48
lds R2,_ControlData+8
lds R3,_ControlData+8+1
cp R4,R2
cpc R5,R3
brlo L40
L48:
.dbline 116
; {
.dbline 117
; bEPPflags.bits.setup_packet=1;
lds R24,_bEPPflags
ori R24,4
sts _bEPPflags,R24
.dbline 118
; bEPPflags.bits.control_state=USB_IDLE;
andi R24,159
sts _bEPPflags,R24
.dbline 119
; }
.dbline 120
; }
xjmp L40
L39:
.dbline 122
; else
; {
.dbline 123
; bEPPflags.bits.control_state=USB_IDLE;
lds R24,_bEPPflags
andi R24,159
sts _bEPPflags,R24
.dbline 124
; }
L40:
L23:
.dbline -2
.dbline 125
; }
L21:
adiw R28,2
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r ep_last 20 c
.dbend
.dbfunc e ep0_txdone _ep0_txdone fV
; i -> R20,R21
.even
_ep0_txdone::
xcall push_gset1
sbiw R28,2
.dbline -1
.dbline 127
; void ep0_txdone(void)
; {
.dbline 128
; short i=ControlData.wLength-ControlData.wCount;
lds R2,_ControlData+10
lds R3,_ControlData+10+1
lds R20,_ControlData+8
lds R21,_ControlData+8+1
sub R20,R2
sbc R21,R3
.dbline 129
; D12_ReadLastTransactionStatus(1);
ldi R16,1
xcall _D12_ReadLastTransactionStatus
.dbline 130
; if(bEPPflags.bits.control_state!=USB_TRANSMIT)
lds R24,_bEPPflags
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
andi R24,3
cpi R24,1
breq L52
.dbline 131
; return;
xjmp L49
L52:
.dbline 132
; if(i>=EP0_PACKET_SIZE)
cpi R20,16
ldi R30,0
cpc R21,R30
brlt L54
.dbline 133
; {
.dbline 134
; if(bEPPflags.bits.rom_state)
lds R2,_bEPPflags
lds R3,_bEPPflags+1
sbrs R3,3
rjmp L56
.dbline 135
; D12_CWriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pCData+ControlData.wCount);
lds R2,_ControlData+14
lds R3,_ControlData+14+1
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
std y+1,R5
std y+0,R4
ldi R18,16
ldi R19,0
ldi R16,1
ldi R17,0
xcall _D12_CWriteEndpoint
xjmp L57
L56:
.dbline 137
; else
; D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData+ControlData.wCount);
lds R2,_ControlData+12
lds R3,_ControlData+12+1
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
std y+1,R5
std y+0,R4
ldi R18,16
ldi R16,1
xcall _D12_WriteEndpoint
L57:
.dbline 138
; ControlData.wCount+=EP0_PACKET_SIZE;
lds R24,_ControlData+10
lds R25,_ControlData+10+1
adiw R24,16
sts _ControlData+10+1,R25
sts _ControlData+10,R24
.dbline 139
; bEPPflags.bits.control_state=USB_TRANSMIT;
lds R24,_bEPPflags
andi R24,159
ori R24,32
sts _bEPPflags,R24
.dbline 140
; }
xjmp L55
L54:
.dbline 141
; else if(i!=0)
cpi R20,0
cpc R20,R21
breq L63
X2:
.dbline 142
; {
.dbline 143
; if(bEPPflags.bits.rom_state)
lds R2,_bEPPflags
lds R3,_bEPPflags+1
sbrs R3,3
rjmp L65
.dbline 144
; D12_CWriteEndpoint(1,i,ControlData.pCData+ControlData.wCount);
lds R2,_ControlData+14
lds R3,_ControlData+14+1
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
std y+1,R5
std y+0,R4
movw R18,R20
ldi R16,1
ldi R17,0
xcall _D12_CWriteEndpoint
xjmp L66
L65:
.dbline 146
; else
; D12_WriteEndpoint(1,i,ControlData.pData+ControlData.wCount);
lds R2,_ControlData+12
lds R3,_ControlData+12+1
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
std y+1,R5
std y+0,R4
mov R18,R20
ldi R16,1
xcall _D12_WriteEndpoint
L66:
.dbline 147
; ControlData.wCount+=i;
lds R2,_ControlData+10
lds R3,_ControlData+10+1
add R2,R20
adc R3,R21
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 148
; bEPPflags.bits.control_state=USB_IDLE;
lds R24,_bEPPflags
andi R24,159
sts _bEPPflags,R24
.dbline 149
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -