Пример #1
0
/**
 * 更新好友信息数据.
 * @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;
}
Пример #2
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;
    }
}
Пример #3
0
//=========================================================================
//函数名: 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;
    }
}
Пример #4
0
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;

    }
}
Пример #5
0
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();

      

    } 
}
Пример #6
0
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);
}
Пример #7
0
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;
        }
*/
}
Пример #8
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();
}
Пример #9
0
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);
        }
    } 
}
Пример #10
0
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);
    }
}
Пример #11
0
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);
}
Пример #12
0
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);
    }

}
Пример #13
0
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;
        }
*/
}
Пример #14
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);
}
Пример #15
0
//=========================================================================
//函数名: 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);
}
Пример #16
0
//=========================================================================
//函数名: 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);
    }
}