📄 usb_task.lst
字号:
C51 COMPILER V7.02a USB_TASK 09/13/2007 11:53:05 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE USB_TASK
OBJECT MODULE PLACED IN usb_task.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE modules\mass\usb_task.c OPTIMIZE(7,SPEED) BROWSE INCDIR(.\modules\system;.\
-;.\;.\lib_refd) DEFINE(KEIL) DEBUG OBJECTEXTEND PRINT(.\usb_task.lst) OBJECT(usb_task.obj)
stmt level source
1 /*C**************************************************************************
2 * NAME: usb_task.c
3 *----------------------------------------------------------------------------
4 * Copyright (c) 2003 Atmel.
5 *----------------------------------------------------------------------------
6 * RELEASE: snd1c-refd-nf-4_0_3
7 * REVISION: 1.16
8 *----------------------------------------------------------------------------
9 * PURPOSE:
10 * This file contains the USB task and attached routines
11 *
12 * NOTES:
13 * Global Variables:
14 * - gl_sbc_wr_protect: write protect flag for SCSI disk
15 *****************************************************************************/
16
17 /*_____ I N C L U D E S ____________________________________________________*/
18
19 #include "config.h" /* system configuration */
20 #include "lib_mcu\usb\usb_drv.h" /* usb driver definition */
21 #include "lib_mcu\kbd\kbd_drv.h" /* Keyboard driver definition */
22 #include "lib_mcu\clock\clock.h" /* clock definition */
23 #include "lib_mcu\wdt\wdt_drv.h"
24 #include "modules\display\disp.h" /* display definition */
25 #include "modules\mode\mode_task.h" /* mode task definition */
26 #include "modules\mem\hard.h" /* low level function definition */
27 #include "lib_storage\sbc.h" /* SBC commands definition */
28 #include "usb_task.h" /* usb task definition */
29
30 #include "stdio.h"
31 /*_____ M A C R O S ________________________________________________________*/
32
33
34 /*_____ D E F I N I T I O N ________________________________________________*/
35
36 extern bdata bit gl_sbc_wr_protect; /* mass storage write protected */
37
38 static bdata bit disconnected;
39 static idata Byte dCBWTag[4];
40
41 static bdata bit no_data_phase;
42
43 static bdata bit ms_multiple_drive; /* TRUE: multiple drive support */
44
45 static idata Byte usb_resume_counter;
46
47 bdata bit bmCBWFlag7; /* Data OUT (0) or Data In (1) */
48 bdata bit status_ready;
49 data Byte status;
50 data Uint32 dCBWDataTransferLength; /* usb data message length */
51 bdata bit rx_bank;
52
53
54 /*_____ D E C L A R A T I O N ______________________________________________*/
C51 COMPILER V7.02a USB_TASK 09/13/2007 11:53:05 PAGE 2
55
56 #if MEM_CHIP_TYPE != CHIP_NONE
57 extern void Sbc_chip_init (void); /* chip memory SCSI driver init */
58 extern void Sbc_command_chip (void); /* chip memory SCSI command browser */
59 #endif
60 #if MEM_CARD_TYPE != CARD_NONE
extern void Sbc_card_init (void); /* card memory SCSI driver init */
extern void Sbc_command_card (void); /* card memory SCSI command browser */
#endif
64
65 static void usb_mass_storage_cbw (void);
66 static void usb_mass_storage_csw (void);
67 void usb_ep_init (void);
68
69 /*F**************************************************************************
70 * NAME: usb_task_init
71 *----------------------------------------------------------------------------
72 * PARAMS:
73 *
74 * return:
75 *----------------------------------------------------------------------------
76 * PURPOSE:
77 * USB task initialization
78 *----------------------------------------------------------------------------
79 * EXAMPLE:
80 *----------------------------------------------------------------------------
81 * NOTE:
82 *----------------------------------------------------------------------------
83 * REQUIREMENTS:
84 *****************************************************************************/
85 void usb_task_init (void)
86 {
87 1 disconnected = 0;
88 1 clock_usb_init(); /* for suspend detection */
89 1 usb_init();
90 1 }
91
92
93 /*F**************************************************************************
94 * NAME: usb_task
95 *----------------------------------------------------------------------------
96 * PARAMS:
97 *
98 * return:
99 *----------------------------------------------------------------------------
100 * PURPOSE:
101 * USB task
102 *----------------------------------------------------------------------------
103 * EXAMPLE:
104 *----------------------------------------------------------------------------
105 * NOTE:
106 * In order to avoid spurious connection, resume is done after the resume
107 * event has been detected at least #USB_WAIT_NB_RESUME times.
108 *----------------------------------------------------------------------------
109 * REQUIREMENTS:
110 *****************************************************************************/
111 void usb_task (void)
112 {
113 1 if (Usb_suspend()) /* -- if suspend flag -- */
114 1 {
115 2
116 2
C51 COMPILER V7.02a USB_TASK 09/13/2007 11:53:05 PAGE 3
117 2 if (disconnected == 0)
118 2 { // printf(" 1\n ");
119 3 disconnected = 1;
120 3 clock_disable();
121 3 mode_exit_download();
122 3 usb_resume_counter = USB_WAIT_NB_RESUME;
123 3 }
124 2
125 2 if (Usb_resume()) /* check if resume */
126 2 { // printf(" 2 \n");
127 3 if (usb_resume_counter == 0)
128 3 {
129 4
130 4 // printf("9 \n");
131 4 mode_set_download();
132 4 clock_usb_init();
133 4 print_mode_mass(); /* display mass storage icon */
134 4 // print_screen(MASS_SCREEN); /* display storage screen */
135 4 disconnected = 0;
136 4 Usb_clear_SPINT();
137 4 Usb_clear_WUPCPU();
138 4 Usb_clear_SOFINT();
139 4 }
140 3 else
141 3 {
142 4
143 4
144 4 // printf(" 3 \n");
145 4
146 4
147 4 Usb_clear_WUPCPU();
148 4 Usb_clear_SOFINT();
149 4 usb_resume_counter--;
150 4 }
151 3 }
152 2 }
153 1 else
154 1 {
155 2 // printf(" 4\n");
156 2
157 2 if ( Usb_reset()) /* if end of reset */
158 2 {
159 3
160 3
161 3 // printf(" 5 \n");
162 3
163 3
164 3
165 3 Usb_enable_SPINT(); /* Suspend interrupt enable */
166 3 disconnected = 0;
167 3 Usb_clear_rx_bank();
168 3 Usb_clear_WUPCPU();
169 3 Usb_clear_SPINT();
170 3 Usb_clear_EORINT();
171 3 ms_multiple_drive = FALSE; /* multiple disk support init */
172 3 gl_sbc_wr_protect = Kbd_key_locked(); /* set write protect flag */
173 3 Sbc_chip_init(); /* on-board memory SCSI driver init */
174 3 Sbc_card_init(); /* card memory SCSI driver init */
175 3
176 3
177 3 }
178 2
C51 COMPILER V7.02a USB_TASK 09/13/2007 11:53:05 PAGE 4
179 2 if ( UEPINT!=0) /* new command */
180 2 {
181 3 // printf(" 7 \n");
182 3 Usb_select_ep(EP_CONTROL);
183 3 if (Usb_setup_received())
184 3 {
185 4
186 4 // printf(" 8 \n");
187 4 usb_enumeration_process();
188 4 }
189 3 Usb_select_ep(EP_OUT);
190 3 if (Usb_rx_complete())
191 3 {
192 4
193 4
194 4 // printf(" 6 \n");
195 4
196 4 gl_sbc_wr_protect = Kbd_key_locked(); /* set write protect flag */
197 4 Usb_enable_int();
198 4 usb_mass_storage_cbw();
199 4 usb_mass_storage_csw();
200 4 Usb_disable_int();
201 4 }
202 3 }
203 2 }
204 1 }
205
206
207 /*F**************************************************************************
208 * NAME: usb_mass_storage_cbw
209 *----------------------------------------------------------------------------
210 * PARAMS:
211 *
212 * return:
213 *----------------------------------------------------------------------------
214 * PURPOSE:
215 * Command Block Wrapper management
216 *----------------------------------------------------------------------------
217 * EXAMPLE:
218 *----------------------------------------------------------------------------
219 * NOTE:
220 *----------------------------------------------------------------------------
221 * REQUIREMENTS:
222 *****************************************************************************/
223 void usb_mass_storage_cbw (void)
224 {
225 1 bit cbw_error;
226 1
227 1 cbw_error = FALSE;
228 1 Usb_select_ep(EP_OUT);
229 1 if (0x55 != Usb_read_byte())
230 1 {
231 2 cbw_error = TRUE;
232 2 }
233 1 if (0x53 != Usb_read_byte())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -