ZYNQ 7000 USB HS启动流程和工作方式
目录
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启动流程和工作方式相关推荐
- 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 : -- u-boo ...
- 深入分析Android 9.0源代码——Service启动流程(startService方式)
引言 点击此处查看<深入分析Android 9.0源代码>系列的组织结构和相关说明. 1 应用进程发起启动请求 本章的调用流程如下图所示: (Context)ContextWrapperC ...
- activity启动流程或工作流程
1启动activity 原理. 1.1 启动方式. (launcher启动也就是app点击启动为 startActivitySafely()但是同样会调用 startActivityForR ...
- Activity的启动流程
Activity的启动流程 努力工作 自己平时工作接触的frameworks代码比较多,但真正理解的很有限,一直在努力分析..我主要还是用补丁的形式来看 core/java/android/app/A ...
- mattermost server的启动流程
2019独角兽企业重金招聘Python工程师标准>>> mattermost的server启动流程分为发布方式以及研发方式启动.这里将研发的方式启动. 先来熟悉一下mattermos ...
- zynq7000创建fsbl启动_Xilinx Zynq 7000 FSBL启动分析(一)
花了几天看完了FSBL的代码,在这里做个总结,分析一下zynq的启动过程. 众所周知,xilinx zynq 7000系列的芯片中包括两个部分,PS和PL,也就是FPGA的逻辑编程的部分跟嵌入式ARM ...
- Android 10.0 PackageManagerService(一)工作原理及启动流程-[Android取经之路]
摘要:PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责APK.jar包等的管理. 阅读本文大约需要花费50分钟. 文章的内容主要还是从 ...
- ZYNQ启动流程分析之BootROM
一.FSBL由谁启动? 1.背景 在静态情况下,BOOT.BIN启动文件存放在SD卡或QSPI等存储介质中, 然后BOOt.BIN文件中已经包含了FSBL代码,也就是说FSBL代码已经集成 在了BOO ...
- ZYNQ启动流程之分析BootRoM
ZYNQ启动流程之分析BootRoM 一.fsbl由谁来启动 1.背景 2.需要做的事 3.这些事由谁来做----BootRoM 二.何为BootRoM 三.SD卡启动方式 一.fsbl由谁来启动 1 ...
最新文章
- 安卓手机上 js不能控制微信浏览器强制刷新页面
- 一文详解CMake编译工具与项目构建
- 错误日志这样排查,干活更得劲了!!
- Spring Cloud 爆高危漏洞!!!
- QT的QMapIterator类的使用
- u-boot-1.3.4 for dm365 之网络驱动
- Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇
- mysql win10 无法配置文件_MySQL设置文件无法更改的处理方案详细说明(Win10)
- 如何才能成为一个成功的项目经理
- Python 学习笔记 - 协程
- [转]iOS技巧之获取本机通讯录中的内容,解析通讯录源代码
- B树和TreeSet与TreeMap
- java封装与调用方法_java方法和封装
- 动态推荐系统关键技术研究(一)
- cad快捷栏怎么调出来_如何显示CAD的工具栏?CAD如何调出工具栏
- 五大主流云盘横评对比,百度、腾讯、115、iCloud、OneDrive哪家更值得付费?
- Windows——打印机错误(操作无法完成(错误 0x000006ba)。本地打印机后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。)解决方案
- PTA_拯救007 (25 分)【简单DFS+特判】
- C语言实现字符串对应替换
- Python-Selenium WebUI自动化 Selenium-API整理(下)
热门文章
- 如何让一个div水平垂直居中
- python 免费空间_免费云空间/VPS AppFog申请及Python Web应用开发与上传实战
- 和ts一般怎么玩_TS夺冠后马上卖席位?微博电竞欲加盟,以后场场热搜安排上...
- 成功解决Qt中ui_xxx.h: no such file or directory”
- Office_2019企业版安装教程
- 内网渗透-frp 用于内网穿透的基本配置和使用
- 服务器是虚拟机好还是单机好,比较VMware和VirtualBox虚拟机的优缺点
- unas基于_UNAS 2.0 Ushare Edition系统 NAS 软件 固件 收费版支持更新
- 求珠穆朗玛峰的高度和判断密码是否正确
- PyG Cora图数据集可视化教程