⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbdrv.c

📁 中兴单片机COS系统
💻 C
📖 第 1 页 / 共 2 页
字号:
  usb_info.type = 0;  usb_info.total_len = 0;  usb_info.cur_len = 0;  usb_info.count = 0;}/* usb initialize function ,if you will use usb module, you must call this function    in your main function   INPUT:      none;    OUTPUT:      none;   RETURN:      none; */void usb_initialize(){  //disable interrupt  dis_interrupt();  //init device control registers  set_udc_devcrs(UDC_FULL_SPEED, UDC_REMOTE_WAKEUP_ENB, UDC_BUS_POWERED,                 0, 0x7f, 0xfffefffe);   //init ep control registers		   set_udc_epcrs();  //init epinfo registers  set_udc_infors();  //clear ep1 ep2 status  clr_ep_sts(UDC_DIR_OUT, 2, UDC_EP_STS_OUT);  clr_ep_sts(UDC_DIR_IN, 1, UDC_EP_STS_IN);  //clear Endpoints int flag  udc_set_reg (UDC_EPIntr, 0xffffffff);  //install a irq handler for usb interrupt  setvbr(TP_INT | INTC_UDC, usb_int_handler);  // clear int mask bit   clr_imask_bit(INTC_UDC);  init_usb_info_struct();  //enable interrupt  enb_interrupt();  //init_gpio_led();  }/* usb fifo write   fifo register only supports word-wide;   INPUT:         * buffer : buffer to be send ;	 * pkt_sz : packet size;	 * epnum  : endpoint num;    OUTPUT:         none;   RETURN:         none; */void usb_fifo_out(unsigned char * buffer,unsigned pkt_sz, unsigned epnum){  unsigned int counter, fifo_addr = UDC_InFifo;  unsigned int quad_pkts, nquad_pkts,*ibuf;  unsigned int i=0;  /*if epnum==1 , get ep1 fifo address*/  if (epnum == 1)   	fifo_addr += i_l32(UDC_EP0InBufSize, 0) * 4;  /*if will send a null packet */       if (pkt_sz == 0 )    {      /*write zerolen register*/      udc_set_reg(UDC_WRZeroLen, 0);      /*write any data to fifo*/      udc_set_reg(fifo_addr, 0);     /*confirm send */      udc_set_reg(UDC_WRCNFRM,0);      return;    }  /*===================start put the data into fifo ===============*/      ibuf=(unsigned int *) buffer;  quad_pkts = (pkt_sz >> 2);  nquad_pkts = (pkt_sz & 3);  for (counter = 0; counter < quad_pkts; counter++)    {     i_s32(ibuf[counter], fifo_addr, 0);     i+=4;    }  for (counter = 0; counter < nquad_pkts; counter++)    {      i_s8(buffer[i],fifo_addr, 0);      i++;    }  /*===================end put the data into fifo ===============*/       /*confirm send */  udc_set_reg(UDC_WRCNFRM, 0);}/* usb fifo read   fifo register only supports word-wide;   INPUT:	 * pkt_sz : packet size;	 * epnum  : endpoint num;    OUTPUT:         * buffer : output buffer;   RETURN:         none;  */     void usb_fifo_in( unsigned char *buffer, unsigned pkt_sz,unsigned ep_num){  unsigned int *p = (unsigned int *) buffer;  unsigned int quad_pkts, nquad_pkts, counter;  /*if will receive a null packet */   if (pkt_sz == 0)    {      /*write a data to confirm register */      i_l32(UDC_WRCNFRM, 0);      return;    }    /*================start read data from fifo===============*/  quad_pkts = (pkt_sz >>2);  nquad_pkts = (pkt_sz & 3);  for (counter = 0; counter < quad_pkts; counter++, p++)    *p = i_l32(UDC_OutFifo, 0);  if (nquad_pkts)    *p = i_l32(UDC_OutFifo, 0);  /*================end read data from fifo===============*/}/* receive a packet from usb  : query mode    INPUT:         none;   OUTPUT:         * buf : output buffer;   RETURN:         none; */int usb_receive(char *buf){  unsigned pkt_sz=0,status=0,i=0,count=0;  char tempbuf[65];  do   {     status = get_ep_sts (UDC_DIR_OUT, 2);   }  while (!(status & UDC_EP_STS_OUT));      pkt_sz = get_pkt_sz(2);  usb_fifo_in((unsigned char *)tempbuf,pkt_sz,2);  udc_set_reg (UDC_EPIntr, 0xffff0000);  clr_ep_sts(UDC_DIR_OUT, 2, UDC_EP_STS_OUT);  for(i=0;i<pkt_sz;i++)  {   if((i&3)!=3)     {       *buf++=tempbuf[i];      count++;     }  }  return count;}/* send out a packet  : query mode    INPUT:         * buf : input buffer;   OUTPUT:         none;   RETURN:         none; */int usb_send(char *buf,unsigned len){    unsigned pkt_sz=0,status=0;    unsigned long count=0;    do    {     status = get_ep_sts (UDC_DIR_IN, 1);    }   while (!(status & UDC_EP_STS_IN));   if(len>64)     len=64;        usb_fifo_out(buf,len,1);   clr_ep_sts(UDC_DIR_IN, 1, UDC_EP_STS_IN);   udc_set_reg (UDC_EPIntr, 0x0ffff);   return len;}/*============================USER DEFINE===========================*//* receive packet using user's protocol    INPUT:         none;    OUTPUT:         * kcw_p : user define protocol header (command)	 * buf   : output buffer   RETURN:         len :received length; */int usb_receivepack(Ukey_KCW *kcw_p,char *buf){  unsigned char out_pack,i;  unsigned receive_count=0 ,len=0,all_pkt=0,mod_pkt=0,count=0;  //print_string("receive kcw packet!");      usb_receive((char *)kcw_p);  if(kcw_p->dKCWSignature!=KCW_SIGN|| kcw_p->dKCWOutLength==0)  	return(0);  len=kcw_p->dKCWOutLength;  /*=================new add ==========*/  all_pkt=len/3;  mod_pkt=len%3;  all_pkt*=4;  len=all_pkt+mod_pkt;  out_pack =len>>6;  len&=0x3f;  /**************************************/  if(len>0)    out_pack++;  //print_string("receive data packet!");      for(i=0;i<out_pack;i++)    {      count =usb_receive(buf);	     receive_count+=count;     buf+=count;    }  //print_string("receive buf end");      return(receive_count);}/* send packet using user's protocol    INPUT:         * ksw_p : user define protocol header (return)	 * buf   : input buffer   OUTPUT:         none;    RETURN:         len :sent length ; */int usb_sendpack(Ukey_KSW *ksw_p,char *buf,unsigned short len){        unsigned short mylen;	short length=len,sendlen=0;	mylen=0;		if(length>0)	{	  while(length>0)           {     	         if(length>64)                 	sendlen=64;                 else                       sendlen=length;			 usb_send(buf+mylen,sendlen);		 length-=sendlen;			 mylen+=sendlen;           }		 	    	}    usb_send((char *)ksw_p,16);	return mylen;	}/*============================USER DEFINE===========================*//*=========================Speed Test DEFINE========================*//******************* mask for test usbvoid usb_speed_receive(char *buf){  unsigned pkt_sz=0,status=0;    do       {        status = get_ep_sts (UDC_DIR_OUT, 2);       }   while (!(status & UDC_EP_STS_OUT));   pkt_sz = get_pkt_sz(2);   usb_fifo_in((unsigned char *)buf,pkt_sz,2);   udc_set_reg (UDC_EPIntr, 0xffff0000);   clr_ep_sts(UDC_DIR_OUT, 2, UDC_EP_STS_OUT);   //return pkt_sz;    }void usb_speed_send(char *buf,unsigned len)   {   unsigned status=0;   do   {    status = get_ep_sts (UDC_DIR_IN, 1);   }   while (!(status & UDC_EP_STS_IN));   usb_fifo_out(buf,len,1);   clr_ep_sts(UDC_DIR_IN, 1, UDC_EP_STS_IN);   udc_set_reg (UDC_EPIntr, 0x0ffff);   //return len;   }void usb_speed_receivepack(char *buf, int len){ unsigned char out_pack,i; out_pack = len>>6; for(i=0;i<out_pack;i++) usb_speed_receive(buf+i*64); }	void usb_speed_sendpack(char *buf, int len) {  unsigned short out_pack,i;  out_pack = len>>6;  for(i=0;i<out_pack;i++)  usb_speed_send(buf+i*64,64);}*/void usb_speed_receive(char *buf){  unsigned pkt_sz=0,status=0;    do       {        status = get_ep_sts (UDC_DIR_OUT, 2);       }   while (!(status & UDC_EP_STS_OUT));   pkt_sz = get_pkt_sz(2);   usb_fifo_in((unsigned char *)buf,pkt_sz,2);   udc_set_reg (UDC_EPIntr, 0xffff0000);   clr_ep_sts(UDC_DIR_OUT, 2, UDC_EP_STS_OUT);   //return pkt_sz;    }void usb_speed_send(char *buf,unsigned len)   {   unsigned status=0;   do   {    status = get_ep_sts (UDC_DIR_IN, 1);   }   while (!(status & UDC_EP_STS_IN));   usb_fifo_out(buf,len,1);   clr_ep_sts(UDC_DIR_IN, 1, UDC_EP_STS_IN);   udc_set_reg (UDC_EPIntr, 0x0ffff);   //return len;   }void usb_speed_receivepack(char *buf, int len){ unsigned char out_pack,i; out_pack = len>>6; for(i=0;i<out_pack;i++) usb_speed_receive(buf+i*64); }	void usb_speed_sendpack(char *buf, int len) {  unsigned short out_pack,i;  out_pack = len>>6;  for(i=0;i<out_pack;i++)  usb_speed_send(buf+i*64,64);}																																						   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -