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

📄 usb.lss

📁 PC与AVR通过D12进行USB通讯全套资料
💻 LSS
📖 第 1 页 / 共 4 页
字号:
 2e4:	81 93       	st	Z+, r24
 2e6:	8f 01       	movw	r16, r30
 2e8:	c1 50       	subi	r28, 0x01	; 1
 2ea:	c1 f7       	brne	.-16     	; 0x2dc
	outportb(D12_COMMAND, 0xF2);
 2ec:	62 ef       	ldi	r22, 0xF2	; 242
 2ee:	83 e0       	ldi	r24, 0x03	; 3
 2f0:	0e 94 52 00 	call	0xa4
	if(bEPPflags.bits.in_isr == 0)
 2f4:	80 91 c0 00 	lds	r24, 0x00C0
 2f8:	84 fd       	sbrc	r24, 4
 2fa:	01 c0       	rjmp	.+2      	; 0x2fe
		ENABLE;
 2fc:	78 94       	sei
	return j;
 2fe:	8f 2d       	mov	r24, r15
 300:	99 27       	eor	r25, r25
 302:	cf 91       	pop	r28
 304:	1f 91       	pop	r17
 306:	0f 91       	pop	r16
 308:	ff 90       	pop	r15
 30a:	08 95       	ret

0000030c <D12_WriteEndpoint>:
}


/*写端点缓冲区同时使缓冲区有效,包含写缓冲区命令:F0H*/
/*以及使缓冲区有效命令:FAH*/
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len,unsigned char * buf) 
{
 30c:	ff 92       	push	r15
 30e:	0f 93       	push	r16
 310:	1f 93       	push	r17
 312:	cf 93       	push	r28
 314:	98 2f       	mov	r25, r24
 316:	f6 2e       	mov	r15, r22
 318:	8a 01       	movw	r16, r20
	unsigned char i;
	if(bEPPflags.bits.in_isr == 0)
 31a:	80 91 c0 00 	lds	r24, 0x00C0
 31e:	84 fd       	sbrc	r24, 4
 320:	01 c0       	rjmp	.+2      	; 0x324
		DISABLE;
 322:	f8 94       	cli
	outportb(D12_COMMAND, endp);
 324:	69 2f       	mov	r22, r25
 326:	83 e0       	ldi	r24, 0x03	; 3
 328:	0e 94 52 00 	call	0xa4
	inportb(D12_DATA);
 32c:	82 e0       	ldi	r24, 0x02	; 2
 32e:	0e 94 64 00 	call	0xc8
	outportb(D12_COMMAND, 0xF0);
 332:	60 ef       	ldi	r22, 0xF0	; 240
 334:	83 e0       	ldi	r24, 0x03	; 3
 336:	0e 94 52 00 	call	0xa4
	outportb(D12_DATA, 0);
 33a:	60 e0       	ldi	r22, 0x00	; 0
 33c:	82 e0       	ldi	r24, 0x02	; 2
 33e:	0e 94 52 00 	call	0xa4
	outportb(D12_DATA, len);
 342:	6f 2d       	mov	r22, r15
 344:	82 e0       	ldi	r24, 0x02	; 2
 346:	0e 94 52 00 	call	0xa4
	for(i=0; i<len; i++)
 34a:	ff 20       	and	r15, r15
 34c:	49 f0       	breq	.+18     	; 0x360
 34e:	cf 2d       	mov	r28, r15
		outportb(D12_DATA, *(buf+i));
 350:	f8 01       	movw	r30, r16
 352:	61 91       	ld	r22, Z+
 354:	8f 01       	movw	r16, r30
 356:	82 e0       	ldi	r24, 0x02	; 2
 358:	0e 94 52 00 	call	0xa4
 35c:	c1 50       	subi	r28, 0x01	; 1
 35e:	c1 f7       	brne	.-16     	; 0x350
	outportb(D12_COMMAND, 0xFA);
 360:	6a ef       	ldi	r22, 0xFA	; 250
 362:	83 e0       	ldi	r24, 0x03	; 3
 364:	0e 94 52 00 	call	0xa4
	if(bEPPflags.bits.in_isr == 0)
 368:	80 91 c0 00 	lds	r24, 0x00C0
 36c:	84 fd       	sbrc	r24, 4
 36e:	01 c0       	rjmp	.+2      	; 0x372
		ENABLE;
 370:	78 94       	sei
	return len;
}
 372:	8f 2d       	mov	r24, r15
 374:	99 27       	eor	r25, r25
 376:	cf 91       	pop	r28
 378:	1f 91       	pop	r17
 37a:	0f 91       	pop	r16
 37c:	ff 90       	pop	r15
 37e:	08 95       	ret

00000380 <D12_WriteEndpointIsr>:

/*写端点缓冲区同时使缓冲区有效,专用于中断函数*/
unsigned char D12_WriteEndpointIsr(unsigned char endp, unsigned char len,unsigned char * buf)
{
 380:	ff 92       	push	r15
 382:	0f 93       	push	r16
 384:	1f 93       	push	r17
 386:	cf 93       	push	r28
 388:	98 2f       	mov	r25, r24
 38a:	f6 2e       	mov	r15, r22
 38c:	8a 01       	movw	r16, r20
	unsigned char i;
	if(bEPPflags.bits.in_isr == 0)
 38e:	80 91 c0 00 	lds	r24, 0x00C0
 392:	84 fd       	sbrc	r24, 4
 394:	01 c0       	rjmp	.+2      	; 0x398
		DISABLE;
 396:	f8 94       	cli
	outportb(D12_COMMAND, endp);
 398:	69 2f       	mov	r22, r25
 39a:	83 e0       	ldi	r24, 0x03	; 3
 39c:	0e 94 52 00 	call	0xa4
	inportb(D12_DATA);
 3a0:	82 e0       	ldi	r24, 0x02	; 2
 3a2:	0e 94 64 00 	call	0xc8
	outportb(D12_COMMAND, 0xF0);
 3a6:	60 ef       	ldi	r22, 0xF0	; 240
 3a8:	83 e0       	ldi	r24, 0x03	; 3
 3aa:	0e 94 52 00 	call	0xa4
	outportb(D12_DATA, 0);
 3ae:	60 e0       	ldi	r22, 0x00	; 0
 3b0:	82 e0       	ldi	r24, 0x02	; 2
 3b2:	0e 94 52 00 	call	0xa4
	outportb(D12_DATA, len);
 3b6:	6f 2d       	mov	r22, r15
 3b8:	82 e0       	ldi	r24, 0x02	; 2
 3ba:	0e 94 52 00 	call	0xa4
	for(i=0; i<len; i++)
 3be:	ff 20       	and	r15, r15
 3c0:	49 f0       	breq	.+18     	; 0x3d4
 3c2:	cf 2d       	mov	r28, r15
		outportb(D12_DATA, *(buf+i));
 3c4:	f8 01       	movw	r30, r16
 3c6:	61 91       	ld	r22, Z+
 3c8:	8f 01       	movw	r16, r30
 3ca:	82 e0       	ldi	r24, 0x02	; 2
 3cc:	0e 94 52 00 	call	0xa4
 3d0:	c1 50       	subi	r28, 0x01	; 1
 3d2:	c1 f7       	brne	.-16     	; 0x3c4
	outportb(D12_COMMAND, 0xFA);
 3d4:	6a ef       	ldi	r22, 0xFA	; 250
 3d6:	83 e0       	ldi	r24, 0x03	; 3
 3d8:	0e 94 52 00 	call	0xa4
	if(bEPPflags.bits.in_isr == 0)
 3dc:	80 91 c0 00 	lds	r24, 0x00C0
 3e0:	84 fd       	sbrc	r24, 4
 3e2:	01 c0       	rjmp	.+2      	; 0x3e6
		ENABLE;
 3e4:	78 94       	sei
	return len;
}
 3e6:	8f 2d       	mov	r24, r15
 3e8:	99 27       	eor	r25, r25
 3ea:	cf 91       	pop	r28
 3ec:	1f 91       	pop	r17
 3ee:	0f 91       	pop	r16
 3f0:	ff 90       	pop	r15
 3f2:	08 95       	ret

000003f4 <D12_AcknowledgeEndpoint>:

/*应答SETUP命令:F1H*/
void D12_AcknowledgeEndpoint(unsigned char endp)
{
 3f4:	1f 93       	push	r17
 3f6:	18 2f       	mov	r17, r24
	outportb(D12_COMMAND, endp);
 3f8:	68 2f       	mov	r22, r24
 3fa:	83 e0       	ldi	r24, 0x03	; 3
 3fc:	0e 94 52 00 	call	0xa4
	outportb(D12_COMMAND, 0xF1);
 400:	61 ef       	ldi	r22, 0xF1	; 241
 402:	83 e0       	ldi	r24, 0x03	; 3
 404:	0e 94 52 00 	call	0xa4
	if(endp == 0)
 408:	11 23       	and	r17, r17
 40a:	21 f4       	brne	.+8      	; 0x414
		outportb(D12_COMMAND, 0xF2);
 40c:	62 ef       	ldi	r22, 0xF2	; 242
 40e:	83 e0       	ldi	r24, 0x03	; 3
 410:	0e 94 52 00 	call	0xa4
 414:	1f 91       	pop	r17
 416:	08 95       	ret

00000418 <stall_ep0>:
}


//this part from chap_9.c
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
	sizeof(USB_DEVICE_DESCRIPTOR),
    USB_DEVICE_DESCRIPTOR_TYPE,
    0x0110,
    USB_CLASS_CODE_TEST_CLASS_DEVICE,
    0, 0,
	EP0_PACKET_SIZE,
	0x0471,//0x0471,
	0x0691,
	0x0100,
    0, 0, 0,
	1
};


CON_INT_ENDP_DESCRIPTOR_STRUCT TRANFER_DESC =
{
{
    sizeof(USB_CONFIGURATION_DESCRIPTOR),
    USB_CONFIGURATION_DESCRIPTOR_TYPE,
    CONFIG_DESCRIPTOR_LENGTH,
	1,
	1,
    0,
    0x60,//0x9F,   //	0x80,
	0xC8//0x32
},

{
    sizeof(USB_INTERFACE_DESCRIPTOR),
    USB_INTERFACE_DESCRIPTOR_TYPE,
    0,
    0,
	NUM_ENDPOINTS,
	USB_CLASS_CODE_TEST_CLASS_DEVICE,
	USB_SUBCLASS_CODE_TEST_CLASS_D12,
	USB_PROTOCOL_CODE_TEST_CLASS_D12,
	0
},

{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x81,
	USB_ENDPOINT_TYPE_INTERRUPT,
	EP1_PACKET_SIZE,
	10
},

{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x1,
	USB_ENDPOINT_TYPE_INTERRUPT,
	EP1_PACKET_SIZE,
	10
},

{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x82,
	USB_ENDPOINT_TYPE_BULK,
	EP2_PACKET_SIZE,
	10
},

{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x2,
	USB_ENDPOINT_TYPE_BULK,
	EP2_PACKET_SIZE,
	10
}
};

void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
 418:	61 e0       	ldi	r22, 0x01	; 1
 41a:	80 e0       	ldi	r24, 0x00	; 0
 41c:	0e 94 10 01 	call	0x220
	D12_SetEndpointStatus(1, 1);
 420:	61 e0       	ldi	r22, 0x01	; 1
 422:	86 2f       	mov	r24, r22
 424:	0e 94 10 01 	call	0x220
 428:	08 95       	ret

0000042a <single_transmit>:
}

void single_transmit(unsigned char * buf, unsigned char len)
{
 42a:	ac 01       	movw	r20, r24
	if( len <= EP0_PACKET_SIZE) {
 42c:	61 31       	cpi	r22, 0x11	; 17
 42e:	18 f4       	brcc	.+6      	; 0x436
		D12_WriteEndpoint(1, len, buf);
 430:	81 e0       	ldi	r24, 0x01	; 1
 432:	0e 94 86 01 	call	0x30c
 436:	08 95       	ret
 438:	08 95       	ret

0000043a <reserved>:
	}
}

void reserved(void)
{
	stall_ep0();
 43a:	0e 94 0c 02 	call	0x418
 43e:	08 95       	ret

00000440 <init_unconfig>:
}

void init_unconfig(void)
{
	D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
 440:	80 e0       	ldi	r24, 0x00	; 0
 442:	0e 94 91 00 	call	0x122
 446:	08 95       	ret

00000448 <init_config>:
}

void init_config(void)
{
	D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
 448:	81 e0       	ldi	r24, 0x01	; 1
 44a:	0e 94 91 00 	call	0x122
 44e:	08 95       	ret

00000450 <get_status>:
}

void get_status(void)
{
 450:	cf 93       	push	r28
 452:	df 93       	push	r29
 454:	cd b7       	in	r28, 0x3d	; 61
 456:	de b7       	in	r29, 0x3e	; 62
 458:	22 97       	sbiw	r28, 0x02	; 2
 45a:	0f b6       	in	r0, 0x3f	; 63
 45c:	f8 94       	cli
 45e:	de bf       	out	0x3e, r29	; 62
 460:	0f be       	out	0x3f, r0	; 63
 462:	cd bf       	out	0x3d, r28	; 61
	unsigned char endp, txdat[2];
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 464:	80 91 06 01 	lds	r24, 0x0106
 468:	8f 71       	andi	r24, 0x1F	; 31
	unsigned char c;
	if (bRecipient == USB_RECIPIENT_DEVICE) {
 46a:	49 f4       	brne	.+18     	; 0x47e
		if(bEPPflags.bits.remote_wakeup == 1)
 46c:	80 91 c0 00 	lds	r24, 0x00C0
 470:	83 ff       	sbrs	r24, 3
 472:	02 c0       	rjmp	.+4      	; 0x478
			txdat[0] = 3;
 474:	83 e0       	ldi	r24, 0x03	; 3
 476:	01 c0       	rjmp	.+2      	; 0x47a
		else
			txdat[0] = 1;
 478:	81 e0       	ldi	r24, 0x01	; 1
 47a:	89 83       	std	Y+1, r24	; 0x01
 47c:	18 c0       	rjmp	.+48     	; 0x4ae
		txdat[1]=0;
		single_transmit(txdat, 2);
	} else if (bRecipient == USB_RECIPIENT_INTERFACE) {
 47e:	81 30       	cpi	r24, 0x01	; 1
 480:	a9 f0       	breq	.+42     	; 0x4ac
		txdat[0]=0;
		txdat[1]=0;
		single_transmit(txdat, 2);
	} else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
 482:	82 30       	cpi	r24, 0x02	; 2
 484:	e1 f4       	brne	.+56     	; 0x4be
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 486:	80 91 0a 01 	lds	r24, 0x010A
 48a:	83 70       	andi	r24, 0x03	; 3
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 48c:	20 91 0a 01 	lds	r18, 0x010A
 490:	30 91 0b 01 	lds	r19, 0x010B
 494:	99 27       	eor	r25, r25
 496:	27 ff       	sbrs	r18, 7
 498:	04 c0       	rjmp	.+8      	; 0x4a2
			c = D12_SelectEndpoint(endp*2 + 1);	/* Control-in */
 49a:	88 0f       	add	r24, r24
 49c:	99 1f       	adc	r25, r25
 49e:	8f 5f       	subi	r24, 0xFF	; 255
 4a0:	01 c0       	rjmp	.+2      	; 0x4a4
		else
			c = D12_SelectEndpoint(endp*2);	/* Control-out */
 4a2:	88 0f       	add	r24, r24
 4a4:	0e 94 f1 00 	call	0x1e2
		if(c & D12_STALL)
 4a8:	81 fd       	sbrc	r24, 1
 4aa:	e6 cf       	rjmp	.-52     	; 0x478
			txdat[0] = 1;
		else
			txdat[0] = 0;
 4ac:	19 82       	std	Y+1, r1	; 0x01
		txdat[1] = 0;
 4ae:	fe 01       	movw	r30, r28
 4b0:	31 96       	adiw	r30, 0x01	; 1
 4b2:	11 82       	std	Z+1, r1	; 0x01
		single_transmit(txdat, 2);
 4b4:	62 e0       	ldi	r22, 0x02	; 2
 4b6:	cf 01       	movw	r24, r30
 4b8:	0e 94 15 02 	call	0x42a
 4bc:	02 c0       	rjmp	.+4      	; 0x4c2
	} else
		stall_ep0();
 4be:	0e 94 0c 02 	call	0x418
 4c2:	22 96       	adiw	r28, 0x02	; 2
 4c4:	0f b6       	in	r0, 0x3f	; 63
 4c6:	f8 94       	cli
 4c8:	de bf       	out	0x3e, r29	; 62
 4ca:	0f be       	out	0x3f, r0	; 63
 4cc:	cd bf       	out	0x3d, r28	; 61
 4ce:	df 91       	pop	r29
 4d0:	cf 91       	pop	r28
 4d2:	08 95       	ret

000004d4 <clear_feature>:
}

void clear_feature(void)
{
	unsigned char endp;
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 4d4:	80 91 06 01 	lds	r24, 0x0106
 4d8:	8f 71       	andi	r24, 0x1F	; 31
	if (bRecipient == USB_RECIPIENT_DEVICE
 4da:	71 f4       	brne	.+28     	; 0x4f8
 4dc:	80 91 08 01 	lds	r24, 0x0108
 4e0:	90 91 09 01 	lds	r25, 0x0109
 4e4:	01 97       	sbiw	r24, 0x01	; 1
 4e6:	49 f5       	brne	.+82     	; 0x53a
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
		DISABLE;
 4e8:	f8 94       	cli
		bEPPflags.bits.remote_wakeup = 0;
 4ea:	80 91 c0 00 	lds	r24, 0x00C0
 4ee:	87 7f       	andi	r24, 0xF7	; 247
 4f0:	80 93 c0 00 	sts	0x00C0, r24
		ENABLE;
 4f4:	78 94       	sei
 4f6:	1b c0       	rjmp	.+54     	; 0x52e
		single_transmit(0, 0);
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT
 4f8:	82 30       	cpi	r24, 0x02	; 2
 4fa:	f9 f4       	brne	.+62     	; 0x53a
 4fc:	80 91 08 01 	lds	r24, 0x0108
 500:	90 91 09 01 	lds	r25, 0x0109
 504:	89 2b       	or	r24, r25
 506:	c9 f4       	brne	.+50     	; 0x53a
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 508:	80 91 0a 01 	lds	r24, 0x010A
 50c:	83 70       	andi	r24, 0x03	; 3
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 50e:	20 91 0a 01 	lds	r18, 0x010A
 512:	30 91 0b 01 	lds	r19, 0x010B
 516:	99 27       	eor	r25, r25
 518:	27 ff       	sbrs	r18, 7
 51a:	05 c0       	rjmp	.+10     	; 0x526
			/* clear TX stall for IN on EPn. */
			D12_SetEndpointStatus(endp*2 + 1, 0);
 51c:	88 0f       	add	r24, r24
 51e:	99 1f       	adc	r25, r25
 520:	60 e0       	ldi	r22, 0x00	; 0
 522:	8f 5f       	subi	r24, 0xFF	; 255
 524:	02 c0       	rjmp	.+4      	; 0x52a
		else
			/* clear RX stall for OUT on EPn. */
			D12_SetEndpointStatus(endp*2, 0);
 526:	60 e0       	ldi	r22, 0x00	; 0
 528:	88 0f       	add	r24, r24
 52a:	0e 94 10 01 	call	0x220
		single_transmit(0, 0);
 52e:	60 e0       	ldi	r22, 0x00	; 0
 530:	80 e0       	ldi	r24, 0x00	; 0
 532:	90 e0       	ldi	r25, 0x00	; 0
 534:	0e 94 15 02 	call	0x42a
 538:	08 95       	ret
	} else
		stall_ep0();
 53a:	0e 94 0c 02 	call	0x418
 53e:	08 95       	ret
 540:	08 95       	ret

00000542 <set_feature>:
}

void set_feature(void)
{
	unsigned char endp;
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 542:	80 91 06 01 	lds	r24, 0x0106
 546:	8f 71       	andi	r24, 0x1F	; 31
	if (bRecipient == USB_RECIPIENT_DEVICE
 548:	71 f4       	brne	.+28     	; 0x566
 54a:	80 91 08 01 	lds	r24, 0x0108
 54e:	90 91 09 01 	lds	r25, 0x0109
 552:	01 97       	sbiw	r24, 0x01	; 1
 554:	69 f5       	brne	.+90     	; 0x5b0
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
		DISABLE;
 556:	f8 94       	cli
		bEPPflags.bits.remote_wakeup = 1;
 558:	80 91 c0 00 	lds	r24, 0x00C0
 55c:	88 60       	ori	r24, 0x08	; 8
 55e:	80 93 c0 00 	sts	0x00C0, r24
		ENABLE;
 562:	78 94       	sei
 564:	1f c0       	rjmp	.+62     	; 0x5a4
		single_transmit(0, 0);
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT
 566:	82 30       	cpi	r24, 0x02	; 2
 568:	19 f5       	brne	.+70     	; 0x5b0
 56a:	80 91 08 01 	lds	r24, 0x0108
 56e:	90 91 09 01 	lds	r25, 0x0109
 572:	89 2b       	or	r24, r25
 574:	e9 f4       	brne	.+58     	; 0x5b0
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 576:	80 91 0a 01 	lds	r24, 0x010A
 57a:	83 70       	andi	r24, 0x03	; 3
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 57c:	20 91 0a 01 	lds	r18, 0x010A
 580:	30 91 0b 01 	lds	r19, 0x010B
 584:	99 27       	eor	r25, r25
 586:	27 ff       	sbrs	r18, 7
 588:	05 c0       	rjmp	.+10     	; 0x594
			/* clear TX stall for IN on EPn. */
			D12_SetEndpointStatus(endp*2 + 1, 1);
 58a:	88 0f       	add	r24, r24

⌨️ 快捷键说明

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