📄 avr_usb_disk.lst
字号:
(0023) **工程名称:U盘固件程序开发
(0024) **编译器类型及版本:ICCAVR 6.26C
(0025) **日期:2004.4.30
(0026) **创建人:陈驰
(0027) **所属单位:湖南大学计算机与通信学院
(0028)
(0029) **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
(0030) **时钟频率:8MHZ
(0031)
(0032) **函数功能:中断服务处理
(0033) **函数输入参数及说明:无
(0034)
(0035) **函数返回值:无
(0036) **在本函数以外定义的变量:D12_COMMAND,D12_DATA
(0037) **调用的函数说明:
(0038) Setup_control():枚举控制函数
(0039) USB_submit():控制端点提交函数
(0040) Bulk_Out_Pack(j):处理PC发送的批量传输包
(0041) Bulk_In_Packet():回应批量传输包
(0042) void bus_reset(void):总线重置
(0043) void dma_eot(void):Dma 操作结束
(0044)
(0045) **修改人:陈驰
(0046) **修改日期:2004.4.30
(0047) **修改说明:创建
(0048) *************************************************************/
(0049) void D12_ISR(void)
(0050) {
(0051) unsigned char i,j;
(0052) D12_COMMAND = 0xf4;// 读中断寄存器
040F EF84 LDI R24,0xF4
0410 93807C01 STS R24,0x7C01
(0053) cwait1;
0412 0000 NOP
0413 0000 NOP
(0054) i=D12_DATA;//读取数据赋值给局部变量i
0414 91407C00 LDS R20,0x7C00
(0055) csram;
0416 9360FC01 STS R22,0xFC01
(0056) if(i & 0x01)//处理控制输出端点
0418 FF40 SBRS R20,0
0419 C00D RJMP 0x0427
(0057) {
(0058) D12_COMMAND = 0x40;//读最后状态
041A E480 LDI R24,0x40
041B 93807C01 STS R24,0x7C01
(0059) cwait1;
041D 0000 NOP
041E 0000 NOP
(0060) i= D12_DATA;//从端点缓冲区读取数据
041F 91407C00 LDS R20,0x7C00
(0061) csram;
0421 9360FC01 STS R22,0xFC01
(0062) if (i & 0x20) //收到SETUP包
0423 FF45 SBRS R20,5
0424 C04F RJMP 0x0474
(0063) {
(0064) Setup_control();//枚举控制函数
0425 D119 RCALL _Setup_control
(0065) }
(0066) }else if(i & 0x02)//处理控制输入端点
0426 C04D RJMP 0x0474
0427 FF41 SBRS R20,1
0428 C00B RJMP 0x0434
(0067) {
(0068) D12_COMMAND = 0x41;//读最后状态
0429 E481 LDI R24,0x41
042A 93807C01 STS R24,0x7C01
(0069) cwait1;
042C 0000 NOP
042D 0000 NOP
(0070) i = D12_DATA;//从端点缓冲区读取数据
042E 91407C00 LDS R20,0x7C00
(0071) csram;
0430 9360FC01 STS R22,0xFC01
(0072) USB_submit();//控制端点提交函数
0432 D045 RCALL _USB_submit
(0073) }else if(i & 0x04)//处理端点1输出
0433 C040 RJMP 0x0474
0434 FF42 SBRS R20,2
0435 C001 RJMP 0x0437
(0074) {
(0075)
(0076) }else if(i & 0x08)//处理端点1输入
0436 C03D RJMP 0x0474
0437 FF43 SBRS R20,3
0438 C001 RJMP 0x043A
(0077) {
(0078)
(0079) }else if(i & 0x10)//处理批量输出端点
0439 C03A RJMP 0x0474
043A FF44 SBRS R20,4
043B C01D RJMP 0x0459
(0080) {
(0081) D12_COMMAND = 0x44;//读最后状态
043C E484 LDI R24,0x44
043D 93807C01 STS R24,0x7C01
(0082) cwait;
043F 0000 NOP
(0083) i = D12_DATA;
0440 91407C00 LDS R20,0x7C00
(0084) csram;
0442 9360FC01 STS R22,0xFC01
(0085) D12_COMMAND = 0x04;//选择端点(指针指向0位置)
0444 E084 LDI R24,4
0445 93807C01 STS R24,0x7C01
(0086) cwait;
0447 0000 NOP
(0087) D12_COMMAND = 0xf0;//读缓冲区
0448 EF80 LDI R24,0xF0
0449 93807C01 STS R24,0x7C01
(0088) /****************************
(0089) 缓冲区数据结构:
(0090) 字节1:保留,可为任意值
(0091) 字节2:数据字节的数目/长度
(0092) 字节3:数据字节1
(0093) 字节4:数据字节2
(0094) *****************************/
(0095) cwait1;
044B 0000 NOP
044C 0000 NOP
(0096) j=D12_DATA;//字节1
044D 91607C00 LDS R22,0x7C00
(0097) cwait1;
044F 0000 NOP
0450 0000 NOP
(0098) j=D12_DATA;//字节2
0451 91607C00 LDS R22,0x7C00
(0099) csram;
0453 9360FC01 STS R22,0xFC01
(0100) Bulk_Out_Packet(j);//处理PC发送的批量传输包
0455 2F06 MOV R16,R22
0456 2711 CLR R17
0457 DCFF RCALL _Bulk_Out_Packet
(0101) }else if(i & 0x20)//处理批量输入端点
0458 C01B RJMP 0x0474
0459 FF45 SBRS R20,5
045A C00D RJMP 0x0468
(0102) {
(0103) D12_COMMAND = 0x45;//读 in 最后状态
045B E485 LDI R24,0x45
045C 93807C01 STS R24,0x7C01
(0104) cwait1;
045E 0000 NOP
045F 0000 NOP
(0105) i = D12_DATA;
0460 91407C00 LDS R20,0x7C00
(0106) cwait1;
0462 0000 NOP
0463 0000 NOP
(0107) csram;
0464 9360FC01 STS R22,0xFC01
(0108) Bulk_In_Packet();//回应批量传输包
0466 DE43 RCALL _Bulk_In_Packet
(0109) }else if(i & 0x80)//D12_INT_SUSPENDCHANGE D12挂起
0467 C00C RJMP 0x0474
0468 FF47 SBRS R20,7
0469 C001 RJMP 0x046B
(0110) {
(0111)
(0112) }else if(i & 0x40)//D12_INT_BUSRESET总线复位
046A C009 RJMP 0x0474
046B FF46 SBRS R20,6
046C C002 RJMP 0x046F
(0113) {
(0114) bus_reset();//总线重置
046D D008 RCALL _bus_reset
(0115) }else
046E C005 RJMP 0x0474
(0116) {
(0117) i=D12_DATA; //D12_INT_EOT DMA操作已结束
046F 91407C00 LDS R20,0x7C00
(0118) if(i & 0x01)
0471 FF40 SBRS R20,0
0472 C001 RJMP 0x0474
(0119) {
(0120) dma_eot();//Dma 操作结束
0473 D003 RCALL _dma_eot
(0121) }
(0122) }
(0123) }
0474 D67E RCALL pop_gset2
0475 9508 RET
(0124)
(0125) void bus_reset(void)//总线重置函数
(0126) {
(0127) }
_bus_reset:
0476 9508 RET
(0128)
(0129) void dma_eot(void)//Dma 操作结束函数
(0130) {
(0131) }
_dma_eot:
0477 9508 RET
_USB_submit:
j --> R16
k --> R18
i --> R20
0478 D657 RCALL push_gset1
(0132) /************************************************************
(0133) **工程名称:U盘固件程序开发
(0134) **编译器类型及版本:ICCAVR 6.26C
(0135) **日期:2004.4.30
(0136) **创建人:陈驰
(0137) **所属单位:湖南大学计算机与通信学院
(0138)
(0139) **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
(0140) **时钟频率:8MHZ
(0141)
(0142) **函数功能:控制端点传输提交
(0143) **函数输入参数及说明:无
(0144)
(0145) **函数返回值:无
(0146) **在本函数以外定义的变量:传输结构体
(0147) **调用的函数说明:无
(0148)
(0149) **修改人:陈驰
(0150) **修改日期:2004.4.30
(0151) **修改说明:创建
(0152) *************************************************************/
(0153) void USB_submit(void)
(0154) {
(0155) unsigned char i,j,k;
(0156) /*********说明******************
(0157) D12芯片数据手册上说明控制端点
(0158) 缓冲区大小为16BYTES,使用时试用
(0159) 64BYTES可以完成传输,这里故用64
(0160) 来处理
(0161) *******************************/
(0162) if(64 > XmtBuff.wrLength)
0479 90300156 LDS R3,0x156
047B 90200155 LDS R2,0x155
047D E480 LDI R24,0x40
047E E090 LDI R25,0
047F 1628 CP R2,R24
0480 0639 CPC R3,R25
0481 F418 BCC 0x0485
(0163) {
(0164) j = XmtBuff.wrLength;
0482 2D02 MOV R16,R2
0483 2D13 MOV R17,R3
(0165) }else
0484 C001 RJMP 0x0486
(0166) {
(0167) j = 64;
0485 E400 LDI R16,0x40
(0168) }
(0169) D12_COMMAND = 0x01;//选择端点(指针指向0位置)
0486 E081 LDI R24,1
0487 93807C01 STS R24,0x7C01
(0170) cwait;
0489 0000 NOP
(0171) D12_COMMAND = 0xf0;//写缓冲区
048A EF80 LDI R24,0xF0
048B 93807C01 STS R24,0x7C01
(0172) cwait;
048D 0000 NOP
(0173) /****************************
(0174) 缓冲区数据结构:
(0175) 字节1:保留,可为任意值
(0176) 字节2:数据字节的数目/长度
(0177) 字节3:数据字节1
(0178) 字节4:数据字节2
(0179) *****************************/
(0180) D12_DATA = 0x00;//写字节1
048E 2422 CLR R2
048F 92207C00 STS R2,0x7C00
(0181) cwait;
0491 0000 NOP
(0182) D12_DATA = j;//写字节2
0492 93007C00 STS R16,0x7C00
(0183) csram;
0494 9360FC01 STS R22,0xFC01
(0184) for(i=0;i<j;i++)
0496 2744 CLR R20
0497 C011 RJMP 0x04A9
(0185) {
(0186) k = *(XmtBuff.pp+i);
0498 90300158 LDS R3,0x158
049A 90200157 LDS R2,0x157
049C 2E44 MOV R4,R20
049D 2455 CLR R5
049E 0C42 ADD R4,R2
049F 1C53 ADC R5,R3
04A0 2DE4 MOV R30,R4
04A1 2DF5 MOV R31,R5
04A2 95C8 LPM
04A3 2D20 MOV R18,R0
(0187) D12_DATA = k;//写数据字节
04A4 93207C00 STS R18,0x7C00
(0188) csram;
04A6 9360FC01 STS R22,0xFC01
(0189) }
04A8 9543 INC R20
04A9 1740 CP R20,R16
04AA F368 BCS 0x0498
(0190) XmtBuff.pp += j;
04AB 90300158 LDS R3,0x158
04AD 90200157 LDS R2,0x157
04AF 2E40 MOV R4,R16
04B0 2455 CLR R5
04B1 0C42 ADD R4,R2
04B2 1C53 ADC R5,R3
04B3 92500158 STS R5,0x158
04B5 92400157 STS R4,0x157
(0191) XmtBuff.wrLength -= j;
04B7 2E20 MOV R2,R16
04B8 2433 CLR R3
04B9 90500156 LDS R5,0x156
04BB 90400155 LDS R4,0x155
04BD 1842 SUB R4,R2
04BE 0853 SBC R5,R3
04BF 92500156 STS R5,0x156
04C1 92400155 STS R4,0x155
(0192) D12_COMMAND = 0xfa;//设置缓冲区有效(满标志)
04C3 EF8A LDI R24,0xFA
04C4 93807C01 STS R24,0x7C01
(0193) csram;
04C6 9360FC01 STS R22,0xFC01
(0194) }
04C8 D60A RCALL pop_gset1
04C9 9508 RET
_BULK_submit:
j --> R16
k --> R18
i --> R20
04CA D605 RCALL push_gset1
(0195) /************************************************************
(0196) **工程名称:U盘固件程序开发
(0197) **编译器类型及版本:ICCAVR 6.26C
(0198) **日期:2004.4.30
(0199) **创建人:陈驰
(0200) **所属单位:湖南大学计算机与通信学院
(0201)
(0202) **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
(0203) **时钟频率:8MHZ
(0204)
(0205) **函数功能:BULK端点传输提交
(0206) **函数输入参数及说明:无
(0207)
(0208) **函数返回值:无
(0209) **在本函数以外定义的变量:传输结构体
(0210) **调用的函数说明:
(0211)
(0212) **修改人:陈驰
(0213) **修改日期:2004.4.30
(0214) **修改说明:创建
(0215) *************************************************************/
(0216) void BULK_submit(void)
(0217) {
(0218) unsigned char i,j,k;
(0219) if(64 > XmtBuff.wrLength)
04CB 90300156 LDS R3,0x156
04CD 90200155 LDS R2,0x155
04CF E480 LDI R24,0x40
04D0 E090 LDI R25,0
04D1 1628 CP R2,R24
04D2 0639 CPC R3,R25
04D3 F418 BCC 0x04D7
(0220) {
(0221) j = XmtBuff.wrLength;
04D4 2D02 MOV R16,R2
04D5 2D13 MOV R17,R3
(0222) }else
04D6 C001 RJMP 0x04D8
(0223) {
(0224) j = 64;
04D7 E400 LDI R16,0x40
(0225) }
(0226) D12_COMMAND = 0x05;// 选择端点(指针指向0位置)
04D8 E085 LDI R24,5
04D9 93807C01 STS R24,0x7C01
(0227) cwait;
04DB 0000 NOP
(0228) D12_COMMAND = 0xf0;// 写缓冲区
04DC EF80 LDI R24,0xF0
04DD 93807C01 STS R24,0x7C01
(0229) cwait;
04DF 0000 NOP
(0230) /****************************
(0231) 缓冲区数据结构:
(0232) 字节1:保留,可为任意值
(0233) 字节2:数据字节的数目/长度
(0234) 字节3:数据字节1
(0235) 字节4:数据字节2
(0236) *****************************/
(0237) D12_DATA = 0x00;//写字节1
04E0 2422 CLR R2
04E1 92207C00 STS R2,0x7C00
(0238) cwait;
04E3 0000 NOP
(0239) D12_DATA = j;//写字节2
04E4 93007C00 STS R16,0x7C00
(0240) csram;
04E6 9360FC01 STS R22,0xFC01
(0241) /*****************************
(0242) 判断输出
(0243) XmtBuff.p_p = 0:输出一般数据
(0244) XmtBuff.p_p = 1:输出CONST数据
(0245) ******************************/
(0246) if(XmtBuff.p_p)
04E8 9020015B LDS R2,0x15B
04EA 2022 TST R2
04EB F111 BEQ 0x050E
(0247) {
(0248) for(i=0;i<j ;i++)
04EC 2744 CLR R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -