📄 main.c.lss
字号:
984: 83 70 andi r24, 0x03 ; 3
986: 99 27 eor r25, r25
988: 66 23 and r22, r22
98a: 29 f0 breq .+10 ; 0x996 <clear_feature+0x4e>
D12_SetEndpointStatus(endp*2+1,0); //清除输入端点STALL特性
98c: 88 0f add r24, r24
98e: 99 1f adc r25, r25
990: 60 e0 ldi r22, 0x00 ; 0
992: 8f 5f subi r24, 0xFF ; 255
994: 01 c0 rjmp .+2 ; 0x998 <clear_feature+0x50>
else
D12_SetEndpointStatus(endp*2,0); //清除输出端点STALL特性
996: 88 0f add r24, r24
998: 0e 94 a9 01 call 0x352 <D12_SetEndpointStatus>
single_transmit(0,0); //发送响应
99c: 60 e0 ldi r22, 0x00 ; 0
99e: 80 e0 ldi r24, 0x00 ; 0
9a0: 90 e0 ldi r25, 0x00 ; 0
9a2: 0e 94 10 04 call 0x820 <single_transmit>
9a6: 08 95 ret
}
else
stall_ep0(); //没有该请求,返回STALL
9a8: 0e 94 aa 02 call 0x554 <stall_ep0>
9ac: 08 95 ret
000009ae <set_feature>:
}
//设置特性
void set_feature(void)
{
unsigned char endp;
//读取设备请求中的接收方
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
9ae: 80 91 24 01 lds r24, 0x0124
9b2: 8f 71 andi r24, 0x1F ; 31
if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
9b4: 71 f4 brne .+28 ; 0x9d2 <set_feature+0x24>
9b6: 80 91 26 01 lds r24, 0x0126
9ba: 90 91 27 01 lds r25, 0x0127
9be: 01 97 sbiw r24, 0x01 ; 1
9c0: 69 f5 brne .+90 ; 0xa1c <set_feature+0x6e>
{//设置远程唤醒特性
DISABLE;
9c2: f8 94 cli
bEPPflags.bits.remote_wakeup=1;
9c4: 80 91 22 01 lds r24, 0x0122
9c8: 80 61 ori r24, 0x10 ; 16
9ca: 80 93 22 01 sts 0x0122, r24
ENABLE;
9ce: 78 94 sei
9d0: 1f c0 rjmp .+62 ; 0xa10 <set_feature+0x62>
single_transmit(0,0); //返回应答
}
else
if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
9d2: 82 30 cpi r24, 0x02 ; 2
9d4: 19 f5 brne .+70 ; 0xa1c <set_feature+0x6e>
9d6: 80 91 26 01 lds r24, 0x0126
9da: 90 91 27 01 lds r25, 0x0127
9de: 89 2b or r24, r25
9e0: e9 f4 brne .+58 ; 0xa1c <set_feature+0x6e>
{
endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
9e2: 90 91 28 01 lds r25, 0x0128
9e6: 89 2f mov r24, r25
9e8: 83 70 andi r24, 0x03 ; 3
9ea: 28 2f mov r18, r24
9ec: 33 27 eor r19, r19
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
9ee: 97 ff sbrs r25, 7
9f0: 06 c0 rjmp .+12 ; 0x9fe <set_feature+0x50>
D12_SetEndpointStatus(endp*2+1,1);
9f2: 22 0f add r18, r18
9f4: 33 1f adc r19, r19
9f6: 61 e0 ldi r22, 0x01 ; 1
9f8: 82 2f mov r24, r18
9fa: 86 0f add r24, r22
9fc: 07 c0 rjmp .+14 ; 0xa0c <set_feature+0x5e>
else
D12_SetEndpointStatus(endp*2,1); //设置输出端点禁止
9fe: 61 e0 ldi r22, 0x01 ; 1
a00: 82 2f mov r24, r18
a02: 06 2e mov r0, r22
a04: 01 c0 rjmp .+2 ; 0xa08 <set_feature+0x5a>
a06: 88 0f add r24, r24
a08: 0a 94 dec r0
a0a: ea f7 brpl .-6 ; 0xa06 <set_feature+0x58>
a0c: 0e 94 a9 01 call 0x352 <D12_SetEndpointStatus>
single_transmit(0,0); //发送响应
a10: 60 e0 ldi r22, 0x00 ; 0
a12: 80 e0 ldi r24, 0x00 ; 0
a14: 90 e0 ldi r25, 0x00 ; 0
a16: 0e 94 10 04 call 0x820 <single_transmit>
a1a: 08 95 ret
}
else
stall_ep0(); //没有该请求,返回STALL
a1c: 0e 94 aa 02 call 0x554 <stall_ep0>
a20: 08 95 ret
00000a22 <set_address>:
}
//设置地址
void set_address(void)
{
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK),1);
a22: 80 91 26 01 lds r24, 0x0126
a26: 61 e0 ldi r22, 0x01 ; 1
a28: 8f 77 andi r24, 0x7F ; 127
a2a: 0e 94 26 01 call 0x24c <D12_SetAddressEnable>
single_transmit(0,0); //发送响应
a2e: 60 e0 ldi r22, 0x00 ; 0
a30: 80 e0 ldi r24, 0x00 ; 0
a32: 90 e0 ldi r25, 0x00 ; 0
a34: 0e 94 10 04 call 0x820 <single_transmit>
a38: 08 95 ret
00000a3a <get_descriptor>:
}
//获取描述符
void get_descriptor(void)
{
//读取请求的描述符类型
unsigned char bDescriptor = ControlData.DeviceRequest.wValue;
a3a: 80 91 26 01 lds r24, 0x0126
if(bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
a3e: 81 30 cpi r24, 0x01 ; 1
a40: 29 f4 brne .+10 ; 0xa4c <get_descriptor+0x12>
{
//获取设备描述符
code_transmit((unsigned char *) & DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
a42: 62 e1 ldi r22, 0x12 ; 18
a44: 70 e0 ldi r23, 0x00 ; 0
a46: 8e e8 ldi r24, 0x8E ; 142
a48: 90 e0 ldi r25, 0x00 ; 0
a4a: 14 c0 rjmp .+40 ; 0xa74 <get_descriptor+0x3a>
}
else
if(bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
a4c: 82 30 cpi r24, 0x02 ; 2
a4e: a9 f4 brne .+42 ; 0xa7a <get_descriptor+0x40>
{
if(ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
a50: 80 91 2a 01 lds r24, 0x012A
a54: 90 91 2b 01 lds r25, 0x012B
a58: 8f 97 sbiw r24, 0x2f ; 47
a5a: 30 f0 brcs .+12 ; 0xa68 <get_descriptor+0x2e>
ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;
a5c: 8e e2 ldi r24, 0x2E ; 46
a5e: 90 e0 ldi r25, 0x00 ; 0
a60: 90 93 2b 01 sts 0x012B, r25
a64: 80 93 2a 01 sts 0x012A, r24
//获取配置描述符+配置描述符+接口描述符+端点描述符
code_transmit((unsigned char *) & ConfigDescr,ControlData.DeviceRequest.wLength);
a68: 60 91 2a 01 lds r22, 0x012A
a6c: 70 91 2b 01 lds r23, 0x012B
a70: 85 e8 ldi r24, 0x85 ; 133
a72: 90 e0 ldi r25, 0x00 ; 0
a74: 0e 94 17 04 call 0x82e <code_transmit>
a78: 08 95 ret
}
else
stall_ep0(); //没有该请求,返回STALL
a7a: 0e 94 aa 02 call 0x554 <stall_ep0>
a7e: 08 95 ret
00000a80 <get_configuration>:
}
//获取配置
void get_configuration(void)
{
a80: cf 93 push r28
a82: df 93 push r29
a84: cd b7 in r28, 0x3d ; 61
a86: de b7 in r29, 0x3e ; 62
a88: 21 97 sbiw r28, 0x01 ; 1
a8a: 0f b6 in r0, 0x3f ; 63
a8c: f8 94 cli
a8e: de bf out 0x3e, r29 ; 62
a90: 0f be out 0x3f, r0 ; 63
a92: cd bf out 0x3d, r28 ; 61
unsigned char c=bEPPflags.bits.configuration;
a94: 80 91 23 01 lds r24, 0x0123
a98: 81 70 andi r24, 0x01 ; 1
a9a: 89 83 std Y+1, r24 ; 0x01
single_transmit(&c,1);
a9c: 61 e0 ldi r22, 0x01 ; 1
a9e: ce 01 movw r24, r28
aa0: 01 96 adiw r24, 0x01 ; 1
aa2: 0e 94 10 04 call 0x820 <single_transmit>
aa6: 21 96 adiw r28, 0x01 ; 1
aa8: 0f b6 in r0, 0x3f ; 63
aaa: f8 94 cli
aac: de bf out 0x3e, r29 ; 62
aae: 0f be out 0x3f, r0 ; 63
ab0: cd bf out 0x3d, r28 ; 61
ab2: df 91 pop r29
ab4: cf 91 pop r28
ab6: 08 95 ret
00000ab8 <set_configuration>:
}
//设置配置
void set_configuration(void)
{
if(ControlData.DeviceRequest.wValue==0)
ab8: 80 91 26 01 lds r24, 0x0126
abc: 90 91 27 01 lds r25, 0x0127
ac0: 00 97 sbiw r24, 0x00 ; 0
ac2: 69 f4 brne .+26 ; 0xade <set_configuration+0x26>
{
//配置值不对,设备进入未配置状态
single_transmit(0,0); //发送响应
ac4: 60 e0 ldi r22, 0x00 ; 0
ac6: 0e 94 10 04 call 0x820 <single_transmit>
DISABLE;
aca: f8 94 cli
bEPPflags.bits.configuration=0; //标记未配置
acc: 80 91 23 01 lds r24, 0x0123
ad0: 8e 7f andi r24, 0xFE ; 254
ad2: 80 93 23 01 sts 0x0123, r24
ENABLE;
ad6: 78 94 sei
init_unconfig(); //进入地址状态,禁止0除外的所有端点
ad8: 0e 94 08 04 call 0x810 <init_unconfig>
adc: 08 95 ret
}
else
if(ControlData.DeviceRequest.wValue==1)
ade: 01 97 sbiw r24, 0x01 ; 1
ae0: 89 f4 brne .+34 ; 0xb04 <set_configuration+0x4c>
{
//
single_transmit(0,0); //发送响应
ae2: 60 e0 ldi r22, 0x00 ; 0
ae4: 80 e0 ldi r24, 0x00 ; 0
ae6: 90 e0 ldi r25, 0x00 ; 0
ae8: 0e 94 10 04 call 0x820 <single_transmit>
init_unconfig(); //进入地址状态,禁止0除外的所有端点
aec: 0e 94 08 04 call 0x810 <init_unconfig>
init_config(); //配置处理,允许端点收发
af0: 0e 94 0c 04 call 0x818 <init_config>
DISABLE;
af4: f8 94 cli
bEPPflags.bits.configuration=1; //标记配置
af6: 80 91 23 01 lds r24, 0x0123
afa: 81 60 ori r24, 0x01 ; 1
afc: 80 93 23 01 sts 0x0123, r24
ENABLE;
b00: 78 94 sei
b02: 08 95 ret
}
else
stall_ep0(); //没有该请求,返回STALL
b04: 0e 94 aa 02 call 0x554 <stall_ep0>
b08: 08 95 ret
00000b0a <get_interface>:
}
//获取接口信息
void get_interface(void)
{
b0a: cf 93 push r28
b0c: df 93 push r29
b0e: cd b7 in r28, 0x3d ; 61
b10: de b7 in r29, 0x3e ; 62
b12: 21 97 sbiw r28, 0x01 ; 1
b14: 0f b6 in r0, 0x3f ; 63
b16: f8 94 cli
b18: de bf out 0x3e, r29 ; 62
b1a: 0f be out 0x3f, r0 ; 63
b1c: cd bf out 0x3d, r28 ; 61
unsigned char txdat =0; //本设备只有一个接口
b1e: 19 82 std Y+1, r1 ; 0x01
single_transmit(&txdat,1);
b20: 61 e0 ldi r22, 0x01 ; 1
b22: ce 01 movw r24, r28
b24: 01 96 adiw r24, 0x01 ; 1
b26: 0e 94 10 04 call 0x820 <single_transmit>
b2a: 21 96 adiw r28, 0x01 ; 1
b2c: 0f b6 in r0, 0x3f ; 63
b2e: f8 94 cli
b30: de bf out 0x3e, r29 ; 62
b32: 0f be out 0x3f, r0 ; 63
b34: cd bf out 0x3d, r28 ; 61
b36: df 91 pop r29
b38: cf 91 pop r28
b3a: 08 95 ret
00000b3c <set_interface>:
}
//设置接口
void set_interface(void)
{
if(ControlData.DeviceRequest.wValue==0 && ControlData.DeviceRequest.wIndex==0 )
b3c: 80 91 26 01 lds r24, 0x0126
b40: 90 91 27 01 lds r25, 0x0127
b44: 89 2b or r24, r25
b46: 51 f4 brne .+20 ; 0xb5c <set_interface+0x20>
b48: 80 91 28 01 lds r24, 0x0128
b4c: 90 91 29 01 lds r25, 0x0129
b50: 00 97 sbiw r24, 0x00 ; 0
b52: 21 f4 brne .+8 ; 0xb5c <set_interface+0x20>
single_transmit(0,0); //发送响应
b54: 60 e0 ldi r22, 0x00 ; 0
b56: 0e 94 10 04 call 0x820 <single_transmit>
b5a: 08 95 ret
else
stall_ep0(); //没有该请求,返回STALL
b5c: 0e 94 aa 02 call 0x554 <stall_ep0>
b60: 08 95 ret
00000b62 <get_firmware_version>:
#include "protodma.h"
//获取固件版本号
void get_firmware_version(void)
{
b62: cf 93 push r28
b64: df 93 push r29
b66: cd b7 in r28, 0x3d ; 61
b68: de b7 in r29, 0x3e ; 62
b6a: 21 97 sbiw r28, 0x01 ; 1
b6c: 0f b6 in r0, 0x3f ; 63
b6e: f8 94 cli
b70: de bf out 0x3e, r29 ; 62
b72: 0f be out 0x3f, r0 ; 63
b74: cd bf out 0x3d, r28 ; 61
unsigned char i;
i=0x30; //固件版本号
b76: 80 e3 ldi r24, 0x30 ; 48
b78: 89 83 std Y+1, r24 ; 0x01
D12_WriteEndpoint(1,1,(unsigned char *) &i); //发送数据
b7a: ae 01 movw r20, r28
b7c: 4f 5f subi r20, 0xFF ; 255
b7e: 5f 4f sbci r21, 0xFF ; 255
b80: 61 e0 ldi r22, 0x01 ; 1
b82: 70 e0 ldi r23, 0x00 ; 0
b84: cb 01 movw r24, r22
b86: 0e 94 4d 02 call 0x49a <D12_WriteEndpoint>
b8a: 21 96 adiw r28, 0x01 ; 1
b8c: 0f b6 in r0, 0x3f ; 63
b8e: f8 94 cli
b90: de bf out 0x3e, r29 ; 62
b92: 0f be out 0x3f, r0 ; 63
b94: cd bf out 0x3d, r28 ; 61
b96: df 91 pop r29
b98: cf 91 pop r28
b9a: 08 95 ret
00000b9c <ger_buffer_size>:
}
//获取端点2缓存区大小
void ger_buffer_size(void)
{
b9c: cf 93 push r28
b9e: df 93 push r29
ba0: cd b7 in r28, 0x3d ; 61
ba2: de b7 in r29, 0x3e ; 62
ba4: 24 97 sbiw r28, 0x04 ; 4
ba6: 0f b6 in r0, 0x3f ; 63
ba8: f8 94 cli
baa: de bf out 0x3e, r29 ; 62
bac: 0f be out 0x3f, r0 ; 63
bae: cd bf out 0x3d, r28 ; 61
unsigned char i[4];
i[0]=EP2_PACKET_SIZE; //断电2缓冲区大小
bb0: 80 e4 ldi r24, 0x40 ; 64
bb2: 89 83 std Y+1, r24 ; 0x01
i[1]=0;
bb4: fe 01 movw r30, r28
bb6: 31 96 adiw r30, 0x01 ; 1
bb8: 11 82 std Z+1, r1 ; 0x01
i[2]=0;
bba: 1b 82 std Y+3, r1 ; 0x03
i[3]=0;
bbc: 1c 82 std Y+4, r1 ; 0x04
D12_WriteEndpoint(1,4,i); //发送数据
bbe: af 01 movw r20, r30
bc0: 64 e0 ldi r22, 0x04 ; 4
bc2: 70 e0 ldi r23, 0x00 ; 0
bc4: 81 e0 ldi r24, 0x01 ; 1
bc6: 90 e0 ldi r25, 0x00 ; 0
bc8: 0e 94 4d 02 call 0x49a <D12_WriteEndpoint>
bcc: 24 96 adiw r28, 0x04 ; 4
bce: 0f b6 in r0, 0x3f ; 63
b
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -