www.pudn.com > usbcode.rar > D12ISR.lis
.module D12ISR.c
.area text(rom, con, rel)
0000 .dbfile G:\source\D12ISR.c
0000 .dbfunc s D12_ISR _D12_ISR fI
; j -> R22
; i -> R20
.even
0000 _D12_ISR::
0000 00D0 rcall push_gset2
0002 .dbline -1
0002 .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)
; {
0002 .dbline 53
; unsigned char i,j;
; D12_COMMAND = 0xf4;// 读中断寄存器
0002 84EF ldi R24,244
0004 8093017C sts 31745,R24
0008 .dbline 54
; cwait1;
0008 0000 nop
000A .dbline 54
000A 0000 nop
000C .dbline 55
; i=D12_DATA;//读取数据赋值给局部变量i
000C 4091007C lds R20,31744
0010 .dbline 56
; csram;
0010 609301FC sts 0xfc01,R22
0014 .dbline 56
0014 .dbline 57
; if(i & 0x01)//处理控制输出端点
0014 40FF sbrs R20,0
0016 0DC0 rjmp L3
0018 .dbline 58
; {
0018 .dbline 59
; D12_COMMAND = 0x40;//读最后状态
0018 80E4 ldi R24,64
001A 8093017C sts 31745,R24
001E .dbline 60
; cwait1;
001E 0000 nop
0020 .dbline 60
0020 0000 nop
0022 .dbline 61
; i= D12_DATA;//从端点缓冲区读取数据
0022 4091007C lds R20,31744
0026 .dbline 62
; csram;
0026 609301FC sts 0xfc01,R22
002A .dbline 62
002A .dbline 63
; if (i & 0x20) //收到SETUP包
002A 45FF sbrs R20,5
002C 4FC0 rjmp L4
002E .dbline 64
; {
002E .dbline 65
; Setup_control();//枚举控制函数
002E 00D0 rcall _Setup_control
0030 .dbline 66
; }
0030 .dbline 67
0030 4DC0 rjmp L4
0032 L3:
0032 .dbline 67
; }else if(i & 0x02)//处理控制输入端点
0032 41FF sbrs R20,1
0034 0BC0 rjmp L7
0036 .dbline 68
; {
0036 .dbline 69
; D12_COMMAND = 0x41;//读最后状态
0036 81E4 ldi R24,65
0038 8093017C sts 31745,R24
003C .dbline 70
; cwait1;
003C 0000 nop
003E .dbline 70
003E 0000 nop
0040 .dbline 71
; i = D12_DATA;//从端点缓冲区读取数据
0040 4091007C lds R20,31744
0044 .dbline 72
; csram;
0044 609301FC sts 0xfc01,R22
0048 .dbline 72
0048 .dbline 73
; USB_submit();//控制端点提交函数
0048 45D0 rcall _USB_submit
004A .dbline 74
004A 40C0 rjmp L8
004C L7:
004C .dbline 74
; }else if(i & 0x04)//处理端点1输出
004C 42FF sbrs R20,2
004E 01C0 rjmp L9
0050 .dbline 75
; {
0050 .dbline 77
0050 3DC0 rjmp L10
0052 L9:
0052 .dbline 77
;
; }else if(i & 0x08)//处理端点1输入
0052 43FF sbrs R20,3
0054 01C0 rjmp L11
0056 .dbline 78
; {
0056 .dbline 80
0056 3AC0 rjmp L12
0058 L11:
0058 .dbline 80
;
; }else if(i & 0x10)//处理批量输出端点
0058 44FF sbrs R20,4
005A 1DC0 rjmp L13
005C .dbline 81
; {
005C .dbline 82
; D12_COMMAND = 0x44;//读最后状态
005C 84E4 ldi R24,68
005E 8093017C sts 31745,R24
0062 .dbline 83
; cwait;
0062 0000 nop
0064 .dbline 84
; i = D12_DATA;
0064 4091007C lds R20,31744
0068 .dbline 85
; csram;
0068 609301FC sts 0xfc01,R22
006C .dbline 85
006C .dbline 86
; D12_COMMAND = 0x04;//选择端点(指针指向0位置)
006C 84E0 ldi R24,4
006E 8093017C sts 31745,R24
0072 .dbline 87
; cwait;
0072 0000 nop
0074 .dbline 88
; D12_COMMAND = 0xf0;//读缓冲区
0074 80EF ldi R24,240
0076 8093017C sts 31745,R24
007A .dbline 96
; /****************************
; 缓冲区数据结构:
; 字节1:保留,可为任意值
; 字节2:数据字节的数目/长度
; 字节3:数据字节1
; 字节4:数据字节2
; *****************************/
; cwait1;
007A 0000 nop
007C .dbline 96
007C 0000 nop
007E .dbline 97
; j=D12_DATA;//字节1
007E 6091007C lds R22,31744
0082 .dbline 98
; cwait1;
0082 0000 nop
0084 .dbline 98
0084 0000 nop
0086 .dbline 99
; j=D12_DATA;//字节2
0086 6091007C lds R22,31744
008A .dbline 100
; csram;
008A 609301FC sts 0xfc01,R22
008E .dbline 100
008E .dbline 101
; Bulk_Out_Packet(j);//处理PC发送的批量传输包
008E 062F mov R16,R22
0090 1127 clr R17
0092 00D0 rcall _Bulk_Out_Packet
0094 .dbline 102
0094 1BC0 rjmp L14
0096 L13:
0096 .dbline 102
; }else if(i & 0x20)//处理批量输入端点
0096 45FF sbrs R20,5
0098 0DC0 rjmp L15
009A .dbline 103
; {
009A .dbline 104
; D12_COMMAND = 0x45;//读 in 最后状态
009A 85E4 ldi R24,69
009C 8093017C sts 31745,R24
00A0 .dbline 105
; cwait1;
00A0 0000 nop
00A2 .dbline 105
00A2 0000 nop
00A4 .dbline 106
; i = D12_DATA;
00A4 4091007C lds R20,31744
00A8 .dbline 107
; cwait1;
00A8 0000 nop
00AA .dbline 107
00AA 0000 nop
00AC .dbline 108
; csram;
00AC 609301FC sts 0xfc01,R22
00B0 .dbline 108
00B0 .dbline 109
; Bulk_In_Packet();//回应批量传输包
00B0 00D0 rcall _Bulk_In_Packet
00B2 .dbline 110
00B2 0CC0 rjmp L16
00B4 L15:
00B4 .dbline 110
; }else if(i & 0x80)//D12_INT_SUSPENDCHANGE D12挂起
00B4 47FF sbrs R20,7
00B6 01C0 rjmp L17
00B8 .dbline 111
; {
00B8 .dbline 113
00B8 09C0 rjmp L18
00BA L17:
00BA .dbline 113
;
; }else if(i & 0x40)//D12_INT_BUSRESET总线复位
00BA 46FF sbrs R20,6
00BC 02C0 rjmp L19
00BE .dbline 114
; {
00BE .dbline 115
; bus_reset();//总线重置
00BE 08D0 rcall _bus_reset
00C0 .dbline 116
; }else
00C0 05C0 rjmp L20
00C2 L19:
00C2 .dbline 117
; {
00C2 .dbline 118
; i=D12_DATA; //D12_INT_EOT DMA操作已结束
00C2 4091007C lds R20,31744
00C6 .dbline 119
; if(i & 0x01)
00C6 40FF sbrs R20,0
00C8 01C0 rjmp L21
00CA .dbline 120
; {
00CA .dbline 121
; dma_eot();//Dma 操作结束
00CA 03D0 rcall _dma_eot
00CC .dbline 122
; }
00CC L21:
00CC .dbline 123
; }
00CC L20:
00CC L18:
00CC L16:
00CC L14:
00CC L12:
00CC L10:
00CC L8:
00CC L4:
00CC .dbline -2
00CC .dbline 124
; }
00CC L2:
00CC 00D0 rcall pop_gset2
00CE .dbline 0 ; func end
00CE 0895 ret
00D0 .dbsym r j 22 c
00D0 .dbsym r i 20 c
00D0 .dbfunc s bus_reset _bus_reset fI
.even
00D0 _bus_reset::
00D0 .dbline -1
00D0 .dbline 127
;
; void bus_reset(void)//总线重置函数
; {
00D0 .dbline -2
00D0 .dbline 128
; }
00D0 L23:
00D0 .dbline 0 ; func end
00D0 0895 ret
00D2 .dbfunc s dma_eot _dma_eot fI
.even
00D2 _dma_eot::
00D2 .dbline -1
00D2 .dbline 131
;
; void dma_eot(void)//Dma 操作结束函数
; {
00D2 .dbline -2
00D2 .dbline 132
; }
00D2 L24:
00D2 .dbline 0 ; func end
00D2 0895 ret
00D4 .dbfunc s USB_submit _USB_submit fI
; j -> R16
; k -> R18
; i -> R20
.even
00D4 _USB_submit::
00D4 00D0 rcall push_gset1
00D6 .dbline -1
00D6 .dbline 155
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:控制端点传输提交
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:传输结构体
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void USB_submit(void)
; {
00D6 .dbline 163
; unsigned char i,j,k;
; /*********说明******************
; D12芯片数据手册上说明控制端点
; 缓冲区大小为16BYTES,使用时试用
; 64BYTES可以完成传输,这里故用64
; 来处理
; *******************************/
; if(64 > XmtBuff.wrLength)
00D6 30904100 lds R3,_XmtBuff+64+1
00DA 20904000 lds R2,_XmtBuff+64
00DE 80E4 ldi R24,64
00E0 90E0 ldi R25,0
00E2 2816 cp R2,R24
00E4 3906 cpc R3,R25
00E6 18F4 brsh L26
00E8 .dbline 164
; {
00E8 .dbline 165
; j = XmtBuff.wrLength;
00E8 022D mov R16,R2
00EA 132D mov R17,R3
00EC .dbline 166
; }else
00EC 01C0 rjmp L27
00EE L26:
00EE .dbline 167
; {
00EE .dbline 168
; j = 64;
00EE 00E4 ldi R16,64
00F0 .dbline 169
; }
00F0 L27:
00F0 .dbline 170
; D12_COMMAND = 0x01;//选择端点(指针指向0位置)
00F0 81E0 ldi R24,1
00F2 8093017C sts 31745,R24
00F6 .dbline 171
; cwait;
00F6 0000 nop
00F8 .dbline 172
; D12_COMMAND = 0xf0;//写缓冲区
00F8 80EF ldi R24,240
00FA 8093017C sts 31745,R24
00FE .dbline 173
; cwait;
00FE 0000 nop
0100 .dbline 181
; /****************************
; 缓冲区数据结构:
; 字节1:保留,可为任意值
; 字节2:数据字节的数目/长度
; 字节3:数据字节1
; 字节4:数据字节2
; *****************************/
; D12_DATA = 0x00;//写字节1
0100 2224 clr R2
0102 2092007C sts 31744,R2
0106 .dbline 182
; cwait;
0106 0000 nop
0108 .dbline 183
; D12_DATA = j;//写字节2
0108 0093007C sts 31744,R16
010C .dbline 184
; csram;
010C 609301FC sts 0xfc01,R22
0110 .dbline 184
0110 .dbline 185
; for(i=0;i R16
; k -> R18
; i -> R20
.even
0178 _BULK_submit::
0178 00D0 rcall push_gset1
017A .dbline -1
017A .dbline 218
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:BULK端点传输提交
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:传输结构体
; **调用的函数说明:
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void BULK_submit(void)
; {
017A .dbline 220
; unsigned char i,j,k;
; if(64 > XmtBuff.wrLength)
017A 30904100 lds R3,_XmtBuff+64+1
017E 20904000 lds R2,_XmtBuff+64
0182 80E4 ldi R24,64
0184 90E0 ldi R25,0
0186 2816 cp R2,R24
0188 3906 cpc R3,R25
018A 18F4 brsh L38
018C .dbline 221
; {
018C .dbline 222
; j = XmtBuff.wrLength;
018C 022D mov R16,R2
018E 132D mov R17,R3
0190 .dbline 223
; }else
0190 01C0 rjmp L39
0192 L38:
0192 .dbline 224
; {
0192 .dbline 225
; j = 64;
0192 00E4 ldi R16,64
0194 .dbline 226
; }
0194 L39:
0194 .dbline 227
; D12_COMMAND = 0x05;// 选择端点(指针指向0位置)
0194 85E0 ldi R24,5
0196 8093017C sts 31745,R24
019A .dbline 228
; cwait;
019A 0000 nop
019C .dbline 229
; D12_COMMAND = 0xf0;// 写缓冲区
019C 80EF ldi R24,240
019E 8093017C sts 31745,R24
01A2 .dbline 230
; cwait;
01A2 0000 nop
01A4 .dbline 238
; /****************************
; 缓冲区数据结构:
; 字节1:保留,可为任意值
; 字节2:数据字节的数目/长度
; 字节3:数据字节1
; 字节4:数据字节2
; *****************************/
; D12_DATA = 0x00;//写字节1
01A4 2224 clr R2
01A6 2092007C sts 31744,R2
01AA .dbline 239
; cwait;
01AA 0000 nop
01AC .dbline 240
; D12_DATA = j;//写字节2
01AC 0093007C sts 31744,R16
01B0 .dbline 241
; csram;
01B0 609301FC sts 0xfc01,R22
01B4 .dbline 241
01B4 .dbline 247
; /*****************************
; 判断输出
; XmtBuff.p_p = 0:输出一般数据
; XmtBuff.p_p = 1:输出CONST数据
; ******************************/
; if(XmtBuff.p_p)
01B4 20904600 lds R2,_XmtBuff+70
01B8 2220 tst R2
01BA 11F1 breq L42
01BC .dbline 248
; {
01BC .dbline 249
; for(i=0;i