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

📄 usb.lss

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