?? chap_9.lst
字號(hào):
154 2 txdat[0] = 1; //不支持遠(yuǎn)程喚醒、自供電
155 2 txdat[1]=0; //高8位為0
156 2 single_transmit(txdat, 2); //發(fā)送16位的狀態(tài)到主機(jī)
157 2
158 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) { //對(duì)接口請(qǐng)求
159 2 txdat[0]=0;
160 2 txdat[1]=0;
161 2 single_transmit(txdat, 2);
162 2 //發(fā)送16位的狀態(tài)到主機(jī)
163 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) { //對(duì)端點(diǎn)請(qǐng)求
164 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
165 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
166 2 c = D12_SelectEndpoint(endp*2 + 1); //讀取輸入端點(diǎn)狀態(tài)
167 2 else
168 2 c = D12_SelectEndpoint(endp*2); //讀取輸出端點(diǎn)狀態(tài)
169 2 if(c & D12_STALL)
170 2 txdat[0] = 1; //端點(diǎn)禁止
171 2 else
172 2 txdat[0] = 0; //端點(diǎn)有效
173 2 txdat[1] = 0;
174 2 single_transmit(txdat, 2); //發(fā)送16位的狀態(tài)到主機(jī)
175 2
176 2 } else
177 1 stall_ep0(); //非標(biāo)準(zhǔn)請(qǐng)求,發(fā)STALL
178 1 }
C51 COMPILER V7.06 CHAP_9 12/03/2004 14:34:47 PAGE 4
179
180
181 /****************************************
182 ** 函數(shù)名稱: void clear_feature(void)
183 ** 功能描述: 清除特性
184 *****************************************/
185 void clear_feature(void)
186 {
187 1 INT8U endp; //讀取請(qǐng)求類型中的接收方
188 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
189 1 //讀取請(qǐng)求類型
190 1 if (bRecipient == USB_RECIPIENT_DEVICE //對(duì)設(shè)備請(qǐng)求
191 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
192 2 DISABLE(); //清除遠(yuǎn)程喚醒特性
193 2 bEPPflags.bits.remote_wakeup = 0; //清0遠(yuǎn)程喚醒標(biāo)志
194 2 ENABLE();
195 2 single_transmit(0, 0); //返回一個(gè)空的數(shù)據(jù)表示執(zhí)行完畢
196 2 }
197 1
198 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT //對(duì)端點(diǎn)請(qǐng)求
199 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
200 2 //清除端點(diǎn)禁止特性,恢復(fù)其使用
201 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
202 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
203 2 D12_SetEndpointStatus(endp*2 + 1, 0); //清除控制輸入端點(diǎn)STALL特性
204 2 else
205 2 D12_SetEndpointStatus(endp*2, 0); //清除控制輸出端點(diǎn)STALL特性
206 2 single_transmit(0, 0); //返回一個(gè)空的數(shù)據(jù)表示執(zhí)行完畢
207 2 } else
208 1 stall_ep0(); //沒有該請(qǐng)求,返回STALL
209 1 }
210
211
212 /****************************************
213 ** 函數(shù)名稱: void set_feature(void)
214 ** 功能描述: 設(shè)置特性
215 *****************************************/
216 void set_feature(void)
217 {
218 1 INT8U endp; //讀取請(qǐng)求類型中的接收方
219 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
220 1 //讀取請(qǐng)求類型
221 1 if (bRecipient == USB_RECIPIENT_DEVICE //對(duì)設(shè)備請(qǐng)求
222 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
223 2 //設(shè)置遠(yuǎn)程喚醒特性
224 2 DISABLE();
225 2 bEPPflags.bits.remote_wakeup = 1; //置1遠(yuǎn)程喚醒標(biāo)志
226 2 ENABLE();
227 2 single_transmit(0, 0); //返回一個(gè)空的數(shù)據(jù)表示執(zhí)行完畢
228 2 }
229 1
230 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT //對(duì)端點(diǎn)請(qǐng)求
231 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
232 2 //禁止端點(diǎn)
233 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
234 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
235 2 D12_SetEndpointStatus(endp*2 + 1, 1); //設(shè)置輸入端點(diǎn)禁止
236 2 else
237 2 D12_SetEndpointStatus(endp*2, 1); //設(shè)置輸出端點(diǎn)禁止
238 2 single_transmit(0, 0); //返回一個(gè)空的數(shù)據(jù)表示執(zhí)行完畢
239 2 } else
240 1 stall_ep0(); //沒有該請(qǐng)求,返回STALL
C51 COMPILER V7.06 CHAP_9 12/03/2004 14:34:47 PAGE 5
241 1 }
242
243
244 /****************************************
245 ** 函數(shù)名稱: void set_address(void)
246 ** 功能描述: 設(shè)置地址
247 *****************************************/
248 void set_address(void)
249 {
250 1 D12_SetAddressEnable((INT8U)(ControlData.DeviceRequest.wValue &
251 1 DEVICE_ADDRESS_MASK), 1);
252 1 single_transmit(0, 0); //發(fā)送一個(gè)空的數(shù)據(jù)響應(yīng)
253 1 }
254
255
256 /****************************************
257 ** 函數(shù)名稱: void get_descriptor(void)
258 ** 功能描述: 獲取描述符
259 *****************************************/
260 void get_descriptor(void)
261 {
262 1 INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue); //讀取請(qǐng)求的描述符類型
263 1
264 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE){ //獲取設(shè)備描述符
265 2 code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
266 2
267 2 }else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) { //獲取其它描述符
268 2 if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH){
269 3 ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
270 3 }
271 2 code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
272 2 //發(fā)送描述符內(nèi)容
273 2 }else
274 1 stall_ep0(); //沒有該請(qǐng)求,返回STALL
275 1 }
276
277
278 /****************************************
279 ** 函數(shù)名稱: void get_configuration(void)
280 ** 功能描述: 獲取配置
281 *****************************************/
282 void get_configuration(void)
283 {
284 1 INT8U c = bEPPflags.bits.configuration; //取出配置值
285 1
286 1 single_transmit(&c, 1); //發(fā)送配置值
287 1 }
288
289 /****************************************
290 ** 函數(shù)名稱: void set_configuration(void)
291 ** 功能描述: 設(shè)置配置
292 *****************************************/
293 void set_configuration(void)
294 {
295 1 if (ControlData.DeviceRequest.wValue == 0) { //配置值不對(duì),設(shè)備進(jìn)入未配置狀態(tài)
296 2 single_transmit(0, 0); //發(fā)向一個(gè)空包響應(yīng)
297 2 DISABLE();
298 2 bEPPflags.bits.configuration = 0; //標(biāo)記未配置
299 2 ENABLE();
300 2 init_unconfig(); //進(jìn)入地址狀態(tài),禁止0除外的所有端點(diǎn)
301 2
302 2 } else if (ControlData.DeviceRequest.wValue == 1) { //配置設(shè)備
C51 COMPILER V7.06 CHAP_9 12/03/2004 14:34:47 PAGE 6
303 2 single_transmit(0, 0); //發(fā)向一個(gè)空包響應(yīng)
304 2 init_unconfig(); //進(jìn)入地址狀態(tài),禁止0除外的所有端點(diǎn)
305 2 init_config(); //配置處理,允許端點(diǎn)收發(fā)
306 2 DISABLE();
307 2 bEPPflags.bits.configuration = 1; //標(biāo)志已配置
308 2 ENABLE();
309 2 } else
310 1 stall_ep0(); //沒有該請(qǐng)求,返回STALL
311 1 }
312
313
314 /****************************************
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -