⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.lss

📁 avr与PC机之间的通信
💻 LSS
📖 第 1 页 / 共 4 页
字号:
 58c:	99 1f       	adc	r25, r25
 58e:	61 e0       	ldi	r22, 0x01	; 1
 590:	86 0f       	add	r24, r22
 592:	06 c0       	rjmp	.+12     	; 0x5a0
		else
			/* clear RX stall for OUT on EPn. */
			D12_SetEndpointStatus(endp*2, 1);
 594:	61 e0       	ldi	r22, 0x01	; 1
 596:	06 2e       	mov	r0, r22
 598:	01 c0       	rjmp	.+2      	; 0x59c
 59a:	88 0f       	add	r24, r24
 59c:	0a 94       	dec	r0
 59e:	ea f7       	brpl	.-6      	; 0x59a
 5a0:	0e 94 10 01 	call	0x220
		single_transmit(0, 0);
 5a4:	60 e0       	ldi	r22, 0x00	; 0
 5a6:	80 e0       	ldi	r24, 0x00	; 0
 5a8:	90 e0       	ldi	r25, 0x00	; 0
 5aa:	0e 94 15 02 	call	0x42a
 5ae:	08 95       	ret
	} else
		stall_ep0();
 5b0:	0e 94 0c 02 	call	0x418
 5b4:	08 95       	ret
 5b6:	08 95       	ret

000005b8 <set_address>:
}

void set_address(void)
{
	D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
 5b8:	80 91 08 01 	lds	r24, 0x0108
 5bc:	61 e0       	ldi	r22, 0x01	; 1
 5be:	8f 77       	andi	r24, 0x7F	; 127
 5c0:	0e 94 76 00 	call	0xec
		DEVICE_ADDRESS_MASK), 1);
	single_transmit(0, 0);
 5c4:	60 e0       	ldi	r22, 0x00	; 0
 5c6:	80 e0       	ldi	r24, 0x00	; 0
 5c8:	90 e0       	ldi	r25, 0x00	; 0
 5ca:	0e 94 15 02 	call	0x42a
 5ce:	08 95       	ret

000005d0 <D12_ReadChipID>:
}

unsigned short D12_ReadChipID(void)
{
 5d0:	cf 93       	push	r28
 5d2:	df 93       	push	r29
	unsigned short i,j;
	if(bEPPflags.bits.in_isr == 0)
 5d4:	80 91 c0 00 	lds	r24, 0x00C0
 5d8:	84 fd       	sbrc	r24, 4
 5da:	01 c0       	rjmp	.+2      	; 0x5de
		DISABLE;
 5dc:	f8 94       	cli
	outportb(D12_COMMAND, 0xFD);
 5de:	6d ef       	ldi	r22, 0xFD	; 253
 5e0:	83 e0       	ldi	r24, 0x03	; 3
 5e2:	0e 94 52 00 	call	0xa4
	i=inportb(D12_DATA);
 5e6:	82 e0       	ldi	r24, 0x02	; 2
 5e8:	0e 94 64 00 	call	0xc8
 5ec:	c8 2f       	mov	r28, r24
 5ee:	dd 27       	eor	r29, r29
	j=inportb(D12_DATA);
 5f0:	82 e0       	ldi	r24, 0x02	; 2
 5f2:	0e 94 64 00 	call	0xc8
 5f6:	99 27       	eor	r25, r25
	i += (j<<8);
 5f8:	98 2f       	mov	r25, r24
 5fa:	88 27       	eor	r24, r24
 5fc:	c8 0f       	add	r28, r24
 5fe:	d9 1f       	adc	r29, r25
	if(bEPPflags.bits.in_isr == 0)
 600:	80 91 c0 00 	lds	r24, 0x00C0
 604:	84 fd       	sbrc	r24, 4
 606:	01 c0       	rjmp	.+2      	; 0x60a
		ENABLE;
 608:	78 94       	sei
	return i;
}
 60a:	ce 01       	movw	r24, r28
 60c:	df 91       	pop	r29
 60e:	cf 91       	pop	r28
 610:	08 95       	ret

00000612 <code_transmit>:

void code_transmit(unsigned char *pRomData, unsigned short len)
{
 612:	ac 01       	movw	r20, r24
	ControlData.wCount = 0;
 614:	10 92 11 01 	sts	0x0111, r1
 618:	10 92 10 01 	sts	0x0110, r1
	if(ControlData.wLength > len)
 61c:	80 91 0e 01 	lds	r24, 0x010E
 620:	90 91 0f 01 	lds	r25, 0x010F
 624:	68 17       	cp	r22, r24
 626:	79 07       	cpc	r23, r25
 628:	20 f4       	brcc	.+8      	; 0x632
		ControlData.wLength = len;
 62a:	70 93 0f 01 	sts	0x010F, r23
 62e:	60 93 0e 01 	sts	0x010E, r22

	ControlData.pData = pRomData;
 632:	50 93 13 01 	sts	0x0113, r21
 636:	40 93 12 01 	sts	0x0112, r20
	if( ControlData.wLength >= EP0_PACKET_SIZE) {
 63a:	80 91 0e 01 	lds	r24, 0x010E
 63e:	90 91 0f 01 	lds	r25, 0x010F
 642:	40 97       	sbiw	r24, 0x10	; 16
 644:	b0 f0       	brcs	.+44     	; 0x672
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
 646:	60 e1       	ldi	r22, 0x10	; 16
 648:	81 e0       	ldi	r24, 0x01	; 1
 64a:	0e 94 86 01 	call	0x30c
		ControlData.wCount += EP0_PACKET_SIZE;
 64e:	80 91 10 01 	lds	r24, 0x0110
 652:	90 91 11 01 	lds	r25, 0x0111
 656:	40 96       	adiw	r24, 0x10	; 16
 658:	90 93 11 01 	sts	0x0111, r25
 65c:	80 93 10 01 	sts	0x0110, r24

		DISABLE;
 660:	f8 94       	cli
		bEPPflags.bits.control_state = USB_TRANSMIT;
 662:	80 91 c0 00 	lds	r24, 0x00C0
 666:	8f 79       	andi	r24, 0x9F	; 159
 668:	80 62       	ori	r24, 0x20	; 32
 66a:	80 93 c0 00 	sts	0x00C0, r24
		ENABLE;
 66e:	78 94       	sei
 670:	08 95       	ret
	}
	else {
		D12_WriteEndpoint(1, ControlData.wLength, pRomData);
 672:	60 91 0e 01 	lds	r22, 0x010E
 676:	81 e0       	ldi	r24, 0x01	; 1
 678:	0e 94 86 01 	call	0x30c
		ControlData.wCount += ControlData.wLength;
 67c:	80 91 10 01 	lds	r24, 0x0110
 680:	90 91 11 01 	lds	r25, 0x0111
 684:	20 91 0e 01 	lds	r18, 0x010E
 688:	30 91 0f 01 	lds	r19, 0x010F
 68c:	82 0f       	add	r24, r18
 68e:	93 1f       	adc	r25, r19
 690:	90 93 11 01 	sts	0x0111, r25
 694:	80 93 10 01 	sts	0x0110, r24
		DISABLE;
 698:	f8 94       	cli
		bEPPflags.bits.control_state = USB_IDLE;
 69a:	80 91 c0 00 	lds	r24, 0x00C0
 69e:	8f 79       	andi	r24, 0x9F	; 159
 6a0:	80 93 c0 00 	sts	0x00C0, r24
		ENABLE;
 6a4:	78 94       	sei
 6a6:	08 95       	ret
 6a8:	08 95       	ret

000006aa <get_descriptor>:
	}
}


void get_descriptor(void)
{
	unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
 6aa:	80 91 09 01 	lds	r24, 0x0109
//	put_c('g');
	if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) 
 6ae:	81 30       	cpi	r24, 0x01	; 1
 6b0:	29 f4       	brne	.+10     	; 0x6bc
	{
//		put_c('d');
		code_transmit((unsigned char *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
 6b2:	62 e1       	ldi	r22, 0x12	; 18
 6b4:	70 e0       	ldi	r23, 0x00	; 0
 6b6:	8e ea       	ldi	r24, 0xAE	; 174
 6b8:	90 e0       	ldi	r25, 0x00	; 0
 6ba:	06 c0       	rjmp	.+12     	; 0x6c8
	} 
	else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) 
 6bc:	82 30       	cpi	r24, 0x02	; 2
 6be:	39 f4       	brne	.+14     	; 0x6ce
	{
//		put_c('c');
		code_transmit((unsigned char *)&TRANFER_DESC, CONFIG_DESCRIPTOR_LENGTH);
 6c0:	6e e2       	ldi	r22, 0x2E	; 46
 6c2:	70 e0       	ldi	r23, 0x00	; 0
 6c4:	80 e8       	ldi	r24, 0x80	; 128
 6c6:	90 e0       	ldi	r25, 0x00	; 0
 6c8:	0e 94 09 03 	call	0x612
 6cc:	08 95       	ret
	} 
	else
		stall_ep0();
 6ce:	0e 94 0c 02 	call	0x418
 6d2:	08 95       	ret
 6d4:	08 95       	ret

000006d6 <get_configuration>:
}

void get_configuration(void)
{
 6d6:	cf 93       	push	r28
 6d8:	df 93       	push	r29
 6da:	cd b7       	in	r28, 0x3d	; 61
 6dc:	de b7       	in	r29, 0x3e	; 62
 6de:	21 97       	sbiw	r28, 0x01	; 1
 6e0:	0f b6       	in	r0, 0x3f	; 63
 6e2:	f8 94       	cli
 6e4:	de bf       	out	0x3e, r29	; 62
 6e6:	0f be       	out	0x3f, r0	; 63
 6e8:	cd bf       	out	0x3d, r28	; 61
	unsigned char c = bEPPflags.bits.configuration;
 6ea:	80 91 c0 00 	lds	r24, 0x00C0
 6ee:	88 1f       	adc	r24, r24
 6f0:	88 27       	eor	r24, r24
 6f2:	88 1f       	adc	r24, r24
 6f4:	89 83       	std	Y+1, r24	; 0x01
	single_transmit(&c, 1);
 6f6:	61 e0       	ldi	r22, 0x01	; 1
 6f8:	ce 01       	movw	r24, r28
 6fa:	01 96       	adiw	r24, 0x01	; 1
 6fc:	0e 94 15 02 	call	0x42a
 700:	21 96       	adiw	r28, 0x01	; 1
 702:	0f b6       	in	r0, 0x3f	; 63
 704:	f8 94       	cli
 706:	de bf       	out	0x3e, r29	; 62
 708:	0f be       	out	0x3f, r0	; 63
 70a:	cd bf       	out	0x3d, r28	; 61
 70c:	df 91       	pop	r29
 70e:	cf 91       	pop	r28
 710:	08 95       	ret

00000712 <set_configuration>:
}

void set_configuration(void)
{

	if (ControlData.DeviceRequest.wValue == 0) {
 712:	80 91 08 01 	lds	r24, 0x0108
 716:	90 91 09 01 	lds	r25, 0x0109
 71a:	00 97       	sbiw	r24, 0x00	; 0
 71c:	69 f4       	brne	.+26     	; 0x738
		/* put device in unconfigured state */
		single_transmit(0, 0);
 71e:	60 e0       	ldi	r22, 0x00	; 0
 720:	0e 94 15 02 	call	0x42a
		DISABLE;
 724:	f8 94       	cli
		bEPPflags.bits.configuration = 0;
 726:	80 91 c0 00 	lds	r24, 0x00C0
 72a:	8f 77       	andi	r24, 0x7F	; 127
 72c:	80 93 c0 00 	sts	0x00C0, r24
		ENABLE;
 730:	78 94       	sei
		init_unconfig();
 732:	0e 94 20 02 	call	0x440
 736:	08 95       	ret
	} else if (ControlData.DeviceRequest.wValue == 1) {
 738:	01 97       	sbiw	r24, 0x01	; 1
 73a:	89 f4       	brne	.+34     	; 0x75e
		/* Configure device */
		single_transmit(0, 0);
 73c:	60 e0       	ldi	r22, 0x00	; 0
 73e:	80 e0       	ldi	r24, 0x00	; 0
 740:	90 e0       	ldi	r25, 0x00	; 0
 742:	0e 94 15 02 	call	0x42a

		init_unconfig();
 746:	0e 94 20 02 	call	0x440
		init_config();
 74a:	0e 94 24 02 	call	0x448
		
		DISABLE;
 74e:	f8 94       	cli
		bEPPflags.bits.configuration = 1;
 750:	80 91 c0 00 	lds	r24, 0x00C0
 754:	80 68       	ori	r24, 0x80	; 128
 756:	80 93 c0 00 	sts	0x00C0, r24
		ENABLE;
 75a:	78 94       	sei
 75c:	08 95       	ret
	} else
		stall_ep0();
 75e:	0e 94 0c 02 	call	0x418
 762:	08 95       	ret
 764:	08 95       	ret

00000766 <get_interface>:
}

void get_interface(void)
{
 766:	cf 93       	push	r28
 768:	df 93       	push	r29
 76a:	cd b7       	in	r28, 0x3d	; 61
 76c:	de b7       	in	r29, 0x3e	; 62
 76e:	21 97       	sbiw	r28, 0x01	; 1
 770:	0f b6       	in	r0, 0x3f	; 63
 772:	f8 94       	cli
 774:	de bf       	out	0x3e, r29	; 62
 776:	0f be       	out	0x3f, r0	; 63
 778:	cd bf       	out	0x3d, r28	; 61
	unsigned char txdat = 0;        /* Only/Current interface = 0 */
 77a:	19 82       	std	Y+1, r1	; 0x01
	single_transmit(&txdat, 1);
 77c:	61 e0       	ldi	r22, 0x01	; 1
 77e:	ce 01       	movw	r24, r28
 780:	01 96       	adiw	r24, 0x01	; 1
 782:	0e 94 15 02 	call	0x42a
 786:	21 96       	adiw	r28, 0x01	; 1
 788:	0f b6       	in	r0, 0x3f	; 63
 78a:	f8 94       	cli
 78c:	de bf       	out	0x3e, r29	; 62
 78e:	0f be       	out	0x3f, r0	; 63
 790:	cd bf       	out	0x3d, r28	; 61
 792:	df 91       	pop	r29
 794:	cf 91       	pop	r28
 796:	08 95       	ret

00000798 <set_interface>:
}

void set_interface(void)
{
	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
 798:	80 91 08 01 	lds	r24, 0x0108
 79c:	90 91 09 01 	lds	r25, 0x0109
 7a0:	89 2b       	or	r24, r25
 7a2:	51 f4       	brne	.+20     	; 0x7b8
 7a4:	80 91 0a 01 	lds	r24, 0x010A
 7a8:	90 91 0b 01 	lds	r25, 0x010B
 7ac:	00 97       	sbiw	r24, 0x00	; 0
 7ae:	21 f4       	brne	.+8      	; 0x7b8
		single_transmit(0, 0);
 7b0:	60 e0       	ldi	r22, 0x00	; 0
 7b2:	0e 94 15 02 	call	0x42a
 7b6:	08 95       	ret
	else
		stall_ep0();
 7b8:	0e 94 0c 02 	call	0x418
 7bc:	08 95       	ret
 7be:	08 95       	ret

000007c0 <control_handler>:
}

void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_configuration,
	set_configuration,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};



void control_handler(void)
{
	unsigned char type, req;

	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 7c0:	80 91 06 01 	lds	r24, 0x0106
 7c4:	80 76       	andi	r24, 0x60	; 96
	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
 7c6:	e0 91 07 01 	lds	r30, 0x0107
 7ca:	ef 70       	andi	r30, 0x0F	; 15
	if (type == USB_STANDARD_REQUEST)
 7cc:	88 23       	and	r24, r24
 7ce:	51 f4       	brne	.+20     	; 0x7e4
		(*StandardDeviceRequest[req])();
 7d0:	ff 27       	eor	r31, r31
 7d2:	ee 0f       	add	r30, r30
 7d4:	ff 1f       	adc	r31, r31
 7d6:	e0 5a       	subi	r30, 0xA0	; 160
 7d8:	ff 4f       	sbci	r31, 0xFF	; 255
 7da:	01 90       	ld	r0, Z+
 7dc:	f0 81       	ld	r31, Z
 7de:	e0 2d       	mov	r30, r0
 7e0:	09 95       	icall
 7e2:	08 95       	ret
	else
		stall_ep0();
 7e4:	0e 94 0c 02 	call	0x418
 7e8:	08 95       	ret
 7ea:	08 95       	ret

000007ec <disconnect_USB>:
}

void disconnect_USB(void)
{
	// Initialize D12 configuration
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
 7ec:	63 e4       	ldi	r22, 0x43	; 67
 7ee:	82 e0       	ldi	r24, 0x02	; 2
 7f0:	0e 94 ab 00 	call	0x156
 7f4:	08 95       	ret

000007f6 <connect_USB>:
}

void connect_USB(void)
{
	D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
 7f6:	80 ec       	ldi	r24, 0xC0	; 192
 7f8:	0e 94 c8 00 	call	0x190
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
 7fc:	63 e4       	ldi	r22, 0x43	; 67
 7fe:	82 e1       	ldi	r24, 0x12	; 18
 800:	0e 94 ab 00 	call	0x156
 804:	08 95       	ret

00000806 <reconnect_USB>:
}

