📄 main.c.lss
字号:
6e0: ac 01 movw r20, r24
6e2: 60 e1 ldi r22, 0x10 ; 16
6e4: 81 e0 ldi r24, 0x01 ; 1
6e6: 0e 94 4d 02 call 0x49a <D12_WriteEndpoint>
6ea: 80 91 2e 01 lds r24, 0x012E
6ee: 90 91 2f 01 lds r25, 0x012F
6f2: 40 96 adiw r24, 0x10 ; 16
6f4: 90 93 2f 01 sts 0x012F, r25
6f8: 80 93 2e 01 sts 0x012E, r24
6fc: 80 91 22 01 lds r24, 0x0122
700: 8f 73 andi r24, 0x3F ; 63
702: 80 64 ori r24, 0x40 ; 64
704: 24 c0 rjmp .+72 ; 0x74e <ep0_txdone+0xb2>
706: 20 97 sbiw r28, 0x00 ; 0
708: d1 f0 breq .+52 ; 0x73e <ep0_txdone+0xa2>
70a: 80 91 30 01 lds r24, 0x0130
70e: 90 91 31 01 lds r25, 0x0131
712: 20 91 2e 01 lds r18, 0x012E
716: 30 91 2f 01 lds r19, 0x012F
71a: 82 0f add r24, r18
71c: 93 1f adc r25, r19
71e: ac 01 movw r20, r24
720: 6c 2f mov r22, r28
722: 81 e0 ldi r24, 0x01 ; 1
724: 0e 94 4d 02 call 0x49a <D12_WriteEndpoint>
728: 80 91 2e 01 lds r24, 0x012E
72c: 90 91 2f 01 lds r25, 0x012F
730: 8c 0f add r24, r28
732: 9d 1f adc r25, r29
734: 90 93 2f 01 sts 0x012F, r25
738: 80 93 2e 01 sts 0x012E, r24
73c: 05 c0 rjmp .+10 ; 0x748 <ep0_txdone+0xac>
73e: ae 01 movw r20, r28
740: 60 e0 ldi r22, 0x00 ; 0
742: 81 e0 ldi r24, 0x01 ; 1
744: 0e 94 4d 02 call 0x49a <D12_WriteEndpoint>
748: 80 91 22 01 lds r24, 0x0122
74c: 8f 73 andi r24, 0x3F ; 63
74e: 80 93 22 01 sts 0x0122, r24
752: df 91 pop r29
754: cf 91 pop r28
756: 08 95 ret
00000758 <main_rxdone>:
// LED();
}
//主端点OUT控制
void main_rxdone(void)
{
758: 1f 93 push r17
unsigned char len,epstatus,j;
j=D12_ReadLastTransactionStatus(4); //清中断标志位
75a: 84 e0 ldi r24, 0x04 ; 4
75c: 0e 94 9b 01 call 0x336 <D12_ReadLastTransactionStatus>
epstatus=D12_ReadEndpointStatus(4); //读取缓冲区状态
760: 84 e0 ldi r24, 0x04 ; 4
762: 0e 94 bc 01 call 0x378 <D12_ReadEndpointStatus>
epstatus &=0x60;
766: 18 2f mov r17, r24
768: 10 76 andi r17, 0x60 ; 96
//接收数据
len=D12_ReadEndpoint(4,64,EpBuf);
76a: 40 91 20 01 lds r20, 0x0120
76e: 50 91 21 01 lds r21, 0x0121
772: 60 e4 ldi r22, 0x40 ; 64
774: 84 e0 ldi r24, 0x04 ; 4
776: 0e 94 e9 01 call 0x3d2 <D12_ReadEndpoint>
if(epstatus==0x60)
77a: 10 36 cpi r17, 0x60 ; 96
77c: 41 f4 brne .+16 ; 0x78e <main_rxdone+0x36>
len=D12_ReadEndpoint(4,64,EpBuf); //读取双缓冲区数据
77e: 40 91 20 01 lds r20, 0x0120
782: 50 91 21 01 lds r21, 0x0121
786: 60 e4 ldi r22, 0x40 ; 64
788: 84 e0 ldi r24, 0x04 ; 4
78a: 0e 94 e9 01 call 0x3d2 <D12_ReadEndpoint>
78e: 1f 91 pop r17
790: 08 95 ret
00000792 <fn_usb_isr>:
792: cf 93 push r28
794: df 93 push r29
796: f8 94 cli
798: 80 91 22 01 lds r24, 0x0122
79c: 80 62 ori r24, 0x20 ; 32
79e: 80 93 22 01 sts 0x0122, r24
7a2: 0e 94 77 01 call 0x2ee <D12_ReadInterruptRegister>
7a6: ec 01 movw r28, r24
7a8: 00 97 sbiw r24, 0x00 ; 0
7aa: 31 f1 breq .+76 ; 0x7f8 <fn_usb_isr+0x66>
7ac: 86 ff sbrs r24, 6
7ae: 05 c0 rjmp .+10 ; 0x7ba <fn_usb_isr+0x28>
7b0: 80 91 22 01 lds r24, 0x0122
7b4: 82 60 ori r24, 0x02 ; 2
7b6: 80 93 22 01 sts 0x0122, r24
7ba: c7 ff sbrs r28, 7
7bc: 05 c0 rjmp .+10 ; 0x7c8 <fn_usb_isr+0x36>
7be: 80 91 22 01 lds r24, 0x0122
7c2: 84 60 ori r24, 0x04 ; 4
7c4: 80 93 22 01 sts 0x0122, r24
7c8: c1 ff sbrs r28, 1
7ca: 02 c0 rjmp .+4 ; 0x7d0 <fn_usb_isr+0x3e>
7cc: 0e 94 4e 03 call 0x69c <ep0_txdone>
7d0: c0 ff sbrs r28, 0
7d2: 02 c0 rjmp .+4 ; 0x7d8 <fn_usb_isr+0x46>
7d4: 0e 94 cd 02 call 0x59a <ep0_rxdone>
7d8: c3 ff sbrs r28, 3
7da: 02 c0 rjmp .+4 ; 0x7e0 <fn_usb_isr+0x4e>
7dc: 0e 94 b8 02 call 0x570 <ep1_txdone>
7e0: c2 ff sbrs r28, 2
7e2: 02 c0 rjmp .+4 ; 0x7e8 <fn_usb_isr+0x56>
7e4: 0e 94 bc 02 call 0x578 <ep1_rxdone>
7e8: c5 ff sbrs r28, 5
7ea: 02 c0 rjmp .+4 ; 0x7f0 <fn_usb_isr+0x5e>
7ec: 0e 94 b4 02 call 0x568 <main_txdone>
7f0: c4 ff sbrs r28, 4
7f2: 02 c0 rjmp .+4 ; 0x7f8 <fn_usb_isr+0x66>
7f4: 0e 94 ac 03 call 0x758 <main_rxdone>
7f8: 80 91 22 01 lds r24, 0x0122
7fc: 8f 7d andi r24, 0xDF ; 223
7fe: 80 93 22 01 sts 0x0122, r24
802: 78 94 sei
804: df 91 pop r29
806: cf 91 pop r28
808: 08 95 ret
0000080a <reserved>:
**********************************/
//保留子程序
void reserved(void)
{
stall_ep0(); //返回STALL
80a: 0e 94 aa 02 call 0x554 <stall_ep0>
80e: 08 95 ret
00000810 <init_unconfig>:
}
//进入地址状态,禁止0除外的所有端点
void init_unconfig(void)
{
D12_SetEndpointEnable(0); //禁止除0外的所有端点
810: 80 e0 ldi r24, 0x00 ; 0
812: 0e 94 3c 01 call 0x278 <D12_SetEndpointEnable>
816: 08 95 ret
00000818 <init_config>:
}
//配置处理,允许端点收发
void init_config(void)
{
D12_SetEndpointEnable(1); //允许端点收发
818: 81 e0 ldi r24, 0x01 ; 1
81a: 0e 94 3c 01 call 0x278 <D12_SetEndpointEnable>
81e: 08 95 ret
00000820 <single_transmit>:
}
//通过端点索引1发送数据(Data类型)
void single_transmit(unsigned char *buf,unsigned char len)
{
820: ac 01 movw r20, r24
if(len <= EP0_PACKET_SIZE)
822: 61 31 cpi r22, 0x11 ; 17
824: 18 f4 brcc .+6 ; 0x82c <single_transmit+0xc>
{
D12_WriteEndpoint(1,len,buf);
826: 81 e0 ldi r24, 0x01 ; 1
828: 0e 94 4d 02 call 0x49a <D12_WriteEndpoint>
82c: 08 95 ret
0000082e <code_transmit>:
}
}
//通过端点索引1发送数据(CODE类型)
void code_transmit(unsigned char *pRomData,unsigned short len)
{
82e: ac 01 movw r20, r24
ControlData.wCount=0;
830: 10 92 2f 01 sts 0x012F, r1
834: 10 92 2e 01 sts 0x012E, r1
if(ControlData.wLength>len)
838: 80 91 2c 01 lds r24, 0x012C
83c: 90 91 2d 01 lds r25, 0x012D
840: 68 17 cp r22, r24
842: 79 07 cpc r23, r25
844: 20 f4 brcc .+8 ; 0x84e <code_transmit+0x20>
ControlData.wLength=len; //发送数据长度控制
846: 70 93 2d 01 sts 0x012D, r23
84a: 60 93 2c 01 sts 0x012C, r22
ControlData.pData=pRomData;
84e: 50 93 31 01 sts 0x0131, r21
852: 40 93 30 01 sts 0x0130, r20
if(ControlData.wLength>=EP0_PACKET_SIZE)
856: 80 91 2c 01 lds r24, 0x012C
85a: 90 91 2d 01 lds r25, 0x012D
85e: 40 97 sbiw r24, 0x10 ; 16
860: b0 f0 brcs .+44 ; 0x88e <code_transmit+0x60>
{
D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);
862: 60 e1 ldi r22, 0x10 ; 16
864: 81 e0 ldi r24, 0x01 ; 1
866: 0e 94 4d 02 call 0x49a <D12_WriteEndpoint>
ControlData.wCount += EP0_PACKET_SIZE;
86a: 80 91 2e 01 lds r24, 0x012E
86e: 90 91 2f 01 lds r25, 0x012F
872: 40 96 adiw r24, 0x10 ; 16
874: 90 93 2f 01 sts 0x012F, r25
878: 80 93 2e 01 sts 0x012E, r24
DISABLE;
87c: f8 94 cli
bEPPflags.bits.control_state=USB_TRANSMIT; //标志发送状态
87e: 80 91 22 01 lds r24, 0x0122
882: 8f 73 andi r24, 0x3F ; 63
884: 80 64 ori r24, 0x40 ; 64
886: 80 93 22 01 sts 0x0122, r24
ENABLE;
88a: 78 94 sei
88c: 08 95 ret
}
else
{
D12_WriteEndpoint(1,ControlData.wLength,pRomData);
88e: 60 91 2c 01 lds r22, 0x012C
892: 81 e0 ldi r24, 0x01 ; 1
894: 0e 94 4d 02 call 0x49a <D12_WriteEndpoint>
ControlData.wCount += ControlData.wLength;
898: 80 91 2e 01 lds r24, 0x012E
89c: 90 91 2f 01 lds r25, 0x012F
8a0: 20 91 2c 01 lds r18, 0x012C
8a4: 30 91 2d 01 lds r19, 0x012D
8a8: 82 0f add r24, r18
8aa: 93 1f adc r25, r19
8ac: 90 93 2f 01 sts 0x012F, r25
8b0: 80 93 2e 01 sts 0x012E, r24
DISABLE;
8b4: f8 94 cli
bEPPflags.bits.control_state=USB_IDLE; //标志发送状态
8b6: 80 91 22 01 lds r24, 0x0122
8ba: 8f 73 andi r24, 0x3F ; 63
8bc: 80 93 22 01 sts 0x0122, r24
ENABLE;
8c0: 78 94 sei
8c2: 08 95 ret
000008c4 <get_status>:
}
}
/**********************************
USB标准请求服务子程序
**********************************/
//获取状态
void get_status(void)
{
8c4: cf 93 push r28
8c6: df 93 push r29
8c8: cd b7 in r28, 0x3d ; 61
8ca: de b7 in r29, 0x3e ; 62
8cc: 22 97 sbiw r28, 0x02 ; 2
8ce: 0f b6 in r0, 0x3f ; 63
8d0: f8 94 cli
8d2: de bf out 0x3e, r29 ; 62
8d4: 0f be out 0x3f, r0 ; 63
8d6: cd bf out 0x3d, r28 ; 61
unsigned char endp,txdat[2];
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
8d8: 80 91 24 01 lds r24, 0x0124
8dc: 8f 71 andi r24, 0x1F ; 31
unsigned char c;
if(bRecipient == USB_RECIPIENT_DEVICE)
8de: 49 f4 brne .+18 ; 0x8f2 <get_status+0x2e>
{ //返回设备状态
if(bEPPflags.bits.remote_wakeup==1)
8e0: 80 91 22 01 lds r24, 0x0122
8e4: 84 ff sbrs r24, 4
8e6: 02 c0 rjmp .+4 ; 0x8ec <get_status+0x28>
txdat[0]=3; //支持远程唤醒,自供电
8e8: 83 e0 ldi r24, 0x03 ; 3
8ea: 01 c0 rjmp .+2 ; 0x8ee <get_status+0x2a>
else
txdat[0]=1;
8ec: 81 e0 ldi r24, 0x01 ; 1
8ee: 89 83 std Y+1, r24 ; 0x01
8f0: 18 c0 rjmp .+48 ; 0x922 <get_status+0x5e>
txdat[1]=0;
single_transmit(txdat,2); //发送数据
}
else
if(bRecipient == USB_RECIPIENT_INTERFACE)
8f2: 81 30 cpi r24, 0x01 ; 1
8f4: a9 f0 breq .+42 ; 0x920 <get_status+0x5c>
{ //返回接口状态
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat,2); //发送数据
}
else
if(bRecipient == USB_RECIPIENT_ENDPOINT)
8f6: 82 30 cpi r24, 0x02 ; 2
8f8: e1 f4 brne .+56 ; 0x932 <get_status+0x6e>
{ //返回端点状态
endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
8fa: 90 91 28 01 lds r25, 0x0128
8fe: 89 2f mov r24, r25
900: 83 70 andi r24, 0x03 ; 3
902: 28 2f mov r18, r24
904: 33 27 eor r19, r19
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
906: 97 ff sbrs r25, 7
908: 05 c0 rjmp .+10 ; 0x914 <get_status+0x50>
c=D12_SelectEndpoint(endp*2+1); //读取输入端点状态
90a: 22 0f add r18, r18
90c: 33 1f adc r19, r19
90e: 82 2f mov r24, r18
910: 8f 5f subi r24, 0xFF ; 255
912: 02 c0 rjmp .+4 ; 0x918 <get_status+0x54>
else
c=D12_SelectEndpoint(endp*2); //读取输出端点状态
914: 82 2f mov r24, r18
916: 88 0f add r24, r24
918: 0e 94 8f 01 call 0x31e <D12_SelectEndpoint>
if(c & D12_STALL)
91c: 81 fd sbrc r24, 1
91e: e6 cf rjmp .-52 ; 0x8ec <get_status+0x28>
txdat[0]=1; //端点禁止
else
txdat[0]=0; //端点有效
920: 19 82 std Y+1, r1 ; 0x01
txdat[1]=0;
922: fe 01 movw r30, r28
924: 31 96 adiw r30, 0x01 ; 1
926: 11 82 std Z+1, r1 ; 0x01
single_transmit(txdat,2); //发送数据
928: 62 e0 ldi r22, 0x02 ; 2
92a: cf 01 movw r24, r30
92c: 0e 94 10 04 call 0x820 <single_transmit>
930: 02 c0 rjmp .+4 ; 0x936 <get_status+0x72>
}
else
stall_ep0(); //非标准请求,发STALL
932: 0e 94 aa 02 call 0x554 <stall_ep0>
936: 22 96 adiw r28, 0x02 ; 2
938: 0f b6 in r0, 0x3f ; 63
93a: f8 94 cli
93c: de bf out 0x3e, r29 ; 62
93e: 0f be out 0x3f, r0 ; 63
940: cd bf out 0x3d, r28 ; 61
942: df 91 pop r29
944: cf 91 pop r28
946: 08 95 ret
00000948 <clear_feature>:
}
//清除特性
void clear_feature(void)
{
unsigned char endp; //读取请求类型中的接收方
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
948: 80 91 24 01 lds r24, 0x0124
94c: 8f 71 andi r24, 0x1F ; 31
if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
94e: 71 f4 brne .+28 ; 0x96c <clear_feature+0x24>
950: 80 91 26 01 lds r24, 0x0126
954: 90 91 27 01 lds r25, 0x0127
958: 01 97 sbiw r24, 0x01 ; 1
95a: 31 f5 brne .+76 ; 0x9a8 <clear_feature+0x60>
{//清除远程唤醒特性
DISABLE;
95c: f8 94 cli
bEPPflags.bits.remote_wakeup=0;
95e: 80 91 22 01 lds r24, 0x0122
962: 8f 7e andi r24, 0xEF ; 239
964: 80 93 22 01 sts 0x0122, r24
ENABLE;
968: 78 94 sei
96a: 18 c0 rjmp .+48 ; 0x99c <clear_feature+0x54>
single_transmit(0,0); //返回应答
}
else
if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
96c: 82 30 cpi r24, 0x02 ; 2
96e: e1 f4 brne .+56 ; 0x9a8 <clear_feature+0x60>
970: 80 91 26 01 lds r24, 0x0126
974: 90 91 27 01 lds r25, 0x0127
978: 89 2b or r24, r25
97a: b1 f4 brne .+44 ; 0x9a8 <clear_feature+0x60>
{ //清除端点禁止特性,恢复其使用
endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
97c: 80 91 28 01 lds r24, 0x0128
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
980: 68 2f mov r22, r24
982: 60 78 andi r22, 0x80 ; 128
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -