www.pudn.com > usbcode.rar > D12Setup.s


	.module D12Setup.c 
	.area data(ram, con, rel) 
_StandardDeviceRequest:: 
	.blkw 1 
	.area idata 
	.word PL_get_status 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_clear_feature 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_void_function 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_set_feature 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_void_function 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_set_address 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_get_descriptor 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_void_function 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_get_configuration 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_set_configuration 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_get_interface 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_set_interface 
	.area data(ram, con, rel) 
	.blkw 1 
	.area idata 
	.word PL_void_function 
	.area data(ram, con, rel) 
	.dbfile G:\source/d12setup.h 
	.dbsym s StandardDeviceRequest _StandardDeviceRequest A[26:13]pfI 
	.area lit(rom, con, rel) 
_device_descriptor:: 
	.byte 18,1 
	.byte 0,1 
	.byte 0,0 
	.byte 0,64 
	.byte 'q,4 
	.byte 144,8 
	.byte 0,1 
	.byte 0,0 
	.byte 0,1 
	.dbsym s device_descriptor _device_descriptor A[18:18]c 
_Configuration_Descriptor:: 
	.byte 9,2 
	.byte 32,0 
	.byte 1,1 
	.byte 0,128 
	.byte 50 
	.dbsym s Configuration_Descriptor _Configuration_Descriptor A[9:9]c 
_Interface_Descriptor:: 
	.byte 9,4 
	.byte 0,0 
	.byte 2,8 
	.byte 6,'P 
	.byte 0 
	.dbsym s Interface_Descriptor _Interface_Descriptor A[9:9]c 
_Bulk_in_Descriptor:: 
	.byte 7,5 
	.byte 130,2 
	.byte 64,0 
	.byte 0 
	.dbsym s Bulk_in_Descriptor _Bulk_in_Descriptor A[7:7]c 
_Bulk_out_Descriptor:: 
	.byte 7,5 
	.byte 2,2 
	.byte 64,0 
	.byte 0 
	.dbsym s Bulk_out_Descriptor _Bulk_out_Descriptor A[7:7]c 
	.area text(rom, con, rel) 
	.dbfile G:\source/d12setup.h 
	.dbfile G:\source\D12Setup.c 
	.dbfunc s Setup_control _Setup_control fI 
;              p -> R10,R11 
;              j -> R20 
;              i -> R22 
	.even 
_Setup_control:: 
	rcall push_gset3 
	.dbline -1 
	.dbline 51 
; /*++ 
;  
; Module Name: 
;  
;          D12Setup.c 
;  
; Abstract: 
;  
;          Header file related to D12 module 
;  
; Environment: 
;  
;         ICCAVR 6.29 
;  
; Revision History: 
;  
;         04/23/2004      chenchi   created 
;  
; --*/ 
; /******************************************************************/ 
; #include "io8515v.h" 
; #include "d12.h" 
; #include "d12setup.h" 
;  
; TRANSMIT_STRUCT XmtBuff;//定义传输结构体变量 
;  
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:完成设备枚举 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   (*StandardDeviceRequest[i])(); 
;   标准设备请求函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void Setup_control(void) 
; { 
	.dbline 53 
; 	unsigned char i,j,*p; 
; 	D12_COMMAND = 0x00;//选择端点(指针指向0位置) 
	clr R2 
	sts 31745,R2 
	.dbline 54 
; 	cwait; 
	nop 
	.dbline 55 
; 	D12_COMMAND = 0xf0;//读标准控制码 
	ldi R24,240 
	sts 31745,R24 
	.dbline 56 
; 	cwait1; 
	nop 
	.dbline 56 
	nop 
	.dbline 64 
; 	/**************************** 
; 	  缓冲区数据结构: 
; 	  字节1:保留,可为任意值 
; 	  字节2:数据字节的数目/长度 
; 	  字节3:数据字节1 
; 	  字节4:数据字节2 
; 	*****************************/ 
; 	i = D12_DATA;//字节1 
	lds R22,31744 
	.dbline 65 
; 	cwait1; 
	nop 
	.dbline 65 
	nop 
	.dbline 66 
; 	i = D12_DATA;//字节2 
	lds R22,31744 
	.dbline 67 
; 	cwait1; 
	nop 
	.dbline 67 
	nop 
	.dbline 68 
; 	j = D12_DATA;//数据字节 
	lds R20,31744 
	.dbline 69 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 69 
	.dbline 70 
; 	p = XmtBuff.b;//P指针指向传输缓冲区 
	ldi R24,<_XmtBuff 
	ldi R25,>_XmtBuff 
	mov R10,R24 
	mov R11,R25 
	.dbline 71 
; 	*(p++) = j; 
	mov R2,R10 
	mov R3,R11 
	mov R24,R2 
	mov R25,R3 
	adiw R24,1 
	mov R10,R24 
	mov R11,R25 
	mov R30,R2 
	mov R31,R3 
	std z+0,R20 
	.dbline 72 
; 	for(i=0;i<7;i++) 
	clr R22 
	rjmp L6 
L3: 
	.dbline 73 
	.dbline 74 
	lds R20,31744 
	.dbline 75 
	sts 0xfc01,R22 
	.dbline 75 
	.dbline 76 
	st Z+,R20 
	.dbline 77 
L4: 
	.dbline 72 
	inc R22 
L6: 
	.dbline 72 
	cpi R22,7 
	brlo L3 
	.dbline 78 
; 	{ 
; 	   j = D12_DATA;//数据字节 
; 	   csram; 
; 	   asm("st Z+,%j"); 
; 	} 
; 	D12_COMMAND = 0x01;// 选择端点(指针指向0位置) 
	ldi R24,1 
	sts 31745,R24 
	.dbline 79 
; 	cwait; 
	nop 
	.dbline 80 
; 	D12_COMMAND = 0xf1;//应答SETUP包 
	ldi R24,241 
	sts 31745,R24 
	.dbline 81 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 81 
	.dbline 82 
; 	i = XmtBuff.b[1]; 
	lds R22,_XmtBuff+1 
	.dbline 83 
; 	if (i <= 0x0B)//标准请求跳转表 
	ldi R24,11 
	cp R24,R22 
	brlo L8 
	.dbline 84 
; 	{ 
	.dbline 85 
; 		(*StandardDeviceRequest[i])(); 
	ldi R24,<_StandardDeviceRequest 
	ldi R25,>_StandardDeviceRequest 
	mov R30,R22 
	clr R31 
	lsl R30 
	rol R31 
	add R30,R24 
	adc R31,R25 
	ldd R26,z+0 
	ldd R27,z+1 
	mov R30,R26 
	mov R31,R27 
	rcall xicall 
	.dbline 86 
; 	} 
	rjmp L9 
L8: 
	.dbline 87 
; 	else{ 
	.dbline 88 
; 		D12_COMMAND = 0x01;//选择端点(指针指向0位置) 
	ldi R24,1 
	sts 31745,R24 
	.dbline 89 
; 		cwait; 
	nop 
	.dbline 90 
; 		D12_COMMAND = 0xf0;// 写缓冲区 
	ldi R24,240 
	sts 31745,R24 
	.dbline 91 
; 		cwait; 
	nop 
	.dbline 99 
; 		/**************************** 
; 	  	  缓冲区数据结构: 
; 	  	  字节1:保留,可为任意值 
; 	  	  字节2:数据字节的数目/长度 
; 	  	  字节3:数据字节1 
; 	  	  字节4:数据字节2 
; 		*****************************/ 
; 		D12_DATA = 0x00;//字节1 
	clr R2 
	sts 31744,R2 
	.dbline 100 
; 		cwait; 
	nop 
	.dbline 101 
; 		D12_DATA = 0x01;//字节2 
	ldi R24,1 
	sts 31744,R24 
	.dbline 102 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 102 
	.dbline 103 
; 		D12_DATA = 0x00;//数据字节 
	clr R2 
	sts 31744,R2 
	.dbline 104 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 104 
	.dbline 105 
; 		D12_COMMAND = 0xfa;//设置 IN 缓冲区有效(满标志) 
	ldi R24,250 
	sts 31745,R24 
	.dbline 106 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 106 
	.dbline 107 
; 	} 
L9: 
	.dbline 108 
; 	D12_COMMAND = 0x00;//选择端点(指针指向0位置) 
	clr R2 
	sts 31745,R2 
	.dbline 109 
; 	cwait; 
	nop 
	.dbline 110 
; 	D12_COMMAND = 0xf1;//应答SETUP包 
	ldi R24,241 
	sts 31745,R24 
	.dbline 111 
; 	cwait; 
	nop 
	.dbline 112 
; 	D12_COMMAND = 0xf2;//清端点缓冲区 
	ldi R24,242 
	sts 31745,R24 
	.dbline -2 
	.dbline 113 
; } 
L2: 
	rcall pop_gset3 
	.dbline 0 ; func end 
	ret 
	.dbsym r p 10 pc 
	.dbsym r j 20 c 
	.dbsym r i 22 c 
	.dbfunc s void_function _void_function fI 
	.even 
_void_function:: 
	.dbline -1 
	.dbline 136 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:停止控制端点.应答枚举请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明:无 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void void_function(void) 
; { 
	.dbline 137 
; 	D12_COMMAND = 0x40;//0端点停止(用于发送Stall包) 
	ldi R24,64 
	sts 31745,R24 
	.dbline 138 
; 	cwait; 
	nop 
	.dbline 139 
; 	D12_DATA = 0x01; 
	ldi R24,1 
	sts 31744,R24 
	.dbline 140 
; 	cwait; 
	nop 
	.dbline 141 
; 	D12_COMMAND = 0x41;//1端点停止(用于发送Stall包) 
	ldi R24,65 
	sts 31745,R24 
	.dbline 142 
; 	cwait; 
	nop 
	.dbline 143 
; 	D12_DATA = 0x01; 
	ldi R24,1 
	sts 31744,R24 
	.dbline 144 
; 	cwait; 
	nop 
	.dbline 145 
; 	D12_COMMAND = 0xf1;//应答SETUP包 
	ldi R24,241 
	sts 31745,R24 
	.dbline 146 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 146 
	.dbline -2 
	.dbline 147 
; } 
L10: 
	.dbline 0 ; func end 
	ret 
	.dbfunc s get_status _get_status fI 
	.even 
_get_status:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 172 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void get_status(void) 
; { 
	.dbline 173 
; 	XmtBuff.b[1] = 0x00; 
	clr R2 
	sts _XmtBuff+1,R2 
	.dbline 174 
; 	switch (XmtBuff.b[0]) 
	lds R20,_XmtBuff 
	clr R21 
	cpi R20,128 
	ldi R30,0 
	cpc R21,R30 
	breq L14 
	cpi R20,129 
	ldi R30,0 
	cpc R21,R30 
	breq L17 
	cpi R20,130 
	ldi R30,0 
	cpc R21,R30 
	breq L18 
	rjmp L13 
X0: 
	.dbline 175 
; 	{ 
	.dbline 177 
; 	case 0x80: 
; 		break; 
L17: 
	.dbline 179 
; 	case 0x81: 
; 		XmtBuff.b[0] = 0x00; 
	clr R2 
	sts _XmtBuff,R2 
	.dbline 180 
; 		break; 
	rjmp L14 
L18: 
	.dbline 182 
; 	case 0x82: 
; 		XmtBuff.b[0] = 0x00; 
	clr R2 
	sts _XmtBuff,R2 
	.dbline 183 
; 		break; 
L13: 
L14: 
	.dbline 185 
; 	} 
; 	XmtBuff.p_p=0; 
	clr R2 
	sts _XmtBuff+70,R2 
	.dbline 186 
; 	XmtBuff.wrLength = 2; 
	ldi R24,2 
	ldi R25,0 
	sts _XmtBuff+64+1,R25 
	sts _XmtBuff+64,R24 
	.dbline 187 
; 	XmtBuff.p = XmtBuff.b; 
	ldi R24,<_XmtBuff 
	ldi R25,>_XmtBuff 
	sts _XmtBuff+68+1,R25 
	sts _XmtBuff+68,R24 
	.dbline 188 
; 	USB_submit(); 
	rcall _USB_submit 
	.dbline -2 
	.dbline 189 
; } 
L11: 
	rcall pop_gset1 
	.dbline 0 ; func end 
	ret 
	.dbfunc s clear_feature _clear_feature fI 
;              j -> R20 
	.even 
_clear_feature:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 214 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void clear_feature(void) 
; { 
	.dbline 216 
; 	unsigned char j; 
; 	switch (XmtBuff.b[0]) 
	lds R20,_XmtBuff 
	clr R21 
	cpi R20,0 
	cpc R20,R21 
	breq L24 
	cpi R20,1 
	ldi R30,0 
	cpc R21,R30 
	breq L24 
	cpi R20,2 
	ldi R30,0 
	cpc R21,R30 
	breq L28 
	rjmp L23 
X1: 
	.dbline 217 
; 	{ 
	.dbline 219 
; 	case 0x00://清设备唤醒功能 
; 		break; 
	.dbline 221 
; 	case 0x01://清接口状态 
; 		break; 
L28: 
	.dbline 224 
; 	case 0x02://启用端点 
; 		//XmtBuff.b[5] D7为方向,D3~0为端点号 
; 		j = XmtBuff.b[5]; 
	lds R20,_XmtBuff+5 
	.dbline 225 
; 		if(j<0x80) 
	cpi R20,128 
	brsh L30 
	.dbline 226 
; 		{ 
	.dbline 227 
; 			j = 0x40+j*2; 
	lsl R20 
	subi R20,192	; addi 64 
	.dbline 228 
; 			D12_COMMAND = j;// 启用OUT端点 
	sts 31745,R20 
	.dbline 229 
; 			D12_DATA = 0x00; 
	clr R2 
	sts 31744,R2 
	.dbline 230 
; 			csram; 
	sts 0xfc01,R22 
	.dbline 230 
	.dbline 231 
; 		} 
	rjmp L24 
L30: 
	.dbline 233 
; 		else 
; 		{ 
	.dbline 234 
; 			j = (j & 0x0f); 
	andi R20,15 
	.dbline 235 
; 			D12_COMMAND = 0x41+j*2;// 启用IN端点 
	mov R24,R20 
	lsl R24 
	subi R24,191	; addi 65 
	sts 31745,R24 
	.dbline 236 
; 			D12_DATA = 0x00; 
	clr R2 
	sts 31744,R2 
	.dbline 237 
; 			csram; 
	sts 0xfc01,R22 
	.dbline 237 
	.dbline 238 
; 		} 
	.dbline 239 
; 		break; 
L23: 
L24: 
	.dbline 241 
; 	} 
; 	XmtBuff.wrLength = 0; 
	clr R2 
	clr R3 
	sts _XmtBuff+64+1,R3 
	sts _XmtBuff+64,R2 
	.dbline 242 
; 	USB_submit(); 
	rcall _USB_submit 
	.dbline -2 
	.dbline 243 
; } 
L22: 
	rcall pop_gset1 
	.dbline 0 ; func end 
	ret 
	.dbsym r j 20 c 
	.dbfunc s set_feature _set_feature fI 
;              j -> R20 
	.even 
_set_feature:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 268 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void set_feature(void) 
; { 
	.dbline 270 
; 	unsigned char j; 
; 	switch (XmtBuff.b[0]) 
	lds R20,_XmtBuff 
	clr R21 
	cpi R20,0 
	cpc R20,R21 
	breq L35 
	cpi R20,1 
	ldi R30,0 
	cpc R21,R30 
	breq L35 
	cpi R20,2 
	ldi R30,0 
	cpc R21,R30 
	breq L39 
	rjmp L34 
X2: 
	.dbline 271 
; 	{ 
	.dbline 273 
; 	case 0x00://设置设备唤醒功能 
; 		break; 
	.dbline 275 
; 	case 0x01://设置接口状态 
; 		break; 
L39: 
	.dbline 278 
; 	case 0x02://停止端点 
; 		//XmtBuff.b[5] D7为方向,D3~0为端点号 
; 		j = XmtBuff.b[5]; 
	lds R20,_XmtBuff+5 
	.dbline 279 
; 		if(j<0x80) 
	cpi R20,128 
	brsh L41 
	.dbline 280 
; 		{ 
	.dbline 281 
; 			j = 0x40+j * 2; 
	lsl R20 
	subi R20,192	; addi 64 
	.dbline 282 
; 			D12_COMMAND = j;// 停止OUT端点 
	sts 31745,R20 
	.dbline 283 
; 			cwait; 
	nop 
	.dbline 284 
; 			D12_DATA = 0x01; 
	ldi R24,1 
	sts 31744,R24 
	.dbline 285 
; 			csram; 
	sts 0xfc01,R22 
	.dbline 285 
	.dbline 286 
; 		} 
	rjmp L35 
L41: 
	.dbline 288 
; 		else 
; 		{ 
	.dbline 289 
; 			j = j & 0x0f; 
	andi R20,15 
	.dbline 290 
; 			j = 0x41+j*2; 
	lsl R20 
	subi R20,191	; addi 65 
	.dbline 291 
; 			D12_COMMAND = j;// 停止IN端点 
	sts 31745,R20 
	.dbline 292 
; 			cwait; 
	nop 
	.dbline 293 
; 			D12_DATA = 0x01; 
	ldi R24,1 
	sts 31744,R24 
	.dbline 294 
; 			csram; 
	sts 0xfc01,R22 
	.dbline 294 
	.dbline 295 
; 		} 
	.dbline 296 
; 		break; 
L34: 
L35: 
	.dbline 298 
; 	} 
; 	XmtBuff.wrLength = 0; 
	clr R2 
	clr R3 
	sts _XmtBuff+64+1,R3 
	sts _XmtBuff+64,R2 
	.dbline 299 
; 	USB_submit(); 
	rcall _USB_submit 
	.dbline -2 
	.dbline 300 
; } 
L33: 
	rcall pop_gset1 
	.dbline 0 ; func end 
	ret 
	.dbsym r j 20 c 
	.dbfunc s set_address _set_address fI 