void reconnect_USB(void)
{
	disconnect_USB();
 806:	0e 94 f6 03 	call	0x7ec
	connect_USB();
 80a:	0e 94 fb 03 	call	0x7f6
 80e:	08 95       	ret

00000810 <bus_reset>:
}
//this part from isr.c


void bus_reset(void)
{
 810:	08 95       	ret

00000812 <ep0_rxdone>:
}

void ep0_rxdone(void)
{
	unsigned char ep_last, i;

	ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
 812:	80 e0       	ldi	r24, 0x00	; 0
 814:	0e 94 06 01 	call	0x20c

	if (ep_last & D12_SETUPPACKET) {
 818:	85 ff       	sbrs	r24, 5
 81a:	4f c0       	rjmp	.+158    	; 0x8ba

		ControlData.wLength = 0;
 81c:	10 92 0f 01 	sts	0x010F, r1
 820:	10 92 0e 01 	sts	0x010E, r1
		ControlData.wCount = 0;
 824:	10 92 11 01 	sts	0x0111, r1
 828:	10 92 10 01 	sts	0x0110, r1

		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
 82c:	46 e0       	ldi	r20, 0x06	; 6
 82e:	51 e0       	ldi	r21, 0x01	; 1
 830:	68 e0       	ldi	r22, 0x08	; 8
 832:	80 e0       	ldi	r24, 0x00	; 0
 834:	0e 94 40 01 	call	0x280
 838:	88 30       	cpi	r24, 0x08	; 8
 83a:	59 f0       	breq	.+22     	; 0x852
			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
			//setup包出错,返回
			D12_SetEndpointStatusIsr(0, 1);
 83c:	61 e0       	ldi	r22, 0x01	; 1
 83e:	80 e0       	ldi	r24, 0x00	; 0
 840:	0e 94 28 01 	call	0x250
			D12_SetEndpointStatusIsr(1, 1);
 844:	61 e0       	ldi	r22, 0x01	; 1
 846:	86 2f       	mov	r24, r22
 848:	0e 94 28 01 	call	0x250
			bEPPflags.bits.control_state = USB_IDLE;
 84c:	80 91 c0 00 	lds	r24, 0x00C0
 850:	5b c0       	rjmp	.+182    	; 0x908
			
			return;
		}

		ControlData.DeviceRequest.wValue = ControlData.DeviceRequest.wValue;
		ControlData.DeviceRequest.wIndex = ControlData.DeviceRequest.wIndex;
		ControlData.DeviceRequest.wLength = ControlData.DeviceRequest.wLength;

		// Acknowledge setup here to unlock in/out endp
		D12_AcknowledgeEndpoint(0);
 852:	80 e0       	ldi	r24, 0x00	; 0
 854:	0e 94 fa 01 	call	0x3f4
		D12_AcknowledgeEndpoint(1);
 858:	81 e0       	ldi	r24, 0x01	; 1
 85a:	0e 94 fa 01 	call	0x3f4

		ControlData.wLength = ControlData.DeviceRequest.wLength;
 85e:	20 91 0c 01 	lds	r18, 0x010C
 862:	30 91 0d 01 	lds	r19, 0x010D
 866:	30 93 0f 01 	sts	0x010F, r19
 86a:	20 93 0e 01 	sts	0x010E, r18
		ControlData.wCount = 0;
 86e:	10 92 11 01 	sts	0x0111, r1
 872:	10 92 10 01 	sts	0x0110, r1

		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 876:	80 91 06 01 	lds	r24, 0x0106
 87a:	87 ff       	sbrs	r24, 7
 87c:	07 c0       	rjmp	.+14     	; 0x88c
			bEPPflags.bits.setup_packet = 1;
 87e:	80 91 c0 00 	lds	r24, 0x00C0
			bEPPflags.bits.control_state = USB_TRANSMIT;		/* get command */
 882:	8f 7b       	andi	r24, 0xBF	; 191
 884:	84 62       	ori	r24, 0x24	; 36
 886:	80 93 c0 00 	sts	0x00C0, r24
 88a:	08 95       	ret
		}
		else {
			if (ControlData.DeviceRequest.wLength == 0) {
 88c:	21 15       	cp	r18, r1
 88e:	31 05       	cpc	r19, r1
 890:	c1 f1       	breq	.+112    	; 0x902
 892:	80 91 c0 00 	lds	r24, 0x00C0
				bEPPflags.bits.setup_packet = 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -