技术文章:AWorks下USB设备模式的编程与应用

发布者:cocolang最新更新时间:2019-05-09 来源: 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设备。


二、AWorks工程配置


在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设备宏。  


  #define AW_DEV_IMX1050_USBD             /**< brief USB Device */


在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的驱动:


/**

 * name 内部USB Device控制器

 * @{

 */

#ifdef AW_DEV_IMX1050_USBD

#ifndef AW_COM_USBD

#define AW_COM_USBD

#endif

#define AW_DRV_IMX1050_USBD

#endif


三、AWorks中USB Device的硬件配置


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


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


1

aw_local aw_const struct awbl_imx1050_usbd_info  __g_imx1050_usbd_info = {

2

    {

3

        "/dev/usbd",                 /**< 控制器名字 */

4

        AWBL_USBD_CFG_SELF_POWERED  /**< 控制器配置信息*/

5

    },

6


7

    IMX1050_USB1_BASE_ADDR,         /**< 寄存器基地址 */

8

    IMX1050_USBPHY1_BASE_ADDR,      /**< USB PHY寄存器基地址 */

9

    INUM_USB_OTG1,                   /**< USB 中断号*/

10

    5,                                /**< 处理usb中断业务的任务优先级 */

11

    32,

12

    __imx1050_usbd_plfm_init                  /**< 平台相关初始化:初始化时钟 */

13

};

14



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

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

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


1

aw_local void __imx1050_usbd_plfm_init (void) {

2

    /* 配置USB Device时钟 */

3

    usbd_clk_init();

4

};


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


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

 

/** brief USB设备类回调函数列表 */

struct aw_usbd_cb {

    /** brief 控制器链接到设备 */

    int (*pfn_link) (struct aw_usbd *p_obj);

    /** brief 控制器和设备断开链接 */

    int (*pfn_unlink) (struct aw_usbd *p_obj);

    /** brief 接收到SETUP包 */

    int (*pfn_ctrl_setup) (struct aw_usbd        *p_obj,

                           struct aw_usb_ctrlreq *p_setup,

                           void                  *p_buf,

                           int                    buf_len);

    /** brief 设置或清除配置 */

    int (*pfn_config_set) (struct aw_usbd      *p_obj,

                           struct aw_usbd_cfg  *p_cfg,

                           bool_t               set);

    /** brief 总线挂起 */

    void (*pfn_suspend) (struct aw_usbd *p_obj);

    /** brief 总线恢复 */

    void (*pfn_resume) (struct aw_usbd  *p_obj);

    /** brief 总线断开连接 */

    void (*pfn_disconnect) (struct aw_usbd *p_obj);

};

 

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


/** brief USBD信息结构定义 */

struct aw_usbd_info {

    uint8_t          clss;          /**< brief 类代码 */

    uint8_t          sub_clss;      /**< brief 子类代码 */

    uint8_t          protocol;      /**< brief 协议代码 */

    uint8_t          mps0;          /**< brief 端点0包最大尺寸 */

    uint16_t         bcd;           /**< brief 设备版本号 */

    uint16_t         vid;           /**< brief 厂商ID */

    uint16_t         pid;           /**< brief 产品ID */

    const char      *manufacturer;  /**< brief 制造商字符串描述 */

    const char      *product;       /**< brief 产品字符串描述 */

    const char      *serial;        /**< brief 序列号字符串描述 */

};


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


/** brief USBD接口信息 */

struct aw_usbd_fun_info {

    uint8_t       clss;         /**< brief 类代码 */

    uint8_t       sub_clss;     /**< brief 子类代码 */

    uint8_t       protocol;     /**< brief 协议代码 */

 

    /** brief 替代设置回调 */

    int (*pfn_alt_set) (struct aw_usbd_fun  *p_fun,

                        bool_t               set);

 

    /** brief setup控制传输回调 */

    int (*pfn_ctrl_setup) (struct aw_usbd_fun    *p_fun,

                           struct aw_usb_ctrlreq *p_setup,

                           void                  *p_buf,

                           int                    buf_len);

};

 

五、USB Device操作接口


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


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

image.png

●  struct aw_usbd_fun    为功能接口对象

●  struct aw_usbd        为USB Device对象

●  struct aw_usbd_pipe   为端点管道对象


六、应用案例代码详解


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

[1] [2]
关键字:AWorks  USB 引用地址:技术文章:AWorks下USB设备模式的编程与应用

上一篇:小米8屏幕指纹版要来?官方暗示:压感指纹识别
下一篇:Zwipe和英飞凌就生物识别支付达成合作协议

推荐阅读最新更新时间:2024-11-13 10:53

USB PD有望一统快充技术规范,PPS加速行业标准化
  传言即将发布的iPhone8会支持 USB Type-C 接口和 USB  PD协议?9月1日,在2017 USB  PD快充产业亚洲高峰论坛上,据业内人士透露,iPhone8支持USB PD协议将是大概率事件。下面就随网络通信小编一起来了解一下相关内容吧。   USB PD(Power Delivery)协议可以为快充技术带来更大的灵活性,支持的充电功率最高可达到100w,被业界认为是最有希望统一目前标准各立的快充技术规范。基于USB PD 3.0形成的PPS有望实现对高通QC4.0/3.0、联发科PE3.0/2.0、华为、OPPO等主流快充方案的收编。目前USB PD协议配合USB  Type-C 接口广泛应用于苹果新
