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

📄 main.c.lss

📁 AVR单片机控制的PDIUSBD12原程序
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 984:	83 70       	andi	r24, 0x03	; 3
 986:	99 27       	eor	r25, r25
 988:	66 23       	and	r22, r22
 98a:	29 f0       	breq	.+10     	; 0x996 <clear_feature+0x4e>
				D12_SetEndpointStatus(endp*2+1,0);					//清除输入端点STALL特性
 98c:	88 0f       	add	r24, r24
 98e:	99 1f       	adc	r25, r25
 990:	60 e0       	ldi	r22, 0x00	; 0
 992:	8f 5f       	subi	r24, 0xFF	; 255
 994:	01 c0       	rjmp	.+2      	; 0x998 <clear_feature+0x50>
			else
				D12_SetEndpointStatus(endp*2,0);					//清除输出端点STALL特性
 996:	88 0f       	add	r24, r24
 998:	0e 94 a9 01 	call	0x352 <D12_SetEndpointStatus>
			single_transmit(0,0);									//发送响应
 99c:	60 e0       	ldi	r22, 0x00	; 0
 99e:	80 e0       	ldi	r24, 0x00	; 0
 9a0:	90 e0       	ldi	r25, 0x00	; 0
 9a2:	0e 94 10 04 	call	0x820 <single_transmit>
 9a6:	08 95       	ret
		}
		else
			stall_ep0();										//没有该请求,返回STALL			
 9a8:	0e 94 aa 02 	call	0x554 <stall_ep0>
 9ac:	08 95       	ret

000009ae <set_feature>:
}
//设置特性
void set_feature(void)
{
	unsigned char endp;
	//读取设备请求中的接收方
	unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 9ae:	80 91 24 01 	lds	r24, 0x0124
 9b2:	8f 71       	andi	r24, 0x1F	; 31
	if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
 9b4:	71 f4       	brne	.+28     	; 0x9d2 <set_feature+0x24>
 9b6:	80 91 26 01 	lds	r24, 0x0126
 9ba:	90 91 27 01 	lds	r25, 0x0127
 9be:	01 97       	sbiw	r24, 0x01	; 1
 9c0:	69 f5       	brne	.+90     	; 0xa1c <set_feature+0x6e>
	{//设置远程唤醒特性
		DISABLE;
 9c2:	f8 94       	cli
		bEPPflags.bits.remote_wakeup=1;
 9c4:	80 91 22 01 	lds	r24, 0x0122
 9c8:	80 61       	ori	r24, 0x10	; 16
 9ca:	80 93 22 01 	sts	0x0122, r24
		ENABLE;
 9ce:	78 94       	sei
 9d0:	1f c0       	rjmp	.+62     	; 0xa10 <set_feature+0x62>
		single_transmit(0,0);										//返回应答
	}
	else
		if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
 9d2:	82 30       	cpi	r24, 0x02	; 2
 9d4:	19 f5       	brne	.+70     	; 0xa1c <set_feature+0x6e>
 9d6:	80 91 26 01 	lds	r24, 0x0126
 9da:	90 91 27 01 	lds	r25, 0x0127
 9de:	89 2b       	or	r24, r25
 9e0:	e9 f4       	brne	.+58     	; 0xa1c <set_feature+0x6e>
		{
			endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 9e2:	90 91 28 01 	lds	r25, 0x0128
 9e6:	89 2f       	mov	r24, r25
 9e8:	83 70       	andi	r24, 0x03	; 3
 9ea:	28 2f       	mov	r18, r24
 9ec:	33 27       	eor	r19, r19
			if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 9ee:	97 ff       	sbrs	r25, 7
 9f0:	06 c0       	rjmp	.+12     	; 0x9fe <set_feature+0x50>
				D12_SetEndpointStatus(endp*2+1,1);
 9f2:	22 0f       	add	r18, r18
 9f4:	33 1f       	adc	r19, r19
 9f6:	61 e0       	ldi	r22, 0x01	; 1
 9f8:	82 2f       	mov	r24, r18
 9fa:	86 0f       	add	r24, r22
 9fc:	07 c0       	rjmp	.+14     	; 0xa0c <set_feature+0x5e>
			else
				D12_SetEndpointStatus(endp*2,1);					//设置输出端点禁止
 9fe:	61 e0       	ldi	r22, 0x01	; 1
 a00:	82 2f       	mov	r24, r18
 a02:	06 2e       	mov	r0, r22
 a04:	01 c0       	rjmp	.+2      	; 0xa08 <set_feature+0x5a>
 a06:	88 0f       	add	r24, r24
 a08:	0a 94       	dec	r0
 a0a:	ea f7       	brpl	.-6      	; 0xa06 <set_feature+0x58>
 a0c:	0e 94 a9 01 	call	0x352 <D12_SetEndpointStatus>
			single_transmit(0,0);									//发送响应
 a10:	60 e0       	ldi	r22, 0x00	; 0
 a12:	80 e0       	ldi	r24, 0x00	; 0
 a14:	90 e0       	ldi	r25, 0x00	; 0
 a16:	0e 94 10 04 	call	0x820 <single_transmit>
 a1a:	08 95       	ret
		}
		else
			stall_ep0();										//没有该请求,返回STALL			
 a1c:	0e 94 aa 02 	call	0x554 <stall_ep0>
 a20:	08 95       	ret

00000a22 <set_address>:
}
//设置地址
void set_address(void)
{
	D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK),1);
 a22:	80 91 26 01 	lds	r24, 0x0126
 a26:	61 e0       	ldi	r22, 0x01	; 1
 a28:	8f 77       	andi	r24, 0x7F	; 127
 a2a:	0e 94 26 01 	call	0x24c <D12_SetAddressEnable>
	single_transmit(0,0);									//发送响应
 a2e:	60 e0       	ldi	r22, 0x00	; 0
 a30:	80 e0       	ldi	r24, 0x00	; 0
 a32:	90 e0       	ldi	r25, 0x00	; 0
 a34:	0e 94 10 04 	call	0x820 <single_transmit>
 a38:	08 95       	ret

00000a3a <get_descriptor>:
}
//获取描述符
void get_descriptor(void)
{
	//读取请求的描述符类型
	unsigned char bDescriptor = ControlData.DeviceRequest.wValue;
 a3a:	80 91 26 01 	lds	r24, 0x0126
	if(bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
 a3e:	81 30       	cpi	r24, 0x01	; 1
 a40:	29 f4       	brne	.+10     	; 0xa4c <get_descriptor+0x12>
	{
		//获取设备描述符
		code_transmit((unsigned char *) & DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
 a42:	62 e1       	ldi	r22, 0x12	; 18
 a44:	70 e0       	ldi	r23, 0x00	; 0
 a46:	8e e8       	ldi	r24, 0x8E	; 142
 a48:	90 e0       	ldi	r25, 0x00	; 0
 a4a:	14 c0       	rjmp	.+40     	; 0xa74 <get_descriptor+0x3a>
	}
	else
		if(bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
 a4c:	82 30       	cpi	r24, 0x02	; 2
 a4e:	a9 f4       	brne	.+42     	; 0xa7a <get_descriptor+0x40>
		{
			if(ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
 a50:	80 91 2a 01 	lds	r24, 0x012A
 a54:	90 91 2b 01 	lds	r25, 0x012B
 a58:	8f 97       	sbiw	r24, 0x2f	; 47
 a5a:	30 f0       	brcs	.+12     	; 0xa68 <get_descriptor+0x2e>
				ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;
 a5c:	8e e2       	ldi	r24, 0x2E	; 46
 a5e:	90 e0       	ldi	r25, 0x00	; 0
 a60:	90 93 2b 01 	sts	0x012B, r25
 a64:	80 93 2a 01 	sts	0x012A, r24
			//获取配置描述符+配置描述符+接口描述符+端点描述符
			code_transmit((unsigned char *) & ConfigDescr,ControlData.DeviceRequest.wLength);
 a68:	60 91 2a 01 	lds	r22, 0x012A
 a6c:	70 91 2b 01 	lds	r23, 0x012B
 a70:	85 e8       	ldi	r24, 0x85	; 133
 a72:	90 e0       	ldi	r25, 0x00	; 0
 a74:	0e 94 17 04 	call	0x82e <code_transmit>
 a78:	08 95       	ret
		}
		else
		stall_ep0();										//没有该请求,返回STALL		
 a7a:	0e 94 aa 02 	call	0x554 <stall_ep0>
 a7e:	08 95       	ret

00000a80 <get_configuration>:
}
//获取配置
void get_configuration(void)
{
 a80:	cf 93       	push	r28
 a82:	df 93       	push	r29
 a84:	cd b7       	in	r28, 0x3d	; 61
 a86:	de b7       	in	r29, 0x3e	; 62
 a88:	21 97       	sbiw	r28, 0x01	; 1
 a8a:	0f b6       	in	r0, 0x3f	; 63
 a8c:	f8 94       	cli
 a8e:	de bf       	out	0x3e, r29	; 62
 a90:	0f be       	out	0x3f, r0	; 63
 a92:	cd bf       	out	0x3d, r28	; 61
	unsigned char c=bEPPflags.bits.configuration;
 a94:	80 91 23 01 	lds	r24, 0x0123
 a98:	81 70       	andi	r24, 0x01	; 1
 a9a:	89 83       	std	Y+1, r24	; 0x01
	single_transmit(&c,1);
 a9c:	61 e0       	ldi	r22, 0x01	; 1
 a9e:	ce 01       	movw	r24, r28
 aa0:	01 96       	adiw	r24, 0x01	; 1
 aa2:	0e 94 10 04 	call	0x820 <single_transmit>
 aa6:	21 96       	adiw	r28, 0x01	; 1
 aa8:	0f b6       	in	r0, 0x3f	; 63
 aaa:	f8 94       	cli
 aac:	de bf       	out	0x3e, r29	; 62
 aae:	0f be       	out	0x3f, r0	; 63
 ab0:	cd bf       	out	0x3d, r28	; 61
 ab2:	df 91       	pop	r29
 ab4:	cf 91       	pop	r28
 ab6:	08 95       	ret

00000ab8 <set_configuration>:
}
//设置配置
void set_configuration(void)
{
	if(ControlData.DeviceRequest.wValue==0)
 ab8:	80 91 26 01 	lds	r24, 0x0126
 abc:	90 91 27 01 	lds	r25, 0x0127
 ac0:	00 97       	sbiw	r24, 0x00	; 0
 ac2:	69 f4       	brne	.+26     	; 0xade <set_configuration+0x26>
	{
		//配置值不对,设备进入未配置状态
		single_transmit(0,0);						//发送响应
 ac4:	60 e0       	ldi	r22, 0x00	; 0
 ac6:	0e 94 10 04 	call	0x820 <single_transmit>
		DISABLE;
 aca:	f8 94       	cli
		bEPPflags.bits.configuration=0;				//标记未配置
 acc:	80 91 23 01 	lds	r24, 0x0123
 ad0:	8e 7f       	andi	r24, 0xFE	; 254
 ad2:	80 93 23 01 	sts	0x0123, r24
		ENABLE;
 ad6:	78 94       	sei
		init_unconfig();							//进入地址状态,禁止0除外的所有端点
 ad8:	0e 94 08 04 	call	0x810 <init_unconfig>
 adc:	08 95       	ret
	}
	else
		if(ControlData.DeviceRequest.wValue==1)
 ade:	01 97       	sbiw	r24, 0x01	; 1
 ae0:	89 f4       	brne	.+34     	; 0xb04 <set_configuration+0x4c>
		{
			//
			single_transmit(0,0);						//发送响应
 ae2:	60 e0       	ldi	r22, 0x00	; 0
 ae4:	80 e0       	ldi	r24, 0x00	; 0
 ae6:	90 e0       	ldi	r25, 0x00	; 0
 ae8:	0e 94 10 04 	call	0x820 <single_transmit>
			init_unconfig();							//进入地址状态,禁止0除外的所有端点
 aec:	0e 94 08 04 	call	0x810 <init_unconfig>
			init_config();								//配置处理,允许端点收发
 af0:	0e 94 0c 04 	call	0x818 <init_config>
			DISABLE;
 af4:	f8 94       	cli
			bEPPflags.bits.configuration=1;				//标记配置
 af6:	80 91 23 01 	lds	r24, 0x0123
 afa:	81 60       	ori	r24, 0x01	; 1
 afc:	80 93 23 01 	sts	0x0123, r24
			ENABLE;
 b00:	78 94       	sei
 b02:	08 95       	ret
		}
		else
			stall_ep0();								//没有该请求,返回STALL
 b04:	0e 94 aa 02 	call	0x554 <stall_ep0>
 b08:	08 95       	ret

00000b0a <get_interface>:
}
//获取接口信息
void get_interface(void)
{
 b0a:	cf 93       	push	r28
 b0c:	df 93       	push	r29
 b0e:	cd b7       	in	r28, 0x3d	; 61
 b10:	de b7       	in	r29, 0x3e	; 62
 b12:	21 97       	sbiw	r28, 0x01	; 1
 b14:	0f b6       	in	r0, 0x3f	; 63
 b16:	f8 94       	cli
 b18:	de bf       	out	0x3e, r29	; 62
 b1a:	0f be       	out	0x3f, r0	; 63
 b1c:	cd bf       	out	0x3d, r28	; 61
	unsigned char txdat =0;							//本设备只有一个接口
 b1e:	19 82       	std	Y+1, r1	; 0x01
	single_transmit(&txdat,1);
 b20:	61 e0       	ldi	r22, 0x01	; 1
 b22:	ce 01       	movw	r24, r28
 b24:	01 96       	adiw	r24, 0x01	; 1
 b26:	0e 94 10 04 	call	0x820 <single_transmit>
 b2a:	21 96       	adiw	r28, 0x01	; 1
 b2c:	0f b6       	in	r0, 0x3f	; 63
 b2e:	f8 94       	cli
 b30:	de bf       	out	0x3e, r29	; 62
 b32:	0f be       	out	0x3f, r0	; 63
 b34:	cd bf       	out	0x3d, r28	; 61
 b36:	df 91       	pop	r29
 b38:	cf 91       	pop	r28
 b3a:	08 95       	ret

00000b3c <set_interface>:
}
//设置接口
void set_interface(void)
{
	if(ControlData.DeviceRequest.wValue==0 && ControlData.DeviceRequest.wIndex==0 )
 b3c:	80 91 26 01 	lds	r24, 0x0126
 b40:	90 91 27 01 	lds	r25, 0x0127
 b44:	89 2b       	or	r24, r25
 b46:	51 f4       	brne	.+20     	; 0xb5c <set_interface+0x20>
 b48:	80 91 28 01 	lds	r24, 0x0128
 b4c:	90 91 29 01 	lds	r25, 0x0129
 b50:	00 97       	sbiw	r24, 0x00	; 0
 b52:	21 f4       	brne	.+8      	; 0xb5c <set_interface+0x20>
		single_transmit(0,0);						//发送响应
 b54:	60 e0       	ldi	r22, 0x00	; 0
 b56:	0e 94 10 04 	call	0x820 <single_transmit>
 b5a:	08 95       	ret
	else
		stall_ep0();								//没有该请求,返回STALL
 b5c:	0e 94 aa 02 	call	0x554 <stall_ep0>
 b60:	08 95       	ret

00000b62 <get_firmware_version>:
#include "protodma.h"

//获取固件版本号
void get_firmware_version(void)
{
 b62:	cf 93       	push	r28
 b64:	df 93       	push	r29
 b66:	cd b7       	in	r28, 0x3d	; 61
 b68:	de b7       	in	r29, 0x3e	; 62
 b6a:	21 97       	sbiw	r28, 0x01	; 1
 b6c:	0f b6       	in	r0, 0x3f	; 63
 b6e:	f8 94       	cli
 b70:	de bf       	out	0x3e, r29	; 62
 b72:	0f be       	out	0x3f, r0	; 63
 b74:	cd bf       	out	0x3d, r28	; 61
	unsigned char i;
	i=0x30;												//固件版本号
 b76:	80 e3       	ldi	r24, 0x30	; 48
 b78:	89 83       	std	Y+1, r24	; 0x01
	D12_WriteEndpoint(1,1,(unsigned char *) &i);		//发送数据
 b7a:	ae 01       	movw	r20, r28
 b7c:	4f 5f       	subi	r20, 0xFF	; 255
 b7e:	5f 4f       	sbci	r21, 0xFF	; 255
 b80:	61 e0       	ldi	r22, 0x01	; 1
 b82:	70 e0       	ldi	r23, 0x00	; 0
 b84:	cb 01       	movw	r24, r22
 b86:	0e 94 4d 02 	call	0x49a <D12_WriteEndpoint>
 b8a:	21 96       	adiw	r28, 0x01	; 1
 b8c:	0f b6       	in	r0, 0x3f	; 63
 b8e:	f8 94       	cli
 b90:	de bf       	out	0x3e, r29	; 62
 b92:	0f be       	out	0x3f, r0	; 63
 b94:	cd bf       	out	0x3d, r28	; 61
 b96:	df 91       	pop	r29
 b98:	cf 91       	pop	r28
 b9a:	08 95       	ret

00000b9c <ger_buffer_size>:
}
//获取端点2缓存区大小
void ger_buffer_size(void)
{
 b9c:	cf 93       	push	r28
 b9e:	df 93       	push	r29
 ba0:	cd b7       	in	r28, 0x3d	; 61
 ba2:	de b7       	in	r29, 0x3e	; 62
 ba4:	24 97       	sbiw	r28, 0x04	; 4
 ba6:	0f b6       	in	r0, 0x3f	; 63
 ba8:	f8 94       	cli
 baa:	de bf       	out	0x3e, r29	; 62
 bac:	0f be       	out	0x3f, r0	; 63
 bae:	cd bf       	out	0x3d, r28	; 61
	unsigned char i[4];
	i[0]=EP2_PACKET_SIZE;								//断电2缓冲区大小
 bb0:	80 e4       	ldi	r24, 0x40	; 64
 bb2:	89 83       	std	Y+1, r24	; 0x01
	i[1]=0;
 bb4:	fe 01       	movw	r30, r28
 bb6:	31 96       	adiw	r30, 0x01	; 1
 bb8:	11 82       	std	Z+1, r1	; 0x01
	i[2]=0;
 bba:	1b 82       	std	Y+3, r1	; 0x03
	i[3]=0;
 bbc:	1c 82       	std	Y+4, r1	; 0x04
	D12_WriteEndpoint(1,4,i);							//发送数据
 bbe:	af 01       	movw	r20, r30
 bc0:	64 e0       	ldi	r22, 0x04	; 4
 bc2:	70 e0       	ldi	r23, 0x00	; 0
 bc4:	81 e0       	ldi	r24, 0x01	; 1
 bc6:	90 e0       	ldi	r25, 0x00	; 0
 bc8:	0e 94 4d 02 	call	0x49a <D12_WriteEndpoint>
 bcc:	24 96       	adiw	r28, 0x04	; 4
 bce:	0f b6       	in	r0, 0x3f	; 63
 b

⌨️ 快捷键说明

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