USB Device实验程序解析
USB_Device Test Procedure
Tektronix P6245場效應管探針*2
Tektronix TCA to BNC電源適配器*3
TDS7000Deskew制具*1
(2)電流表*1
(3ห้องสมุดไป่ตู้1MUSB電纜*5
(4)電腦*1Windows2000 or XP,
configured with High-speed Electrical Test Tool Software , EHCI Driver Stack and Tektronix USB2.0 Compliance test software.
21.測試結果將顯示在示波器屏幕上﹐而且會記錄在一個HTML報告中﹐保存到硬盤。觀察Eye diagram, Signal rate, Rise time, Fall time和Eop width是否都PASS.
22.將S6回到原來位置﹐測試指示燈滅。
3-2 Device Full-speed Signal Quality Test
圖1Device High-speed Signal Quality Test
1.打開示波器﹐預熱20分鐘。
2.在示波器屏幕上選擇File → Run application → USB 2.0 compliance test package.
3.示波器﹐按下Default setup按鈕.
4.在applications menu bar選擇File→recall default
5.在Measurement select菜單下選High speed.
6.在Signal quality區域選擇測試內容﹕Eye diagram, Signal rate, Rise time, Fall time和Eop width.
USB设备检测的一般过程.
USB 设备检测的一般过程USB 设备检测也是通过/proc 目录下的USB 文件系统进行的。
为了使一个USB 设备能够正常工作,必须要现在系统中插入USB 桥接器模块。
在检测开始时,一般要先检测是否存在/proc/bus/usb目录,若不存在则尝试插入USB 桥接模块。
现在一般的 USB 桥接器模块有两种类型, UHCI 和 OHCI 。
在决定插入那一个桥接器模块时,可以察看 /proc/pci 文件来决定。
打开此文件,您若发现USB 节为 I/O at 0xHHHH 格式(例如出现 I/O at 0xe000 [0xe01f] ), HHHH 为 16 进制数,则桥接器类型为UHCI 。
若是它为32 bit memory at 0xHH000000 形式(例如出现 32 bit memory at 0xee000000 ),HH 为16 进制数,则桥接器类型为OHCI 。
但是若您的桥接器类型不满足上述任何一种情况,唯一的解决办法就是您尝试插入这两种模块,直到成功为止。
一般而言,UHCI 类型的桥接器它的插入模块是uhci 或 usb-uhci (由内核版本决定);而对于OHCI 类型的桥接器它的插入模块是 ohci 或 usb-ohci 。
您在正确的插入了桥接器模块之后,这时 /proc 文件系统下就会出现USB 设备目录,不过这时这个目录是空的,没有任何文件。
这时您就必须挂接usbdevfs 文件系统,然后通过此文件系统检测连接的设备。
在成功挂接usb 文件系统之后,就会生成文件/proc/bus/usb/devices ,/proc/bus/usb/drivers 和目录 /proc/bus/usb/busNo 。
挂接 usbdevfs 文件您可以通过如下操作实现:mount -t usbdevfs none /proc/bus/usb或在 /etc/fstab 上加入none /proc/bus/usb usbdevfs defaults 0 0然后通过 /proc/bus/usb/devices 文件的内容,您就可以获得连接的设备信息,包括设备标识和制造商标是等信息。
USB设备开发过程解析_前台VB+驱动VC+固件GCC_
边干边写之——USB设备开发过程解析(前台VB+驱动VC+固件GCC)[声明:]1、本文为开发工作过程中的心得体会,认识粗浅表述不周之处请见谅;2、本文内容供广大爱好者学习交流之用,如需转载请注明出处并告知本人。
KKND 08年11月21日清晨发表于VBGood论坛Dreamon-II Labs.******************************************************************************[正文]其实弄清楚USB的工作流程后开发USB设备是很简单的事情。
简单来说无非是这样的过程:开发设备硬件-> 编写设备固件程序-> 编写驱动程序-> 开发应用程序其中后3项主要是软件编程工作,也是本文讨论的重点。
应用程序与USB硬件设备通信自底向上需要完成三部分程序的开发:固件程序 <-USB总线驱动程序-> 设备驱动程序 <-系统I/O管理器-> 用户应用程序以下分别将这三部分程序中用于实现通信的核心代码加以介绍。
固件程序:固件程序也就是所谓的“下位机”程序,它运行于设备上,由设备上的单片机执行,用于控制USB接口芯片与主机进行通信。
开发环境:GCC + AVR Studio……/******************************************************************* USB中断处理,该中断由USB接口芯片产生,由下位机CPU处理******************************************************************/void usb_isr(void){……if ( D12_int_flags & D12_INT_ENDP0OUT ) control_out_handler(); // 产生USB控制端点接收中断时调用该函数……}/******************************************************************* 处理USB控制端点接收事件******************************************************************/ void control_out_handler( void ){……control_dispatcher(); // 调用分发处理函数}/******************************************************************* 分发处理,根据URB 的请求类型和请求号选择相应的处理函数******************************************************************/ void control_dispatcher( void ){uchar type, req;type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;req = ControlData.DeviceRequest.bRequest;……if ( type == USB_VENDOR_REQUEST ) // 处理用户自定义请求{// 根据请求号选择请求处理函数表入口if ( req < NUMBER_VENDOR_REQ ) (*VendorDeviceRequest[req])();}……}/******************************************************************* 用于处理用户请求的函数入口表******************************************************************/ const pfnvoid VendorDeviceRequest[] ={fun0,fun1,fun2,……};/******************************************************************* 用户请求处理函数实现******************************************************************/void fun0(void){uint8_t txdata[LEN];……single_transmit(txdata, LEN);}驱动程序:目前Windows系统下的驱动程序通常采用WDM模型(Win32 Driver Model,Win32驱动模型),采用Microsoft提供的DDK开发,借助第三方驱动程序开发工具比如DriverStudio 可以大大简化开发过程。
用USB Monitor监视USB枚举(配置、识别)过程(USB枚举过程分析
搭个简单电路验证USB主机是如何检测USB设备的插入和拨出动作的------分隔线----------------------------USB设备是一种即插即用设备,即插即用的英文缩写为PNP(Plug and Play),在不用关主机的情况即可直接拨插USB设备,而且插上即可使用,那么USB主机是如何检测USB设备的插入和拨出动作的呢?总结来说USB主机是通过监视USB端口上的电压变化来判断设备的插入和拨出动作的。
USB集线器端口的两根信号线D+和D-(《USB物理模型简介》一文有介绍)的每一根都有15kΩ的下拉电阻,而在设备端,在D+或D-上接了1.5kΩ的上拉电阻,当未插入设备时,即集线器的端口悬空时,两根信号线都被下拉电阻拉到了低电平。
当USB设备插入时,由于上拉电阻的存在,由1.5K的上拉电阻和15K 的下拉电阻分压,两要信号线中有一根被拉到了高电平,集线器检测到这个状态后,它就报告给USB主控制器(或者通过它上一层的集线器报告给USB主控制器),这样就检测到设备的插入了。
对于全速和高速设备,上拉电阻是接在D+上的,而低速设备则是上拉电阻接在D-上的,集线器通过判断哪根线被拉高来区分是低速设备还是全速和高速设备。
USB高速设备先是被识别为全速设备,然后通过主机和设备两者之间的数据通讯进一步确认,再切换到高速模式的。
在高速模式下,是电流传输模式,这时会将D+上的上拉电阻断开。
当USB主机检测设备的插入后,主机将会向设备发出一系列枚举请求,设备作出正确响应来完成USB设备枚举过程。
我们做个简单的实验,自已搭一个电路,只用一个上拉电阻接在USB的+5V (VBUS)和D+或者D-上,这个电路插入电脑上的USB端口后同样会提示发现USB 设备,只是不能安装驱动程序而已(因为安装驱动力程序需要设备枚举过后,设备枚举过程需要USB设备对主机发来的命令请求数据包作出正确的回复),这时打开设备管理器看看,有显示未知USB设备,并且其VID和PID为0,根据这个,我们可以简单的判断设备是否枚举成功。
零死角玩转stm32-高级篇6、UsbDevice(模拟U盘)
0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!6、UsbDevice(模拟U盘)6.1 实验描述及工程文件清单实验描述这是一个USB Mass Storage 实验,用USB线连接PC机与开发板,在电脑上就可以像操作普通U盘那样来操作开发板中的MicroSD卡,并在超级终端中打印出相应的调试信息。
在这里野火用的MicroSD卡的容量是1G。
硬件连接PE3-USB-MODE (PE3为普通I/O)PA11-USBDM(D-)PA12-USBDP(D+)用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/misc.cFWlib/stm32f10x_dma.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_flash.c用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/sdcard.cUSER/usb_istr.cUSER/usb_prop.cUSER/usb_pwr.cUSER/hw_config.cUSER/memory.cUSB文件usb_core.cusb_init.cusb_mem.cusb_regs.cusb_bot.cusb_scsi.cusb_data.cusb_desc.cusb_endp.c其中USER文件夹下红色标注的5个c文件也是USB库文件,只因为我们需要修改它们才没有把它们放在USBLIB目录下。
官方USB程序和例程
官方USB程序和例程一、USB的“JoyStickMouse”例程结构分析1、例程的结构(1)底层结构包括5个文件:usb_core.c(USB总线数据处理的核心文件),usb_init.c,usb_int.c(用于端点数据输入输入中断处理),usb_mem.c(用于缓冲区操作),usb_regs.c(用于寄存器操作)。
它们都包含了头文件“usb_lib.h”。
在这个头文件中,又有以下定义:#include "usb_type.h"#include "usb_regs.h"#include "usb_def.h"#include "usb_core.h"#include "usb_init.h"#include "usb_mem.h"#include "usb_int.h"usb_lib.h中又包含了七个头文件,其中usb_type.h中主要是用typedef为stm32支持的数据类型取一些新的名称。
usb_def.h中主要是定义一些相关的数据类型。
还有一个未包含在usb_lib.h中的头文件,usb_conf.h用于USB 设备的配置。
(2)上层结构上层结构总共5个文件:hw_config.c(用于USB硬件配置)、usb_pwr.c(用于USB连接、断开操作)、usb_istr.c(直接处理USB 中断)、usb_prop.c(用于上层协议处理,比如HID协议,大容量存储设备协议)、usb_desc.c(具体设备的相关描述符定义和处理)。
可见,ST的USB操作库结构十分清晰明了,我先不准备直接阅读源代码。
而是先利用MDK的软件模拟器仿真执行,先了解一下设备初始化的流程。
2、设备初始化所做的工作(1)Set_System(void)这个是main函数中首先调用的函数,它位于hw_config.c文件中。
usb20_device_test_agilent
测试步骤
3. 打开USB测试软件,如图所示:
测试步骤
4. 设置测试参数。在setup标签页中,device test point下选择device, test connect中选择differential。如图所示:
测试步骤
5. 设置测试参数。在select test标签页中,选择所需的SQ测试项。如图所 示:
• 眼图测试
• 信号速率 • 包尾宽度 • 交叉电压范围(用于低速和全速) • JK抖动、KJ抖动 • 连续抖动 • 单调性测试(用于高速)
• 上升下降时间
测试步骤
1. 开启示波器,连接差分探头1169A并接好E2678A。如下图所示:
测试步骤
夹具E2645-66501目前有两个版本,新夹具与旧夹具基本功能一致,区别 在于新夹具添加了SMA测试端口。可使用任意的一个版本完成测试。如下 图:
测试步骤
9. 在电脑上运行USB HSET测试软件,依下图的提示选择操作。
Test
Enumeratsful
Execute
测试步骤
10.拨动开关,黄灯变亮,将在示波器上观察到如下图所示波形。
测试步骤
11.继续操作步骤7中的示波器的对话框。点击ok,自动生成html格式的 report。
测试步骤
将加上Damping header的E2678A连接到旧夹具的TP2测试针脚的D+和 D-上,注意与差分探头1169的极性相一致。如下图:
测试步骤
夹具E2645-66501部分连接如图所示,图中使用的是新版本夹具。图中U 盘处接DUT,使开关处于绿灯亮,黄灯不亮的状态。
开关
测试步骤
2.通道和探头设置如图所示 设置方法:Setup/Channelx(113x对应的 通道)/probes,执行后弹出如下窗口
USB设备描述符完全解析
USB设备描述符完全解析//===================================== ======================================= // 文件名: USBDESC.C// 用途: USB描述符// 作者: shenfei5// 时间: 2007.2.3// 版本: V1.10//===================================== =======================================#include <RTL.h>#include "usb.h" // USB模块#include "hid.h" // HID设备#include "usbcfg.h" // 配置USB#include "usbdesc.h" // USB描述符//// HID报文描述符//const U8 HID_ReportDescriptor[] = {HID_UsagePageVendor(0x00), // 报告页版本: 0X06 0X00 0XFF HID_Usage(0x01), // 用途页: 0X05 0X01// 如果是MOUSE,KEY,在这里应该有用法索引HID_Collection(HID_Application), // 用法集合开始: 0XA1 0X01HID_UsagePage(HID_USAGE_PAGE_BUTTON), // BUTTON用法页HID_UsageMin(1), // 用法最小值HID_UsageMax(3), // 用法最小值HID_LogicalMin(0), // 逻辑最小值HID_LogicalMax(1), // 逻辑最大值HID_ReportCount(3), // 报告计数(3)HID_ReportSize(1), // 报告页大小 (1)HID_Input(HID_Data | HID_Variable | HID_Absolute), // 输入(2)HID_ReportCount(1), // 报告计数值HID_ReportSize(5), // 报告大小HID_Input(HID_Constant), // 输入 1HID_UsagePage(HID_USAGE_PAGE_LED), // LED用法页HID_Usage(HID_USAGE_LED_GENERIC_INDICATOR), // 用法页HID_LogicalMin(0), // 用法最小值HID_LogicalMax(1), // 用法最大值HID_ReportCount(8), // 报告计数值HID_ReportSize(1), // 报告大小 (1)HID_Output(HID_Data | HID_Variable | HID_Absolute), // 输出(2)HID_EndCollection, // 报告结束};// HID报告描述符大小const U16 HID_ReportDescSize = sizeof(HID_ReportDescriptor);//// USB 设备描述符//const U8 USB_DeviceDescriptor[] = {USB_DEVICE_DESC_SIZE, // bLength 描述符长度 = 12HUSB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 1HWBVAL(0x0110), // 1.10 // bcdUSB 设备版本号 = 你发行的版本的号0x00, // bDeviceClass 类型代码 = 由USB指定0x00, // bDeviceSubClass 子类型代码 = 由USB分配0x00, // bDeviceProtocol 协议代码 = 由USB分配USB_MAX_PACKET0, // bMaxPacketSize0 端点0的容量= 64(只能是 8,16,32,64)WBVAL(0x1977), // idVendor 供应商ID(同USB协会分配,我就自己分配一份)WBVAL(0X1006), // idProduct 产品ID(由厂商分配)WBVAL(0x0100), // 1.00 // bcdDevice ( 设备出厂编号 )0x04, // iManufacturer ( 厂商描述字符串索引, 用来在字符串索引中查找字符串)0x20, // iProduct ( 产品描述字符串索引, 用来在字符串索引中查找字符串)0x42, // iSerialNumber ( 设备序列号描述字符串索引, 用来在字符串索引中查找字符串)0x01 // bNumConfigurations (配置字符串的个数)};//// USB 描述符集// 所有描述符 (配置描述符, 接口描述符, 端点描述符, USB类描述符, 设备描述符//const U8 USB_ConfigDescriptor[] = {// 配置描述符USB_CONFIGUARTION_DESC_SIZE, // bLength 描述符长度 = 9HUSB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 2HWBVAL( // wTotalLengthUSB_CONFIGUARTION_DESC_SIZE + // 返回描述符串集的长度, 配置描述字符长度USB_INTERFACE_DESC_SIZE + // 接口描述字符长度HID_DESC_SIZE + // HID描述字符长度USB_ENDPOINT_DESC_SIZE // 端点描述字符长度),0x01, // bNumInterfaces// 支持接口数0x01, // bConfigurationValue// 配置值0x00, // iConfiguration// 配置字符串描述索相// 0: 不使用// 如果使用,必须在字符串描述符中添加相应的字符串.USB_CONFIG_BUS_POWERED | // bmAttributes 设置的供电特性USB_CONFIG_REMOTE_WAKEUP, // 总线供电// 有唤醒功能USB_CONFIG_POWER_MA(100), // bMaxPower 设备从供电总线吸取的电流值//// 当前配置为 100MA// 接口类描述符// 接口 0 ,位置 0 , HID类// Interface 0, Alternate Setting 0, HID ClassUSB_INTERFACE_DESC_SIZE, // bLength 描述符长度 = 9HUSB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 4H0x00, // bInterfaceNumber ( 接口编号 )0x00, // bAlternateSetting ( 可代替位置 )0x01, // bNumEndpoints 使用端点(不含端点0)USB_DEVICE_CLASS_HUMAN_INTERFACE, // bInterfaceClass // USB 类// USB_DEVICE_CLASS_HUMAN_INTERFACE == 3// HID类HID_SUBCLASS_NONE, // bInterfaceSubClass// 子类,没有.HID_PROTOCOL_NONE, // bInterfaceProtocol// 协议代码0x5C, // iInterface// 字符串描述符索引,要使用该字符串必须在字符串描述符里添加相应的字符串// HID类描述符// HID_DESC_OFFSET = 0x0012// HID类描述符的偏移量HID_DESC_SIZE, // bLength 描述符长度 =HID_HID_DESCRIPTOR_TYPE, // bDescriptorType HID描述符类型 = 21HWBVAL(0x0100), // 1.00 // bcdHID HID版本号0x00, // bCountryCode 国家代码0x01, // bNumDescriptors 支持其它类描述符个数HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType 从属类描述类型 = 报告描述符22HWBVAL(HID_REPORT_DESC_SIZE), // wDescriptorLength 从属类描述的长度// Endpoint, HID Interrupt In// HID 端点描述描,端点1输入USB_ENDPOINT_DESC_SIZE, // bLength 端点描述符长度USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType 端点描述符类型 = 5HUSB_ENDPOINT_IN(1), // bEndpointAddress 逻辑端点号 BIT.7 = DIR// BIT.0..3 端点号// 这个值是用来把逻辑端点号换成物理端点号USB_ENDPOINT_TYPE_INTERRUPT, // bmAttributes 端点属性= 中断WBVAL(0x0004), // wMaxPacketSize 端点容量10, // 10ms // bInterval// 传输间隔时间.只对中断端点有效// Terminator0 // bLength// 结果码.};//// USB 字符串描述符 (可选)// 字符描述符结构:// {// 字符串描述符 1 大小// 描述符类型 = 字符串描述符(0X03)// 描述符内容.// ... ...// 字符串描述符n 1 大小// 描述符类型n = 字符串描述符(0X03)// 描述符内容n.// }//const U8 USB_StringDescriptor[] = {// 字符串索引: 0x00:// 字符串用途: 语言代码0x04, // 描述符长度 bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)//WBVAL(0x0409), // 使用English 语言// 描述符内容wLANGIDWBVAL(0x0804), // 试一下中文的行不行,改了之后,在硬件属性里看不到,在客户端可以看到,不明原因.// 字符串索引: 0x04:// 字符串用途: 生产产商字符描述符0x1C, // 描述符长度 bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)0xc1,0,0xd6,0,0xca,0,0xa4,0,0xb7,0,0xe1,0,' ',0,' ',0,' ',0,' ',0,' ',0,' ',0,' ',0,// 字符串索引: 0x20// 字符串用途: 产品名称0x22, // 描述符长度 bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)0xc1,0,0xd6,0,0xca,0,0xa4,0,0xb7,0,0xe1,0,' ',0,' ',0,' ',0,' ',0,' ',0,' ',0,' ',0,'H',0,'I',0,'D',0,// 字符串索引: 0x42// 字符串用途: 产品系列号0x1A, // 描述符长度 bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)'T',0,'E',0,'S',0,'T',0,'0',0,'0',0,'0',0,'0',0,'0',0,'0',0,'0',0,'0',0,// 字符串索引号 0x5C// 接口 Interface 0, 位置 Alternate Setting 00x08, // 描述符长度 bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)'H',0,'I',0,'D',0,};。
USB的枚举(实验第四讲)
端点0接收到的8字节的含义
它是一个USB标准设备请求 这8个字节是在控制传输的建立过程通过默 认控制端点0发出的 0 8个字节里面包含数据过程所需要传输数据 的
传输方向 传输长度 数据类型
USB标准设备请求的数据结构
长度为8个字节 包含5个数据域
bmRequestType bRequest wValue wIndex wLength 长度1字节 长度1字节 长度2字节 长度2字节 长度2字节
先研究第一个数据域 bmRequestType
这个数据域用来确定请求的特性
D7:数据传输的方向
0=主机到设备 1=设备到主机
D6~5:请求的类型
0=标准 1=类 2=厂商 3=保留
我们的课程暂时只考虑标准请求
D4~0:请求的接收者
0=设备 1=接口 2=端点 3=其他 4~31=保留
以我们上次的实验结果为例,第 一个字节的内容是0x80,其二进 制代码为10000000B,表示是一 个标准请求,请求的接收者是设 备,请求来的数据要从设备传输 到主机
//USB协议定义了几个标准输入请求,我们实现这些标准请求即可 //请求的代码在bRequest中,对不同的请求代码进行散转 //事实上,我们还需要对接收者进行散转,因为不同的请求接收者 //是不一样的。接收者在bmRequestType的D4~D0位中定义。 //我们这里为了简化操作,有些就省略了对接收者的判断。 //例如获取描述符的请求,只根据描述符的类型来区别。 switch(bRequest) { case GET_CONFIGURATION: //获取配置 #ifdef DEBUG0 Prints("获取配置。\r\n"); #endif break;
u盘启动实验报告
u盘启动实验报告
《U盘启动实验报告》
在当今数字化时代,U盘已经成为了人们生活中不可或缺的一部分。
除了用来
存储文件和数据外,U盘还可以用来启动电脑系统,这就是U盘启动。
今天,
我将分享一次U盘启动实验的报告。
实验目的:通过U盘启动,测试电脑系统的稳定性和速度。
实验时间:2022年10月15日
实验步骤:
1. 准备一个U盘,容量不小于8GB,格式化为FAT32或NTFS格式。
2. 下载一个适合自己电脑型号的操作系统镜像文件,比如Windows或Linux系统。
3. 使用专门的软件将操作系统镜像文件写入U盘,制作成启动盘。
4. 将U盘插入电脑,重启电脑并按下相应的启动键,选择U盘启动。
5. 进入操作系统安装界面,进行系统安装或者测试。
实验结果:
通过U盘启动,电脑系统启动速度明显提升,操作系统运行稳定。
在安装系统
过程中,U盘启动也大大加快了安装速度,节省了时间。
整个实验过程非常顺利,U盘启动的效果非常好。
实验结论:
U盘启动是一种快速、方便的启动方式,能够大大提高电脑系统的启动速度和
稳定性。
对于需要频繁安装系统或者进行系统维护的用户来说,U盘启动是一
个非常好的选择。
因此,建议大家在日常使用电脑时,多加利用U盘启动功能,
体验更加高效的电脑操作体验。
通过这次实验,我深切体会到了U盘启动的便利和效果。
希望我的实验报告能够对大家有所启发,让更多人了解并善于利用U盘启动功能。
python读取usb hid数据例程
python读取usb hid数据例程Python读取USB HID数据例程USB HID(Human Interface Device)是一种常见的USB设备,它可以用于与计算机进行人机交互,例如键盘、鼠标、游戏手柄等。
在本文中,我们将学习如何使用Python读取USB HID设备的数据。
以下是一步一步的教程,以帮助您了解如何实现这一过程。
第一步:了解USB HID在开始之前,我们需要对USB HID设备进行一些了解。
USB HID 设备使用HID协议与计算机通信,该协议定义了设备发送和接收数据的格式。
HID设备将数据封装在USB报文中,我们需要知道如何解析这些数据以获得有意义的信息。
第二步:安装必要的软件库在Python中,我们使用hidapi库来读取USB HID设备的数据。
首先,我们需要通过以下命令安装hidapi库:pip install hidapi安装完成后,我们可以开始编写代码。
第三步:导入所需的库要使用hidapi库,我们需要导入hidapi库以及其它所需的库。
请记住在我们开始之前安装了hidapi库。
import hid第四步:查找HID设备在开始读取USB HID设备数据之前,我们需要确定设备的Vid 和Pid(供应商ID和产品ID)。
这些信息可帮助我们找到指定的HID 设备。
我们可以使用hid.enumerate()函数列出所有的HID设备,然后找到我们需要的设备并获取其Vid和Pid。
devices = hid.enumerate()for device in devices:print(device)运行上述代码,将打印出所有已连接的HID设备及其信息。
我们需要找到目标设备并记下其Vid和Pid。
第五步:打开HID设备通过使用设备的Vid和Pid,我们可以用hid.device()函数打开设备。
该函数的参数为Vid和Pid。
device = hid.device(Vid, Pid)请将Vid和Pid替换为您找到的设备的实际值。
usbdeviceconnection 解析
USB(Universal Serial Bus)是一种现代化的外部设备连接标准,它为计算机和其他电子设备提供了一种便捷的方式来连接和交换数据。
USB设备连接是指通过USB接口将USB设备与计算机或其他主机连接起来的过程,通过这种连接方式,用户可以方便地进行数据传输、充电、外设连接等操作。
USB设备连接的过程涉及到多方面的知识和技术,包括USB接口标准、驱动程序安装、设备识别与配置等,下面对USB设备连接进行详细的解析。
一、USB接口标准1. USB 1.0/1.1:USB 1.0标准于1996年发布,最大传输速率为12Mbps,USB 1.1是对USB 1.0的修订版,修复了一些错误并加入了对储存设备和音频设备的支持。
2. USB 2.0:USB 2.0标准于2000年发布,最大传输速率为480Mbps,是USB 1.0/1.1的升级版,在传输速率和设备兼容性方面有了明显的提升。
3. USB 3.0:USB 3.0标准于2008年发布,最大传输速率为5Gbps,相较于USB 2.0,USB 3.0在传输速率和功耗方面有了显著的改进,使得它更适合连接大容量存储设备和高速外围设备。
4. USB 3.1:USB 3.1标准于2013年发布,最大传输速率为10Gbps,是USB 3.0的升级版本,速度更快、功耗更低。
5. USB Type-C:USB Type-C接口是一种全新的USB接口类型,它可以实现正反插拔,支持高功率充电和高速数据传输,未来将逐渐取代传统的USB接口。
二、驱动程序安装USB设备连接到计算机后,操作系统需要能够识别并与之通信才能正常使用。
这就需要安装正确的USB设备驱动程序。
一般来说,大多数USB设备在连接到计算机时会自动安装相应的驱动程序,但也有少部分设备需要手动安装驱动程序才能正常使用。
在安装驱动程序时,用户需要注意以下几点:1. 确保下载驱动程序的来源可靠,避免下载和安装未经冠方认证的驱动程序,以免造成系统安全隐患。
USBDevice实验程序解析
USBDevice实验程序解析第一篇:USB Device实验程序解析// USB device实验程序解析//头文件#include #include #include #include “inc/hw_ints.h” #include “inc/hw_memmap.h” #include “inc/hw_types.h” #include “driverlib/debug.h” #include “driverlib/fpu.h” #include “driverlib/gpio.h” #include “driverlib/interrupt.h” #include “driverlib/sysctl.h” #include “driverlib/systick.h” #include “driverlib/timer.h” #include “driverlib/uart.h” #include “driverlib/rom.h” #include “grlib/grlib.h” #include “usblib/usblib.h” #include “usblib/usb-ids.h” #include “usblib/device/usbdevice.h” #include “usblib/device/usbdbulk.h” #include “utils/uartstdio.h” #include “utils/ustdlib.h” #include “drivers/cfal96x64x16.h” #include “usb_bulk_structs.h” // 系统节拍定时systick宏定义// SYSTICKS_PER_SECOND 每秒中断次数#define SYSTICKS_PER_SECOND 100 #define SYSTICK_PERIOD_MS(1000 / SYSTICKS_PER_SECOND)// 全局systick计数volatile ui32 g_ulSysTickCount = 0;//全局变量记录发送和接收字节数 volatile ui32 g_ulTxCount = 0;volatile ui32 g_ulRxCount = 0;#ifdef DEBUG ui32 g_ulUARTRxErrors = 0;#endif // 与debug相关的定义和声明// 如果在编译时定义了DEBUG那么通过UART0进行Debug的输出#ifdef DEBUG //将所有Debug打印请求映射到UARTprintf输出 #define DEBUG_PRINT UARTprintf #else // 编译所有的Debug 打印请求#define DEBUG_PRINT while(0)((int(*)(char *,...))0)#endif // 图形上下文(context)用于OLED屏幕显示 tContext g_sContext;// 宏定义标志,用于在中断时向主程序发送命令.#define COMMAND_PACKET_RECEIVED 0x00000001 #define COMMAND_STATUS_UPDATE0x00000002 volatile ui32 g_ulFlags = 0;char *g_pcStatus;// 全局标志显示USB设置是否完成static volatile bool g_bUSBConfigured = false;// 错误处理#ifdef DEBUG void __error__(char *pcFilename, ui32 ulLine){UARTprintf(“Error at line %d of %sn”, ulLine, pcFilename);while(1){} } #endif // systick中断处理 void SysTickIntHandler(void){// 更新tick计数g_ulSysTickCount++;}//函数static ui32 // 功能:device接收数据并返回给主机。
实验十 USB驱动配置实验
实验十 USB驱动配置实验【实验目的】1、了解USB接口的工作原理2、掌握USB存储器驱动的配置方法3、掌握USB存储器的使用方法【实验原理】1、USB接口简介USB的全称是Universal Serial Bus。
最多可连接127台外设,由于USB支持热插拔,即插即用,支持的电子设备多(一般的PC都配置了USB接口)等优点。
当前,在市场上流行的USB接口主要符合:USB1.1,USB2.0和USB OTG三种规范。
目前主流的掌上电脑一般都配置了USB接口,用户可用厂商提供的USB数据线与其它同样具备USB接口的电子设备连接起来使用。
USB1.1规范支持低速(1.5Mb/s)和全速(12Mb/s)两种不同速率的数据传输和4种不同类型的数据传输方式:控制传输、中断传输、批量传输和同步传输。
按照物理接口,USB接口可以分为主机(USB host)端、USB集线器(USB hub)和USB设备(USB device)端三种类型。
USB集线器其实是一类特殊的USB设备,在一个完整的USB拓扑结构上,必须有且仅有一个USB主机,一个或多个USB集线器和USB设备。
为了满足语音和图像传输对宽带的要求,USB2.0在兼容USB1.1低速和全速数据传输基础上,支持高速(480Mb/s)数据传输。
对于USB2.0规范,同样支持控制传输、中断传输、批量传输和同步传输4种类型的数据传输方式。
在物理结构和拓扑结构上,USB2.0和USB1.1也完全相同。
USB OTG规范是作为对USB2.0规范的补充而出现的,其目的是为了满足便携式设备(如数码相机)对USB接口性能的需求。
根据USB OTG规范,一个USB接口可同时具有USB主机和USB设备两种功能,根据与其连接的其他设备属性,USB OTG接口会自动转换成为适合USB总线需求的接口类型。
比如,当一个具有USB OTG接口的PDA直接与打印机相连时,其充当的角色就是USB主机,而当其与PC机相连时,其充当的角色就是USB 设备。
USB Device Class 详解
USB Class CodesDecember 7, 2011From:/developers/defined_classUSB defines class code information that is used to identify a device’s functionality and to nominally load a device driver based on that functionality. The information is contained in three bytes with the names Base Class, SubClass, and Protocol. (Note that ‘Base Class’ is used in this description to identify the first byte of the Class Code triple. That terminology is not used in the USB Specification). There are two places on a device where class code information can be placed.One place is in the Device Descriptor, and the other is in Interface Descriptors. Some defined class codes are allowed to be used only in a Device Descriptor, others can be used in both Device and Interface Descriptors, and some can only be used in Interface Descriptors. The table below shows the currently defined set of Base Class values, what the generic usage is, and where that Base Class can be used (either Device or Interface Descriptors or both).Base Clas s Descriptor UsageDescription00h Device Use class information in the Interface Descriptors 01h Interface Audio02h Both Communications and CDC Control03h Interface HID (Human Interface Device)05h Interface Physical06h Interface Image07h Interface Printer08h Interface Mass Storage09h Device Hub0Ah Interface CDC-Data0Bh Interface Smart Card0Dh Interface Content Security0Eh Interface Video0Fh Interface Personal Healthcare10h Interface Audio/Video DevicesDCh Both Diagnostic DeviceE0h Interface Wireless ControllerEFh Both MiscellaneousFEh Interface Application SpecificFFh Both Vendor SpecificBase Class 00h(Device)This base class is defined to be used in Device Descriptors to indicate that class information should be determined from the Interface Descriptors in the device. There is one class code definition in this base class. All other values are reserved.This value is also used in Interface Descriptors to indicate a null class code triple.Base Class SubClassProtocolMeaning00h 00h 00h Use class code info from Interface Descriptors Base Class 01h (Audio)This base class is defined for Audio capable devices that conform to the Audio Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes may only be used in Interface Descriptors.Base Class SubClassProtocolMeaning01h xxh xxh Audio deviceBase Class 02h (Communications and CDC Control)This base class is defined for devices that conform to the Communications Device Class Specification found on the USB-IF website. That specificationdefines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. Note that the Communication Device Class spec requires some class code values (triples) to be used in Device Descriptors and some to be used in Interface Descriptors.Base Class SubClassProtocolMeaning02h xxh xxh Communication device classBase Class 03h (HID – Human Interface Device)This base class is defined for devices that conform to the HID Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaning03h xxh xxh HID device classBase Class 05h (Physical)This base class is defined for devices that conform to the Physical Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaning05h xxh xxh Physical device classBase Class 06h (Still Imaging)This base class is defined for devices that conform to the Imaging Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved.Base SubC Proto MeaningClass lass col06h 01h 01h Still Imaging deviceBase Class 07h (Printer)This base class is defined for devices that conform to the Printer Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaning07h xxh xxh Printer deviceBase Class 08h (Mass Storage)This base class is defined for devices that conform to the Mass Storage Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaning08h xxh xxh Mass Storage deviceBase Class 09h (Hub)This base class is defined for devices that are USB hubs and conform to the definition in the USB specification. That specification defines the complete triples as shown below. All other values are reserved. These class codes can only be used in Device Descriptors.Base Class SubClassProtocolMeaning09h 00h 00h Full speed Hub01h Hi-speed hub with single TT 02h Hi-speed hub with multiple TTsBase Class 0Ah (CDC-Data)This base class is defined for devices that conform to the Communications Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values.Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaning0Ah xxh xxh CDC data deviceBase Class 0Bh (Smart Card)This base class is defined for devices that conform to the Smart Card Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values.Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaning0Bh xxh xxh Smart Card deviceBase Class 0Dh (Content Security)This base class is defined for devices that conform to the Content Security Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaning0Dh 00h 00h Content Security deviceBase Class 0Eh (Video)This base class is defined for devices that conform to the Video Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Class lass col0Eh xxh xxh Video deviceBase Class 0Fh (Personal Healthcare)This base class is defined for devices that conform to the Personal Healthcare Device Class Specification found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes should only be used in Interface Descriptors.Base Class SubClassProtocolMeaning0Fh xxh xxh Personal Healthcare deviceBase Class 10h (Audio/Video Devices)The USB Audio/Video (AV) Device Class Definition describes the methods used to communicate with devices or functions embedded in composite devices that are used to manipulate audio, video, voice, and all image- and sound-related functionality. That specification defines the usable set of SubClass and Protocol values. Values outside of that defined spec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaning10h 01h02h03h00h Audio/Video Device – AVControl Interface00h Audio/Video Device –AVData Video Streaming Interface00h Audio/Video Device –AVData Audio Streaming InterfaceBase Class DCh (Diagnostic Device)This base class is defined for devices that diagnostic devices. There is currently only one value defined. All other values are reserved. This class code can be used in Device or Interface Descriptors.Class lass colDCh 01h 01h USB2 Compliance Device. Definition for this device can be found at /technology/usb/spec.htmBase Class E0h (Wireless Controller)This base class is defined for devices that are Wireless controllers. Values not shown in the table below are reserved. These class codes are to be used in Interface Descriptors, with the exception of the Bluetooth class code which can also be used in a Device Descriptor.B as e Cl as s SubClassProtocolMeaningE0h 01h01h Bluetooth Programming Interface. Get specific information from .02h UWB Radio Control Interface. Definition for this is found in the Wireless USB Specification in Chapter 8.03h Remote NDIS. Information can be found at: /windowsmobile/mobileoperators/default.mspx04h Bluetooth AMP Controller. Get specific information from .2h01h Host Wire Adapter Control/Data interface. Definition can be found in the Wireless USB Specification in Chapter 8.02h Device Wire Adapter Control/Data interface. Definition can befound in the Wireless USB Specification in Chapter 8.03h Device Wire Adapter Isochronous interface. Definition can befound in the Wireless USB Specification in Chapter 8.Base Class EFh (Miscellaneous)This base class is defined for miscellaneous device definitions. Values not shown in the table below are reserved. The use of these class codes (Device or Interface descriptor) are specifically annotated in each entry below.Base Class SubClassProtocolMeaningEFh 01h01hActive Sync device. This class code can be usedin either Device or Interface Descriptors. ContactMicrosoft for more information on this class.02h Palm Sync. This class code can be used in either Device or Interface Descriptors.02h01hInterface Association Descriptor. The usage of thisclass code triple is defined in the InterfaceAssociation Descriptor ECN that is provided on. This class code may only be used inDevice Descriptors.02hWire Adapter Multifunction Peripheral programminginterface. Definition can be found in the WirelessUSB Specification in Chapter 8. This class codemay only be used in Device Descriptors03h 01hCable Based Association Framework. This isdefined in the Association Model addendum to theWireless USB specification. This class code mayonly be used in Interface Descriptors.Base Class FEh (Application Specific)This base class is defined for devices that conform to several class specifications found on the USB-IF website. That specification defines the usable set of SubClass and Protocol values. Values outside of that definedspec are reserved. These class codes can only be used in Interface Descriptors.Base Class SubClassProtocolMeaningFEh 01h 01hDevice Firmware Upgrade. Device class definitionprovided on .02h 00hIRDA Bridge device. Device class definitionprovided on .03h00hUSB Test and Measurement Device. Definitionprovided in the USB Test and Measurement Classspec found on .01hUSB Test and Measurement Device conforming tothe USBTMC USB488 Subclass Specification foundon .Base Class FFh (Vendor Specific)This base class is defined for vendors to use as they please. These class codes can be used in both Device and Interface Descriptors.Base Class SubClassProtocolMeaningFFh xxh xxh Vendor specific。
USB实验
华南师范大学增城学院课程论文题目:usb设备实验课程名称嵌入式系统设计与开发课程设计考查学期2011 / 2012学年第 1 学期考查方式实验报告设计姓名丁明胜学号200808014139专业应用电子成绩指导教师陈卫丽关于USB 设备实验的报告1.实验目的:了解USB DEVICE 的相关知识。
了解S3C2410A的USB DEVICE 的控制器的编程。
2.实验内容:通过USB DEVICE 下载数据。
3.实验设备:S3C2410A设备实验箱、串口连接线、网络线。
ADS1.2集成开发环境、ARM 仿真器。
USB连接线。
4实验原理4.1USB总线的简介通用串行总线是用于将适用USB的外围设备连接到主机的外部总线结构,其主要是用在中速和低速的的外设。
USB 是通过PCI总线和PC的内部系统数据线的连接,实现数据的传送。
USB同时又是一种通信协议,他支持主系统(host)和USB 的外围设备(device)之间的数据传送,在USB通信协议中,每个系统有且只有一个(host),因此将两台PC的USB 口通过A-A头连接起来,是不能实现通信的。
因为对于电脑主板上USB来说都是host,如果连接起来就是两个host的通信,这样一来一个USB系统有了两个的host,与他的网络协议冲突。
4.2USB的物理信号USB的电缆有四根线,两根传送的是5V的电源,有一些直接和电源HUB相连的设备可以利用他来供电。
另外的两根是数据线,数据线是单工的在整个的一个系统中,数据速率是一定的,要么是高速,要么是低速,没有一个可以中间变速的设备来实现数据码流的变速。
在这一点上,USB和1394有明显的差别。
USB的总线可以在不使用的时候被挂起,这样一来就可以节约能源。
在有些时候,总线还有可能档机,比如说像数据传送的时候,突然被打断,在这个时候通过host的重新配置可以实现总线的重新工作。
4.3USB系统一个USB系统包含三类硬件设备:USB主机、USB设备、USB集线器。
“操作系统”实验教学之U盘驱动程序开发
“操作系统”实验教学之U盘驱动程序开发摘要:本文介绍了一个U盘驱动程序开发实验的设计与实施情况,包括实验内容、实验基本过程和思路、实验组织和效果等。
本实验有助于学生更真实地了解设备管理的实际情况,加深对设备管理原理的理解。
关键词:设备驱动程序;U盘;设备管理1引言设备管理是操作系统的一个关键内容,在实际操作系统的开发中,有相当多的代码是各类设备的驱动程序。
因此,在操作系统实践环节中设计一个合适的设备驱动程序开发实验具有非常重要的意义。
本文介绍了一个Linux环境下的U盘驱动程序开发实验的设计与实施情况。
U盘是一个典型的块设备,这类设备种类多、使用广泛,其驱动程序的开发也比字符设备复杂。
为了降低复杂性,许多相关的实验安排都是针对一个虚拟设备,如内存盘(RAM disk)。
但这样做也有它的弊端,即与真实物理设备的驱动程序开发差异很大,学生不能更真实地了解设备管理的实际情况。
因此,如果能够设计一个真实块设备(如U盘)的驱动程序开发实验,将能够弥补上述缺憾。
在Linux环境下,已经有一个通用的U盘驱动程序usb-storage.ko,其源程序放在目录drivers\usb\storage下(相对于内核源码根目录)。
但这个驱动的实现相当复杂,它将一个USB设备模拟成了一个SCSI设备,进而通过SCSI设备的接口来访问,该驱动程序很难被学生所理解。
在我们设计的实验中,希望学生开发一个相对简单些的U盘驱动程序,不求高性能,只求结构明朗、清晰易懂,主要是让学生掌握一个实际块设备的驱动方式,从而加深对设备管理原理的理解。
事实上,本实验开发的驱动程序应该能够适用于所有基于Bulkonly传输协议的USB大容量存储设备(USB Mass Storage),比如USB移动硬盘和USB外置光驱,U盘只是其中的一种。
由于USB大容量存储设备具有容量大、速度快、连接灵活、即插即用、总线供电等优点,它们得到了广泛使用,掌握这类设备驱动程序的开发技术无疑具有很强的实用性。
USB接口实验
一、实验目的
1、了解 USB 接口基本原理。 2、掌握通过 USB 接口与 PC 通讯的编程技术。
二、实验设备Байду номын сангаас
硬件:Embest S3CEV40 实验平台,Embest ARM 标准/增强型仿真器套件,PC 机。 软件:Embest IDE 2003 集成开发环境,Windows 98/2000/NT/XP。
设备驱动程序设计 USB 读写 Embest S3CEV40 的 USB 控制器 USBN9603 用户寄存器有两个,分别为只写的 内部地址寄存器,与可读写的数据寄存器,内部地址寄存器的地址为 0x02000002,数 据寄存器地址为 0x02000000。 对 USB 控制器进行读操作(包括读 USB 内部寄存器及数据)时,第一步是设置 USB 6bits 宽的内部地址寄存器,指明将要从 USB 某个内部地址读一个字节,第二步是从数据 寄存器读出 8bits 宽的数据。 对 USB 进行写操作类似读操作,第一步同样是设置 USB 的内部地址寄存器,指明将 要写一个字节数据到 USB 内部某个地址中去。 USB 中断 Embest S3CEV40 的 USB 控制器中断请求引脚连接 S3C44B0X 外部中断引脚 EXINT0,对应的中断向量为 0,初始化 USB 中断的步骤是:
USBN9603 与 MCU 的接口模式分为两种: 8 位并行总线模式(Parallel Interface) ,使用并行总线方式时又可选择复用 (Multiplexed)或非复用(Non-Multiplexed)模式,其中地址/数据线的复用 方式电路设计稍显复杂。 微总线模式(MICROWIRE interface) 。 以上模式的选择由管脚 MODE0,MODE1 决定。
USB设备收发数据实验
计算机学院综合性实验实验报告课程名称嵌入式系统基础实验学期至学年第 1 学期学生所在学院部计算机学院年级专业班级学生姓名学号任课教师实验成绩计算机学院制《嵌入式系统基础》课程综合性实验报告图1(4)打开ADS1.2开发环境,从里面打开\实验程序\HARDWARE\ADS\实验十五\D12.mcp项目文件,进行编译。
(5)编译通过后,进入ADS1.2调试界面,加载\实验程序\HARDWARE\ADS\实验十五\D12_Data\Debug中的映象文件程序映像D12.axf。
显示图 2图2(6)在ADS调试环境下全速运行映象文件。
使用USB电缆线,,扁头接PC机端,次实验,则在PC机上会出现自动安装USB设备的过程,安装上后,D3灯应该不停的闪烁。
同时,如图3 在控制面板/系统/硬件/设备管理器栏里自动添加了一个名为人体学输入设备的USB设备。
图3(7)此时,打开随箱提供的/实验软件syrj/tools/目录下的上层应用程序usbhidio.exe文件,如图2-15-2,在Bytes to send栏中选择要发送的数据,之后,点击一下Write Report按钮,在Send and Receive Data栏中选择Once或Continuous,Once是发一次收一次,而Continuous是连续发和连续收,接收到的数据在Bytes Receive 栏中显示,在连续发的过程中也可以更改要发送的数据,而接收数据实时更换。
图4四、实验结果及分析在Bytes to send栏中选择要发送的数据,之后,点击一下Write Report按钮,在Send and Receive Data栏中选择Continuous选项,接收到的数据在Bytes Receive 栏中显示如下图。
本实验随机带的上层应用程序usbhid.exe的基本的设计原理是在USB设备初始化完之后,PC通过USB总线给设备写数据到数据端口,设备收到数据后,把数据放到数据输出端口,供PC读取。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// USB device实验程序解析//头文件#include <stdint.h>#include <stdbool.h>#include <time.h>#include "inc/hw_ints.h"#include "inc/hw_memmap.h"#include "inc/hw_types.h"#include "driverlib/debug.h"#include "driverlib/fpu.h"#include "driverlib/gpio.h"#include "driverlib/interrupt.h"#include "driverlib/sysctl.h"#include "driverlib/systick.h"#include "driverlib/timer.h"#include "driverlib/uart.h"#include "driverlib/rom.h"#include "grlib/grlib.h"#include "usblib/usblib.h"#include "usblib/usb-ids.h"#include "usblib/device/usbdevice.h"#include "usblib/device/usbdbulk.h"#include "utils/uartstdio.h"#include "utils/ustdlib.h"#include "drivers/cfal96x64x16.h"#include "usb_bulk_structs.h"// 系统节拍定时systick宏定义// SYSTICKS_PER_SECOND 每秒中断次数#define SYSTICKS_PER_SECOND 100#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) // 全局systick计数volatile ui32 g_ulSysTickCount = 0;//全局变量记录发送和接收字节数volatile ui32 g_ulTxCount = 0;volatile ui32 g_ulRxCount = 0;#ifdef DEBUGui32 g_ulUARTRxErrors = 0;#endif// 与debug相关的定义和声明// 如果在编译时定义了DEBUG那么通过UART0进行Debug的输出#ifdef DEBUG//将所有Debug打印请求映射到UARTprintf输出#define DEBUG_PRINT UARTprintf#else// 编译所有的Debug打印请求#define DEBUG_PRINT while(0) ((int (*)(char *, ...))0)#endif// 图形上下文(context)用于OLED屏幕显示tContext g_sContext;// 宏定义标志,用于在中断时向主程序发送命令.#define COMMAND_PACKET_RECEIVED 0x00000001#define COMMAND_STATUS_UPDATE 0x00000002volatile ui32 g_ulFlags = 0;char *g_pcStatus;// 全局标志显示USB设置是否完成static volatile bool g_bUSBConfigured = false;// 错误处理#ifdef DEBUGvoid__error__(char *pcFilename, ui32 ulLine){UARTprintf("Error at line %d of %s\n", ulLine, pcFilename);while(1){}}#endif// systick中断处理voidSysTickIntHandler(void){// 更新tick计数g_ulSysTickCount++;}//函数static ui32// 功能:device接收数据并返回给主机。
// 当从主机数据发送就绪后,该程序被调用,逐个字节读取数据,并且翻转//大小写,最后回传给主机// 变量psDevice 指向要处理的设备数据实例// 变量pcData 指向USB接收缓冲去新接收到的数据// 变量ulNumBytes 是程序要处理的字节数。
// 返回:处理的数据字节数static ui32EchoNewDataToHost(tUSBDBulkDevice *psDevice, ui8 *pcData,ui32 ulNumBytes){ui32 ulLoop, ulSpace, ulCount;ui32 ulReadIndex;ui32 ulWriteIndex;tUSBRingBufObject sTxRing;// 获取当前缓冲区信息以允许设备能直接写入发送缓冲区。
//(变量中已经有足够信息与接收缓冲区直接连接)USBBufferInfoGet(&g_sTxBuffer, &sTxRing);// 获取发送缓冲区的剩余空间ulSpace = USBBufferSpaceAvailable(&g_sTxBuffer);// 判断此次可以处理的字节数ulLoop = (ulSpace < ulNumBytes) ? ulSpace : ulNumBytes; ulCount = ulLoop;// 更新接收字节数g_ulRxCount += ulNumBytes;// 显示Debug信息DEBUG_PRINT("Received %d bytes\n", ulNumBytes);// 与USB缓冲区连接启动字节处理ulReadIndex = (ui32)(pcData - g_pucUSBRxBuffer); ulWriteIndex = sTxRing.ui32WriteIndex;while(ulLoop){ // 将接收缓冲去的字节拷入发送缓冲区// 判断是否是小写字母if((g_pucUSBRxBuffer[ulReadIndex] >= 'a') &&(g_pucUSBRxBuffer[ulReadIndex] <= 'z')){ // 转换为大写字母,写到发送缓冲区中g_pucUSBTxBuffer[ulWriteIndex] =(g_pucUSBRxBuffer[ulReadIndex] - 'a') + 'A';}else{ // 判断是否是大写字母if((g_pucUSBRxBuffer[ulReadIndex] >= 'A') &&(g_pucUSBRxBuffer[ulReadIndex] <= 'Z')){ // 转换为小写字母,写到发送缓冲区中g_pucUSBTxBuffer[ulWriteIndex] =(g_pucUSBRxBuffer[ulReadIndex] - 'Z') + 'z';}else{ // 将接收到的数据拷到发送缓冲区g_pucUSBTxBuffer[ulWriteIndex] = g_pucUSBRxBuffer[ulReadIndex];}}// 将指针移到下一字节,当移到缓冲区底时,进行对应调整ulWriteIndex++;ulWriteIndex = (ulWriteIndex == BULK_BUFFER_SIZE) ? 0 : ulWriteIndex;ulReadIndex++;ulReadIndex = (ulReadIndex == BULK_BUFFER_SIZE) ? 0 : ulReadIndex;ulLoop--;}// 完成接收所有字节并进行转换后发送给主机USBBufferDataWritten(&g_sTxBuffer, ulCount);DEBUG_PRINT("Wrote %d bytes\n", ulCount);// 返回处理的字节数return(ulCount);}// 函数void DisplayStatus// 功能:在屏幕显示当前状态的字符串// 变量psContext 指向图形上下文(context)用于OLED屏幕显示// 变量pcStatus 指向要显示字符串Void DisplayStatus(tContext *psContext, char *pcStatus){ // 清除原来状态,显示黑色背景GrContextForegroundSet(&g_sContext, ClrBlack);GrStringDrawCentered(psContext, " ", -1,GrContextDpyWidthGet(psContext) / 2, 16, true);// 显示新状态DEBUG_PRINT("%s\n", pcStatus);GrContextForegroundSet(&g_sContext, ClrWhite);GrStringDrawCentered(psContext, pcStatus, -1,GrContextDpyWidthGet(psContext) / 2, 16, true);}// 函数ui32TxHandler// 功能:处理与发送通道有关的USB设备驱动通知(数据由device向主机传送)// 变量pvCBData 是从机提供的返回指针// 变量ulEvent 正在被通知的事件// 变量ulMsgValue 是事件对应值// 变量pvMsgData is 事件指针.// 此程序被bulk驱动调用以通知USB设备(与发送数据通道有关的)事件//(IN通道将数据发送给主机)ui32TxHandler(void *pvCBData, ui32 ulEvent, ui32 ulMsgValue,void *pvMsgData){ // 此程序没有对发送事件作任何响应,只是更新发送字节数if(ulEvent == USB_EVENT_TX_COMPLETE){g_ulTxCount += ulMsgValue;}// 显示Debug信息DEBUG_PRINT("TX complete %d\n", ulMsgValue);return(0);}//函数ui32RxHandler// 功能:处理与发送通道有关的USB设备驱动通知(由主机向device发送)// 变量pvCBData 是从机提供的返回指针// 变量ulEvent 正在被通知的事件// 变量ulMsgValue 是事件对应值// 变量pvMsgData is 事件指针.// 说明:此程序被bulk驱动调用以通知USB设备(与接收数据通道有关的)事件//(OUT通道将数据由主机发送出去)ui32RxHandler(void *pvCBData, ui32 ulEvent,ui32 ulMsgValue, void *pvMsgData){ // 判断是哪一个事件状态switch(ulEvent){ // 正在与主机连接,可以进行通信case USB_EVENT_CONNECTED:{g_bUSBConfigured = true;g_pcStatus = "Host connected.";g_ulFlags |= COMMAND_STATUS_UPDATE;// 刷新缓冲区USBBufferFlush(&g_sTxBuffer);USBBufferFlush(&g_sRxBuffer);break;}// 主机断开连接case USB_EVENT_DISCONNECTED:{g_bUSBConfigured = false;g_pcStatus = "Host disconn.";g_ulFlags |= COMMAND_STATUS_UPDATE;break;}// 接收到新字节包case USB_EVENT_RX_AVAILABLE:{tUSBDBulkDevice *psDevice;// 从返回数据变量中回去实例数据的指针psDevice = (tUSBDBulkDevice *)pvCBData;// 读取新数据包并且返回发送给主机return(EchoNewDataToHost(psDevice, pvMsgData, ulMsgValue));}// 暂时忽略挂起(SUSPEND)和重启(RESUME)信号。