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