?? chap_9.lst
字號:
154 2 txdat[0] = 1; //不支持遠程喚醒、自供電
155 2 txdat[1]=0; //高8位為0
156 2 single_transmit(txdat, 2); //發送16位的狀態到主機
157 2
158 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) { //對接口請求
159 2 txdat[0]=0;
160 2 txdat[1]=0;
161 2 single_transmit(txdat, 2);
162 2 //發送16位的狀態到主機
163 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) { //對端點請求
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); //讀取輸入端點狀態
167 2 else
168 2 c = D12_SelectEndpoint(endp*2); //讀取輸出端點狀態
169 2 if(c & D12_STALL)
170 2 txdat[0] = 1; //端點禁止
171 2 else
172 2 txdat[0] = 0; //端點有效
173 2 txdat[1] = 0;
174 2 single_transmit(txdat, 2); //發送16位的狀態到主機
175 2
176 2 } else
177 1 stall_ep0(); //非標準請求,發STALL
178 1 }
C51 COMPILER V7.07 CHAP_9 11/06/2006 16:40:43 PAGE 4
179
180
181 /****************************************
182 ** 函數名稱: void clear_feature(void)
183 ** 功能描述: 清除特性
184 *****************************************/
185 void clear_feature(void)
186 {
187 1 INT8U endp; //讀取請求類型中的接收方
188 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
189 1 //讀取請求類型
190 1 if (bRecipient == USB_RECIPIENT_DEVICE //對設備請求
191 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
192 2 DISABLE(); //清除遠程喚醒特性
193 2 bEPPflags.bits.remote_wakeup = 0; //清0遠程喚醒標志
194 2 ENABLE();
195 2 single_transmit(0, 0); //返回一個空的數據表示執行完畢
196 2 }
197 1
198 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT //對端點請求
199 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
200 2 //清除端點禁止特性,恢復其使用
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); //清除控制輸入端點STALL特性
204 2 else
205 2 D12_SetEndpointStatus(endp*2, 0); //清除控制輸出端點STALL特性
206 2 single_transmit(0, 0); //返回一個空的數據表示執行完畢
207 2 } else
208 1 stall_ep0(); //沒有該請求,返回STALL
209 1 }
210
211
212 /****************************************
213 ** 函數名稱: void set_feature(void)
214 ** 功能描述: 設置特性
215 *****************************************/
216 void set_feature(void)
217 {
218 1 INT8U endp; //讀取請求類型中的接收方
219 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
220 1 //讀取請求類型
221 1 if (bRecipient == USB_RECIPIENT_DEVICE //對設備請求
222 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
223 2 //設置遠程喚醒特性
224 2 DISABLE();
225 2 bEPPflags.bits.remote_wakeup = 1; //置1遠程喚醒標志
226 2 ENABLE();
227 2 single_transmit(0, 0); //返回一個空的數據表示執行完畢
228 2 }
229 1
230 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT //對端點請求
231 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
232 2 //禁止端點
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); //設置輸入端點禁止
236 2 else
237 2 D12_SetEndpointStatus(endp*2, 1); //設置輸出端點禁止
238 2 single_transmit(0, 0); //返回一個空的數據表示執行完畢
239 2 } else
240 1 stall_ep0(); //沒有該請求,返回STALL
C51 COMPILER V7.07 CHAP_9 11/06/2006 16:40:43 PAGE 5
241 1 }
242
243
244 /****************************************
245 ** 函數名稱: void set_address(void)
246 ** 功能描述: 設置地址
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); //發送一個空的數據響應
253 1 }
254
255
256 /****************************************
257 ** 函數名稱: void get_descriptor(void)
258 ** 功能描述: 獲取描述符
259 *****************************************/
260 void get_descriptor(void)
261 {
262 1 INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue); //讀取請求的描述符類型
263 1
264 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE){ //獲取設備描述符
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 //發送描述符內容
273 2 }else
274 1 stall_ep0(); //沒有該請求,返回STALL
275 1 }
276
277
278 /****************************************
279 ** 函數名稱: 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); //發送配置值
287 1 }
288
289 /****************************************
290 ** 函數名稱: void set_configuration(void)
291 ** 功能描述: 設置配置
292 *****************************************/
293 void set_configuration(void)
294 {
295 1 if (ControlData.DeviceRequest.wValue == 0) { //配置值不對,設備進入未配置狀態
296 2 single_transmit(0, 0); //發向一個空包響應
297 2 DISABLE();
298 2 bEPPflags.bits.configuration = 0; //標記未配置
299 2 ENABLE();
300 2 init_unconfig(); //進入地址狀態,禁止0除外的所有端點
301 2
302 2 } else if (ControlData.DeviceRequest.wValue == 1) { //配置設備
C51 COMPILER V7.07 CHAP_9 11/06/2006 16:40:43 PAGE 6
303 2 single_transmit(0, 0); //發向一個空包響應
304 2 init_unconfig(); //進入地址狀態,禁止0除外的所有端點
305 2 init_config(); //配置處理,允許端點收發
306 2 DISABLE();
307 2 bEPPflags.bits.configuration = 1; //標志已配置
308 2 ENABLE();
309 2 } else
310 1 stall_ep0(); //沒有該請求,返回STALL
311 1 }
312
313
314 /****************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -