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

📄 usb.lss

📁 菲利普的pdiusb d12芯片和avr mega8的usb通讯试验代码
💻 LSS
📖 第 1 页 / 共 5 页
字号:

USB.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         00000060  00800100  00000bd0  00000c64  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  1 .text         00000bd0  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .bss          00000068  00800160  00800160  00000cc4  2**0
                  ALLOC
  3 .noinit       00000000  008001c8  008001c8  00000cc4  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  00000cc4  2**0
                  CONTENTS
  5 .stab         0000036c  00000000  00000000  00000cc4  2**2
                  CONTENTS, READONLY, DEBUGGING
  6 .stabstr      00000084  00000000  00000000  00001030  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_aranges 00000064  00000000  00000000  000010b4  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_pubnames 00000448  00000000  00000000  00001118  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_info   000017de  00000000  00000000  00001560  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_abbrev 00000603  00000000  00000000  00002d3e  2**0
                  CONTENTS, READONLY, DEBUGGING
 11 .debug_line   00000d90  00000000  00000000  00003341  2**0
                  CONTENTS, READONLY, DEBUGGING
 12 .debug_str    000007f5  00000000  00000000  000040d1  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 34 00 	jmp	0x68 <__ctors_end>
   4:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
   8:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
   c:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  10:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  14:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  18:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  1c:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  20:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  24:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  28:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  2c:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  30:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  34:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  38:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  3c:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  40:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  44:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  48:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  4c:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  50:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  54:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  58:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  5c:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  60:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>
  64:	0c 94 4f 00 	jmp	0x9e <__bad_interrupt>

00000068 <__ctors_end>:
  68:	11 24       	eor	r1, r1
  6a:	1f be       	out	0x3f, r1	; 63
  6c:	cf ef       	ldi	r28, 0xFF	; 255
  6e:	d4 e0       	ldi	r29, 0x04	; 4
  70:	de bf       	out	0x3e, r29	; 62
  72:	cd bf       	out	0x3d, r28	; 61

00000074 <__do_copy_data>:
  74:	11 e0       	ldi	r17, 0x01	; 1
  76:	a0 e0       	ldi	r26, 0x00	; 0
  78:	b1 e0       	ldi	r27, 0x01	; 1
  7a:	e0 ed       	ldi	r30, 0xD0	; 208
  7c:	fb e0       	ldi	r31, 0x0B	; 11
  7e:	02 c0       	rjmp	.+4      	; 0x84 <.do_copy_data_start>

00000080 <.do_copy_data_loop>:
  80:	05 90       	lpm	r0, Z+
  82:	0d 92       	st	X+, r0

00000084 <.do_copy_data_start>:
  84:	a0 36       	cpi	r26, 0x60	; 96
  86:	b1 07       	cpc	r27, r17
  88:	d9 f7       	brne	.-10     	; 0x80 <.do_copy_data_loop>

0000008a <__do_clear_bss>:
  8a:	11 e0       	ldi	r17, 0x01	; 1
  8c:	a0 e6       	ldi	r26, 0x60	; 96
  8e:	b1 e0       	ldi	r27, 0x01	; 1
  90:	01 c0       	rjmp	.+2      	; 0x94 <.do_clear_bss_start>

00000092 <.do_clear_bss_loop>:
  92:	1d 92       	st	X+, r1

00000094 <.do_clear_bss_start>:
  94:	a8 3c       	cpi	r26, 0xC8	; 200
  96:	b1 07       	cpc	r27, r17
  98:	e1 f7       	brne	.-8      	; 0x92 <.do_clear_bss_loop>
  9a:	0c 94 ad 05 	jmp	0xb5a <main>

0000009e <__bad_interrupt>:
  9e:	0c 94 00 00 	jmp	0x0 <__vectors>

000000a2 <stall_ep0>:
** 功能描述: 使控制端点处于停止状态
**************************************/
void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
  a2:	61 e0       	ldi	r22, 0x01	; 1
  a4:	80 e0       	ldi	r24, 0x00	; 0
  a6:	0e 94 03 04 	call	0x806 <D12_SetEndpointStatus>
	D12_SetEndpointStatus(1, 1);
  aa:	61 e0       	ldi	r22, 0x01	; 1
  ac:	86 2f       	mov	r24, r22
  ae:	0e 94 03 04 	call	0x806 <D12_SetEndpointStatus>
  b2:	08 95       	ret

000000b4 <reserved>:
}
   
   
/*************************************
** 函数名称: void reserved(void)
** 功能描述: 保留子程序
**************************************/   
void reserved(void)
{
	stall_ep0();				//返回STALL
  b4:	0e 94 51 00 	call	0xa2 <stall_ep0>
  b8:	08 95       	ret

000000ba <init_unconfig>:
}


/**********************************************
** 函数名称: void init_unconfig(void)
** 功能描述: 进入地址状态,禁止0除外的所有端点
***********************************************/
void init_unconfig(void)
{
	D12_SetEndpointEnable(0);	//禁止0除外的所有端点
  ba:	80 e0       	ldi	r24, 0x00	; 0
  bc:	0e 94 76 03 	call	0x6ec <D12_SetEndpointEnable>
  c0:	08 95       	ret

000000c2 <init_config>:
}

/**********************************************
** 函数名称: void init_config(void)
** 功能描述: 配置处理,允许端点收发
***********************************************/
void init_config(void)
{
	D12_SetEndpointEnable(1);	//使能普通/同步端点使能
  c2:	81 e0       	ldi	r24, 0x01	; 1
  c4:	0e 94 76 03 	call	0x6ec <D12_SetEndpointEnable>
  c8:	08 95       	ret

000000ca <single_transmit>:
}


/*********************************************************
** 函数名称: void single_transmit(INT8U * buf, INT8U len)
** 功能描述: 通过端点索引 1 发送数据(DATA 类型)
** 输	 入: INT8U * buf:	发送数据指针
			 INT8U len:		发送数据长度
** 输	 出: 无
**********************************************************/
void single_transmit(INT8U * buf, INT8U len)
{
  ca:	ac 01       	movw	r20, r24
	if( len <= EP0_PACKET_SIZE) {			//长度小于EP0最大信息包大小才允许发送
  cc:	61 31       	cpi	r22, 0x11	; 17
  ce:	18 f4       	brcc	.+6      	; 0xd6 <single_transmit+0xc>
		D12_WriteEndpoint(1, len, buf);
  d0:	81 e0       	ldi	r24, 0x01	; 1
  d2:	0e 94 68 04 	call	0x8d0 <D12_WriteEndpoint>
  d6:	08 95       	ret

000000d8 <code_transmit>:
	}
}

/*************************************************************
** 函数名称: void code_transmit(INT8U * pRomData, INT16U len)
** 功能描述: 通过端点索引 1 发送数据(CODE类型)
** 输	 入: INT8U  *pRomData:	发送数据指针
			 INT16U len:		发送数据长度
** 输	 出: 无
**************************************************************/
void code_transmit(INT8U *pRomData, INT16U len)
{
  d8:	ac 01       	movw	r20, r24
	ControlData.wCount = 0;								//传输字节数计数器清0
  da:	10 92 6d 01 	sts	0x016D, r1
  de:	10 92 6c 01 	sts	0x016C, r1
	if(ControlData.wLength > len)
  e2:	80 91 6a 01 	lds	r24, 0x016A
  e6:	90 91 6b 01 	lds	r25, 0x016B
  ea:	68 17       	cp	r22, r24
  ec:	79 07       	cpc	r23, r25
  ee:	20 f4       	brcc	.+8      	; 0xf8 <code_transmit+0x20>
		ControlData.wLength = len;						//传输数据总字节数不得超过len
  f0:	70 93 6b 01 	sts	0x016B, r23
  f4:	60 93 6a 01 	sts	0x016A, r22

	ControlData.pData = pRomData;						//传输数据指针指向pRomData
  f8:	50 93 6f 01 	sts	0x016F, r21
  fc:	40 93 6e 01 	sts	0x016E, r20
	if( ControlData.wLength >= EP0_PACKET_SIZE) {		//传输数据总字节数大于端点0最大信息包大小
 100:	80 91 6a 01 	lds	r24, 0x016A
 104:	90 91 6b 01 	lds	r25, 0x016B
 108:	40 97       	sbiw	r24, 0x10	; 16
 10a:	b0 f0       	brcs	.+44     	; 0x138 <code_transmit+0x60>
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);	//发送端点0最大信息包大小个字节
 10c:	60 e1       	ldi	r22, 0x10	; 16
 10e:	81 e0       	ldi	r24, 0x01	; 1
 110:	0e 94 68 04 	call	0x8d0 <D12_WriteEndpoint>
		ControlData.wCount += EP0_PACKET_SIZE;						//统计已发送字节数
 114:	80 91 6c 01 	lds	r24, 0x016C
 118:	90 91 6d 01 	lds	r25, 0x016D
 11c:	40 96       	adiw	r24, 0x10	; 16
 11e:	90 93 6d 01 	sts	0x016D, r25
 122:	80 93 6c 01 	sts	0x016C, r24

		DISABLE();
 126:	f8 94       	cli
		bEPPflags.bits.control_state = USB_TRANSMIT;				//标志数据发送状态			
 128:	80 91 60 01 	lds	r24, 0x0160
 12c:	8f 73       	andi	r24, 0x3F	; 63
 12e:	80 64       	ori	r24, 0x40	; 64
 130:	80 93 60 01 	sts	0x0160, r24
		ENABLE();
 134:	78 94       	sei
 136:	08 95       	ret
	}
	else {
		D12_WriteEndpoint(1, ControlData.wLength, pRomData);		//写入传输数据总字节数
 138:	60 91 6a 01 	lds	r22, 0x016A
 13c:	81 e0       	ldi	r24, 0x01	; 1
 13e:	0e 94 68 04 	call	0x8d0 <D12_WriteEndpoint>
		ControlData.wCount += ControlData.wLength;					//统计已发送字节数
 142:	80 91 6c 01 	lds	r24, 0x016C
 146:	90 91 6d 01 	lds	r25, 0x016D
 14a:	20 91 6a 01 	lds	r18, 0x016A
 14e:	30 91 6b 01 	lds	r19, 0x016B
 152:	82 0f       	add	r24, r18
 154:	93 1f       	adc	r25, r19
 156:	90 93 6d 01 	sts	0x016D, r25
 15a:	80 93 6c 01 	sts	0x016C, r24
		DISABLE();
 15e:	f8 94       	cli
		bEPPflags.bits.control_state = USB_IDLE;					//标志空闲状态
 160:	80 91 60 01 	lds	r24, 0x0160
 164:	8f 73       	andi	r24, 0x3F	; 63
 166:	80 93 60 01 	sts	0x0160, r24
		ENABLE();
 16a:	78 94       	sei
 16c:	08 95       	ret

0000016e <get_status>:
	}
}

//*************************************************************************
// USB 标准设备请求服务程序
//*************************************************************************

/********************************************************************
** 函数名称: void get_status(void)
** 功能描述: 主机要求获取状态,设备返回16位的状态描述给主机
*********************************************************************/
void get_status(void)
{
 16e:	cf 93       	push	r28
 170:	df 93       	push	r29
 172:	cd b7       	in	r28, 0x3d	; 61
 174:	de b7       	in	r29, 0x3e	; 62
 176:	22 97       	sbiw	r28, 0x02	; 2
 178:	0f b6       	in	r0, 0x3f	; 63
 17a:	f8 94       	cli
 17c:	de bf       	out	0x3e, r29	; 62
 17e:	0f be       	out	0x3f, r0	; 63
 180:	cd bf       	out	0x3d, r28	; 61
	INT8U endp, txdat[2], c;
	INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;	
 182:	80 91 62 01 	lds	r24, 0x0162
 186:	8f 71       	andi	r24, 0x1F	; 31
																//取得设备请求类型	
	if (bRecipient == USB_RECIPIENT_DEVICE) {					//对设备请求
 188:	49 f4       	brne	.+18     	; 0x19c <get_status+0x2e>
		if(bEPPflags.bits.remote_wakeup == 1)			
 18a:	80 91 60 01 	lds	r24, 0x0160
 18e:	84 ff       	sbrs	r24, 4
 190:	02 c0       	rjmp	.+4      	; 0x196 <get_status+0x28>
			txdat[0] = 3;										//支持远程唤醒、自供电
 192:	83 e0       	ldi	r24, 0x03	; 3
 194:	01 c0       	rjmp	.+2      	; 0x198 <get_status+0x2a>
		else
			txdat[0] = 1;										//不支持远程唤醒、自供电
 196:	81 e0       	ldi	r24, 0x01	; 1
 198:	89 83       	std	Y+1, r24	; 0x01
 19a:	18 c0       	rjmp	.+48     	; 0x1cc <get_status+0x5e>
		txdat[1]=0;												//高8位为0
		single_transmit(txdat, 2);								//发送16位的状态到主机
		
	} else if (bRecipient == USB_RECIPIENT_INTERFACE) {			//对接口请求
 19c:	81 30       	cpi	r24, 0x01	; 1
 19e:	a9 f0       	breq	.+42     	; 0x1ca <get_status+0x5c>
		txdat[0]=0;
		txdat[1]=0;
		single_transmit(txdat, 2);	
									//发送16位的状态到主机
	} else if (bRecipient == USB_RECIPIENT_ENDPOINT) {			//对端点请求
 1a0:	82 30       	cpi	r24, 0x02	; 2
 1a2:	e1 f4       	brne	.+56     	; 0x1dc <get_status+0x6e>
		endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 1a4:	90 91 66 01 	lds	r25, 0x0166
 1a8:	89 2f       	mov	r24, r25
 1aa:	83 70       	andi	r24, 0x03	; 3
 1ac:	28 2f       	mov	r18, r24
 1ae:	33 27       	eor	r19, r19
		if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
 1b0:	97 ff       	sbrs	r25, 7
 1b2:	05 c0       	rjmp	.+10     	; 0x1be <get_status+0x50>
			c = D12_SelectEndpoint(endp*2 + 1);					//读取输入端点状态
 1b4:	22 0f       	add	r18, r18
 1b6:	33 1f       	adc	r19, r19
 1b8:	82 2f       	mov	r24, r18
 1ba:	8f 5f       	subi	r24, 0xFF	; 255
 1bc:	02 c0       	rjmp	.+4      	; 0x1c2 <get_status+0x54>
		else
			c = D12_SelectEndpoint(endp*2);						//读取输出端点状态
 1be:	82 2f       	mov	r24, r18
 1c0:	88 0f       	add	r24, r24
 1c2:	0e 94 e0 03 	call	0x7c0 <D12_SelectEndpoint>
		if(c & D12_STALL)
 1c6:	81 fd       	sbrc	r24, 1
 1c8:	e6 cf       	rjmp	.-52     	; 0x196 <get_status+0x28>
			txdat[0] = 1;										//端点禁止
		else
			txdat[0] = 0;										//端点有效
 1ca:	19 82       	std	Y+1, r1	; 0x01
		txdat[1] = 0;
 1cc:	fe 01       	movw	r30, r28
 1ce:	31 96       	adiw	r30, 0x01	; 1
 1d0:	11 82       	std	Z+1, r1	; 0x01
		single_transmit(txdat, 2);								//发送16位的状态到主机
 1d2:	62 e0       	ldi	r22, 0x02	; 2
 1d4:	cf 01       	movw	r24, r30
 1d6:	0e 94 65 00 	call	0xca <single_transmit>
 1da:	02 c0       	rjmp	.+4      	; 0x1e0 <get_status+0x72>

	} else
		stall_ep0();					//非标准请求,发STALL

⌨️ 快捷键说明

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