📄 host20_ap_hub.c
字号:
///////////////////////////////////////////////////////////////////////////////
//
// File name: OTGHost_AP_Hub.C
// Version: 1.0
// Date: 2004/6/08
//
// Author: Bruce
// Email:
// Phone: (03) 578-7888
// Company: Faraday Tech. Corp.
//
// ** Support: <1>.1.X Hub Emulation
// <2>.2.0 Hub Emulation
// <3>.Device under Hub Emulation
//
// **Description:
// Group-1:Main Function
// <1>.OTGH_Hub_Main
// <1.1>.Get Hub Descriptor
// Setup=0xA0,0x06,0x00,0x00,0x00,0x00,0x47,0x00
// In =47 bytes
// Ack
// <1.2>.Set Port Feature => Port Power Enable (All the port)
// Setup=0x23,0x03,0x08,0x00,0x01,0x00,0x00,0x00
// In =0 bytes
// <1.3>.???=>Clear Port Feature =>Port Connection
//
// <1.4>.Interrupt In (loop until "Port Change detect")
//
// <1.5>.OTGH_Hub_Detect_Device
// <1.6>.OTGH_HID_Emulate_Device
//
// <2>.OTGH_Hub_Detect_Device
// <2.1>.Get Status(Port)
// Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00
// In =4 bytes
// Ack
// <2.2>.Clear Feature(Port)=>Connection
// Setup=0xA3,0x01,0x10,0x00,0x0?,0x00,0x00,0x00
// In =0 bytes
// <2.3>.Set Feature (Port)=>Port Reset
// Setup=0xA3,0x03,0x04,0x00,0x0?,0x00,0x00,0x00
// In =0 bytes
// <2.4>.Get Status(Port)=>To ckeck reset complete
// Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00
// In =4 bytes
// Ack
// <2.5>.Clear Feature(Port)=>C_Port_Reset
// Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00
// <2.6>.Get Status (port) => To know the speed
//
// <3>.OTGH_Hub_Emulate_Device
//
//
///////////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "chipset.h"
#include "flib.h"
#include "Lib_Host20.h"
#include "Host20_AP.H"
#include "Host20_AP_HID.H"
#include "Host20_AP_Hub.H"
#include "Host20_AP_Camera.H"
Host20_Hub_Attach_Structure sHub;
//====================================================================
// * Function Name: OTGH_Hub_Main
// * Description:
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_Hub_Command_Build(Host20_Control_Command_Structure *pbCMD,UINT8 bmRequestType_Temp
,UINT8 bRequest_Temp,UINT16 wValue_Temp,UINT16 wIndex_Temp,UINT16 wLength_Temp)
{
UINT8 i;
UINT8 *pbTemp;
pbTemp=pbCMD;
for (i=0;i<8;i++)
*pbTemp++=0x00;
pbCMD->bmRequestType=bmRequestType_Temp;
pbCMD->bRequest=bRequest_Temp;
pbCMD->wValueLow=(UINT8)wValue_Temp;
pbCMD->wValueHigh=(UINT8)(wValue_Temp>>8);
pbCMD->wIndexLow=(UINT8)wIndex_Temp;
pbCMD->wIndexHigh=(UINT8)(wIndex_Temp>>8);
pbCMD->wLengthLow=(UINT8)wLength_Temp;
pbCMD->wLengthHigh=(UINT8)(wLength_Temp>>8);
}
//====================================================================
// * Function Name: OTGH_Hub_Int_Init
// * Description:
// * OutPut:
//====================================================================
void OTGH_Hub_Int_Init(void)
{
UINT32 i;
UINT32 wSize;
//<1>.Disable the Periodic
flib_Host20_Periodic_Setting(HOST20_Disable);
//<2>.Init qHD for Interrupt(7~9)
psHost20_qHD_List_Interrupt[0]=Host20_STRUCTURE_qHD_BASE_ADDRESS+Host20_qHD_SIZE*5;
wSize=sAttachDevice.saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeHighByte;
wSize=((wSize<<8)+sAttachDevice.saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeLowByte);
flib_Host20_Allocate_QHD(psHost20_qHD_List_Interrupt[0],HOST20_HD_Type_QH
,sAttachDevice.bAdd,0,1,wSize);//Address,Head=0,EndPt=1,Size
psHost20_qHD_List_Interrupt[0]->bTerminate=1;
psHost20_qHD_List_Interrupt[0]->bHighBandwidth=1;
psHost20_qHD_List_Interrupt[0]->bEdSpeed=sAttachDevice.bSpeed;
//<3>.Set Periodic Base Address
mwHost20_PeriodicBaseAddr_Set(Host20_STRUCTURE_Preiodic_Frame_List_BASE_ADDRESS);
//<4>.Update qHD (<1>.Fill S-Mask to 1 <2>.Max Size)
psHost20_qHD_List_Interrupt[0]->bInterruptScheduleMask=1;
//<5>.Disable all the Frame List (Terminal=1) & Link the qHD1 to Frame List
for (i=0;i<Host20_Preiodic_Frame_List_MAX;i++)
psHost20_FramList->sCell[i].bTerminal=1;
for (i=0;i<Host20_Preiodic_Frame_List_MAX;i=i+0x100)
{psHost20_FramList->sCell[i].bLinkPointer=(UINT32)(psHost20_qHD_List_Interrupt[0])>>5;
psHost20_FramList->sCell[i].bType=HOST20_HD_Type_QH;
psHost20_FramList->sCell[i].bTerminal=0;
}
//<6>.Enable the periodic
flib_Host20_Periodic_Setting(HOST20_Enable);
}
//====================================================================
// * Function Name: OTGH_Hub_Port_Change_Detect
// * Description:
// * Input: none
// * OutPut: none
//====================================================================
UINT8 OTGH_Hub_Port_Change_Detect(void)
{
UINT8 *pbBuffer4K_1;
Host20_BufferPointerArray_Structure aTemp;
UINT8 bReturn;
//<1>.Init Interrupt for Hub
OTGH_Hub_Int_Init();//Init the qhd
//<2>.Init Buffer
pbBuffer4K_1=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
aTemp.BufferPointerArray[0]=pbBuffer4K_1;
aTemp.BufferPointerArray[1]=0;
aTemp.BufferPointerArray[2]=0;
aTemp.BufferPointerArray[3]=0;
aTemp.BufferPointerArray[4]=0;
//<3>.Issue Interrupt
if (sAttachDevice.bConnectStatus>0)
{
printf(">>> Get the Port Change Event...\n");
flib_Host20_Issue_Interrupt(0,1,&(aTemp.BufferPointerArray[0])//bArrayListNum,hwSize,*pwBufferArray
,0,OTGH_Dir_IN);//wOffset,bDirection
}
bReturn=*pbBuffer4K_1;
printf(">>> Port Change Event = 0x%x\n",bReturn);
//<4>.free memory
flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,pbBuffer4K_1);
//<5>.Disable Periodic
flib_Host20_Periodic_Setting(HOST20_Disable);
return(bReturn);
}
//====================================================================
// * Function Name: OTGH_Hub_GetStatus
// * Description:
// * Input:
// * OutPut:
//====================================================================
void OTGH_Hub_GetStatus(UINT8 bPortNumber,UINT8 Mode,UINT8 *pbData)
{
Host20_Control_Command_Structure bCMD;
OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_In|Mode)
,HOST20_HUB_Request_GetStatus,0x00,(bPortNumber+1),0x04);
flib_Host20_Issue_Control_ByMode (1,&bCMD,0x04 //bEdNum,UINT8* pbCmd,hwDataSize
,pbData,0);//UINT8* pbData,UINT8 bModeSelect
printf(">>> Port GetStatus:0x%x, 0x%x, 0x%x, 0x%x \n",pbData[0],pbData[1],pbData[2],pbData[3]);
}
//====================================================================
// * Function Name: OTGH_Hub_ClearFeature
// * Description:
// * Input:
// * OutPut:
//====================================================================
void OTGH_Hub_ClearFeature(UINT8 bPortNumber,UINT8 Mode,UINT8 bFeatureSelector)
{
Host20_Control_Command_Structure bCMD;
UINT8 bDumyBuffer[2];
OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_Out|Mode)
,HOST20_HUB_Request_ClearFeature,bFeatureSelector,(bPortNumber+1),0x00);
flib_Host20_Issue_Control_ByMode (1,&bCMD,0x00 //bEdNum,UINT8* pbCmd,hwDataSize
,bDumyBuffer,1);//UINT8* pbData,UINT8 bModeSelect
printf(">>> Clear Feature Finish(0x%x) \n",bFeatureSelector);
}
//====================================================================
// * Function Name: OTGH_Hub_SetFeature
// * Description:
// * Input:
// * OutPut:
//====================================================================
void OTGH_Hub_SetFeature(UINT8 bPortNumber,UINT8 Mode,UINT8 bFeatureSelector)
{
Host20_Control_Command_Structure bCMD;
UINT8 bDumyBuffer[2];
OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_Out|Mode)
,HOST20_HUB_Request_SetFeature,bFeatureSelector,(bPortNumber+1),0x00);
flib_Host20_Issue_Control_ByMode (1,&bCMD,0x00 //bEdNum,UINT8* pbCmd,hwDataSize
,bDumyBuffer,1);//UINT8* pbData,UINT8 bModeSelect
printf(">>> Set Feature Finish(0x%x)... \n",bFeatureSelector);
}
//====================================================================
// * Function Name: OTGH_Hub_Init_Device
// * Description:
// * Input:
// * OutPut:
//====================================================================
void OTGH_Hub_Init_Device(UINT8 bPortNumber)
{
Host20_Hub_Port_Status_Structure bStatus;
//<2.1>.Get Status(Port)
// Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00
// In =4 bytes
// Ack
OTGH_Hub_GetStatus(bPortNumber,HOST20_HUB_RequestType_About_Port,&(bStatus));//bPortNumber,Mode, *pbData
if (bStatus.bSts_CurrentConnect==0)
{
printf("??? Connect Error...");
while(1);
}
//<2.2>.Clear Feature(Port)=>Connection
// Setup=0xA3,0x01,0x10,0x00,0x0?,0x00,0x00,0x00
// In =0 bytes
if (bStatus.bChg_Connect)
{
printf(">>> ClearFeature (port) =>Connection \n");
OTGH_Hub_ClearFeature(bPortNumber,HOST20_HUB_RequestType_About_Port
,HOST20_HUB_FEATURE_C_PORT_CONNECTION);
}
//<2.3>.Set Feature (Port)=>Port Reset
// Setup=0xA3,0x03,0x04,0x00,0x0?,0x00,0x00,0x00
// In =0 bytes
printf(">>> SetFeature (port) =>Port Reset \n");
OTGH_Hub_SetFeature(bPortNumber,HOST20_HUB_RequestType_About_Port
,HOST20_HUB_FEATURE_PORT_RESET);
//<2.4>.Get Status(Port)=>To ckeck reset complete
// Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00
// In =4 bytes
// Ack
//????????=>Delay time
flib_Host20_TimerEnable(50);
OTGH_Hub_GetStatus(bPortNumber,HOST20_HUB_RequestType_About_Port,&(bStatus));//bPortNumber,Mode, *pbData
if (bStatus.bChg_ResetComplete)
{
printf(">>> Reset Complete...\n");
//<2.5>.Clear Feature(Port)=>C_Port_Reset
// Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00
printf(">>> ClearFeature (port) =>Reset Complete \n");
OTGH_Hub_ClearFeature(bPortNumber,HOST20_HUB_RequestType_About_Port
,HOST20_HUB_FEATURE_C_PORT_RESET);
}
//<2.6>.Get Status (port) => To know the speed
OTGH_Hub_GetStatus(bPortNumber,HOST20_HUB_RequestType_About_Port,&bStatus);//bPortNumber,Mode, *pbData
if (bStatus.bSts_LowSpeedAttached)
{printf(">>> Low Speed Device attach to Hub...\n");
sHub.bDeviceAOnHub[bPortNumber].bSpeed=0x01;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -