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


	.module D12ISR.c 
	.area text(rom, con, rel) 
	.dbfile G:\source\D12ISR.c 
	.dbfunc s D12_ISR _D12_ISR fI 
;              j -> R22 
;              i -> R20 
	.even 
_D12_ISR:: 
	rcall push_gset2 
	.dbline -1 
	.dbline 51 
; /*++ 
;  
; Module Name: 
;  
;          D12ISR.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" 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:中断服务处理 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA 
; **调用的函数说明: 
;   Setup_control():枚举控制函数 
;   USB_submit():控制端点提交函数 
;   Bulk_Out_Pack(j):处理PC发送的批量传输包 
;   Bulk_In_Packet():回应批量传输包 
;   void bus_reset(void):总线重置 
;   void dma_eot(void):Dma 操作结束 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void D12_ISR(void) 
; { 
	.dbline 53 
; 	unsigned char i,j; 
; 	D12_COMMAND = 0xf4;// 读中断寄存器 
	ldi R24,244 
	sts 31745,R24 
	.dbline 54 
; 	cwait1; 
	nop 
	.dbline 54 
	nop 
	.dbline 55 
; 	i=D12_DATA;//读取数据赋值给局部变量i 
	lds R20,31744 
	.dbline 56 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 56 
	.dbline 57 
; 	if(i & 0x01)//处理控制输出端点 
	sbrs R20,0 
	rjmp L3 
	.dbline 58 
; 	{ 
	.dbline 59 
; 		D12_COMMAND = 0x40;//读最后状态 
	ldi R24,64 
	sts 31745,R24 
	.dbline 60 
; 		cwait1; 
	nop 
	.dbline 60 
	nop 
	.dbline 61 
; 		i= D12_DATA;//从端点缓冲区读取数据 
	lds R20,31744 
	.dbline 62 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 62 
	.dbline 63 
; 		if (i & 0x20) //收到SETUP包 
	sbrs R20,5 
	rjmp L4 
	.dbline 64 
; 		{ 
	.dbline 65 
; 			Setup_control();//枚举控制函数 
	rcall _Setup_control 
	.dbline 66 
; 		} 
	.dbline 67 
	rjmp L4 
L3: 
	.dbline 67 
; 	}else if(i & 0x02)//处理控制输入端点 
	sbrs R20,1 
	rjmp L7 
	.dbline 68 
; 	{ 
	.dbline 69 
; 		D12_COMMAND = 0x41;//读最后状态 
	ldi R24,65 
	sts 31745,R24 
	.dbline 70 
; 		cwait1; 
	nop 
	.dbline 70 
	nop 
	.dbline 71 
; 		i = D12_DATA;//从端点缓冲区读取数据 
	lds R20,31744 
	.dbline 72 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 72 
	.dbline 73 
; 		USB_submit();//控制端点提交函数 
	rcall _USB_submit 
	.dbline 74 
	rjmp L8 
L7: 
	.dbline 74 
; 	}else if(i & 0x04)//处理端点1输出 
	sbrs R20,2 
	rjmp L9 
	.dbline 75 
; 	{ 
	.dbline 77 
	rjmp L10 
L9: 
	.dbline 77 
; 		 
; 	}else if(i & 0x08)//处理端点1输入 
	sbrs R20,3 
	rjmp L11 
	.dbline 78 
; 	{ 
	.dbline 80 
	rjmp L12 
L11: 
	.dbline 80 
;  
; 	}else if(i & 0x10)//处理批量输出端点 
	sbrs R20,4 
	rjmp L13 
	.dbline 81 
; 	{ 
	.dbline 82 
; 		D12_COMMAND = 0x44;//读最后状态 
	ldi R24,68 
	sts 31745,R24 
	.dbline 83 
; 		cwait; 
	nop 
	.dbline 84 
; 		i = D12_DATA; 
	lds R20,31744 
	.dbline 85 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 85 
	.dbline 86 
; 		D12_COMMAND = 0x04;//选择端点(指针指向0位置) 
	ldi R24,4 
	sts 31745,R24 
	.dbline 87 
; 		cwait; 
	nop 
	.dbline 88 
; 		D12_COMMAND = 0xf0;//读缓冲区 
	ldi R24,240 
	sts 31745,R24 
	.dbline 96 
; 		/**************************** 
; 		  缓冲区数据结构: 
; 		  字节1:保留,可为任意值 
; 		  字节2:数据字节的数目/长度 
; 		  字节3:数据字节1 
; 		  字节4:数据字节2 
; 		*****************************/ 
; 		cwait1; 
	nop 
	.dbline 96 
	nop 
	.dbline 97 
; 		j=D12_DATA;//字节1 
	lds R22,31744 
	.dbline 98 
; 		cwait1; 
	nop 
	.dbline 98 
	nop 
	.dbline 99 
; 		j=D12_DATA;//字节2 
	lds R22,31744 
	.dbline 100 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 100 
	.dbline 101 
; 		Bulk_Out_Packet(j);//处理PC发送的批量传输包 
	mov R16,R22 
	clr R17 
	rcall _Bulk_Out_Packet 
	.dbline 102 
	rjmp L14 
L13: 
	.dbline 102 
; 	}else if(i & 0x20)//处理批量输入端点 
	sbrs R20,5 
	rjmp L15 
	.dbline 103 
; 	{ 
	.dbline 104 
; 		D12_COMMAND = 0x45;//读 in 最后状态 
	ldi R24,69 
	sts 31745,R24 
	.dbline 105 
; 		cwait1; 
	nop 
	.dbline 105 
	nop 
	.dbline 106 
; 		i = D12_DATA; 
	lds R20,31744 
	.dbline 107 
; 		cwait1; 
	nop 
	.dbline 107 
	nop 
	.dbline 108 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 108 
	.dbline 109 
; 		Bulk_In_Packet();//回应批量传输包 
	rcall _Bulk_In_Packet 
	.dbline 110 
	rjmp L16 
L15: 
	.dbline 110 
; 	}else if(i & 0x80)//D12_INT_SUSPENDCHANGE D12挂起 
	sbrs R20,7 
	rjmp L17 
	.dbline 111 
; 	{ 
	.dbline 113 
	rjmp L18 
L17: 
	.dbline 113 
; 	 
; 	}else if(i & 0x40)//D12_INT_BUSRESET总线复位 
	sbrs R20,6 
	rjmp L19 
	.dbline 114 
; 	{ 
	.dbline 115 
; 		bus_reset();//总线重置 
	rcall _bus_reset 
	.dbline 116 
; 	}else 
	rjmp L20 
L19: 
	.dbline 117 
; 	{ 
	.dbline 118 
; 		i=D12_DATA; //D12_INT_EOT DMA操作已结束 
	lds R20,31744 
	.dbline 119 
; 		if(i & 0x01) 
	sbrs R20,0 
	rjmp L21 
	.dbline 120 
; 		{ 
	.dbline 121 
; 			dma_eot();//Dma 操作结束 
	rcall _dma_eot 
	.dbline 122 
; 		} 
L21: 
	.dbline 123 
; 	} 
L20: 
L18: 
L16: 
L14: 
L12: 
L10: 
L8: 
L4: 
	.dbline -2 
	.dbline 124 
; } 
L2: 
	rcall pop_gset2 
	.dbline 0 ; func end 
	ret 
	.dbsym r j 22 c 
	.dbsym r i 20 c 
	.dbfunc s bus_reset _bus_reset fI 
	.even 
_bus_reset:: 
	.dbline -1 
	.dbline 127 
;  
; void bus_reset(void)//总线重置函数 
; { 
	.dbline -2 
	.dbline 128 
; } 
L23: 
	.dbline 0 ; func end 
	ret 
	.dbfunc s dma_eot _dma_eot fI 
	.even 
_dma_eot:: 
	.dbline -1 
	.dbline 131 
;  
; void dma_eot(void)//Dma 操作结束函数 
; { 
	.dbline -2 
	.dbline 132 
; } 
L24: 
	.dbline 0 ; func end 
	ret 
	.dbfunc s USB_submit _USB_submit fI 
;              j -> R16 
;              k -> R18 
;              i -> R20 
	.even 
_USB_submit:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 155 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:控制端点传输提交 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:传输结构体 
; **调用的函数说明:无 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void USB_submit(void) 
; { 
	.dbline 163 
; 	unsigned char i,j,k; 
; 	/*********说明****************** 
; 	  D12芯片数据手册上说明控制端点 
; 	  缓冲区大小为16BYTES,使用时试用 
; 	  64BYTES可以完成传输,这里故用64 
; 	  来处理 
; 	*******************************/ 
; 	if(64 > XmtBuff.wrLength) 
	lds R3,_XmtBuff+64+1 
	lds R2,_XmtBuff+64 
	ldi R24,64 
	ldi R25,0 
	cp R2,R24 
	cpc R3,R25 
	brsh L26 
	.dbline 164 
; 	{ 
	.dbline 165 
; 		j = XmtBuff.wrLength; 
	mov R16,R2 
	mov R17,R3 
	.dbline 166 
; 	}else 
	rjmp L27 
L26: 
	.dbline 167 
; 	{ 
	.dbline 168 
; 		j = 64; 
	ldi R16,64 
	.dbline 169 
; 	} 
L27: 
	.dbline 170 
; 	D12_COMMAND = 0x01;//选择端点(指针指向0位置) 
	ldi R24,1 
	sts 31745,R24 
	.dbline 171 
; 	cwait; 
	nop 
	.dbline 172 
; 	D12_COMMAND = 0xf0;//写缓冲区 
	ldi R24,240 
	sts 31745,R24 
	.dbline 173 
; 	cwait; 
	nop 
	.dbline 181 
; 	/**************************** 
; 	  缓冲区数据结构: 
; 	  字节1:保留,可为任意值 
; 	  字节2:数据字节的数目/长度 
; 	  字节3:数据字节1 
; 	  字节4:数据字节2 
; 	*****************************/ 
; 	D12_DATA = 0x00;//写字节1 
	clr R2 
	sts 31744,R2 
	.dbline 182 
; 	cwait; 
	nop 
	.dbline 183 
; 	D12_DATA = j;//写字节2 
	sts 31744,R16 
	.dbline 184 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 184 
	.dbline 185 
; 	for(i=0;i R16 
;              k -> R18 
;              i -> R20 
	.even 
_BULK_submit:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 218 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:BULK端点传输提交 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:传输结构体 
; **调用的函数说明: 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void BULK_submit(void) 
; { 
	.dbline 220 
; 	unsigned char i,j,k; 
; 	if(64 > XmtBuff.wrLength) 
	lds R3,_XmtBuff+64+1 
	lds R2,_XmtBuff+64 
	ldi R24,64 
	ldi R25,0 
	cp R2,R24 
	cpc R3,R25 
	brsh L38 
	.dbline 221 
; 	{ 
	.dbline 222 
; 		j = XmtBuff.wrLength; 
	mov R16,R2 
	mov R17,R3 
	.dbline 223 
; 	}else 
	rjmp L39 
L38: 
	.dbline 224 
; 	{ 
	.dbline 225 
; 		j = 64; 
	ldi R16,64 
	.dbline 226 
; 	} 
L39: 
	.dbline 227 
; 	D12_COMMAND = 0x05;// 选择端点(指针指向0位置) 
	ldi R24,5 
	sts 31745,R24 
	.dbline 228 
; 	cwait; 
	nop 
	.dbline 229 
; 	D12_COMMAND = 0xf0;// 写缓冲区 
	ldi R24,240 
	sts 31745,R24 
	.dbline 230 
; 	cwait; 
	nop 
	.dbline 238 
; 	/**************************** 
; 	  缓冲区数据结构: 
; 	  字节1:保留,可为任意值 
; 	  字节2:数据字节的数目/长度 
; 	  字节3:数据字节1 
; 	  字节4:数据字节2 
; 	*****************************/ 
; 	D12_DATA = 0x00;//写字节1 
	clr R2 
	sts 31744,R2 
	.dbline 239 
; 	cwait; 
	nop 
	.dbline 240 
; 	D12_DATA = j;//写字节2 
	sts 31744,R16 
	.dbline 241 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 241 
	.dbline 247 
; 	/***************************** 
; 	  判断输出 
; 	  XmtBuff.p_p = 0:输出一般数据 
; 	  XmtBuff.p_p = 1:输出CONST数据 
; 	******************************/ 
; 	if(XmtBuff.p_p) 
	lds R2,_XmtBuff+70 
	tst R2 
	breq L42 
	.dbline 248 
; 	{ 
	.dbline 249 
; 		for(i=0;i