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

📄 chap9.lst

📁 AVR单片机控制的PDIUSBD12原程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
  77:chap9.c       **** 	unsigned char c;
  78:chap9.c       **** 	if(bRecipient == USB_RECIPIENT_DEVICE)
 418               	.LM28:
 419 00d4 49F4      		brne .L11
  79:chap9.c       **** 	{																//返回设备状态
  80:chap9.c       **** 		if(bEPPflags.bits.remote_wakeup==1)
 421               	.LM29:
 422 00d6 8091 0000 		lds r24,bEPPflags
 423 00da 84FF      		sbrs r24,4
 424 00dc 02C0      		rjmp .L12
  81:chap9.c       **** 			txdat[0]=3;												//支持远程唤醒,自供电
 426               	.LM30:
 427 00de 83E0      		ldi r24,lo8(3)
 428 00e0 01C0      		rjmp .L23
 429               	.L12:
  82:chap9.c       **** 		else
  83:chap9.c       **** 			txdat[0]=1;
 431               	.LM31:
 432 00e2 81E0      		ldi r24,lo8(1)
 433               	.L23:
 434 00e4 8983      		std Y+1,r24
 435 00e6 18C0      		rjmp .L21
 436               	.L11:
  84:chap9.c       **** 		txdat[1]=0;
  85:chap9.c       **** 		single_transmit(txdat,2);									//发送数据
  86:chap9.c       **** 	}
  87:chap9.c       **** 	else
  88:chap9.c       **** 		if(bRecipient == USB_RECIPIENT_INTERFACE)
 438               	.LM32:
 439 00e8 8130      		cpi r24,lo8(1)
 440 00ea A9F0      		breq .L20
  89:chap9.c       **** 		{															//返回接口状态
  90:chap9.c       **** 			txdat[0]=0;
  91:chap9.c       **** 			txdat[1]=0;
  92:chap9.c       **** 			single_transmit(txdat,2);								//发送数据
  93:chap9.c       **** 		}
  94:chap9.c       **** 		else
  95:chap9.c       **** 			if(bRecipient == USB_RECIPIENT_ENDPOINT)
 442               	.LM33:
 443 00ec 8230      		cpi r24,lo8(2)
 444 00ee E1F4      		brne .L17
  96:chap9.c       **** 			{														//返回端点状态
  97:chap9.c       **** 				endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 446               	.LM34:
 447 00f0 9091 0000 		lds r25,ControlData+4
 448 00f4 892F      		mov r24,r25
 449 00f6 8370      		andi r24,lo8(3)
 450 00f8 282F      		mov r18,r24
 451 00fa 3327      		clr r19
  98:chap9.c       **** 				if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 453               	.LM35:
 454 00fc 97FF      		sbrs r25,7
 455 00fe 05C0      		rjmp .L18
  99:chap9.c       **** 					c=D12_SelectEndpoint(endp*2+1);				//读取输入端点状态
 457               	.LM36:
 458 0100 220F      		add r18,r18
 459 0102 331F      		adc r19,r19
 460 0104 822F      		mov r24,r18
 461 0106 8F5F      		subi r24,lo8(-(1))
 462 0108 02C0      		rjmp .L24
 463               	.L18:
 100:chap9.c       **** 				else
 101:chap9.c       **** 					c=D12_SelectEndpoint(endp*2);					//读取输出端点状态
 465               	.LM37:
 466 010a 822F      		mov r24,r18
 467 010c 880F      		lsl r24
 468               	.L24:
 469 010e 0E94 0000 		call D12_SelectEndpoint
 102:chap9.c       **** 				if(c & D12_STALL)
 471               	.LM38:
 472 0112 81FD      		sbrc r24,1
 473 0114 E6CF      		rjmp .L12
 474               	.L20:
 103:chap9.c       **** 					txdat[0]=1;										//端点禁止
 104:chap9.c       **** 				else
 105:chap9.c       **** 					txdat[0]=0;										//端点有效
 476               	.LM39:
 477 0116 1982      		std Y+1,__zero_reg__
 478               	.L21:
 106:chap9.c       **** 				txdat[1]=0;
 480               	.LM40:
 481 0118 FE01      		movw r30,r28
 482 011a 3196      		adiw r30,1
 483 011c 1182      		std Z+1,__zero_reg__
 107:chap9.c       **** 				single_transmit(txdat,2);							//发送数据
 485               	.LM41:
 486 011e 62E0      		ldi r22,lo8(2)
 487 0120 CF01      		movw r24,r30
 488 0122 0E94 0000 		call single_transmit
 489 0126 02C0      		rjmp .L10
 490               	.L17:
 108:chap9.c       **** 			}
 109:chap9.c       **** 			else
 110:chap9.c       **** 				stall_ep0();										//非标准请求,发STALL
 492               	.LM42:
 493 0128 0E94 0000 		call stall_ep0
 494               	.L10:
 495               	/* epilogue: frame size=2 */
 496 012c 2296      		adiw r28,2
 497 012e 0FB6      		in __tmp_reg__,__SREG__
 498 0130 F894      		cli
 499 0132 DEBF      		out __SP_H__,r29
 500 0134 0FBE      		out __SREG__,__tmp_reg__
 501 0136 CDBF      		out __SP_L__,r28
 502 0138 DF91      		pop r29
 503 013a CF91      		pop r28
 504 013c 0895      		ret
 505               	/* epilogue end (size=9) */
 506               	/* function get_status size 67 (48) */
 514               	.Lscope5:
 516               	.global	clear_feature
 518               	clear_feature:
 111:chap9.c       **** }
 112:chap9.c       **** //清除特性
 113:chap9.c       **** void clear_feature(void)
 114:chap9.c       **** {
 520               	.LM43:
 521               	/* prologue: frame size=0 */
 522               	/* prologue end (size=0) */
 115:chap9.c       **** 	unsigned char endp;											//读取请求类型中的接收方
 116:chap9.c       **** 	unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 524               	.LM44:
 525 013e 8091 0000 		lds r24,ControlData
 526 0142 8F71      		andi r24,lo8(31)
 117:chap9.c       **** 	if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKE
 528               	.LM45:
 529 0144 71F4      		brne .L26
 531               	.LM46:
 532 0146 8091 0000 		lds r24,ControlData+2
 533 014a 9091 0000 		lds r25,(ControlData+2)+1
 534 014e 0197      		sbiw r24,1
 535 0150 31F5      		brne .L28
 118:chap9.c       **** 	{//清除远程唤醒特性
 119:chap9.c       **** 		DISABLE;
 537               	.LM47:
 538               	/* #APP */
 539 0152 F894      		cli
 120:chap9.c       **** 		bEPPflags.bits.remote_wakeup=0;
 541               	.LM48:
 542               	/* #NOAPP */
 543 0154 8091 0000 		lds r24,bEPPflags
 544 0158 8F7E      		andi r24,lo8(-17)
 545 015a 8093 0000 		sts bEPPflags,r24
 121:chap9.c       **** 		ENABLE;
 547               	.LM49:
 548               	/* #APP */
 549 015e 7894      		sei
 550               	/* #NOAPP */
 551 0160 18C0      		rjmp .L33
 552               	.L26:
 122:chap9.c       **** 		single_transmit(0,0);										//返回应答
 123:chap9.c       **** 	}
 124:chap9.c       **** 	else
 125:chap9.c       **** 		if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT
 554               	.LM50:
 555 0162 8230      		cpi r24,lo8(2)
 556 0164 E1F4      		brne .L28
 557 0166 8091 0000 		lds r24,ControlData+2
 558 016a 9091 0000 		lds r25,(ControlData+2)+1
 559 016e 892B      		or r24,r25
 560 0170 B1F4      		brne .L28
 126:chap9.c       **** 		{	//清除端点禁止特性,恢复其使用
 127:chap9.c       **** 			endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 562               	.LM51:
 563 0172 8091 0000 		lds r24,ControlData+4
 128:chap9.c       **** 			if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 565               	.LM52:
 566 0176 682F      		mov r22,r24
 567 0178 6078      		andi r22,lo8(-128)
 568 017a 8370      		andi r24,lo8(3)
 569 017c 9927      		clr r25
 570 017e 6623      		tst r22
 571 0180 29F0      		breq .L29
 129:chap9.c       **** 				D12_SetEndpointStatus(endp*2+1,0);					//清除输入端点STALL特性
 573               	.LM53:
 574 0182 880F      		add r24,r24
 575 0184 991F      		adc r25,r25
 576 0186 60E0      		ldi r22,lo8(0)
 577 0188 8F5F      		subi r24,lo8(-(1))
 578 018a 01C0      		rjmp .L32
 579               	.L29:
 130:chap9.c       **** 			else
 131:chap9.c       **** 				D12_SetEndpointStatus(endp*2,0);					//清除输出端点STALL特性
 581               	.LM54:
 582 018c 880F      		lsl r24
 583               	.L32:
 584 018e 0E94 0000 		call D12_SetEndpointStatus
 585               	.L33:
 132:chap9.c       **** 			single_transmit(0,0);									//发送响应
 587               	.LM55:
 588 0192 60E0      		ldi r22,lo8(0)
 589 0194 80E0      		ldi r24,lo8(0)
 590 0196 90E0      		ldi r25,hi8(0)
 591 0198 0E94 0000 		call single_transmit
 592 019c 0895      		ret
 593               	.L28:
 133:chap9.c       **** 		}
 134:chap9.c       **** 		else
 135:chap9.c       **** 			stall_ep0();										//没有该请求,返回STALL			
 595               	.LM56:
 596 019e 0E94 0000 		call stall_ep0
 597 01a2 0895      		ret
 598               	/* epilogue: frame size=0 */
 599               	/* epilogue: noreturn */
 600               	/* epilogue end (size=0) */
 601               	/* function clear_feature size 55 (55) */
 606               	.Lscope6:
 608               	.global	set_feature
 610               	set_feature:
 136:chap9.c       **** }
 137:chap9.c       **** //设置特性
 138:chap9.c       **** void set_feature(void)
 139:chap9.c       **** {
 612               	.LM57:
 613               	/* prologue: frame size=0 */
 614               	/* prologue end (size=0) */
 140:chap9.c       **** 	unsigned char endp;
 141:chap9.c       **** 	//读取设备请求中的接收方
 142:chap9.c       **** 	unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 616               	.LM58:
 617 01a4 8091 0000 		lds r24,ControlData
 618 01a8 8F71      		andi r24,lo8(31)
 143:chap9.c       **** 	if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKE
 620               	.LM59:
 621 01aa 71F4      		brne .L35
 623               	.LM60:
 624 01ac 8091 0000 		lds r24,ControlData+2
 625 01b0 9091 0000 		lds r25,(ControlData+2)+1
 626 01b4 0197      		sbiw r24,1
 627 01b6 69F5      		brne .L37
 144:chap9.c       **** 	{//设置远程唤醒特性
 145:chap9.c       **** 		DISABLE;
 629               	.LM61:
 630               	/* #APP */
 631 01b8 F894      		cli
 146:chap9.c       **** 		bEPPflags.bits.remote_wakeup=1;
 633               	.LM62:
 634               	/* #NOAPP */
 635 01ba 8091 0000 		lds r24,bEPPflags
 636 01be 8061      		ori r24,lo8(16)
 637 01c0 8093 0000 		sts bEPPflags,r24
 147:chap9.c       **** 		ENABLE;
 639               	.LM63:
 640               	/* #APP */
 641 01c4 7894      		sei
 642               	/* #NOAPP */
 643 01c6 1FC0      		rjmp .L42
 644               	.L35:
 148:chap9.c       **** 		single_transmit(0,0);										//返回应答
 149:chap9.c       **** 	}
 150:chap9.c       **** 	else
 151:chap9.c       **** 		if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT
 646               	.LM64:
 647 01c8 8230      		cpi r24,lo8(2)
 648 01ca 19F5      		brne .L37
 649 01cc 8091 0000 		lds r24,ControlData+2
 650 01d0 9091 0000 		lds r25,(ControlData+2)+1
 651 01d4 892B      		or r24,r25
 652 01d6 E9F4      		brne .L37
 152:chap9.c       **** 		{
 153:chap9.c       **** 			endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 654               	.LM65:
 655 01d8 9091 0000 		lds r25,ControlData+4
 656 01dc 892F      		mov r24,r25
 657 01de 8370      		andi r24,lo8(3)
 658 01e0 282F      		mov r18,r24
 659 01e2 3327      		clr r19
 154:chap9.c       **** 			if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 661               	.LM66:
 662 01e4 97FF      		sbrs r25,7
 663 01e6 06C0      		rjmp .L38
 155:chap9.c       **** 				D12_SetEndpointStatus(endp*2+1,1);
 665               	.LM67:
 666 01e8 220F      		add r18,r18
 667 01ea 331F      		adc r19,r19
 668 01ec 61E0      		ldi r22,lo8(1)
 669 01ee 822F      		mov r24,r18
 670 01f0 860F      		add r24,r22
 671 01f2 07C0      		rjmp .L41
 672               	.L38:
 156:chap9.c       **** 			else
 157:chap9.c       **** 				D12_SetEndpointStatus(endp*2,1);					//设置输出端点禁止
 674               	.LM68:
 675 01f4 61E0      		ldi r22,lo8(1)
 676 01f6 822F      		mov r24,r18
 677 01f8 062E      		mov r0,r22
 678 01fa 01C0      		rjmp 2f
 679 01fc 880F      	1:	lsl r24
 680 01fe 0A94      	2:	dec r0
 681 0200 EAF7      		brpl 1b
 682               	.L41:
 683 0202 0E94 0000 		call D12_SetEndpointStatus
 684               	.L42:
 158:chap9.c       **** 			single_transmit(0,0);									//发送响应
 686               	.LM69:
 687 0206 60E0      		ldi r22,lo8(0)
 688 0208 80E0      		ldi r24,lo8(0)
 689 020a 90E0      		ldi r25,hi8(0)
 690 020c 0E94 0000 		call single_transmit
 691 0210 0895      		ret
 692               	.L37:
 159:chap9.c       **** 		}
 160:chap9.c       **** 		else
 161:chap9.c       **** 			stall_ep0();										//没有该请求,返回STALL			
 694               	.LM70:
 695 0212 0E94 0000 		call stall_ep0
 696 0216 0895      		ret
 697               	/* epilogue: frame size=0 */
 698               	/* epilogue: noreturn */
 699               	/* epilogue end (size=0) */
 700               	/* function set_feature size 62 (62) */
 706               	.Lscope7:
 708               	.global	set_address
 710               	set_address:
 162:chap9.c       **** }
 163:chap9.c       **** //设置地址
 164:chap9.c       **** void set_address(void)
 165:chap9.c       **** {
 712               	.LM71:
 713               	/* prologue: frame size=0 */
 714               	/* prologue end (size=0) */
 166:chap9.c       **** 	D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK),1);
 716               	.LM72:
 717 0218 8091 0000 		lds r24,ControlData+2
 718 021c 61E0      		ldi r22,lo8(1)
 719 021e 8F77      		andi r24,lo8(127)
 720 0220 0E94 0000 		call D12_SetAddressEnable
 167:chap9.c       **** 	single_transmit(0,0);									//发送响应
 722               	.LM73:
 723 0224 60E0      		ldi r22,lo8(0)
 724 0226 80E0      		ldi r24,lo8(0)
 725 0228 90E0      		ldi r25,hi8(0)
 726 022a 0E94 0000 		call single_transmit
 727               	/* epilogue: frame size=0 */

⌨️ 快捷键说明

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