?? 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 + -