目录

1.USB数据结构

2.USB设备启动流程和工作方式

(1).通过ID查找USB配置信息UsbConfigPtr

(2).将USB配置信息UsbConfigPtr挂接到XUsbPS对象实例UsbInstance上去

(3).创建USB的中断函数

(4).初始化USB设备配置信息DeviceConfig并将USB设备配置信息DeviceConfig挂接到XUsbPS对象实例UsbInstance上去

(5).注册用户中断,用户可以任意设定

(6).设置端点中断入口

(7).启动USB

(8).启动后


1.USB数据结构

    static XUsbPs UsbInstance;    /* The instance of the USB Controller */XUsbPs_Config        *UsbConfigPtr;XUsbPs_DeviceConfig    DeviceConfig;  

2.USB设备启动流程和工作方式

(1)通过ID查找USB配置信息UsbConfigPtr

    UsbConfigPtr = XUsbPs_LookupConfig(UsbDeviceId);if (NULL == UsbConfigPtr) {goto out;}

(2)将USB配置信息UsbConfigPtr挂接到XUsbPS对象实例UsbInstance上去

 Status = XUsbPs_CfgInitialize(UsbInstancePtr,UsbConfigPtr,UsbConfigPtr->BaseAddress);if (XST_SUCCESS != Status) {goto out;}

(3)创建USB的中断函数

XusbPs_IntrHandler为XUsbPS对象中断的第1级入口,以后所有的回调函数都是通过次函数分发出去的

 Status = UsbSetupIntrSystem(IntcInstancePtr,UsbInstancePtr,UsbIntrId);if (XST_SUCCESS != Status){goto out;}
进入函数-->Status = XScuGic_Connect(IntcInstancePtr, UsbIntrId,(Xil_ExceptionHandler)XUsbPs_IntrHandler,(void *)UsbInstancePtr);if (Status != XST_SUCCESS) {return Status;}

(4)初始化USB设备配置信息DeviceConfig并将USB设备配置信息DeviceConfig挂接到XUsbPS对象实例UsbInstance上去

 DeviceConfig.EpCfg[0].Out.Type      = XUSBPS_EP_TYPE_CONTROL;DeviceConfig.EpCfg[0].Out.NumBufs = 2;DeviceConfig.EpCfg[0].Out.BufSize  = 64;DeviceConfig.EpCfg[0].Out.MaxPacketSize   = 64;DeviceConfig.EpCfg[0].In.Type     = XUSBPS_EP_TYPE_CONTROL;DeviceConfig.EpCfg[0].In.NumBufs  = 2;DeviceConfig.EpCfg[0].In.MaxPacketSize = 64;DeviceConfig.EpCfg[1].Out.Type        = XUSBPS_EP_TYPE_BULK;DeviceConfig.EpCfg[1].Out.NumBufs    = 16;DeviceConfig.EpCfg[1].Out.BufSize = 512;DeviceConfig.EpCfg[1].Out.MaxPacketSize  = 512;DeviceConfig.EpCfg[1].In.Type        = XUSBPS_EP_TYPE_BULK;DeviceConfig.EpCfg[1].In.NumBufs = 16;DeviceConfig.EpCfg[1].In.MaxPacketSize    = 512;DeviceConfig.NumEndpoints = NumEndpoints;MemPtr = (u8 *)&Buffer[0];memset(MemPtr,0,MEMORY_SIZE);Xil_DCacheFlushRange((unsigned int)MemPtr, MEMORY_SIZE);/* Finish the configuration of the DeviceConfig structure and configure* the DEVICE side of the controller.*/DeviceConfig.DMAMemPhys = (u32) MemPtr;Status = XUsbPs_ConfigureDevice(UsbInstancePtr, &DeviceConfig);if (XST_SUCCESS != Status) {goto out;}

(5)注册用户中断,用户可以任意设定

 /* Set the handler for receiving frames. */Status = XUsbPs_IntrSetHandler(UsbInstancePtr, UsbIntrHandler, NULL,XUSBPS_IXR_UE_MASK);if (XST_SUCCESS != Status) {goto out;}
进入函数--->
/*****************************************************************************/
/**
* This function registers the user callback handler for controller
* (non-endpoint) interrupts.
*
*
******************************************************************************/
int XUsbPs_IntrSetHandler(XUsbPs *InstancePtr,XUsbPs_IntrHandlerFunc CallBackFunc,void *CallBackRef, u32 Mask)
{Xil_AssertNonvoid(InstancePtr != NULL);InstancePtr->HandlerFunc    = CallBackFunc;InstancePtr->HandlerRef      = CallBackRef;InstancePtr->HandlerMask  = Mask;return XST_SUCCESS;
}

(6)设置端点中断入口

核心的核心:此处都为OUT是因为所有的传输事务都是由主机HOST发起的,当主机HOST发起事务后进入对应端点的中断,所以为都OUT,这里的IN、OUT都是针对主机HOST来讲的。

就是接收到主机发起的事务之后,回调的函数。如果参数为IN,则为设备发送数据完毕之后回调的函数。

 /* Set the handler for handling endpoint 0 events. This is where we* will receive and handle the Setup packet from the host.*/Status = XUsbPs_EpSetHandler(UsbInstancePtr, 0,XUSBPS_EP_DIRECTION_OUT,XUsbPs_Ep0EventHandler, UsbInstancePtr);/* Set the handler for handling endpoint 1 events.** Note that for this example we do not need to register a handler for* TX complete events as we only send data using static data buffers* that do not need to be free()d or returned to the OS after they have* been sent.*/Status = XUsbPs_EpSetHandler(UsbInstancePtr, 1,XUSBPS_EP_DIRECTION_OUT,XUsbPs_Ep1EventHandler, UsbInstancePtr);

(7)启动USB

 /* Start the USB engine */XUsbPs_Start(UsbInstancePtr);

(8)启动后

启动后就开始监听主机HOST的传输事务,一但有相应的事务或者连接,就会进入XUsbPs_IntrHandler中断函数,此函数会根据中断类型去分发到相应的回调函数,其他USB设备工作方式也是大同小异。

ZYNQ 7000 USB HS启动流程和工作方式相关推荐

  1. 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boo ...

  2. 深入分析Android 9.0源代码——Service启动流程(startService方式)

    引言 点击此处查看<深入分析Android 9.0源代码>系列的组织结构和相关说明. 1 应用进程发起启动请求 本章的调用流程如下图所示: (Context)ContextWrapperC ...

  3. activity启动流程或工作流程

    1启动activity 原理. 1.1   启动方式.    (launcher启动也就是app点击启动为 startActivitySafely()但是同样会调用 startActivityForR ...

  4. Activity的启动流程

    Activity的启动流程 努力工作 自己平时工作接触的frameworks代码比较多,但真正理解的很有限,一直在努力分析..我主要还是用补丁的形式来看 core/java/android/app/A ...

  5. mattermost server的启动流程

    2019独角兽企业重金招聘Python工程师标准>>> mattermost的server启动流程分为发布方式以及研发方式启动.这里将研发的方式启动. 先来熟悉一下mattermos ...

  6. zynq7000创建fsbl启动_Xilinx Zynq 7000 FSBL启动分析(一)

    花了几天看完了FSBL的代码,在这里做个总结,分析一下zynq的启动过程. 众所周知,xilinx zynq 7000系列的芯片中包括两个部分,PS和PL,也就是FPGA的逻辑编程的部分跟嵌入式ARM ...

  7. Android 10.0 PackageManagerService(一)工作原理及启动流程-[Android取经之路]

    摘要:PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责APK.jar包等的管理. 阅读本文大约需要花费50分钟. 文章的内容主要还是从 ...

  8. ZYNQ启动流程分析之BootROM

    一.FSBL由谁启动? 1.背景 在静态情况下,BOOT.BIN启动文件存放在SD卡或QSPI等存储介质中, 然后BOOt.BIN文件中已经包含了FSBL代码,也就是说FSBL代码已经集成 在了BOO ...

  9. ZYNQ启动流程之分析BootRoM

    ZYNQ启动流程之分析BootRoM 一.fsbl由谁来启动 1.背景 2.需要做的事 3.这些事由谁来做----BootRoM 二.何为BootRoM 三.SD卡启动方式 一.fsbl由谁来启动 1 ...

最新文章

  1. 安卓手机上 js不能控制微信浏览器强制刷新页面
  2. 一文详解CMake编译工具与项目构建
  3. 错误日志这样排查,干活更得劲了!!
  4. Spring Cloud 爆高危漏洞!!!
  5. QT的QMapIterator类的使用
  6. u-boot-1.3.4 for dm365 之网络驱动
  7. Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇
  8. mysql win10 无法配置文件_MySQL设置文件无法更改的处理方案详细说明(Win10)
  9. 如何才能成为一个成功的项目经理
  10. Python 学习笔记 - 协程
  11. [转]iOS技巧之获取本机通讯录中的内容,解析通讯录源代码
  12. B树和TreeSet与TreeMap
  13. java封装与调用方法_java方法和封装
  14. 动态推荐系统关键技术研究(一)
  15. cad快捷栏怎么调出来_如何显示CAD的工具栏?CAD如何调出工具栏
  16. 五大主流云盘横评对比,百度、腾讯、115、iCloud、OneDrive哪家更值得付费?
  17. Windows——打印机错误(操作无法完成(错误 0x000006ba)。本地打印机后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。)解决方案
  18. PTA_拯救007 (25 分)【简单DFS+特判】
  19. C语言实现字符串对应替换
  20. Python-Selenium WebUI自动化 Selenium-API整理(下)

热门文章

  1. 如何让一个div水平垂直居中
  2. python 免费空间_免费云空间/VPS AppFog申请及Python Web应用开发与上传实战
  3. 和ts一般怎么玩_TS夺冠后马上卖席位?微博电竞欲加盟,以后场场热搜安排上...
  4. 成功解决Qt中ui_xxx.h: no such file or directory”
  5. Office_2019企业版安装教程
  6. 内网渗透-frp 用于内网穿透的基本配置和使用
  7. 服务器是虚拟机好还是单机好,比较VMware和VirtualBox虚拟机的优缺点
  8. unas基于_UNAS 2.0 Ushare Edition系统 NAS 软件 固件 收费版支持更新
  9. 求珠穆朗玛峰的高度和判断密码是否正确
  10. PyG Cora图数据集可视化教程