📄 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.06 CHAP_9 01/03/2007 10:44:27 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.06 CHAP_9 01/03/2007 10:44:27 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.06 CHAP_9 01/03/2007 10:44:27 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 + -