?? udc.bk
字號:
}else BusNotify(handle,UDC_HIGHSPEED,0,0); // enable USB Suspend interrupt byte = jz_readb(USB_REG_INTRUSBE); jz_writeb(USB_REG_INTRUSBE,byte | USB_INTR_SUSPEND); BusNotify(handle,UDC_RESET,0,0); } if(val & USB_INTR_SUSPEND) { BusNotify(handle,UDC_SUSPEND,0,0); byte = jz_readb(USB_REG_INTRUSBE); jz_writeb(USB_REG_INTRUSBE,(byte & (~USB_INTR_SUSPEND) & 7)); printf("udc suspend %x\n",byte);#ifdef USE_MIDWARE if ( protocool_stat == CABLE_CONNECTED ) { printf("USB uninstall ! %d \n",protocool_stat); udcsrc.Src = SRC_UDC; udcsrc.Event = EVENT_UNINSTALL; protocool_stat = CABLE_DISCONNECT; OSQPost(udcsrc.CurEvent1 , (void *)&udcid); OSSemPost(udcsrc.CurEvent); OSSemPend(udcsrc.CurEvent2, 0 , &err); OSTimeDly(350); if ( check_gpio(GPIO_UDC_DETE) ) //cable have not disconnect { printf("Reas power cable insert! \n"); udcsrc.Src = SRC_UDC; udcsrc.Event = EVENT_POWER_IN; OSQPost(udcsrc.CurEvent1 , (void *)&udcid); OSSemPost(udcsrc.CurEvent); OSSemPend(udcsrc.CurEvent2, 0 , &err); } } else jz_writeb(USB_REG_POWER,0x60); //High speed #endif } if(val & 2) { printf("udc resume\n"); } }void udc4740Proc (unsigned int handle){ u8 IntrUSB = 0; u16 IntrIn = 0; u16 IntrOut = 0; u16 IntrDMA = 0; PEPSTATE pep; cli();/* Read interrupt regiters */ IntrUSB = jz_readb(USB_REG_INTRUSB);/* Check for resume from suspend mode */ if(IntrUSB != 8) udcIntrbhandle(handle,IntrUSB); /* Check for endpoint 0 interrupt */ IntrIn = jz_readw(USB_REG_INTRIN);// if(jz_readw(USB_REG_INTROUTE)) IntrOut = jz_readw(USB_REG_INTROUT); //printf("IntrIn = %x IntrOut = %x\n",IntrIn,IntrOut); if (IntrIn & USB_INTR_EP0) { //dprintf("\nUDC EP0 operations!\n"); EP0_Handler(handle); } pep = GetEpState(1); if(pep->state == CPU_WRITE) { if (IntrIn & 2) { dprintf("\nUDC EP1 IN operation!"); EPIN_Handler(handle,pep); //return; } } IntrDMA = jz_readb(USB_REG_INTR); //printf("IntrDMA = %x\n",IntrDMA); if(pep->state == DMA_WRITE) { dprintf("dma write intr = %x\n",IntrDMA); if(IntrDMA & 1) { dprintf("addr %x,count %x,cntl %x\r\n", jz_readl(USB_REG_ADDR1),jz_readl(USB_REG_COUNT1),jz_readl(USB_REG_CNTL1)); DMA_SendData_Finish(); if(pep->curlen != pep->totallen) { /*??????????????*/ printf("cur_len %d,totallen %d\r\n",pep->curlen,pep->totallen); usb_setw(USB_REG_INTRINE,EP1_INTR_BIT); // open ep1 in intr pep->state = CPU_WRITE; EPIN_Handler(handle,pep); //jz_writeb(USB_REG_INDEX, 1); //usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY); }else { pep->state = WRITE_FINISH; usb_clearw(USB_REG_INTRINE,EP1_INTR_BIT); // close ep1 in intr BusNotify(handle,UDC_PROTAL_SEND_FINISH, (unsigned char *)(pep->data_addr),pep->curlen); } //return; } } pep = GetEpState(2); if(pep->state == CPU_READ) { if ((IntrOut /*& IntrOutMask*/ ) & 2) { dprintf("UDC EP1 OUT operation!\n"); EPOUT_Handler(handle,pep); //return; } } if(pep->state == DMA_READ) { if(IntrDMA == 0) IntrDMA = jz_readb(USB_REG_INTR); dprintf("\nDMA_REA intrDMA = %x\n",IntrDMA); if (IntrDMA & 0x2) //channel 2 :OUT { dprintf("\n INTR 2!"); DMA_ReceieveData_Finish(); if((pep->totallen % pep->fifosize) != 0) { usb_setw(USB_REG_INTROUTE,EP1_INTR_BIT); //Enable Ep Out pep->state = CPU_READ; EPOUT_Handler(handle,pep); }else { pep->state = READ_FINISH; BusNotify(handle,UDC_PROTAL_RECEIVE_FINISH, (unsigned char *)(pep->data_addr),pep->curlen); } //return; } } sti(); //dprintf("\n UDCProc finish!\n"); //return;}void GPIO_Handle(unsigned int arg){ //__gpio_ack_irq(GPIO_UDC_DETE); __gpio_mask_irq(GPIO_UDC_DETE); udc_irq_type |= 0x10; OSSemPost(udcEvent);}void EnableDevice(unsigned int handle);static void GPIO_IST(void * arg){ PUDC_BUS pBus = (PUDC_BUS) arg; unsigned int stat = 0; unsigned int gpio_state = 0; unsigned int count = 0; static unsigned int judge = 0, i; u8 byte1 , byte2 ,err; dprintf("\n GPIO IRQ!!"); if ( cable_stat == CABLE_CONNECTED ) //connected! { OSTimeDly(100); if ( check_gpio(GPIO_UDC_DETE) ) //false disconnect return ; if ( protocool_stat == CABLE_CONNECTED ) //info suspend { printf("cable USE uninstall ! \n"); udcsrc.Src = SRC_UDC; udcsrc.Event = EVENT_UNINSTALL; protocool_stat = CABLE_DISCONNECT; OSQPost(udcsrc.CurEvent1 , (void *)&udcid); OSSemPost(udcsrc.CurEvent); OSSemPend(udcsrc.CurEvent2, 0 ,&err); } //Do disabledevice cable_stat = CABLE_DISCONNECT; udcsrc.Src = SRC_UDC; udcsrc.Event = EVENT_POWER_OUT; OSQPost(udcsrc.CurEvent1 , (void *)&udcid); OSSemPost(udcsrc.CurEvent); OSSemPend(udcsrc.CurEvent2, 0 ,&err); BusNotify((unsigned int)pBus,UDC_REMOVE,0,0); DisableDevice(0); __gpio_as_irq_rise_edge(GPIO_UDC_DETE); } else //disconnect! {// OSTimeDly(50); if ( !check_gpio(GPIO_UDC_DETE) ) //false connect return ; //for test USB or POWER cable!! EnableDevice(0); for ( i = 0; i <= MAX_CABLE_DETE; i ++) { //sleep wait a while! OSTimeDly(CABLE_DETE_TIME/10); byte1 = jz_readb(USB_REG_POWER); byte2 = jz_readb(USB_REG_INTRUSB); if ( ( byte1 & 0x08 )|| ( byte2 & 0x04 ) ) //reset occur! break; else printf("Wait reset time out! \n"); }// DisableDevice(0); cable_stat = CABLE_CONNECTED; __gpio_as_irq_fall_edge(GPIO_UDC_DETE); if ( i > MAX_CABLE_DETE ) //power cable! { printf("Power cable insert! \n"); udcsrc.Src = SRC_UDC; udcsrc.Event = EVENT_POWER_IN; OSQPost(udcsrc.CurEvent1 , (void *)&udcid); OSSemPost(udcsrc.CurEvent); OSSemPend(udcsrc.CurEvent2, 0 ,&err); return ; } else //usb cable!! { udcsrc.Src = SRC_UDC; udcsrc.Event = EVENT_USB_IN; OSQPost(udcsrc.CurEvent1 , (void *)&udcid); OSSemPost(udcsrc.CurEvent); printf("USB cable insert! \n"); OSSemPend(udcsrc.CurEvent2 , 0, &err); printf("read val %d \n",res.Val); if ( res.Val == 1 ) //|| res.Val == 0xffff) //up layer said yes! {// protocool_stat = CABLE_CONNECTED; BusNotify((unsigned int)pBus,UDC_JUDGE,0,0); } else //up layer said no! { printf("dddddddddddddddd \n"); DisableDevice(0); protocool_stat = CABLE_DISCONNECT; printf("As power cable insert! \n"); } } } }void GPIO_IRQ_init(PUDC_BUS pBus){ int err = 0; __gpio_as_irq_rise_edge(GPIO_UDC_DETE); request_irq(IRQ_GPIO_UDC_DETE, GPIO_Handle, pBus); __gpio_disable_pull(GPIO_UDC_DETE); REG_CPM_SCR &= ~CPM_SCR_USBPHY_ENABLE; //disable UDC_PHY jz_writeb(USB_REG_POWER,0x60); //High speed }static void udcIntrHandler(unsigned int arg){ __intc_mask_irq(IRQ_UDC); udc_irq_type |= 0x1; //dprintf("UDC irq\r\n"); OSSemPost(udcEvent);}static void udcTaskEntry(void *arg){ u8 err; while (1) { OSSemPend(udcEvent, 0, &err); dprintf("udc_irq_type = %x\r\n",udc_irq_type); if(udc_irq_type & 0x10) { GPIO_IST(arg); udc_irq_type &= ~0x10; __gpio_unmask_irq(GPIO_UDC_DETE); } if(udc_irq_type & 1) { udc4740Proc((unsigned int)arg); udc_irq_type &= ~0x1; __intc_unmask_irq(IRQ_UDC); } }}/* interface */static void SetAddress(unsigned int handle,unsigned short value){ dprintf("Set address %d\r\n",value);#if 1 protocool_stat = CABLE_CONNECTED;#endif jz_writeb(USB_REG_FADDR,value);}void EnableDevice(unsigned int handle){ __cpm_start_udc(); REG_CPM_SCR |= CPM_SCR_USBPHY_ENABLE; jz_writeb(USB_REG_POWER,0x60); //enable sofeconnect __intc_unmask_irq(IRQ_UDC); printf("Enable USB Phy!\r\n"); }static void DisableDevice(unsigned int handle){ u8 err; REG_CPM_SCR &= ~CPM_SCR_USBPHY_ENABLE;// jz_writeb(USB_REG_POWER,0x00); //disable sofeconnet! jz_readb(USB_REG_INTRUSB); jz_readw(USB_REG_INTRIN); jz_readw(USB_REG_INTROUT); udc_irq_type = 0; OSSemSet(udcEvent,0,&err); __intc_ack_irq(IRQ_UDC); __cpm_stop_udc(); __intc_mask_irq(IRQ_UDC); printf("Disable USB Phy!\r\n");}void StartTransfer(unsigned int handle,unsigned char ep,unsigned char *buf,unsigned int len){ PEPSTATE pep; dprintf("StartTransfer ep = %x buf:%08x len = %d\r\n",ep,buf,len); unsigned char state; switch(ep) { case 0: pep = GetEpState(0); pep->totallen = len; pep->curlen = 0; pep->data_addr = (unsigned int)buf; pep->state = CPU_WRITE; break; case 0x81: pep = GetEpState(1); pep->totallen = len; pep->curlen = 0; pep->data_addr = (unsigned int)buf; usb_setw(USB_REG_INTRINE,EP1_INTR_BIT); //open ep1 in intr if(len < pep->fifosize) { pep->state = CPU_WRITE; jz_writeb(USB_REG_INDEX,1); state = jz_readw(USB_REG_INCSR); if(!(state & EP_FIFO_NOEMPTY)) { len = len > pep->fifosize ? pep->fifosize :len; udcWriteFifo(pep,len); usb_setw(USB_REG_INCSR, USB_INCSR_INPKTRDY); } } else { jz_writeb(USB_REG_INDEX,1); state = jz_readw(USB_REG_INCSR); pep->state = DMA_WRITE; if(!(state & EP_FIFO_NOEMPTY)) DMA_SendData(pep); } break; case 0x1: pep = GetEpState(2); pep->totallen = len; pep->curlen = 0; pep->data_addr = (unsigned int)buf; if(len < pep->fifosize) { pep->state = CPU_READ; usb_setw(USB_REG_INTROUTE,EP1_INTR_BIT); //Enable Ep Out } else { pep->state = DMA_READ; DMA_ReceiveData(pep); } break; case 0xff: //mean send stall!// printf("Send Stall! %x \n",jz_readw(USB_REG_INCSR)); usb_setw( USB_REG_INCSR, 0x10); //set stall while( ! (jz_readw(USB_REG_INCSR) & 0x20 ) ); //wait stall sent! usb_setw( USB_REG_INCSR, 0x60); //clear datatag! usb_clearw( USB_REG_INCSR, 0x10); //clear sendstall usb_clearw( USB_REG_INCSR, 0x20); //clear sentstall// printf("Clear stall! %x \n",jz_readw(USB_REG_INCSR)); break; }}void InitEndpointSuppost(unsigned int handle,unsigned char *ep,USB_ENDPOINT_TYPE ep_type,unsigned short *ep_max_pkg){ PEPSTATE pep; if(ep_type == ENDPOINT_TYPE_CONTROL) { *ep = 0; *ep_max_pkg = MAX_EP0_SIZE; } if(ep_type == ENDPOINT_TYPE_BULK) { if(*ep & 0x80) pep = GetEpState(1); else pep = GetEpState(2); *ep = pep->ep; *ep_max_pkg = pep->fifosize; }// printf("ep = %x ep_type = %x epmax = %x\r\n",*ep,ep_type,pep->fifosize); }#ifdef USE_MIDWAREstatic void GetRequest(MIDSRCDTA *dat){ dat->Val = res.Val;// printf("Up layer get :%d \n",res.Val);}static void Response(MIDSRCDTA *dat){ res.Val = dat->Val; printf("Up layer said :%d \n",res.Val);}#endifvoid InitUDC(PUDC_BUS pBus){ pBus->EnableDevice = EnableDevice; pBus->SetAddress = SetAddress; pBus->StartTransfer = StartTransfer; pBus->InitEndpointSuppost = InitEndpointSuppost; pBus->DisableDevice = DisableDevice; printf("Init UDC %s %s\n",__DATE__,__TIME__);#ifdef USE_MIDWARE udcsrc.GetRequest = GetRequest; udcsrc.Response = Response; udcsrc.Name = "UDC"; printf("Register Midware SRC udc! \n"); RegisterMidSrc((PMIDSRC)&udcsrc); udcid = udcsrc.ID;// res.Val = 0xffff; cable_stat = CABLE_DISCONNECT; protocool_stat = CABLE_DISCONNECT;#endif dprintf("Init UDC\n"); USB_Version=USB_HS; __intc_mask_irq(IRQ_UDC); __gpio_mask_irq(GPIO_UDC_DETE); udcEvent = OSSemCreate(0); dprintf("UDC with DMA reset!!\r\n"); request_irq(IRQ_UDC, udcIntrHandler, 0); GPIO_IRQ_init(pBus); udc_reset((unsigned int)pBus); dprintf("UDC with DMA reset finish!!\r\n"); dprintf("Create UDC Task!!\r\n"); OSTaskCreate(udcTaskEntry, (void *)pBus, (void *)&udcTaskStack[UDC_TASK_STK_SIZE - 1], UDC_TASK_PRIO); local_pBus = pBus;// __gpio_unmask_irq(GPIO_UDC_DETE);// __intc_unmask_irq(IRQ_UDC);#if 1 if ( __gpio_get_pin(GPIO_UDC_DETE) == 1 ) { __gpio_mask_irq(GPIO_UDC_DETE); udc_irq_type |= 0x10; OSSemPost(udcEvent); }#endif}int UDC_DetectStatus(void){ if ( protocool_stat == CABLE_CONNECTED ) return 0; else return 1;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -