📄 ch375.lst
字号:
192 1
193 1 if(0!=len)
194 1 {
195 2 CH375_WR_CMD_PORT( CMD_WR_USB_DATA5 );
196 2 CH375_WR_DAT_PORT( len );
197 2 for(i=0; i<len; i++)
198 2 {
199 3 CH375_WR_DAT_PORT( ep1Buf[i] );
200 3 }
201 2 }
202 1 }
203 //-----------------------------------------------------
204 //函数名: mCh375DesUp
205 //作用: 复制描述符放到request结构中
206 // 变量*VarSetupDescr指向描述中
207 //参数: 无
208 //----------------------------------------------------
209 void mCh375DesUp(void)
210 {
211 1 unsigned char k;
212 1 for (k=0; k!=8; k++ )
213 1 {
214 2 request.buffer[k]=*VarSetupDescr; //依次复制8个描述符,
215 2 VarSetupDescr++;
216 2 }
217 1 }
218 //-------------------------------------------------------
219 //函数名: rdData
220 //作用: 读取当前结点的数据
221 //参数: 无
222 //返回: 读取得数据的长度
223 //-------------------------------------------------------
224 uint8 rdData()
225 {
226 1 uint8 length, *ret_buf;
227 1 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区
228 1 length = CH375_RD_DAT_PORT(); // 首先读取后续数据长度
229 1 if ( 0 != length ) // 如果长度为0则不处理
230 1 {
231 2 RECV_LEN = length; // 命令包的数据长度
232 2 ret_buf = RECV_BUFFER; // 接收缓冲区
233 2 while ( length -- )
234 2 {
235 3 *ret_buf = CH375_RD_DAT_PORT();
236 3 ret_buf++;
237 3 }
238 2 return(RECV_LEN);
239 2 }
240 1 else
C51 COMPILER V7.06 CH375 04/07/2006 09:06:59 PAGE 5
241 1 {
242 2 return(0);
243 2 }
244 1 }
245 //-------------------------------
246 //函数名: mCh375Interrupt
247 //作用: CH375中断处理
248 //参数: 无
249 //-------------------------------
250 void mCh375Interrupt(void)
251 {
252 1 unsigned char InterruptStatus;
253 1 unsigned char length, len;
254 1
255 1 CH375_WR_CMD_PORT(CMD_GET_STATUS); // 获取中断状态并取消中断请求
256 1 InterruptStatus = CH375_RD_DAT_PORT(); // 获取中断状态
257 1 RECV_LEN=0;
258 1 switch( InterruptStatus ) // 分析中断状态
259 1 {
260 2 case USB_INT_EP2_OUT: // 批量端点/端点2收到数据, 下传成功
261 2 if(0x00!=(rdData())) // 收到数据非空
262 2 {
263 3 if(0x11==RECV_BUFFER[0])
264 3 {
265 4 led=!led;
266 4 }
267 3 }
268 2 if(debug) uartPutStr("EP2_OUT\n\r");
269 2 break;
270 2 case USB_INT_EP2_IN: //批量端点/端点2数据上传成功, 未处理
271 2 if(debug) uartPutStr("EP2_IN\n\r");
272 2 CH375_WR_CMD_PORT (CMD_UNLOCK_USB);
273 2 break;
274 2 case USB_INT_EP1_IN: //中断端点/端点1数据上传成功,未处理
275 2 if(debug) uartPutStr("EP1_IN\n\r");
276 2 CH375_WR_CMD_PORT (CMD_UNLOCK_USB);
277 2 break;
278 2 case USB_INT_EP1_OUT: //中断端点/端点1数据下传成功
279 2 if(debug) uartPutStr("EP1_OUT\n\r");
280 2 if(0x00!=rdData())
281 2 {
282 3 break;
283 3 }
284 2 break;
285 2 case USB_INT_EP0_SETUP: //控制端点建立成功, 端点0接受到数据, setup成功
286 2 if(debug&DBG_SETUP) uartPutStr("#SETUP\n\r");
287 2 CH375_WR_CMD_PORT( CMD_RD_USB_DATA );
288 2 length=CH375_RD_DAT_PORT();
289 2 for( len=0; len<length; len++ )
290 2 {
291 3 request.buffer[len] = CH375_RD_DAT_PORT(); // 取出数据
292 3 }
293 2 if(debug&DBG_SETUP) uartPrint("setup dat: %\n\r", request.buffer, length);
294 2 if( 0x08==length )
295 2 {
296 3 mVarSetupLength=(request.buffer[6]&0x7f); //控制传输数据长度最大设置为128
297 3 if( !(request.r.bmReuestType&0x60) ) //标准请求
298 3 {
299 4 mVarSetupRequest=request.r.bRequest; //暂存标准请求码, 标准请求码有12种, 其中有2种是为将来保留的
300 4 switch( request.r.bRequest ) //分析标准请求
301 4 {
302 5 //标准请求, 1
C51 COMPILER V7.06 CH375 04/07/2006 09:06:59 PAGE 6
303 5 case DEF_USB_CLR_FEATURE: //请求, 清除特性, 现在只支持端口
304 5 if(debug) uartPutStr("clr feature\n\r");
305 5 if((request.r.bmReuestType&0x1F)==0x02) //接受者, 0-设备, 1-接口, 2-端点, 3-其他
306 5 {
307 6 switch( request.buffer[4] ) //表明是哪一个接口或节点, bit7-表方向, 1-入; bit0-3端点号
308 6 {
309 7 case 0x82: //端点2, 入
310 7 CH375_WR_CMD_PORT( CMD_SET_ENDP7 ); //设置端点2发送器, 清除端点2上传
311 7 CH375_WR_DAT_PORT( 0x8E ); //发命令清除端点
312 7 break;
313 7 case 0x02: //端点2, 出
314 7 CH375_WR_CMD_PORT( CMD_SET_ENDP6 );
315 7 CH375_WR_DAT_PORT( 0x80 ); //清除端点2下传
316 7 break;
317 7 case 0x81: //
318 7 CH375_WR_CMD_PORT( CMD_SET_ENDP5 ); //清除端点1上传
319 7 CH375_WR_DAT_PORT( 0x8E );
320 7 break;
321 7 case 0x01:
322 7 CH375_WR_CMD_PORT( CMD_SET_ENDP4 ); //清除端点1下传
323 7 CH375_WR_DAT_PORT( 0x80 );
324 7 break;
325 7 default:
326 7 break;
327 7 }
328 6 }
329 5 else
330 5 {
331 6 CH375FLAGERR=1; //不支持的清除特性,置错误标志
332 6 }
333 5 break;
334 5 //标准请求, 2
335 5 case DEF_USB_GET_STATUS: //标准请求, 获得状态
336 5 if(debug) uartPutStr("G_STATUS\n\r");
337 5 request.buffer[0]=0;
338 5 request.buffer[1]=0; //上传状态
339 5 break;
340 5 //标准请求, 3
341 5 case DEF_USB_SET_ADDRESS: //标准请求, 设置地址
342 5 VarUsbAddress=request.buffer[2]; //暂存USB主机发来的地址
343 5 break;
344 5 //标准请求, 4
345 5 case DEF_USB_GET_DESCR: //标准请求, 获得描述符
346 5 /* if(request.buffer[3]==1) //设备描述符上传
347 5 VarSetupDescr=DevDes;
348 5 else if(request.buffer[3]==2) //配置描述符上传
349 5 VarSetupDescr=ConDes;
350 5 else if(request.buffer[3]==3) {
351 5 if ( request.buffer[2]== 0 ) VarSetupDescr=LangDes;
352 5 else VarSetupDescr=SerDes; //做字符串处理
353 5 }
354 5 mCh375DesUp();*/
355 5
356 5 switch(request.buffer[3])
357 5 {
358 6 case USB_DEVICE: //设备描述苻
359 6 if(debug) uartPutStr("DEVICE\n\r");
360 6 VarSetupDescr=DevDes;
361 6 break;
362 6 case USB_CONFIGURATION: //配置描述符
363 6 if(debug) uartPutStr("CONFIG\n\r");
364 6 VarSetupDescr=ConDes;
C51 COMPILER V7.06 CH375 04/07/2006 09:06:59 PAGE 7
365 6 break;
366 6 case USB_STRING: //字符串描述符
367 6 if(debug) uartPutStr("STRING\n\r");
368 6 if(0==request.buffer[2])
369 6 VarSetupDescr=LangDes;
370 6 else
371 6 VarSetupDescr=SerDes;
372 6 break;
373 6 case USB_HID: //HID描述符
374 6 if(debug) uartPutStr("HID\n\r");
375 6 VarSetupDescr=Class_Descriptor;
376 6 break;
377 6 case USB_REPORT: //
378 6 if(debug) uartPutStr("REPORT\n\r");
379 6 VarSetupDescr=hid_report_desc_table;
380 6 break;
381 6 default:
382 6 if(debug) uartPutStr("NO_DES\n\r");
383 6 break;
384 6 }
385 5 mCh375DesUp(); //其余描述符不支持
386 5 break;
387 5 case DEF_USB_SET_FEATURE:
388 5 CH375_WR_CMD_PORT( CMD_SET_ENDP4 ); //清除端点1下传
389 5 CH375_WR_DAT_PORT( 0x80 );
390 5 break;
391 5 //标准请求, 5
392 5 case DEF_USB_GET_CONFIG: //获得配置
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -