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

📄 usb.lss

📁 菲利普的pdiusb d12芯片和avr mega8的usb通讯试验代码
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 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 + -