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