STM32之USB host库:USBH_Process学习理解

更新时间:2023-06-12 08:29:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

STM32之USB host库:USBH_Process学习理解


void USBH_Process(USB_OTG_CORE_HANDLE *pdev , USBH_HOST *phost)
{
volatile USBH_Status status = USBH_FAIL;



if ((HCD_IsDeviceConnected(pdev) == 0)&& (phost->gState != HOST_IDLE)) // 若是未连接&&不空闲状态下
{
if(phost->gState != HOST_DEV_DISCONNECTED)
{
phost->gState = HOST_DEV_DISCONNECTED;
}
}

switch (phost->gState)
{

case HOST_IDLE : //空闲状态

if (HCD_IsDeviceConnected(pdev)) //如果 设备连接上了
{
phost->gState = HOST_DEV_ATTACHED; //就把状态转入 -> HOST_DEV_ATTACHED
USB_OTG_BSP_mDelay(100); //延时
}
break;

case HOST_DEV_ATTACHED : //接触状态(但是没有连接上)

phost->usr_cb->DeviceAttached(); //调用usbh_usr.c中的用户回调函数 -> USBH_USR_DeviceAttached()
phost->Control.hc_num_out = USBH_Alloc_Channel(pdev, 0x00); //给USB终端设备分配的传出通道
phost->Control.hc_num_in = USBH_Alloc_Channel(pdev, 0x80); //分配USB设备的传入通道


if ( HCD_ResetPort(pdev) == 0) //如果 检测到 复位命令
{
phost->usr_cb->ResetDevice(); //那么执行 USB复位,不是主机复位!


phost->device_prop.speed = HCD_GetCurrentSpeed(pdev); //获得当前设备的速度

phost->gState = HOST_ENUMERATION; //然后 状态转入 -> HOST_ENUMERATION
phost->usr_cb->DeviceSpeedDetected(phost->device_prop.speed); //调用用户回调函数,在LCD上显示设备速度信息


USBH_Open_Channel (pdev, //开启入口通道
phost->Control.hc_num_in,
phost->device_prop.address,
phost->device_prop.speed,
EP_TYPE_CTRL,
phost->Control.ep0size);


USBH_Open_Channel (pdev, //开启出口通道
phost->Control.hc_num_out,
phost->device_prop.address,
phost->device_prop.speed,
EP_TYPE_CTRL,
phost->Control.ep0size);
}
break;

case HOST_ENUMERATION: //枚举进程

if ( USBH_HandleEnum(pdev , phost) == USBH_OK) //如果枚举完成
{



phost->usr_cb->EnumerationDone(); //就执行用户回调,可以在显示器上显示枚举完毕信息

phost->gState = HOST_USR_INPUT; //然后转入下一个状态 -> HOST_USR_INPUT
}
break;

case HOST_USR_INPUT: //用户输入行为

if ( phost->usr_cb->UserInput() =
= USBH_USR_RESP_OK) //如果对用户输入有响应
{
if((phost->class_cb->Init(pdev, phost))\
== USBH_OK)
{
phost->gState = HOST_CLASS_REQUEST;

//然后转入下一个状态 -> HOST_CLASS_REQUEST
}
}
break;

case HOST_CLASS_REQUEST:

status = phost->class_cb->Requests(pdev, phost);

if(status == USBH_OK) //如果类请求事件完成
{
phost->gState = HOST_CLASS; //则进入下一状态 -> HOST_CLASS
}

else //否则
{
USBH_ErrorHandle(phost, status); //主机进行错误处理
}


break;
case HOST_CLASS: //主机类

status = phost->class_cb->Machine(pdev, phost);
USBH_ErrorHandle(phost, status);
break;

case HOST_CTRL_XFER:

USBH_HandleControl(pdev, phost);
break;

case HOST_SUSPENDED:
break;

case HOST_ERROR_STATE:

USBH_DeInit(pdev, phost); //重初始化
phost->usr_cb->DeInit(); //执行用户回调:重初始化
phost->class_cb->DeInit(pdev, &phost->device_prop);
break;

case HOST_DEV_DISCONNECTED :


phost->usr_cb->DeviceDisconnected(); //用户回调:在显示器上显示->设备未连接


USBH_DeInit(pdev, phost); //主机重新初始化,进入新的枚举过程
phost->usr_cb->DeInit(); //执行用户回调:重初始化
phost->class_cb->DeInit(pdev, &phost->device_prop);
USBH
_DeAllocate_AllChannel(pdev); //收回通道
phost->gState = HOST_IDLE; //主机回到初始状态 -> HOST_IDLE(空闲)

break;

default :
break;
}


本文来源:https://www.bwwdw.com/article/3tb1.html

Top