📄 usb.lss
字号:
1dc: 0e 94 51 00 call 0xa2 <stall_ep0>
1e0: 22 96 adiw r28, 0x02 ; 2
1e2: 0f b6 in r0, 0x3f ; 63
1e4: f8 94 cli
1e6: de bf out 0x3e, r29 ; 62
1e8: 0f be out 0x3f, r0 ; 63
1ea: cd bf out 0x3d, r28 ; 61
1ec: df 91 pop r29
1ee: cf 91 pop r28
1f0: 08 95 ret
000001f2 <clear_feature>:
}
/****************************************
** 函数名称: void clear_feature(void)
** 功能描述: 清除特性
*****************************************/
void clear_feature(void)
{
INT8U endp; //读取请求类型中的接收方
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
1f2: 80 91 62 01 lds r24, 0x0162
1f6: 8f 71 andi r24, 0x1F ; 31
//读取请求类型
if (bRecipient == USB_RECIPIENT_DEVICE //对设备请求
1f8: 71 f4 brne .+28 ; 0x216 <clear_feature+0x24>
1fa: 80 91 64 01 lds r24, 0x0164
1fe: 90 91 65 01 lds r25, 0x0165
202: 01 97 sbiw r24, 0x01 ; 1
204: 31 f5 brne .+76 ; 0x252 <clear_feature+0x60>
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
DISABLE(); //清除远程唤醒特性
206: f8 94 cli
bEPPflags.bits.remote_wakeup = 0; //清0远程唤醒标志
208: 80 91 60 01 lds r24, 0x0160
20c: 8f 7e andi r24, 0xEF ; 239
20e: 80 93 60 01 sts 0x0160, r24
ENABLE();
212: 78 94 sei
214: 18 c0 rjmp .+48 ; 0x246 <clear_feature+0x54>
single_transmit(0, 0); //返回一个空的数据表示执行完毕
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT //对端点请求
216: 82 30 cpi r24, 0x02 ; 2
218: e1 f4 brne .+56 ; 0x252 <clear_feature+0x60>
21a: 80 91 64 01 lds r24, 0x0164
21e: 90 91 65 01 lds r25, 0x0165
222: 89 2b or r24, r25
224: b1 f4 brne .+44 ; 0x252 <clear_feature+0x60>
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
//清除端点禁止特性,恢复其使用
endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
226: 80 91 66 01 lds r24, 0x0166
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
22a: 68 2f mov r22, r24
22c: 60 78 andi r22, 0x80 ; 128
22e: 83 70 andi r24, 0x03 ; 3
230: 99 27 eor r25, r25
232: 66 23 and r22, r22
234: 29 f0 breq .+10 ; 0x240 <clear_feature+0x4e>
D12_SetEndpointStatus(endp*2 + 1, 0); //清除控制输入端点STALL特性
236: 88 0f add r24, r24
238: 99 1f adc r25, r25
23a: 60 e0 ldi r22, 0x00 ; 0
23c: 8f 5f subi r24, 0xFF ; 255
23e: 01 c0 rjmp .+2 ; 0x242 <clear_feature+0x50>
else
D12_SetEndpointStatus(endp*2, 0); //清除控制输出端点STALL特性
240: 88 0f add r24, r24
242: 0e 94 03 04 call 0x806 <D12_SetEndpointStatus>
single_transmit(0, 0); //返回一个空的数据表示执行完毕
246: 60 e0 ldi r22, 0x00 ; 0
248: 80 e0 ldi r24, 0x00 ; 0
24a: 90 e0 ldi r25, 0x00 ; 0
24c: 0e 94 65 00 call 0xca <single_transmit>
250: 08 95 ret
} else
stall_ep0(); //没有该请求,返回STALL
252: 0e 94 51 00 call 0xa2 <stall_ep0>
256: 08 95 ret
00000258 <set_feature>:
}
/****************************************
** 函数名称: void set_feature(void)
** 功能描述: 设置特性
*****************************************/
void set_feature(void)
{
INT8U endp; //读取请求类型中的接收方
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
258: 80 91 62 01 lds r24, 0x0162
25c: 8f 71 andi r24, 0x1F ; 31
//读取请求类型
if (bRecipient == USB_RECIPIENT_DEVICE //对设备请求
25e: 71 f4 brne .+28 ; 0x27c <set_feature+0x24>
260: 80 91 64 01 lds r24, 0x0164
264: 90 91 65 01 lds r25, 0x0165
268: 01 97 sbiw r24, 0x01 ; 1
26a: 69 f5 brne .+90 ; 0x2c6 <set_feature+0x6e>
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
//设置远程唤醒特性
DISABLE();
26c: f8 94 cli
bEPPflags.bits.remote_wakeup = 1; //置1远程唤醒标志
26e: 80 91 60 01 lds r24, 0x0160
272: 80 61 ori r24, 0x10 ; 16
274: 80 93 60 01 sts 0x0160, r24
ENABLE();
278: 78 94 sei
27a: 1f c0 rjmp .+62 ; 0x2ba <set_feature+0x62>
single_transmit(0, 0); //返回一个空的数据表示执行完毕
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT //对端点请求
27c: 82 30 cpi r24, 0x02 ; 2
27e: 19 f5 brne .+70 ; 0x2c6 <set_feature+0x6e>
280: 80 91 64 01 lds r24, 0x0164
284: 90 91 65 01 lds r25, 0x0165
288: 89 2b or r24, r25
28a: e9 f4 brne .+58 ; 0x2c6 <set_feature+0x6e>
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
//禁止端点
endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
28c: 90 91 66 01 lds r25, 0x0166
290: 89 2f mov r24, r25
292: 83 70 andi r24, 0x03 ; 3
294: 28 2f mov r18, r24
296: 33 27 eor r19, r19
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
298: 97 ff sbrs r25, 7
29a: 06 c0 rjmp .+12 ; 0x2a8 <set_feature+0x50>
D12_SetEndpointStatus(endp*2 + 1, 1); //设置输入端点禁止
29c: 22 0f add r18, r18
29e: 33 1f adc r19, r19
2a0: 61 e0 ldi r22, 0x01 ; 1
2a2: 82 2f mov r24, r18
2a4: 86 0f add r24, r22
2a6: 07 c0 rjmp .+14 ; 0x2b6 <set_feature+0x5e>
else
D12_SetEndpointStatus(endp*2, 1); //设置输出端点禁止
2a8: 61 e0 ldi r22, 0x01 ; 1
2aa: 82 2f mov r24, r18
2ac: 06 2e mov r0, r22
2ae: 01 c0 rjmp .+2 ; 0x2b2 <set_feature+0x5a>
2b0: 88 0f add r24, r24
2b2: 0a 94 dec r0
2b4: ea f7 brpl .-6 ; 0x2b0 <set_feature+0x58>
2b6: 0e 94 03 04 call 0x806 <D12_SetEndpointStatus>
single_transmit(0, 0); //返回一个空的数据表示执行完毕
2ba: 60 e0 ldi r22, 0x00 ; 0
2bc: 80 e0 ldi r24, 0x00 ; 0
2be: 90 e0 ldi r25, 0x00 ; 0
2c0: 0e 94 65 00 call 0xca <single_transmit>
2c4: 08 95 ret
} else
stall_ep0(); //没有该请求,返回STALL
2c6: 0e 94 51 00 call 0xa2 <stall_ep0>
2ca: 08 95 ret
000002cc <set_address>:
}
/****************************************
** 函数名称: void set_address(void)
** 功能描述: 设置地址
*****************************************/
void set_address(void)
{
D12_SetAddressEnable((INT8U)(ControlData.DeviceRequest.wValue &
2cc: 80 91 64 01 lds r24, 0x0164
2d0: 61 e0 ldi r22, 0x01 ; 1
2d2: 8f 77 andi r24, 0x7F ; 127
2d4: 0e 94 59 03 call 0x6b2 <D12_SetAddressEnable>
DEVICE_ADDRESS_MASK), 1);
single_transmit(0, 0); //发送一个空的数据响应
2d8: 60 e0 ldi r22, 0x00 ; 0
2da: 80 e0 ldi r24, 0x00 ; 0
2dc: 90 e0 ldi r25, 0x00 ; 0
2de: 0e 94 65 00 call 0xca <single_transmit>
2e2: 08 95 ret
000002e4 <get_descriptor>:
}
/****************************************
** 函数名称: void get_descriptor(void)
** 功能描述: 获取描述符
*****************************************/
void get_descriptor(void)
{
INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue); //读取请求的描述符类型
2e4: 80 91 65 01 lds r24, 0x0165
if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE){ //获取设备描述符
2e8: 81 30 cpi r24, 0x01 ; 1
2ea: 29 f4 brne .+10 ; 0x2f6 <get_descriptor+0x12>
code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
2ec: 62 e1 ldi r22, 0x12 ; 18
2ee: 70 e0 ldi r23, 0x00 ; 0
2f0: 8e e4 ldi r24, 0x4E ; 78
2f2: 91 e0 ldi r25, 0x01 ; 1
2f4: 14 c0 rjmp .+40 ; 0x31e <get_descriptor+0x3a>
}else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) { //获取其它描述符
2f6: 82 30 cpi r24, 0x02 ; 2
2f8: a9 f4 brne .+42 ; 0x324 <get_descriptor+0x40>
if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH){
2fa: 80 91 68 01 lds r24, 0x0168
2fe: 90 91 69 01 lds r25, 0x0169
302: 8f 97 sbiw r24, 0x2f ; 47
304: 30 f0 brcs .+12 ; 0x312 <get_descriptor+0x2e>
ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
306: 8e e2 ldi r24, 0x2E ; 46
308: 90 e0 ldi r25, 0x00 ; 0
30a: 90 93 69 01 sts 0x0169, r25
30e: 80 93 68 01 sts 0x0168, r24
}
code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
312: 60 91 68 01 lds r22, 0x0168
316: 70 91 69 01 lds r23, 0x0169
31a: 80 e2 ldi r24, 0x20 ; 32
31c: 91 e0 ldi r25, 0x01 ; 1
31e: 0e 94 6c 00 call 0xd8 <code_transmit>
322: 08 95 ret
//发送描述符内容
}else
stall_ep0(); //没有该请求,返回STALL
324: 0e 94 51 00 call 0xa2 <stall_ep0>
328: 08 95 ret
0000032a <get_configuration>:
}
/****************************************
** 函数名称: void get_configuration(void)
** 功能描述: 获取配置
*****************************************/
void get_configuration(void)
{
32a: cf 93 push r28
32c: df 93 push r29
32e: cd b7 in r28, 0x3d ; 61
330: de b7 in r29, 0x3e ; 62
332: 21 97 sbiw r28, 0x01 ; 1
334: 0f b6 in r0, 0x3f ; 63
336: f8 94 cli
338: de bf out 0x3e, r29 ; 62
33a: 0f be out 0x3f, r0 ; 63
33c: cd bf out 0x3d, r28 ; 61
INT8U c = bEPPflags.bits.configuration; //取出配置值
33e: 80 91 61 01 lds r24, 0x0161
342: 81 70 andi r24, 0x01 ; 1
344: 89 83 std Y+1, r24 ; 0x01
single_transmit(&c, 1); //发送配置值
346: 61 e0 ldi r22, 0x01 ; 1
348: ce 01 movw r24, r28
34a: 01 96 adiw r24, 0x01 ; 1
34c: 0e 94 65 00 call 0xca <single_transmit>
350: 21 96 adiw r28, 0x01 ; 1
352: 0f b6 in r0, 0x3f ; 63
354: f8 94 cli
356: de bf out 0x3e, r29 ; 62
358: 0f be out 0x3f, r0 ; 63
35a: cd bf out 0x3d, r28 ; 61
35c: df 91 pop r29
35e: cf 91 pop r28
360: 08 95 ret
00000362 <set_configuration>:
}
/****************************************
** 函数名称: void set_configuration(void)
** 功能描述: 设置配置
*****************************************/
void set_configuration(void)
{
if (ControlData.DeviceRequest.wValue == 0) { //配置值不对,设备进入未配置状态
362: 80 91 64 01 lds r24, 0x0164
366: 90 91 65 01 lds r25, 0x0165
36a: 00 97 sbiw r24, 0x00 ; 0
36c: 69 f4 brne .+26 ; 0x388 <set_configuration+0x26>
single_transmit(0, 0); //发向一个空包响应
36e: 60 e0 ldi r22, 0x00 ; 0
370: 0e 94 65 00 call 0xca <single_transmit>
DISABLE();
374: f8 94 cli
bEPPflags.bits.configuration = 0; //标记未配置
376: 80 91 61 01 lds r24, 0x0161
37a: 8e 7f andi r24, 0xFE ; 254
37c: 80 93 61 01 sts 0x0161, r24
ENABLE();
380: 78 94 sei
init_unconfig(); //进入地址状态,禁止0除外的所有端点
382: 0e 94 5d 00 call 0xba <init_unconfig>
386: 08 95 ret
} else if (ControlData.DeviceRequest.wValue == 1) { //配置设备
388: 01 97 sbiw r24, 0x01 ; 1
38a: 89 f4 brne .+34 ; 0x3ae <set_configuration+0x4c>
single_transmit(0, 0); //发向一个空包响应
38c: 60 e0 ldi r22, 0x00 ; 0
38e: 80 e0 ldi r24, 0x00 ; 0
390: 90 e0 ldi r25, 0x00 ; 0
392: 0e 94 65 00 call 0xca <single_transmit>
init_unconfig(); //进入地址状态,禁止0除外的所有端点
396: 0e 94 5d 00 call 0xba <init_unconfig>
init_config(); //配置处理,允许端点收发
39a: 0e 94 61 00 call 0xc2 <init_config>
DISABLE();
39e: f8 94 cli
bEPPflags.bits.configuration = 1; //标志已配置
3a0: 80 91 61 01 lds r24, 0x0161
3a4: 81 60 ori r24, 0x01 ; 1
3a6: 80 93 61 01 sts 0x0161, r24
ENABLE();
3aa: 78 94 sei
3ac: 08 95 ret
} else
stall_ep0(); //没有该请求,返回STALL
3ae: 0e 94 51 00 call 0xa2 <stall_ep0>
3b2: 08 95 ret
000003b4 <get_interface>:
}
/****************************************
** 函数名称: void get_interface(void)
** 功能描述: 获取接口信息
*****************************************/
void get_interface(void)
{
3b4: cf 93 push r28
3b6: df 93 push r29
3b8: cd b7 in r28, 0x3d ; 61
3ba: de b7 in r29, 0x3e ; 62
3bc: 21 97 sbiw r28, 0x01 ; 1
3be: 0f b6 in r0, 0x3f ; 63
3c0: f8 94 cli
3c2: de bf out 0x3e, r29 ; 62
3c4: 0f be out 0x3f, r0 ; 63
3c6: cd bf out 0x3d, r28 ; 61
INT8U txdat = 0; //本设备只有一个接口
3c8: 19 82 std Y+1, r1 ; 0x01
single_transmit(&txdat, 1); //发送一个字节
3ca: 61 e0 ldi r22, 0x01 ; 1
3cc: ce 01 movw r24, r28
3ce: 01 96 adiw r24, 0x01 ; 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -