📄 usb.lss
字号:
3d0: 0e 94 65 00 call 0xca <single_transmit>
3d4: 21 96 adiw r28, 0x01 ; 1
3d6: 0f b6 in r0, 0x3f ; 63
3d8: f8 94 cli
3da: de bf out 0x3e, r29 ; 62
3dc: 0f be out 0x3f, r0 ; 63
3de: cd bf out 0x3d, r28 ; 61
3e0: df 91 pop r29
3e2: cf 91 pop r28
3e4: 08 95 ret
000003e6 <set_interface>:
}
/****************************************
** 函数名称: void set_interface(void)
** 功能描述: 设置接口信息
*****************************************/
void set_interface(void)
{
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
3e6: 80 91 64 01 lds r24, 0x0164
3ea: 90 91 65 01 lds r25, 0x0165
3ee: 89 2b or r24, r25
3f0: 51 f4 brne .+20 ; 0x406 <set_interface+0x20>
3f2: 80 91 66 01 lds r24, 0x0166
3f6: 90 91 67 01 lds r25, 0x0167
3fa: 00 97 sbiw r24, 0x00 ; 0
3fc: 21 f4 brne .+8 ; 0x406 <set_interface+0x20>
single_transmit(0, 0); //发送一个空的数据表示执行完毕
3fe: 60 e0 ldi r22, 0x00 ; 0
400: 0e 94 65 00 call 0xca <single_transmit>
404: 08 95 ret
else
stall_ep0(); //没有该请求,返回STALL
406: 0e 94 51 00 call 0xa2 <stall_ep0>
40a: 08 95 ret
0000040c <control_handler>:
}
/*************************************************************
** 函数名称: void control_handler(void)
** 功能描述: 控制传输
**************************************************************/
void control_handler(void)
{
INT8U type, req;
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
40c: 80 91 62 01 lds r24, 0x0162
410: 80 76 andi r24, 0x60 ; 96
//读取请求代码
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
412: e0 91 63 01 lds r30, 0x0163
416: ef 70 andi r30, 0x0F ; 15
if (type == USB_STANDARD_REQUEST)
418: 88 23 and r24, r24
41a: 51 f4 brne .+20 ; 0x430 <control_handler+0x24>
(*StandardDeviceRequest[req])(); //标准请求处理
41c: ff 27 eor r31, r31
41e: ee 0f add r30, r30
420: ff 1f adc r31, r31
422: e0 50 subi r30, 0x00 ; 0
424: ff 4f sbci r31, 0xFF ; 255
426: 01 90 ld r0, Z+
428: f0 81 ld r31, Z
42a: e0 2d mov r30, r0
42c: 09 95 icall
42e: 08 95 ret
//else if (type == USB_VENDOR_REQUEST) //厂商请求
// (*VendorDeviceRequest[req])();
//else if(type == USB_CLASS_REQUEST)
// (*ClassDeviceRequest[req])(); //类请求,如大容量类
else
stall_ep0(); //无效请求,返回STALL
430: 0e 94 51 00 call 0xa2 <stall_ep0>
434: 08 95 ret
00000436 <ep0_rxdone>:
}
/***************************************
** 函数名称: void ep0_rxdone(void)
** 功能描述: 通过端点索引 0 接收数据
** 输 入: 无
** 输 出: 无
***************************************/
void ep0_rxdone(void)
{
436: cf 93 push r28
438: df 93 push r29
43a: cd b7 in r28, 0x3d ; 61
43c: de b7 in r29, 0x3e ; 62
43e: 28 97 sbiw r28, 0x08 ; 8
440: 0f b6 in r0, 0x3f ; 63
442: f8 94 cli
444: de bf out 0x3e, r29 ; 62
446: 0f be out 0x3f, r0 ; 63
448: cd bf out 0x3d, r28 ; 61
INT8U ep_last, i;
INT8U req[sizeof(DEVICE_REQUEST)];
ep_last = D12_ReadLastTransactionStatus(0); //清除中断寄存器状态,取得最后处理状态
44a: 80 e0 ldi r24, 0x00 ; 0
44c: 0e 94 f7 03 call 0x7ee <D12_ReadLastTransactionStatus>
if (ep_last & D12_SETUPPACKET) { //如果收到了建立包(Setup包)
450: 85 ff sbrs r24, 5
452: 71 c0 rjmp .+226 ; 0x536 <__stack+0x37>
ControlData.wLength = 0; //传输字节总数清0
454: 10 92 6b 01 sts 0x016B, r1
458: 10 92 6a 01 sts 0x016A, r1
ControlData.wCount = 0; //传输字节计数器清0
45c: 10 92 6d 01 sts 0x016D, r1
460: 10 92 6c 01 sts 0x016C, r1
if(D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req)
464: ae 01 movw r20, r28
466: 4f 5f subi r20, 0xFF ; 255
468: 5f 4f sbci r21, 0xFF ; 255
46a: 68 e0 ldi r22, 0x08 ; 8
46c: 80 e0 ldi r24, 0x00 ; 0
46e: 0e 94 1d 04 call 0x83a <D12_ReadEndpoint>
472: 88 30 cpi r24, 0x08 ; 8
474: 59 f0 breq .+22 ; 0x48c <ep0_rxdone+0x56>
!= sizeof(DEVICE_REQUEST) ) {
//从端点0读8个字节失败
D12_SetEndpointStatus(0, 1); //停止控制端点0
476: 61 e0 ldi r22, 0x01 ; 1
478: 80 e0 ldi r24, 0x00 ; 0
47a: 0e 94 03 04 call 0x806 <D12_SetEndpointStatus>
D12_SetEndpointStatus(1, 1); //停止控制端点1
47e: 61 e0 ldi r22, 0x01 ; 1
480: 86 2f mov r24, r22
482: 0e 94 03 04 call 0x806 <D12_SetEndpointStatus>
bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
486: 80 91 60 01 lds r24, 0x0160
48a: 7c c0 rjmp .+248 ; 0x584 <__stack+0x85>
return;
}
/******* 以下语句通信中的解决大小端问题,使该函数与编译器无关 ****/
ControlData.DeviceRequest.bmRequestType = req[0];
48c: 89 81 ldd r24, Y+1 ; 0x01
48e: 80 93 62 01 sts 0x0162, r24
ControlData.DeviceRequest.bRequest = req[1];
492: 8a 81 ldd r24, Y+2 ; 0x02
494: 80 93 63 01 sts 0x0163, r24
ControlData.DeviceRequest.wValue = req[3] * 256 + req[2];
498: 8c 81 ldd r24, Y+4 ; 0x04
49a: 99 27 eor r25, r25
49c: 98 2f mov r25, r24
49e: 88 27 eor r24, r24
4a0: 2b 81 ldd r18, Y+3 ; 0x03
4a2: 82 0f add r24, r18
4a4: 91 1d adc r25, r1
4a6: 90 93 65 01 sts 0x0165, r25
4aa: 80 93 64 01 sts 0x0164, r24
ControlData.DeviceRequest.wIndex = req[5] * 256 + req[4];
4ae: 8e 81 ldd r24, Y+6 ; 0x06
4b0: 99 27 eor r25, r25
4b2: 98 2f mov r25, r24
4b4: 88 27 eor r24, r24
4b6: 2d 81 ldd r18, Y+5 ; 0x05
4b8: 82 0f add r24, r18
4ba: 91 1d adc r25, r1
4bc: 90 93 67 01 sts 0x0167, r25
4c0: 80 93 66 01 sts 0x0166, r24
ControlData.DeviceRequest.wLength = req[7] * 256 + req[6];
4c4: 88 85 ldd r24, Y+8 ; 0x08
4c6: 99 27 eor r25, r25
4c8: 98 2f mov r25, r24
4ca: 88 27 eor r24, r24
4cc: 2f 81 ldd r18, Y+7 ; 0x07
4ce: 82 0f add r24, r18
4d0: 91 1d adc r25, r1
4d2: 90 93 69 01 sts 0x0169, r25
4d6: 80 93 68 01 sts 0x0168, r24
/******** 接收建立包成功 **********/
D12_AcknowledgeEndpoint(0); //对控制端点0进行建立包应答
4da: 80 e0 ldi r24, 0x00 ; 0
4dc: 0e 94 a7 04 call 0x94e <D12_AcknowledgeEndpoint>
D12_AcknowledgeEndpoint(1); //对控制端点1进行建立包应答
4e0: 81 e0 ldi r24, 0x01 ; 1
4e2: 0e 94 a7 04 call 0x94e <D12_AcknowledgeEndpoint>
ControlData.wLength = ControlData.DeviceRequest.wLength; //取出要传输数据的总字节数
4e6: 20 91 68 01 lds r18, 0x0168
4ea: 30 91 69 01 lds r19, 0x0169
4ee: 30 93 6b 01 sts 0x016B, r19
4f2: 20 93 6a 01 sts 0x016A, r18
if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
4f6: 80 91 62 01 lds r24, 0x0162
4fa: 87 ff sbrs r24, 7
4fc: 05 c0 rjmp .+10 ; 0x508 <__stack+0x9>
//如果控制传输是控制读取
bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
4fe: 80 91 60 01 lds r24, 0x0160
bEPPflags.bits.control_state = USB_TRANSMIT; //设置为发送状态
502: 8f 77 andi r24, 0x7F ; 127
504: 88 64 ori r24, 0x48 ; 72
506: 3f c0 rjmp .+126 ; 0x586 <__stack+0x87>
}
else{ //控制传输是控制写入
if (ControlData.DeviceRequest.wLength == 0) {
508: 21 15 cp r18, r1
50a: 31 05 cpc r19, r1
50c: c1 f1 breq .+112 ; 0x57e <__stack+0x7f>
50e: 80 91 60 01 lds r24, 0x0160
bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
}
else {
if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
512: 29 30 cpi r18, 0x09 ; 9
514: 31 05 cpc r19, r1
516: 60 f0 brcs .+24 ; 0x530 <__stack+0x31>
//数据长度出错
bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
518: 8f 73 andi r24, 0x3F ; 63
51a: 80 93 60 01 sts 0x0160, r24
D12_SetEndpointStatus(0, 1); //停止控制端点0
51e: 61 e0 ldi r22, 0x01 ; 1
520: 80 e0 ldi r24, 0x00 ; 0
522: 0e 94 03 04 call 0x806 <D12_SetEndpointStatus>
D12_SetEndpointStatus(1, 1); //停止控制端点1
526: 61 e0 ldi r22, 0x01 ; 1
528: 86 2f mov r24, r22
52a: 0e 94 03 04 call 0x806 <D12_SetEndpointStatus>
52e: 31 c0 rjmp .+98 ; 0x592 <__stack+0x93>
}
else
bEPPflags.bits.control_state = USB_RECEIVE; //设置为接收状态
530: 8f 73 andi r24, 0x3F ; 63
532: 80 68 ori r24, 0x80 ; 128
534: 28 c0 rjmp .+80 ; 0x586 <__stack+0x87>
}// set command with data
}// else set command
}// if setup packet
/***** 下面为控制写入的数据阶段 ***************/
else if (bEPPflags.bits.control_state == USB_RECEIVE) { //如果为接收状态
536: 90 91 60 01 lds r25, 0x0160
53a: 89 2f mov r24, r25
53c: 80 7c andi r24, 0xC0 ; 192
53e: 80 38 cpi r24, 0x80 ; 128
540: 29 f5 brne .+74 ; 0x58c <__stack+0x8d>
i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
542: 80 91 6c 01 lds r24, 0x016C
546: 90 91 6d 01 lds r25, 0x016D
54a: 80 59 subi r24, 0x90 ; 144
54c: 9e 4f sbci r25, 0xFE ; 254
54e: ac 01 movw r20, r24
550: 60 e1 ldi r22, 0x10 ; 16
552: 80 e0 ldi r24, 0x00 ; 0
554: 0e 94 1d 04 call 0x83a <D12_ReadEndpoint>
ControlData.dataBuffer + ControlData.wCount); //从端点0接收数据
ControlData.wCount += i; //统计已接收的字节数
558: 20 91 6c 01 lds r18, 0x016C
55c: 30 91 6d 01 lds r19, 0x016D
560: 28 0f add r18, r24
562: 31 1d adc r19, r1
564: 30 93 6d 01 sts 0x016D, r19
568: 20 93 6c 01 sts 0x016C, r18
if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { //数据接收完毕
56c: 80 31 cpi r24, 0x10 ; 16
56e: 39 f4 brne .+14 ; 0x57e <__stack+0x7f>
570: 80 91 6a 01 lds r24, 0x016A
574: 90 91 6b 01 lds r25, 0x016B
578: 28 17 cp r18, r24
57a: 39 07 cpc r19, r25
57c: 50 f0 brcs .+20 ; 0x592 <__stack+0x93>
bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
57e: 80 91 60 01 lds r24, 0x0160
582: 88 60 ori r24, 0x08 ; 8
bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
584: 8f 73 andi r24, 0x3F ; 63
586: 80 93 60 01 sts 0x0160, r24
58a: 03 c0 rjmp .+6 ; 0x592 <__stack+0x93>
}
}else
bEPPflags.bits.control_state = USB_IDLE; //设置等待状态
58c: 9f 73 andi r25, 0x3F ; 63
58e: 90 93 60 01 sts 0x0160, r25
592: 28 96 adiw r28, 0x08 ; 8
594: 0f b6 in r0, 0x3f ; 63
596: f8 94 cli
598: de bf out 0x3e, r29 ; 62
59a: 0f be out 0x3f, r0 ; 63
59c: cd bf out 0x3d, r28 ; 61
59e: df 91 pop r29
5a0: cf 91 pop r28
5a2: 08 95 ret
000005a4 <ep0_txdone>:
}
/***************************************
** 函数名称: void ep0_txdone(void)
** 功能描述: 通过端点索引 0 发送数据
** 输 入: 无
** 输 出: 无
***************************************/
void ep0_txdone(void)
{
5a4: cf 93 push r28
5a6: df 93 push r29
INT16 i = ControlData.wLength - ControlData.wCount; //计算未发送的字节数
5a8: c0 91 6a 01 lds r28, 0x016A
5ac: d0 91 6b 01 lds r29, 0x016B
5b0: 80 91 6c 01 lds r24, 0x016C
5b4: 90 91 6d 01 lds r25, 0x016D
5b8: c8 1b sub r28, r24
5ba: d9 0b sbc r29, r25
D12_ReadLastTransactionStatus(1); //清除中断寄存器标志位
5bc: 81 e0 ldi r24, 0x01 ; 1
5be: 0e 94 f7 03 call 0x7ee <D12_ReadLastTransactionStatus>
if (bEPPflags.bits.control_state != USB_TRANSMIT){ //非发送状态
5c2: 80 91 60 01 lds r24, 0x0160
5c6: 80 7c andi r24, 0xC0 ; 192
5c8: 80 34 cpi r24, 0x40 ; 64
5ca: 31 f0 breq .+12 ; 0x5d8 <ep0_txdone+0x34>
single_transmit(0, 0);
5cc: 60 e0 ldi r22, 0x00 ; 0
5ce: 80 e0 ldi r24, 0x00 ; 0
5d0: 90 e0 ldi r25, 0x00 ; 0
5d2: 0e 94 65 00 call 0xca <single_transmit>
return; //返回
5d6: 46 c0 rjmp .+140 ; 0x664 <ep0_txdone+0xc0>
}
if( i >= EP0_PACKET_SIZE) { //未发送字节数大于16,发送16个字节
5d8: c0 31 cpi r28, 0x10 ; 16
5da: d1 05 cpc r29, r1
5dc: ec f0 brlt .+58 ; 0x618 <ep0_txdone+0x74>
D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
5de: 80 91 6e 01 lds r24, 0x016E
5e2: 90 91 6f 01 lds r25, 0x016F
5e6: 20 91 6c 01 lds r18, 0x016C
5ea: 30 91 6d 01 lds r19, 0x016D
5ee: 82 0f add r24, r18
5f0: 93 1f adc r25, r19
5f2: ac 01 movw r20, r24
5f4: 60 e1 ldi r22, 0x10 ; 16
5f6: 81 e0 ldi r24, 0x01 ; 1
5f8: 0e 94 68 04 call 0x8d0 <D12_WriteEndpoint>
ControlData.wCount += EP0_PACKET_SIZE;
5fc: 80 91 6c 01 lds r24, 0x016C
600: 90 91 6d 01 lds r25, 0x016D
604: 40 96 adiw r24, 0x10 ; 16
606: 90 93 6d 01 sts 0x016D, r25
60a: 80 93 6c 01 sts 0x016C, r24
bEPPflags.bits.control_state = USB_TRANSMIT;
60e: 80 91 60 01 lds r24, 0x0160
612: 8f 73 andi r24, 0x3F ; 63
614: 80 64 ori r24, 0x40 ; 64
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -