📄 chap_9.lst
字号:
155 2 txdat[0] = 1; //不支持远程唤醒、自供电
156 2 txdat[1]=0; //高8位为0
157 2 single_transmit(txdat, 2); //发送16位的状态到主机
158 2
159 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) { //对接口请求
160 2 txdat[0]=0;
161 2 txdat[1]=0;
162 2 single_transmit(txdat, 2);
163 2 //发送16位的状态到主机
164 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) { //对端点请求
165 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
166 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
167 2 c = D12_SelectEndpoint(endp*2 + 1); //读取输入端点状态
168 2 else
169 2 c = D12_SelectEndpoint(endp*2); //读取输出端点状态
170 2 if(c & D12_STALL)
171 2 txdat[0] = 1; //端点禁止
172 2 else
173 2 txdat[0] = 0; //端点有效
174 2 txdat[1] = 0;
175 2 single_transmit(txdat, 2); //发送16位的状态到主机
176 2
177 2 } else
178 1 stall_ep0(); //非标准请求,发STALL
C51 COMPILER V7.50 CHAP_9 11/22/2005 21:08:10 PAGE 4
179 1 }
180
181
182 /****************************************
183 ** 函数名称: void clear_feature(void)
184 ** 功能描述: 清除特性
185 *****************************************/
186 void clear_feature(void)
187 {
188 1 INT8U endp; //读取请求类型中的接收方
189 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
190 1 //读取请求类型
191 1 if (bRecipient == USB_RECIPIENT_DEVICE //对设备请求
192 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
193 2 DISABLE(); //清除远程唤醒特性
194 2 bEPPflags.bits.remote_wakeup = 0; //清0远程唤醒标志
195 2 ENABLE();
196 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
197 2 }
198 1
199 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT //对端点请求
200 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
201 2 //清除端点禁止特性,恢复其使用
202 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
203 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
204 2 D12_SetEndpointStatus(endp*2 + 1, 0); //清除控制输入端点STALL特性
205 2 else
206 2 D12_SetEndpointStatus(endp*2, 0); //清除控制输出端点STALL特性
207 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
208 2 } else
209 1 stall_ep0(); //没有该请求,返回STALL
210 1 }
211
212
213 /****************************************
214 ** 函数名称: void set_feature(void)
215 ** 功能描述: 设置特性
216 *****************************************/
217 void set_feature(void)
218 {
219 1 INT8U endp; //读取请求类型中的接收方
220 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
221 1 //读取请求类型
222 1 if (bRecipient == USB_RECIPIENT_DEVICE //对设备请求
223 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
224 2 //设置远程唤醒特性
225 2 DISABLE();
226 2 bEPPflags.bits.remote_wakeup = 1; //置1远程唤醒标志
227 2 ENABLE();
228 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
229 2 }
230 1
231 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT //对端点请求
232 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
233 2 //禁止端点
234 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
235 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
236 2 D12_SetEndpointStatus(endp*2 + 1, 1); //设置输入端点禁止
237 2 else
238 2 D12_SetEndpointStatus(endp*2, 1); //设置输出端点禁止
239 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
240 2 } else
C51 COMPILER V7.50 CHAP_9 11/22/2005 21:08:10 PAGE 5
241 1 stall_ep0(); //没有该请求,返回STALL
242 1 }
243
244
245 /****************************************
246 ** 函数名称: void set_address(void)
247 ** 功能描述: 设置地址
248 *****************************************/
249 void set_address(void)
250 {
251 1 D12_SetAddressEnable((INT8U)(ControlData.DeviceRequest.wValue &
252 1 DEVICE_ADDRESS_MASK), 1);
253 1 single_transmit(0, 0); //发送一个空的数据响应
254 1 }
255
256
257 /****************************************
258 ** 函数名称: void get_descriptor(void)
259 ** 功能描述: 获取描述符
260 *****************************************/
261 void get_descriptor(void)
262 {
263 1 INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue); //读取请求的描述符类型
264 1
265 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE){ //获取设备描述符
266 2 code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
267 2
268 2 }else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) { //获取其它描述符
269 2 if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH){
270 3 ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
271 3 }
272 2 code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
273 2 //发送描述符内容
274 2 }else
275 1 stall_ep0(); //没有该请求,返回STALL
276 1 }
277
278
279 /****************************************
280 ** 函数名称: void get_configuration(void)
281 ** 功能描述: 获取配置
282 *****************************************/
283 void get_configuration(void)
284 {
285 1 INT8U c = bEPPflags.bits.configuration; //取出配置值
286 1
287 1 single_transmit(&c, 1); //发送配置值
288 1 }
289
290 /****************************************
291 ** 函数名称: void set_configuration(void)
292 ** 功能描述: 设置配置
293 *****************************************/
294 void set_configuration(void)
295 {
296 1 if (ControlData.DeviceRequest.wValue == 0) { //配置值不对,设备进入未配置状态
297 2 single_transmit(0, 0); //发向一个空包响应
298 2 DISABLE();
299 2 bEPPflags.bits.configuration = 0; //标记未配置
300 2 ENABLE();
301 2 init_unconfig(); //进入地址状态,禁止0除外的所有端点
302 2
C51 COMPILER V7.50 CHAP_9 11/22/2005 21:08:10 PAGE 6
303 2 } else if (ControlData.DeviceRequest.wValue == 1) { //配置设备
304 2 single_transmit(0, 0); //发向一个空包响应
305 2 init_unconfig(); //进入地址状态,禁止0除外的所有端点
306 2 init_config(); //配置处理,允许端点收发
307 2 DISABLE();
308 2 bEPPflags.bits.configuration = 1; //标志已配置
309 2 ENABLE();
310 2 } else
311 1 stall_ep0(); //没有该请求,返回STALL
312 1 }
313
314
315 /****************************************
316 ** 函数名称: void get_interface(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -