0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在ZLG打造的AWorks嵌入式实时操作系统中,如何创建一个自定义的USB设备

UtFs_Zlgmcu7890 来源:lq 2019-05-09 09:27 次阅读

由于USB的灵活性,已被广泛应用于PC机的人机接口、存储及嵌入式系统中。本文为大家介绍在ZLG打造的AWorks嵌入式实时操作系统中,如何创建一个自定义的USB设备。

USB,是英文Universal Serial Bus(通用串行总线的缩写),是一种快速、灵活的总线接口。USB对所有的USB外设提供了单一的易于使用的标准的连接类型,简化了USB外设的设计。USB接口支持热插拔,计算机系统可以动态地检测外设的插拔,并且动态地加载驱动程序。另外,USB还具有很灵活的扩展性,一个USB端口接上一个USB HUB(集线器)就可以扩展多个USB端口。USB广泛的应用于PC机中的人机接口、音频、存储等功能,随着嵌入式系统在各个领域上广泛应用,USB也在嵌入式系统中被广泛的使用。

USB简介

USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出。ISB1.1是较为普遍的USB规范,其高速方式的传输速率是12Mbps,低速模式的传输速率为1.5Mbps(b是bit的意思,12Mbps=1.5MB/s),USB2.0规范是由USB1.1规范演变而来,它的传输速率达到了480Mbps,足以满足大多数外设的速率要求。USB2.0中的EHCI(增强主机控制器接口)定义了一个与USB1.1相兼容的结构。它可以用USB2.0的驱动程序驱动USB1.1的设备,也就是说所有支持USB1.1的设备都可以直接在USB2.0的接口上使用而不必担心兼容性问题。

USB采用四线电缆,其中两根是用来传送数据的串行通道,另两根为下游设备提供电源,对于任何已经成功连接且相互识别的外设,将以对方设备均能够支持的最高速率传输数据。USB总线会根据外设情况在所兼容的传输模式中自动地由高速向低速动态转换且匹配锁定在合适的速率。USB系统采用级联星型拓扑,该拓扑由三个基本部分组成:主机,集线器和功能设备。

主机包含有主控制器和根集线器,控制着USB总线上的数据和控制信息的流动,每个USB系统只能有一个根集线器,它连接在主控制器上。

集线器是USB结构中的特定成分,它可以对原有的USB端口在数量上进行扩展以获得更多的USB端口(集线器只能扩展出更多的USB端口,而不能扩展出更多的带宽),设备通过端口连接到USB总线上,同时检测连接在总线上的设备,并为这些设备提供电源管理,负责总线的故障检测和恢复。集线可为总线提供能源,亦可为自身提供能源。

功能设备通过端口与总线连接。

本文章以M1052平台为例,主要讲解在AWorks平台中如何创建一个自定义的USB设备。

1AWorks工程配置

在AWorks工程中,用户可以通过aw_prj_params.h配置文件进行设备添加与删除,aw_prj_params.h在工程目录user_config中。

在aw_prj_params.h文件中,有效定义设备的使能宏,才表示一个有效的硬件设备,在本文章中我们需要使能USB Device,所以在aw_prj_params.h中添加AW_DEV_IMX1050_USBD设备宏。

在aw_prj_params.h中添加AW_DEV_IMX1050_USBD设备宏之后,在aw_prj_param_auto_cfg.h文件中会自动添加AW_COM_USBD的定义,AW_COM_USBD代表的是USB Device协议栈组件。此处要注意AW_DEV_IMX1050_USBD与AW_DEV_IMX1050_USBH1有冲突(一个USB控制器不能同时出现主机设备模式),两个只能使能一个。AW_DRV_IMX1050_USBD表示加载USB Device的驱动:

2AWorks中USB Device的硬件配置

在AWorks中所有设备集中由AWbus_lite进行管理,在使用一个硬件设备前,必须将其添加到系统硬件设备列表(在awbus_lite_hwconf_usrcfg.c中定义),各个硬件设备的类型为struct awbl_devhcf。USB设备相关硬件配置可以查阅工程目录下的:

\user_config\awbl_hwconf_usrcfg\awbl_hwconf_imx1050_usbd.h文件,USB设备模式的设备信息详见程序清单2.1。

程序清单2.1 USB设备模式的设备信息类型定义

其中"/dev/usbd" 是USB Device外设的设备名字,在实际的应用中需要通过该名字来使用USB Device

AWBL_USBD_CFG_SELF_POWERED 表示本设备为自行供电设备。__imx1050_usbd_plfm_init函数是用来初始化与USB Device平台相关的信息,在这里是初始化USB Device时钟,详见程序清单2.2。

程序清单2.2 USB设备模式的平台初始化函数

3与USB Device操作函数相关重要结构体介绍

USB设备类回调函数列表,这个结构体用于提供USB枚举以及USB通信过程中的事件回调接口,方便用户接入应用代码:

USB设备信息结构体,此结构体用于配置USB设备的基础信息(具体信息详见结构体定义),当设备连接到PC端后,可以在PC端查看到这些信息:

USB设备接口信息结构体,这个结构体是用来描述当前USB设备接口的信息:

4USB Device操作接口

AWorks提供了一系列的USB Device操作相关的标准接口,包括初始化一个USB设备、USB功能初始化、启动USB设备和USB数据传输等,用户在使用AWorks开发USB Device的应用程序时,使用上述标准接口就能方便快捷的开发出源代码。详见表4.1

表4.1 USB设备模式操作接口函数

struct aw_usbd 为USB Device对象

struct aw_usbd_fun 为功能接口对象

struct aw_usbd_pipe 为端点管道对象

5应用案例代码详解

这里基于M1052平台,展示如何创建一个自定义的USB设备。本例子会初始化一个USB设备,为USB设备创建一个OUT管道和一个IN管道用于接收和发送数据(IN和OUT的概念是相对于USB主机而言),并在这个USB设备添加接口功能。通过USB设备与PC机的连接,实现与PC的通讯,当PC机上位机软件发送数据时,USB设备通过OUT管道接收数据,并通过IN管道把收到的数据发送回PC端上位机。这里只对部分关键的代码进行讲解,完整的代码请自行下载查看,本例程所在目录位于:

\examples\peripheral\common\usb\ demo_usbd_vendor.c

定义数据接收缓冲区的大小和等待超时时间:

定义USB Device的信息,当USB Device与PC端连接时,PC端会对其进行枚举从而获取USB Device的设备信息,这些信息都可以在PC端进行查看:

USB Device接口信息结构体:

USB Device例程入口函数,这里主要是初始化USB Device对象,并为这个USB Device对象添加自定义功能,最后通过调用aw_usbd_start函数启动配置好的USB Device。

创建USB Device自定义功能,在本例程中,调用aw_usbd_pipe_create函数为USB Devie的自定义功能创建两个管道,一个OUT管道和一个IN管道用于接收和发送数据,然后把这个功能添加进上文中初始化好的USB Device对象,最后创建一个任务用于接收数据并把数据发送回去。

USB Device接收发送任务,当USB Device连接到PC端后,PC端检测到USB Device的设备信息和设置功能接口后,就会调用USB Device接口信息的回调函数__custom_alt_set,__custom_alt_set会发送信号量,通知USB Device接收发送任务USB Device已连接到PC端,然后进入等待数据接收状态,当收到数据后会取消阻塞状态,然后把收到的数据通过IN管道再发送出去:

6应用案例演示

把完整的例程拷贝到工程的user_code目录,并把USB Device入口函数demo_usbd_vendor_entry添加到main.c文件中:

编译程序并把程序烧写进M1052开发板后,通过USB线连接开发板上的USB HOST1 和PC机,这时PC即会检测到有USB设备插入,在PC机上安装对应的驱动后,PC机识别到我们的自定义USB设备。

打开PC端串口打印:

PC端上检测到USB Device的插入,此时因为PC端没有相应的驱动,所以检测到是未知设备:

在PC机上安装相应的驱动后,PC机识别到我们的自定义USB设备:

打开专用的USB通讯软件,选择要操作的端点,因为在本例程中创建了两个管道,一个IN管道一个OUT管道,所以在软件中会看到本USB设备有两个端点,选择后会出现两个窗口,一个是接收一个是发送。

在发送窗口输入想要发送的数据,点击发送,接收窗口就会收到响应的数据。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4962

    文章

    18145

    浏览量

    286510
  • 集线器
    +关注

    关注

    0

    文章

    331

    浏览量

    39073
  • USB设备
    +关注

    关注

    0

    文章

    53

    浏览量

    16252
  • 嵌入式实时操作系统

    关注

    1

    文章

    127

    浏览量

    7743

原文标题:AWorks 编程——USB设备模式的使用

文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于实时操作系统嵌入式控制器的设计

    摘要:本文基于atmega16微处理器和AVRX嵌入式实时操作系统设计并完成了水秋千的嵌入式控制器.为实现高级控制策略和非线性控制理论研究提供了
    发表于 04-27 21:41

    微内核操作系统嵌入式平台上的应用

    2009年将会成为880亿的巨大市场。  所谓嵌入式系统是指为特定应用而设计的专用电脑系统,通常执行的是带有特定要求的预先
    发表于 09-01 13:41

    嵌入式操作系统及其特点

    嵌入式操作系统嵌入式应用软件的开发平台,嵌入式操作系统(OPerating System,OS)是嵌入
    发表于 07-11 16:51

    【安富莱】【RTX操作系统教程】第2章 嵌入式实时操作系统介绍

    操作系统。注:工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统
    发表于 01-15 15:35

    转:第2章嵌入式实时操作系统介绍

    系统定义 当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调
    发表于 08-19 09:47

    【案例分享】FreeRTOS的嵌入式实时操作系统的实现

    FreeRTOS是源码公开的免费的嵌入式实时操作系统,通过研究其内核可以更好地理解嵌入式
    发表于 07-23 04:30

    基于微内核的嵌入式实时操作系统

    ARTs-OS是基于微内核的嵌入式实时操作系统。ARTs-OS的中断管理应该提供的基本功能
    发表于 07-26 07:19

    嵌入式操作系统USB双向通信怎么实现?

    。本文介绍种基于S1C33L11芯片利用嵌入式操作系统的同步机制通过对循环队列及自定义控制包的操作来实现双向通信的方法。
    发表于 03-19 07:35

    嵌入式实时操作系统如何简化应用软件的设计

    嵌入式领域中,嵌入式实时操作系统(RTOS)正得到越来越广泛的应用。采用嵌入式
    发表于 11-25 06:48

    如何在嵌入式操作系统ARM Linux实现ZLG7290的驱动?

    I2C总线接口的工作模式和特点如何在嵌入式操作系统ARM Linux实现ZLG7290的驱动?I2C总线传送数据过程中有哪几种信号?
    发表于 04-23 06:00

    基于Linux的嵌入式操作系统

    嵌入式操作系统一嵌入式操作系统概述1.1 嵌入式操作系统的特点1.2
    发表于 11-08 09:05

    实时嵌入式操作系统的相关资料下载

    整体上看,嵌入式系统实时性能是由硬件 、 实时操作系统
    发表于 12-14 06:49

    嵌入式实时操作系统实验

    章0 目录9 嵌入式实时操作系统实验9.1 ucos-ii操作系统实验9.1.1课堂重点实验所需附件: 附件程序下载9.1.2测试与作
    发表于 12-22 07:47

    嵌入式实时操作系统FreeRTOS基本概述

    嵌入式实时操作系统FreeRTOS基本概述嵌入式领域当中,实时
    发表于 02-16 07:12

    嵌入式开发自定义协议的解析与组包相关案例分享

    1、嵌入式开发自定义协议的解析与组包  嵌入式产品开发,经常会遇到两
    发表于 10-27 17:01