📄 usbdrv.c
字号:
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 + -