;              j -> R20 
	.even 
_set_address:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 325 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void set_address(void) 
; { 
	.dbline 327 
; 	unsigned char j; 
; 	j = 0x80 | XmtBuff.b[2]; 
	lds R20,_XmtBuff+2 
	ori R20,128 
	.dbline 328 
; 	D12_COMMAND = 0xd0;//设置新地址使能 
	ldi R24,208 
	sts 31745,R24 
	.dbline 329 
; 	cwait; 
	nop 
	.dbline 330 
; 	D12_DATA = j; 
	sts 31744,R20 
	.dbline 331 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 331 
	.dbline 332 
; 	XmtBuff.wrLength = 0; 
	clr R2 
	clr R3 
	sts _XmtBuff+64+1,R3 
	sts _XmtBuff+64,R2 
	.dbline 333 
; 	USB_submit(); 
	rcall _USB_submit 
	.dbline -2 
	.dbline 334 
; } 
L44: 
	rcall pop_gset1 
	.dbline 0 ; func end 
	ret 
	.dbsym r j 20 c 
	.dbfunc s get_descriptor _get_descriptor fI 
;              i -> R20,R21 
	.even 
_get_descriptor:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 359 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void get_descriptor(void) 
; { 
	.dbline 361 
; 	unsigned int i; 
; 	XmtBuff.p_p=1; 
	ldi R24,1 
	sts _XmtBuff+70,R24 
	.dbline 362 
; 	switch (XmtBuff.b[3]) 
	lds R20,_XmtBuff+3 
	clr R21 
	cpi R20,1 
	ldi R30,0 
	cpc R21,R30 
	breq L53 
	cpi R20,2 
	ldi R30,0 
	cpc R21,R30 
	breq L56 
	cpi R20,3 
	ldi R30,0 
	cpc R21,R30 
	brne X6 
	rjmp L66 
X6: 
	rjmp L49 
X3: 
	.dbline 363 
; 	{ 
L53: 
	.dbline 365 
; 		case 0x01: //USB_DEVICE 
; 			XmtBuff.pp = device_descriptor; 
	ldi R24,<_device_descriptor 
	ldi R25,>_device_descriptor 
	sts _XmtBuff+66+1,R25 
	sts _XmtBuff+66,R24 
	.dbline 366 
; 			XmtBuff.wrLength = sizeof(device_descriptor); 
	ldi R24,18 
	ldi R25,0 
	sts _XmtBuff+64+1,R25 
	sts _XmtBuff+64,R24 
	.dbline 367 
; 			break; 
	rjmp L50 
L56: 
	.dbline 369 
; 		case 0x02:// USB_CONFIGURATION 
; 			i = XmtBuff.b[7]; 
	lds R20,_XmtBuff+7 
	clr R21 
	.dbline 370 
; 			i = ((i<<8) | XmtBuff.b[6]); 
	lds R2,_XmtBuff+6 
	clr R3 
	mov R4,R20 
	mov R5,R21 
	mov R5,R4 
	clr R4 
	or R4,R2 
	or R5,R3 
	mov R20,R4 
	mov R21,R5 
	.dbline 371 
; 			XmtBuff.pp = Configuration_Descriptor; 
	ldi R24,<_Configuration_Descriptor 
	ldi R25,>_Configuration_Descriptor 
	sts _XmtBuff+66+1,R25 
	sts _XmtBuff+66,R24 
	.dbline 372 
; 			XmtBuff.wrLength = *(XmtBuff.pp+2); 
	adiw R24,2 
	mov R30,R24 
	mov R31,R25 
	lpm 
	mov R2,R0 
	clr R3 
	sts _XmtBuff+64+1,R3 
	sts _XmtBuff+64,R2 
	.dbline 373 
; 			if(i<16) 
	cpi R20,16 
	ldi R30,0 
	cpc R21,R30 
	brsh L50 
	.dbline 374 
; 				  XmtBuff.wrLength = XmtBuff.b[6]; 
	lds R2,_XmtBuff+6 
	clr R3 
	sts _XmtBuff+64+1,R3 
	sts _XmtBuff+64,R2 
	.dbline 375 
; 			break; 
	rjmp L50 
L66: 
	.dbline 377 
; 		case 0x03: //USB_STRING 
; 			switch(XmtBuff.b[2]) 
	lds R20,_XmtBuff+2 
	clr R21 
	cpi R20,0 
	cpc R20,R21 
	breq L50 
	cpi R20,1 
	ldi R30,0 
	cpc R21,R30 
	breq L50 
	cpi R20,2 
	ldi R30,0 
	cpc R21,R30 
	breq L50 
	rjmp L67 
X4: 
	.dbline 378 
; 			{ 
	.dbline 382 
; 			case 0x00 : 
; 				//XmtBuff.wrLength = sizeof(USBStringLanguageDescription); 
; 				//?XmtBuff.p = USBStringLanguageDescription; 
; 				break; 
	.dbline 386 
; 			case 0x01 : 
; 				//?XmtBuff.wrLength = sizeof(USBStringDescription1); 
; 				//?XmtBuff.p = USBStringDescription1; 
; 			   break; 
	.dbline 390 
; 			case 0x02 : 
; 				//?XmtBuff.wrLength = sizeof(USBStringDescription2); 
; 				//?XmtBuff.p = USBStringDescription2; 
; 			   break; 
L67: 
	.dbline 392 
; 			default   : 
; 				void_function(); 
	rcall _void_function 
	.dbline 393 
; 				return; 
	rjmp L47 
X5: 
	.dbline 395 
; 			} 
; 			break; 
L49: 
	.dbline 397 
; 		default : 
; 			void_function(); 
	rcall _void_function 
	.dbline 398 
; 			return; 
	rjmp L47 
L50: 
	.dbline 400 
; 	} 
; 	USB_submit(); 
	rcall _USB_submit 
	.dbline -2 
	.dbline 401 
; } 
L47: 
	rcall pop_gset1 
	.dbline 0 ; func end 
	ret 
	.dbsym r i 20 i 
	.dbfunc s get_configuration _get_configuration fI 
	.even 
_get_configuration:: 
	.dbline -1 
	.dbline 426 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void get_configuration(void) 
; { 
	.dbline 427 
; 	XmtBuff.b[0] = 1;//返回是否被配置(非 0 为配置) 
	ldi R24,1 
	sts _XmtBuff,R24 
	.dbline 428 
; 	XmtBuff.wrLength = 16; 
	ldi R24,16 
	ldi R25,0 
	sts _XmtBuff+64+1,R25 
	sts _XmtBuff+64,R24 
	.dbline 429 
; 	XmtBuff.p_p=0; 
	clr R2 
	sts _XmtBuff+70,R2 
	.dbline 430 
; 	XmtBuff.p = XmtBuff.b; 
	ldi R24,<_XmtBuff 
	ldi R25,>_XmtBuff 
	sts _XmtBuff+68+1,R25 
	sts _XmtBuff+68,R24 
	.dbline 431 
; 	USB_submit(); 
	rcall _USB_submit 
	.dbline -2 
	.dbline 432 
; } 
L74: 
	.dbline 0 ; func end 
	ret 
	.dbfunc s set_configuration _set_configuration fI 
;              j -> R20 
	.even 
_set_configuration:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 457 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void set_configuration(void) 
; { 
	.dbline 459 
; 	unsigned char j; 
; 	if (XmtBuff.b[0] == 0x00) 
	lds R2,_XmtBuff 
	tst R2 
	brne L79 
	.dbline 460 
; 	{ 
	.dbline 461 
; 		XmtBuff.wrLength = 0; 
	clr R2 
	clr R3 
	sts _XmtBuff+64+1,R3 
	sts _XmtBuff+64,R2 
	.dbline 462 
; 		USB_submit(); 
	rcall _USB_submit 
	.dbline 463 
; 		j = XmtBuff.b[2]; 
	lds R20,_XmtBuff+2 
	.dbline 464 
; 		D12_COMMAND = 0xd8; 
	ldi R24,216 
	sts 31745,R24 
	.dbline 465 
; 		if(j == 0x00) 
	tst R20 
	brne L83 
	.dbline 466 
; 		{ 
	.dbline 467 
; 			D12_DATA = 0x00;  // 停止普通/同步端点 
	clr R2 
	sts 31744,R2 
	.dbline 468 
	rjmp L84 
L83: 
	.dbline 468 
; 		}else if(j == 0x01) 
	cpi R20,1 
	brne L85 
	.dbline 469 
; 		{ 
	.dbline 470 
; 			D12_DATA = 0x01;  // 使能普通/同步端点 
	ldi R24,1 
	sts 31744,R24 
	.dbline 471 
; 			cwait; 
	nop 
	.dbline 472 
; 			D12_COMMAND = 0x03; 
	ldi R24,3 
	sts 31745,R24 
	.dbline 473 
; 			cwait; 
	nop 
	.dbline 474 
; 			D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志) 
	ldi R24,250 
	sts 31745,R24 
	.dbline 475 
; 			cwait; 
	nop 
	.dbline 476 
; 			D12_COMMAND = 0x05; 
	ldi R24,5 
	sts 31745,R24 
	.dbline 477 
; 			cwait; 
	nop 
	.dbline 478 
; 			D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志) 
	ldi R24,250 
	sts 31745,R24 
	.dbline 479 
; 		} 
L85: 
L84: 
	.dbline 480 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 480 
	.dbline 481 
;    } 
	rjmp L80 
L79: 
	.dbline 483 
	rcall _void_function 
L80: 
	.dbline -2 
	.dbline 484 
; 	else 
; 		void_function(); 
; } 
L78: 
	rcall pop_gset1 
	.dbline 0 ; func end 
	ret 
	.dbsym r j 20 c 
	.dbfunc s get_interface _get_interface fI 
	.even 
_get_interface:: 
	.dbline -1 
	.dbline 509 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:传输结构体 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void get_interface(void) 
; { 
	.dbline 510 
; 	XmtBuff.b[0] = 0; 
	clr R2 
	sts _XmtBuff,R2 
	.dbline 511 
; 	XmtBuff.wrLength = 1; 
	ldi R24,1 
	ldi R25,0 
	sts _XmtBuff+64+1,R25 
	sts _XmtBuff+64,R24 
	.dbline 512 
; 	XmtBuff.p_p=0; 
	sts _XmtBuff+70,R2 
	.dbline 513 
; 	XmtBuff.p = XmtBuff.b; 
	ldi R24,<_XmtBuff 
	ldi R25,>_XmtBuff 
	sts _XmtBuff+68+1,R25 
	sts _XmtBuff+68,R24 
	.dbline 514 
; 	USB_submit(); 
	rcall _USB_submit 
	.dbline -2 
	.dbline 515 
; } 
L87: 
	.dbline 0 ; func end 
	ret 
	.dbfunc s set_interface _set_interface fI 
	.even 
_set_interface:: 
	.dbline -1 
	.dbline 540 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:标准设备请求 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:传输结构体 
; **调用的函数说明: 
;   USB_submit(); 
;   控制端点提交函数 
;    
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void set_interface(void) 
; { 
	.dbline 541 
; 	XmtBuff.wrLength = 0; 
	clr R2 
	clr R3 
	sts _XmtBuff+64+1,R3 
	sts _XmtBuff+64,R2 
	.dbline 542 
; 	USB_submit(); 
	rcall _USB_submit 
	.dbline -2 
	.dbline 543 
; } 
L91: 
	.dbline 0 ; func end 
	ret 
	.area bss(ram, con, rel) 
	.dbfile G:\source\D12Setup.c 
_XmtBuff:: 
	.blkb 71 
	.dbsym s XmtBuff _XmtBuff X 
	.area func_lit 
PL_set_interface:	.word `_set_interface 
PL_get_interface:	.word `_get_interface 
PL_set_configuration:	.word `_set_configuration 
PL_get_configuration:	.word `_get_configuration 
PL_get_descriptor:	.word `_get_descriptor 
PL_set_address:	.word `_set_address 
PL_set_feature:	.word `_set_feature 
PL_void_function:	.word `_void_function 
PL_clear_feature:	.word `_clear_feature 
PL_get_status:	.word `_get_status