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设备模式操作接口函数
● 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
- 曝iPhone SE 4首发苹果自研5G基带:明年3月登场
- 曝iPhone 17全系首发3nm A19系列芯片:无缘台积电2nm工艺制程
- 供应链称上游元器件要大降价:国产手机现涨价潮后会主动下调售价吗
- 消息称苹果将拿出近 1 亿美元用于解除印尼 iPhone 16 系列销售禁令
- 消息称塔塔公司收购和硕在印度的唯一一家iPhone工厂,深化与苹果合作
- 苹果遭4000万英国iCloud用户集体诉讼,面临276亿元索赔
- 消息称苹果、三星超薄高密度电池均开发失败,iPhone 17 Air、Galaxy S25 Slim手机“变厚”
- 美光亮相2024年进博会,持续深耕中国市场,引领可持续发展
- Qorvo:创新技术引领下一代移动产业
- AM2G-2418DH30Z ±18V 2 瓦 DC-DC 转换器的典型应用,用于开/关控制应用
- 用于 ATX 电源的 DC 到 DC 多输出电源
- 带有外部 NPN 开关的 NCV33063A 降压开关转换器的典型应用
- STBB3JCC 2A、高效单电感降压-升压DC-DC转换器、高亮度WLED驱动器的典型应用
- 吉医iCAN大赛 13组—灯光品质检测
- LM324DTBR2G高阻差分放大器典型应用
- STM32F103RCT6主控
- VNQ5E160AK评估板
- 使用 Analog Devices 的 LTC2629IGN-1 的参考设计
- 使用 MikroElektronika 的 ICM-20602 的参考设计
- MPS探索营 “正经玩技术”!创意征集 | 解锁锂电池充电的无限玩法!
- 助力初创公司~21种Maxim评估板来了!免费领取进行中!
- 泰克 4200A-SCS 带您走进半导体材料测试世界 下载赢好礼!
- 独乐乐不如众乐乐——TI培训“荐课”功能上线公测,邀你提议,参与抢楼!
- MSP430 多款开发工具优惠促销,总有一款会适合你!
- 【EE团】抢先体验 ST最新STM32F0308-DISCOVERY开发工具!
- 有奖直播:当代物联网智能天线设计趋势
- 有奖直播|TI 符合 USB 2.0 标准的最新隔离器件
- 第二届英飞凌【碳化硅应用技术】发展论坛
- Hercules DIY创意大搜集!比比看,谁的设计最“安全”?
- 高通宣布新一代骁龙移动平台:12月1日发布
- 新IEEE Fellow名单曝光!华人雄霸1/3
- 测试显示,谷歌Pixel 6 Pro的5G调制解调器不及高通的骁龙X60
- 斯坦福开发为机器人提供触觉的电子手套 一个修复简历的机器人CV Comp
- Analogue:复古风格Pocket掌机将于12月13日开始发货
- 士兰12英寸项目力争Q4试投产,金柏项目力争Q4主厂房封顶
- 奔驰S级加入博世智能家居合作伙伴计划 可在车内控制智能家居设备
- 华为爱尔兰籍副总裁深圳猝死 仅55岁
- 安霸合作Humanising Autonomy 为ADAS/自动驾驶车提供感知能力
- 俄罗斯研发新应用 用现有CCTV摄像头帮驾驶员快速找到空余停车位