ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实现的USB MASS STORAGE的例子已经有很多,而且实现过程几乎不用写代码,使用官方工具便可实现,ZYNQ器件的例子网上却没有找到,自己实现后分享给大家,废话少说,开始吧!

一、先从原理开始吧,使用到了USB那就先介绍下USB吧,USB首先分为HOST(主设备)和Device(从设备)两大类,我们常常开发的小设备一般是属于Device类型的,Device设备可以实现很多不同的应用如下图所示:
在这里插入图片描述

具体细节可以在网站:Universal Serial Bus - Device Classes (liquisearch.com)查看,我们今天用到的便是Mass stroage,也就是大容量存储设备协议,详细内容可以看Universal Serial Bus Mass Storage Class,或者看下USB Mass Storage大容量存储的基本知识 - 程序员大本营 (pianshen.com)这篇大佬的博客,因为xilinx官方相关历程已经实现好了相关的协议解析和处理,这里不在赘述。

二、知道了大概的思路后我们就可以开始搭建硬件环境了,我们在Vivado中先实现zynq的配置,配置如下图所示:
在这里插入图片描述

这里给出了最重要的配置页面,我们要根据自己的硬件电路完成最基本的硬件配置,包括 QSPI FLASH USB SD UART完成基本的配置后,综合整个项目,生成BIT流,最后导出硬件完成硬件设计 ,这里对其他配置不做详细介绍,毕竟重点在软件部分(Vitis环境下),如有疑问欢迎交流。

三、完成了硬件导出后,如果不出意外,便可以创建Vitis项目,点击“platform.spr”文件,显示板级支持包界面后,点击“Peripheral Drivers”选项展开驱动历程列表,如下图所示:
在这里插入图片描述

在显示出来的列表中选择USB对用的历程生成Demo,如下图所示:
在这里插入图片描述

点击“import examples”生成Demo项目后,项目主要文件如下图所示:
在这里插入图片描述

这个历程已经实现了MASS STORAGE相关的协议,是用DDR模拟了一块存储卡,将该项目编译下载到硬件连接USB接口到电脑,便可以显示一个模拟U盘设备,这里的U盘容量是可以在代码中修改的,修改宏在xusbps_class_storage.h中的VFLASH_SIZE,在硬件不断电情况下可以实现U盘的基本操作,这里主要需要关注的内容是xusbps_class_storage.h 和xusbps_class_storage.c两个文件,因为USB MASS STORAGE协议解析和相关的存储器读写操作需要在这里实现。

四、从上面步骤来看,实际上我们已经实现了USB虚拟U盘的功能,只是现在的存储设备不是SD卡,最后一部就比较简单了,我们将DDR的读写操作该为SD的读写操作即可,当然在此之前不要忘记初始化SD卡的初始化操作,这里有一个关于速度的问题需要指出,最新版本的官方SD库文件是支持DMA的,最终实现的U盘速度会比较快,之前2019板Vitis的SD库还没有实现相关操作,可能需要自己修改,速度上会有一些影响。这里主要修改的代码在xusbps_class_storage.h 和xusbps_class_storage.c两个文件,相关代码我附在历程文件中,此处不再赘述,如有疑问,欢迎交流!

微信公众号:超级攻城狮

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Zynq是赛灵思(Xilinx)公司推出的一款SoC(System on a Chip),集成了ARM处理器和可编程逻辑部分。裸机是指在没有操作系统支持的情况下,直接在硬件平台上进行编程的方式。USB(Universal Serial Bus)是一种用于连接外部设备和计算机的通信接口。 在Zynq裸机环境中进行USB分析时,需要对USB通信协议和硬件接口有一定的了解。USB协议包括传输、设备和主机之间的通信规则和规范。在编程中,需要通过读取和写入USB寄存器来控制USB设备的数据传输和状态管理。 首先,需要初始化USB控制器和连接的设备。通过设置相应的寄存器,将USB控制器切换到USB主机模式,并与USB设备进行握手和通信。 然后,需要进行USB数据传输的配置和管理。通过设置传输控制和配置寄存器,选择数据传输的类型(如控制、批量、中断或等时传输),并设置数据包的大小和方向。 进行USB数据传输时,可以按照USB协议的规定,使用同步、异步或中断方式读取和写入数据。通过读取状态和中断寄存器,可以获取USB设备的状态和处理中断事件。 对于USB外设的驱动程序开发,还需根据具体的应用场景和需求进行功能扩展。例如,可以实现USB的热插拔支持,通过检测设备的插入和拔出事件,动态地进行设备的识别和初始化。 总之,Zynq裸机环境下的USB分析需要熟悉USB协议和硬件接口,并通过操作相关寄存器进行设备的初始化、数据传输和状态管理。这样可以实现基于ZynqUSB设备控制和数据交互,满足特定应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值