[网络通信]
USB充电器制作步骤
  USB充电器套件,又名MP3MP4充电器,输入AC160-240V,50/60Hz,额定输出:DC 5V250mA(如果要长期输出更大电流,请更换Q1为13003)。MP3和MP4在全国范围大量流行,不过作为日常用品的充电器由于直接和220V高压相连,具有故障率较高,容易损坏的特点,特别是买到那些不成熟的产品后,真是苦不看言。现在一同给广大电子爱好者分享一个USB充电器。   下面是对着实物绘制的电路原理图:(电路板上有多种元件安装方法,安装请与原理图、实物图为准,PCB板上有些元件孔是不要安装的,有些元件要装在别的元件孔上,这点请注意!)        说明:为了简化电路,达到学习目地,图中用1欧的电阻
[嵌入式]
USB 3.0标准解析
所谓USB 3.0,就是新一代的USB接口,特点是传输速率非常快,理论上能达到4.8Gbps,比现在的480Mbps的High Speed USB(简称为USB 2.0)快10倍,外形和现在的USB接口基本一致,能兼容USB 2.0和USB 1.1设备。 你厌倦了在拷贝一部高清视频时要等待近20分钟吗?虽然和USB 1.1相比,USB 2.0的速度有了质的飞跃,但我们依然不满足,所以……我们熟悉的USB传输速率又要加速向前冲了! 名叫USB 3.0的新一代接口比现在的USB 2.0快十倍,全面超越 IEEE 1394 和eSATA的速度足以让它傲视所有“非主流”接口的移动设备,它会成为日后王者中的王者吗?其他接口会因此而消失吗?
[嵌入式]
通用快速充电:电池供电应用的未来趋势
如今,那些“永远在线”的消费者希望随时随地为他们的便携式电子产品充电。例如,我们经常看到旅客在等待登机或乘坐火车时给手机、笔记本电脑和耳机充电。但是,由于每个设备的充电方式不同,这些消费者必须携带不同的适配器,并且记住哪个适配器适用哪个设备是件相当麻烦的事情(请参见图1)。对于为了解决这一麻烦的工程师来说,他们的电池充电系统设计必须支持从各种输入源充电。 图1:使用不同的输入源和适配器充电 为什么考虑使用USB Type-C PD充电? 设计一个单芯片充电器集成电路(IC)来为不同配置和不同输入电压范围的多个电池供电设备充电是一个复杂的过程,因为传统适配器不能与所有电池供电设备兼容,且传统USB适配器的功率限制在5-
[汽车电子]
通用快速充电:电池供电应用的未来趋势
【乐拓USB示波器免费试用连载】CAN总线协议分析
CAN总线接口协议分析 通过OSC482L进行CAN总线接口的分析,仪器可选多种测量方式,可以支持单线或双线方式测量。单线测试测量可以支持自动,CAN_H对地,CAN_L对地三种方式,双线差分方式测量支持自动,和A-B通道差分。 本次测试采用单线CAN_H对地的方式。 外部为两个CAN总线设备,将A通道表笔分别和CAN_H和地接好,启动上升沿单次触发方式。 通讯中实际周期性的发送CAN的标准帧ID为0x70A,一个字节长度,D0为0x7F。 实际捕获后,适当调整波形在屏幕上的位置,可以观察到软件对于CAN总线波形的分析结果是完全正确的。 调整内容再次发送,然后启动捕捉功能,可以看到示波器捕捉到CAN数据帧,并正确的分析出
[测试测量]
【乐拓<font color='red'>USB</font>示波器免费试用连载】CAN总线协议分析
允许USB旁路大电容的限流器
  USB(通用串行总线)规格要求,一个连接的USB设备对主机或集线器给出一个与44Ω并联的不大于10μF的负载,它包含了通过器件稳压器的所有可见旁路电容。这个限制可避免当浪涌电流为电容充电时,设备上有过高的压降。有时候,总线供电的设备需要10μF以上的旁路电容,为电流尖峰提供充足的存储空间。本设计实例中的电路IC1采用Linear Technology公司的LTC6102精密电流检测放大器,用于将浪涌电流限制在所设定最大值以下,使设备能够在必要时使用更大的电容。   LTC6102通常用于将一只电流检测电阻上的电压转换为输出电阻上更大的对地电压。该器件有一个低偏压的放大器,可以采用低阻值的检测电阻。在一般的电路结构中,输出电流流过
[嵌入式]
OK6410A 开发板 (八) 5 linux-5.11 OK6410A usb 移植
s3c6410 有两个USB实例(板子也都引出来了), 分别是 USB host 和 USB OTG , 这里说的是 usb host 代码 : https://github.com/lisider/linux/tree/ok6410a-linux-5.11 提交id : dc485e937e8bccc1fc01b5e6d9025bf83b2b6f83 defconfig : arch/arm/configs/ok6410A_sdboot_mini_net_lcd_x11_usb_defconfig CONFIG_USB_NET_DRIVERS=y CONFIG_USB_HID=y CONFIG_USB_OHCI_LI
[单片机]
OK6410A 开发板 (八) 5 linux-5.11 OK6410A <font color='red'>usb</font> 移植
基于USB的高精度多通道数据采集卡设计
  在电子测量中,不仅需要对多路信号进行高精度的采集和预处理,而且要将其快速地传送到计算机,以便于对测量的监测。文中选用ADS8364来进行多通道信号采集,通过CY7C68013芯片采用USB2.O协议进行数据的快速传输。   1 多通道,高精度的A/D转换   ADS8364是美国TI公司生产的高速、低功耗,6通道同步采样16位模数转换器。ADS8364采用+5 V工作电压,并带有80 dB共模抑制的全差分输入通道以及*μs连续近似的模数转换器、6个差分采样放大器。   当ADS8364采用5 MHz的外部时钟来控制转换时,它的取样率是250 kHz,同时对应于4μs的最大吞吐率,这样,采样和转换共需花费20个时钟周
[嵌入式]
小广播
最新手机便携文章
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved