/** * 更新好友信息数据. * @param pal 好友数据 */ void UdpData::UpdatePalInfo(PalInfo *pal) { g_free(pal->segdes); pal->segdes = progdt.FindNetSegDescription(ipv4); g_free(pal->version); if (!(pal->version = iptux_get_section_string(buf, ':', 0))) pal->version = g_strdup("?"); g_free(pal->user); if (!(pal->user = iptux_get_section_string(buf, ':', 2))) pal->user = g_strdup("???"); g_free(pal->host); if (!(pal->host = iptux_get_section_string(buf, ':', 3))) pal->host = g_strdup("???"); if (!FLAG_ISSET(pal->flags, 2)) { g_free(pal->name); if (!(pal->name = ipmsg_get_attach(buf, ':', 5))) pal->name = g_strdup(_("mysterious")); g_free(pal->group); pal->group = GetPalGroup(); g_free(pal->iconfile); if (!(pal->iconfile = GetPalIcon())) pal->iconfile = g_strdup(progdt.palicon); FLAG_CLR(pal->flags, 0); g_free(pal->encode); if ( (pal->encode = GetPalEncode())) FLAG_SET(pal->flags, 0); else pal->encode = g_strdup(encode ? encode : "utf-8"); } FLAG_SET(pal->flags, 1); pal->packetn = 0; pal->rpacketn = 0; }
void USB_Endpoint_Setup_Handler(void) { UINT16 u16Status; switch(Setup_Pkt->bRequest) { case GET_STATUS: if(FLAG_CHK(Setup_Pkt->wIndex_h,gu8HALT_EP)) u16Status=0x0100; else u16Status=0x0000; EP_IN_Transfer(EP0,(UINT8*)&u16Status,2); break; case CLEAR_FEATURE: FLAG_CLR(Setup_Pkt->wIndex_h,gu8HALT_EP); EP_IN_Transfer(EP0,0,0); break; case SET_FEATURE: FLAG_SET(Setup_Pkt->wIndex_h,gu8HALT_EP); EP_IN_Transfer(EP0,0,0); break; default: break; } }
//========================================================================= //函数名: hw_usb_endpoint_setup_handler //功 能: 当主机请求接口配置请求时,执行该函数 //参 数: 无 //返 回: 无 //========================================================================= void hw_usb_endpoint_setup_handler(void) { uint_16 u16Status; switch(Setup_Pkt->bRequest) { case GET_STATUS: if(FLAG_CHK(Setup_Pkt->wIndex_h,gu8HALT_EP)) u16Status=0x0100; else u16Status=0x0000; hw_usb_ep_in_transfer(EP0,(uint_8*)&u16Status,2); break; case CLEAR_FEATURE: FLAG_CLR(Setup_Pkt->wIndex_h,gu8HALT_EP); hw_usb_ep_in_transfer(EP0,0,0); break; case SET_FEATURE: FLAG_SET(Setup_Pkt->wIndex_h,gu8HALT_EP); hw_usb_ep_in_transfer(EP0,0,0); break; default: break; } }
void CDC_Engine(void) { //uint16 u8RecData; /* control Stage */ switch(u8CDCState) { case WAITING_FOR_ENUMERATION: /* 等待 USB 枚举 */ while(gu8USB_State != uENUMERATED) { (void)u8CDCState; }; u8CDCState = 0; break; case SET_LINE_CODING: if(FLAG_CHK(EP0, gu8USB_Flags)) { FLAG_CLR(EP0, gu8USB_Flags); (void)EP_OUT_Transfer(EP0, (uint8 *)&com_cfg); EP_IN_Transfer(EP0, 0, 0); } break; case SET_CONTROL_LINE_STATE: EP_IN_Transfer(EP0, 0, 0); break; } }
void main (void) { Display_Intro(); init_I2C(); port_config(); DISABLE_USB_5V; // Disable USB 5v (for Host support) MAX3353_ISR(); if(MAX3353_Init()) printf("\nMAX3353 not Present\n"); else printf("\nMAX3353 Present\n"); while(1) { /*** Check for changes ****/ if(FLAG_CHK(_MAX3353,gu8ISR_Flags)) { FLAG_CLR(_MAX3353,gu8ISR_Flags); if(gu8MAX3353StatusRegister & ID_GND_EVENT) { printf("\nID-GND --> Changing to HOST mode (Enabling 5V)"); gu8USB_Mode=USB_HOST_MODE_INIT; } if(gu8MAX3353StatusRegister & ID_FLOAT_EVENT) { printf("\nID-FLOAT --> Changing to DEVICE mode (Disabling 5V)"); gu8USB_Mode=USB_DEVICE_MODE_INIT; } if(gu8MAX3353StatusRegister & VBUS_HIGH_EVENT) { printf("\nVBUS is Up"); } if(gu8MAX3353StatusRegister & VBUS_LOW_EVENT) { printf("\nVBUS is Down"); if(gu8USB_Mode==USB_DEVICE_MODE) gu8USB_Mode=USB_DEVICE_MODE_INIT; //enter_vlps(); // Enter VLPS //mcg_pbe_2_pee(); // Exit VLPS // Low power } } /* USB Switch stacks */ USB_State_Machine(); } }
void USB_Setup_Handler(void) { UINT8 u8State; FLAG_CLR(0,gu8USB_Toogle_flags); switch(Setup_Pkt->bmRequestType & 0x1F) { case DEVICE_REQ: if((Setup_Pkt->bmRequestType & 0x1F)== STANDARD_REQ) { //tBDTtable[bEP0IN_ODD].Stat._byte= kUDATA1; USB_StdReq_Handler(); } tBDTtable[bEP0OUT_ODD].Stat._byte= kUDATA0; break; case INTERFACE_REQ: u8State=USB_InterfaceReq_Handler(); if(u8State==uSETUP) tBDTtable[bEP0OUT_ODD].Stat._byte= kUDATA0; else tBDTtable[bEP0OUT_ODD].Stat._byte= kUDATA1; break; case ENDPOINT_REQ: USB_Endpoint_Setup_Handler(); tBDTtable[bEP0OUT_ODD].Stat._byte= kUDATA0; break; default: USB_EP0_Stall(); break; } //USB_CTL&=!USB_CTL_TXSUSPENDTOKENBUSY_MASK; //CTL_TXSUSPEND_TOKENBUSY=0; FLAG_CLR(USB_CTL_TXSUSPENDTOKENBUSY_SHIFT,USB0_CTL); }
void CDC_Engine(void) { //UINT16 u8RecData; /* control Stage */ switch(u8CDCState) { case WAITING_FOR_ENUMERATION: /* Wait for USB Enumeration */ //while(gu8USB_State!=uENUMERATED) { (void)u8CDCState; //__RESET_WATCHDOG(); //USB_FLAGS=USB_ISTAT; //USB_ERROR_FLAGS=USB_ERRSTAT; }; //u8CDCState=0; break; case SET_LINE_CODING: if(FLAG_CHK(EP0,gu8USB_Flags)) { FLAG_CLR(EP0,gu8USB_Flags); (void)EP_OUT_Transfer(EP0,(UINT8*)&LineCoding); EP_IN_Transfer(EP0,0,0); //vfnSCI1Init(); } break; case SET_CONTROL_LINE_STATE: EP_IN_Transfer(EP0,0,0); break; } /* Data stage */ /* if(FLAG_CHK(EP_OUT,gu8USB_Flags)) { u8RecData=USB_EP_OUT_SizeCheck(EP_OUT); // Check how many bytes from the PC usbEP_Reset(EP_OUT); usbSIE_CONTROL(EP_OUT); FLAG_CLR(EP_OUT,gu8USB_Flags); EP_IN_Transfer(EP2,CDC_OUTPointer,2); u8RecData=0; } */ }
/** * 好友退出. */ void UdpData::SomeoneExit() { PalInfo *pal; /* 从好友链表中删除 */ gdk_threads_enter(); if (mwin.PaltreeContainItem(ipv4)) mwin.DelItemFromPaltree(ipv4); pthread_mutex_lock(cthrd.GetMutex()); if ( (pal = cthrd.GetPalFromList(ipv4))) { cthrd.DelPalFromList(ipv4); FLAG_CLR(pal->flags, 1); } pthread_mutex_unlock(cthrd.GetMutex()); gdk_threads_leave(); }
void main (void) { Display_Intro(); init_I2C(); port_config(); DISABLE_USB_5V; // Disable USB 5v (for Host support) if(MAX3353_Init()) printf("\nMAX3353 not Present\n"); else printf("\nMAX3353 Present\n"); MAX3353_ISR(); while(1) { in_char(); #if 0 //CW enter_vlps(); #endif //kevin //enter_stop(); mcg_pbe_2_pee(); if(FLAG_CHK(_MAX3353,gu8ISR_Flags)) { if(gu8MAX3353StatusRegister & ID_GND_EVENT) { ENABLE_USB_5V; printf("\nID-GND --> Changing to HOST mode (Enabling 5V)"); } if(gu8MAX3353StatusRegister & ID_FLOAT_EVENT) { DISABLE_USB_5V; printf("\nID-FLOAT --> Changing to DEVICE mode (Disabling 5V)"); } if(gu8MAX3353StatusRegister & VBUS_HIGH_EVENT) printf("\nVBUS is Up"); if(gu8MAX3353StatusRegister & VBUS_LOW_EVENT) printf("\nVBUS is Down"); FLAG_CLR(_MAX3353,gu8ISR_Flags); } } }
void usb_service(void) { // If data transfer arrives if(FLAG_CHK(EP_OUT,gu8USB_Flags)) { (void)USB_EP_OUT_SizeCheck(EP_OUT); usbEP_Reset(EP_OUT); usbSIE_CONTROL(EP_OUT); FLAG_CLR(EP_OUT,gu8USB_Flags); // Send it back to the PC EP_IN_Transfer(EP2,CDC_OUTPointer,1); } if (!ti_print) { ti_print = 300; sprintf((char *)gu8USB_Buffer,"\rtsi %%= %03i ", AbsolutePercentegePosition); EP_IN_Transfer(EP2,gu8USB_Buffer,15); } }
void USB_Stall_Handler(void) { if(FLAG_CHK(USB_ENDPT_EPSTALL_SHIFT,USB0_ENDPT0)) FLAG_CLR(USB_ENDPT_EPSTALL_SHIFT,USB0_ENDPT0); FLAG_SET(USB_ISTAT_STALL_SHIFT,USB0_ISTAT); }
void EP_IN_Transfer(UINT8 u8EP,UINT8 *pu8DataPointer,UINT8 u8DataSize) { UINT8 *pu8EPBuffer; UINT8 u8EPSize; UINT16 u16Lenght=0; UINT8 u8EndPointFlag; /* Adjust the buffer location */ u8EndPointFlag=u8EP; if(u8EP) u8EP=(UINT8)(u8EP<<2); u8EP+=2; /* Assign the proper EP buffer */ pu8EPBuffer=BufferPointer[u8EP]; /* Check if is a pending transfer */ if(FLAG_CHK(fIN,gu8USBClearFlags)) { pu8IN_DataPointer=pu8DataPointer; gu8IN_Counter=u8DataSize; u16Lenght=(Setup_Pkt->wLength_h<<8)+Setup_Pkt->wLength_l ; if((u16Lenght < u8DataSize) && (u8EP==2)) { gu8IN_Counter=Setup_Pkt->wLength_l; } } /* Check transfer Size */ if(gu8IN_Counter > cEP_Size[u8EP]) { u8EPSize = cEP_Size[u8EP]; gu8IN_Counter-=cEP_Size[u8EP]; FLAG_CLR(fIN,gu8USBClearFlags); } else { u8EPSize = gu8IN_Counter; gu8IN_Counter=0; FLAG_SET(fIN,gu8USBClearFlags); } /* Copy User buffer to EP buffer */ tBDTtable[u8EP].Cnt=(u8EPSize); while(u8EPSize--) *pu8EPBuffer++=*pu8IN_DataPointer++; /* USB Flags Handling */ if(FLAG_CHK(u8EndPointFlag,gu8USB_Toogle_flags)) { tBDTtable[u8EP].Stat._byte= kUDATA0; FLAG_CLR(u8EndPointFlag,gu8USB_Toogle_flags); } else { tBDTtable[u8EP].Stat._byte= kUDATA1; FLAG_SET(u8EndPointFlag,gu8USB_Toogle_flags); } }
void CDC_Engine(void) { //uint16 u8RecData; /** re-init CDC class if a VBUS HIGH event was detected */ if (FLAG_CHK(VBUS_HIGH_EVENT,gu8ISR_Flags)) { FLAG_SET(USB_CTL_USBENSOFEN_MASK,USB0_CTL); u8CDCState = WAITING_FOR_ENUMERATION; enum_msg = TRUE; CDC_Init(); FLAG_CLR(VBUS_HIGH_EVENT,gu8ISR_Flags); } /* control Stage */ switch(u8CDCState) { case WAITING_FOR_ENUMERATION: /* Wait for USB Enumeration */ while(gu8USB_State!=uENUMERATED) { (void)u8CDCState; }; if (enum_msg) { printf ("\nUSB Enumerated, check your COM ports "); enum_msg = FALSE; } u8CDCState=0; break; case SET_LINE_CODING: if(FLAG_CHK(EP0,gu8USB_Flags)) { FLAG_CLR(EP0,gu8USB_Flags); (void)EP_OUT_Transfer(EP0,(uint8*)&LineCoding); EP_IN_Transfer(EP0,0,0); //vfnSCI1Init(); } break; case SET_CONTROL_LINE_STATE: EP_IN_Transfer(EP0,0,0); break; } /* Data stage */ /* if(FLAG_CHK(EP_OUT,gu8USB_Flags)) { u8RecData=USB_EP_OUT_SizeCheck(EP_OUT); // Check how many bytes from the PC usbEP_Reset(EP_OUT); usbSIE_CONTROL(EP_OUT); FLAG_CLR(EP_OUT,gu8USB_Flags); EP_IN_Transfer(EP2,CDC_OUTPointer,2); u8RecData=0; } */ }
//========================================================================= //函数名: hw_usb_stall_handler //功 能: 处理stall中断 //参 数: 无 //返 回: 无 //========================================================================= void hw_usb_stall_handler(void) { if(FLAG_CHK(USB_ENDPT_EPSTALL_SHIFT,USB0_ENDPT0)) FLAG_CLR(USB_ENDPT_EPSTALL_SHIFT,USB0_ENDPT0); FLAG_SET(USB_ISTAT_STALL_SHIFT,USB0_ISTAT); }
//========================================================================= //函数名: hw_usb_setup_handler //功 能: 对SETUP包解包和处理 //参 数: 无 //返 回: 无 //说 明: // (1)只有接收到SETUP包才调用该函数 // (2)SETUP包中8字节数据 // bmRequestType:1 // bRequest:1 // wValue.H:1 :描述符的类型 // wValue.L:1 :描述符的索引 // wIndex:2 // wLength:2 //========================================================================= void hw_usb_setup_handler(void) { uint_8 u8State; // 从DATA0 开始传输。 FLAG_CLR(0,gu8USB_Toogle_flags); switch(Setup_Pkt->bmRequestType & 0x1F) { /* #define STANDARD_REQ 0x00 #define SPECIFIC_REQ 0x20 #define VENDORSPEC_REQ 0x40 #define DEVICE_REQ 0x00 #define INTERFACE_REQ 0x01 #define ENDPOINT_REQ 0x02 */ // #define DEVICE_REQ 0x00 case DEVICE_REQ: // 设备 if((Setup_Pkt->bmRequestType & 0x1F)== STANDARD_REQ) { //tBDTtable[bEP0IN_ODD].Stat._byte= kUDATA1; // USB 设备的标准请求 hw_usb_stdReq_handler(); } //#define kUDATA0 0x88 //#define kUDATA1 0xC8 // 把BDT 的控制权交给USB 模块 tBDTtable[bEP0OUT_ODD].Stat._byte= kUDATA0; break; // #define INTERFACE_REQ 0x01 case INTERFACE_REQ: // 接口 /* u8State=USB_InterfaceReq_Handler(); if(u8State==uSETUP) tBDTtable[bEP0OUT_ODD].Stat._byte= kUDATA0; else tBDTtable[bEP0OUT_ODD].Stat._byte= kUDATA1; */ break; // #define ENDPOINT_REQ 0x02 case ENDPOINT_REQ: // 端点 hw_usb_endpoint_setup_handler(); tBDTtable[bEP0OUT_ODD].Stat._byte= kUDATA0; break; default: hw_usb_ep0_stall(); break; } //USB_CTL&=!USB_CTL_TXSUSPENDTOKENBUSY_MASK; //CTL_TXSUSPEND_TOKENBUSY=0; // 为0 时: SIE 继续处理令牌 FLAG_CLR(USB_CTL_TXSUSPENDTOKENBUSY_SHIFT,USB0_CTL); }
//========================================================================= //函数名: hw_usb_ep_in_transfer //功 能: USB发送IN包 //参 数: u8EP:端点 // pu8DataPointer:待发数据所在缓冲区首地址 // u8DataSize:待发数据长度 //返 回: 无 //========================================================================= void hw_usb_ep_in_transfer(uint_8 u8EP,uint_8 *pu8DataPointer,uint_8 u8DataSize) { uint_8 *pu8EPBuffer; uint_8 u8EPSize; uint_16 u16Lenght=0; uint_8 u8EndPointFlag; //设置端点所对应的端点描述符 u8EndPointFlag=u8EP; if(u8EP) u8EP=(uint_8)(u8EP<<2); u8EP+=2; // 指向端点的缓冲区 pu8EPBuffer=BufferPointer[u8EP]; //检查是否可以发送数据 if(FLAG_CHK(fIN,gu8USBClearFlags)) { // 待传输的数据 pu8IN_DataPointer=pu8DataPointer; gu8IN_Counter=u8DataSize; u16Lenght=(Setup_Pkt->wLength_h<<8)+Setup_Pkt->wLength_l ; if((u16Lenght < u8DataSize) && (u8EP==2)) { gu8IN_Counter=Setup_Pkt->wLength_l; } } // 看看待发送的数据是否大于端点所能发送数据的长度。 if(gu8IN_Counter > cEP_Size[u8EP]) { u8EPSize = cEP_Size[u8EP]; gu8IN_Counter-=cEP_Size[u8EP]; FLAG_CLR(fIN,gu8USBClearFlags); } else { u8EPSize = gu8IN_Counter; gu8IN_Counter=0; FLAG_SET(fIN,gu8USBClearFlags); } // 把待发数据长度写入BDT tBDTtable[u8EP].Cnt=(u8EPSize); // 把数据拷贝到BDT 缓冲区 while(u8EPSize--) *pu8EPBuffer++=*pu8IN_DataPointer++; // gu8USB_Toogle_flags : 用Data0 和Data1 来跟USB 设备进行同步用的。 // DATA0/DATA1 交替 if(FLAG_CHK(u8EndPointFlag,gu8USB_Toogle_flags)) { // gu8USB_Toogle_flags : 表示是DATA0 还是DATA1 。1: 表示发送DATA0, 0: 表示发送DATA1. tBDTtable[u8EP].Stat._byte= kUDATA0; FLAG_CLR(u8EndPointFlag,gu8USB_Toogle_flags); } else { tBDTtable[u8EP].Stat._byte= kUDATA1; FLAG_SET(u8EndPointFlag,gu8USB_Toogle_flags); } }