USB通用函数API接口代码

合集下载

CYAPI函数简介

CYAPI函数简介

主机初始化模块用到了Cypress 的开发包中的类,因此需要在头文件部分添加库文件CyAPI.h、CyAPI.lib 和cyioctl.h 与功能代码一起进行编译,将这三个文件加载到项目中,主要代码如下:#include "CyAPI.h"#include "cyioctl.h"头文件中还需要定义以下全局变量:USBDevice 为USB 设备,InEndpt、OutEndpt 为USB 端点,ReadThread、WriteThread 为线程定义,ReadThreadLooping、WriteThreadLooping 为线程控制变量、ept 为控制端点,主要代码如下:CCyUSBDevice *USBDevice; //定义USB 设备CCyUSBEndPoint *InEndpt; //定义输入USB 端点CCyUSBEndPoint *OutEndpt; //定义输出USB 端点CWinThread *ReadThread; //数据采集线程CWinThread *WriteThread; //波形发生线程BOOL ReadThreadLooping; //数据采集线程循环标志BOOL WriteThreadLooping; //波形发生线程循环标志CCyControlEndPoint *ept; //定义USB 控制端点5.1CyAPI函数库CyApl控制函数类为EZ-USBFXZLP系列USB2.0接口芯片提供了方便和完善的控制接口。

在使用CyPress提供的驱动程序基础上,只需在主机程序中加入头文件CyAPI.h和库文件CyAPI.lib即可调用相应的控制函数。

该类库一共分五大类,分别提供了对uSB设备、usB 配置、USB接口、USB端点及同步信息包的控制接口。

其中,从USB端点控制类中又派生出四个子类来分别控制块传输端点、控制端点、中断传输端点以及同步传输端点。

用VC++编写USB接口通讯程序

用VC++编写USB接口通讯程序

用VC++编写USB接口通讯程序摘要:详细介绍Visual C++ 6.0环境下利用Windows API(Application Program Interface)函数来实现与符合HID设备类的USB接口通讯,并给出了通信程序的部分代码。

关键词:通用串行总线人际接口设备API VisualC++1 引言在USB出现之前,计算机的典型接口有并行口(打印口)、串行口、鼠标口、键盘口、显示器口、游戏口及各种卡式接口(如声卡、网卡)等,与这些接口对应的有各种不同的电缆。

在传输速度方面,这些接口都存在速度偏低的问题;在技术方面,这种设计容易产生I/O冲突。

中断(IRQ)不够用,以及对于每一种新的外设都必须设计新的接口卡等缺点。

当今的计算机外部设备,都在追求高速度和高通用型。

USB接口适应了这种要求,并以其速度快,使用方便,成本低等优点,迅速得到了众多PC厂商和半导体厂商的大力支持,外设向USB过渡称为必然的趋势。

但如果主机PC不知道如何与USB外设通信,那么这个USB外设一点用处都没有,人机接口设备(HID)类是Windows完全支持的第一批USB设备类型中的一种。

在运行Windows98或更高版本的PC机上,应用程序可以使用操作系统内置的驱动与HID通信,但与HID通信不像打开一个端口,设定几个参数,然后就可以读写数据那么简单。

在应用程序能与HID交换数据之前,它先要找到设备,获取有关它的报告信息,为做到这些,应用程序必须通过访问通信API函数,使位于上层的应用程序与位于下层的设备驱动程序进行数据交换。

应用程序可以使用任何能访问API函数的编程语言,C++是一种能访问API函数的功能强大的语言,本文将在VisualC++6.0环境下编写与USB设备通信的Windows程序。

2 USB简介USB是由Intel,Compaq,Digital,IBM,Microsoft,NEC,Northern Telecom等七家世界著名的计算机和通信公司共同推出的新一代接口标准,全称为Universal Serial Bus(通用串行总线)。

PCAN USB API函数说明

PCAN  USB API函数说明

PCAN-Light API FunctionsThe PCAN-Light API provides the following functions for different programming languages: Basic functions valid for all hardware typesFunction DescriptionInit Non-Plug-and-Playhardware,Init Plug-and-Play hardware Initializes Non-Plug-and-Play hardware, sets the Baud rate. (初始化非-即插即用硬件,设置波特率)CloseCloses a previously initialized PCAN hardware.(关闭之前初始化的硬件)Write Transmits a CAN message.(发送CAN报文)ReadReads a CAN message from the receive queue.(从接收列表读取CAN报文)ReadEx Reads a CAN message from the receive queue and returns its reception time-stamp.(从接收列表读取CAN报文并显示报文接收时间标记)StatusGets the current status of a PCAN hardware.(获取当前硬件状态)VersionInfo Reads information about driver, driver version, and copyright information from the driver.(读取驱动程序版本和版权信息)DLLVersionInfoGets the version information of the used PCAN-Light DLL.(读取DLL版本信息)ResetClientResets the receive and transmit queues of the application.(重置程序的接收和发送列表)MsgFilter Configures the reception filter.(配置接收过滤器)ResetFilter Closes the reception filter. No more CAN messages will be received.(关闭接收滤波器)SetRcvEvent Sets the handle of the Receive-Event.(设置接收事件)Additional functions for PCAN-USB(针对PCAN-USB增加的函数)Function DescriptionSetUSBDeviceNr Sets the USB device number to a specified value.SetUSB2DeviceNr Sets the USB device number of a second PCAN-USB adapter to a specified value.GetUSBDeviceNr Fetches the device number of the USB hardware.GetUSB2DeviceNr Fetches the device number of a second PCAN-USB adapter.1、Close FunctionCloses a previously initialized PCAN hardware.(关闭之前初始化的硬件)SyntaxC / C++DWORD__stdcall CAN_Close();Return valuesCAN_ERR_OK, CAN_ERR_NOVXD2、DLLVersionInfo FunctionGets the version information of the used PCAN-Light DLL.(读取DLL版本信息)SyntaxC / C++DWORD__stdcall CAN_DLLVersionInfo(LPSTR TextBuff);ParametersTextBuff[Out] Pointer or reference to a text buffer. The returned text has a maximum length of 255 characters.【输出】(输出最大255个字符的文本)Return valuesCAN_ERR_OKRemarksThe DLLVersionInfo function is available since PCAN-Light version 2.0.3、Init Function (Plug-and-Play hardware)Initializes a Plug-and-Play hardware.(初始化非-即插即用硬件,设置波特率)SyntaxC / C++DWORD__stdcall CAN_Init(WORD wBTR0BTR1,int CANMsgType);ParametersBTR0BTR1[In] Baud rate initialisation. Valid Baud rate codes can be taken from the Baud rates table.【输入】(初始化波特率,有效波特率编码参考波特率定义表)CANMsgType[In] Defines the size of the CAN ID, 11 or 29 bits.【输入】定义CAN ID大小,11 or 29 bits。

EMBC1000-USB1553B-1 USB 接口 1553B 测试模块 使用说明书

EMBC1000-USB1553B-1 USB 接口 1553B 测试模块 使用说明书

EMBC1000-USB1553B-1 USB接口1553B测试模块使用说明书版本:V2.0珠海欧比特控制工程股份有限公司地址:广东省珠海市唐家东岸白沙路1号欧比特科技园邮编:519080 电话*************传真*************网址:前 言感谢您选择了珠海欧比特控制工程股份有限公司的产品:USB接口1553B测试模块,型号EMBC1000-USB1553B-1。

为了使您能尽快熟练地使用EMBC1000-USB1553B-1产品,随产品配备了内容详细的使用说明书,在您第一次安装和使用本产品时,请务必仔细阅读随产品配备光盘里的相关资料。

注:在使用本产品之前必须安装两个驱动,驱动程序在光盘的“:\DRIVER”文件夹下,详细的说明请参阅3.2章节。

本使用说明书中如有错误和疏漏之处,热切欢迎您的指正。

珠海欧比特控制工程股份有限公司- i -目录第一章概述 (1)1.1关于EMBC1000-USB1553B-1 (1)1.2应用 (2)1.3特点 (3)1.4建议的计算机配置 (4)1.5光盘资源 (5)1.6注意事项 (6)第二章 1553B总线网络 (7)2.1接口定义 (7)2.21553B电缆和连接器 (9)2.31553B网络 (10)第三章模块的安装 (11)3.1硬件安装 (11)3.2软件驱动安装 (11)3.3应用软件安装 (15)第四章应用软件操作 (21)4.1BC模式 (22)4.1.1 创建消息 (23)4.1.2 用创建好的消息组建帧 (24)4.1.2 BC参数设置 (25)4.1.3 BC运行 (26)4.2RT接收模式 (26)4.2.1 RT设置 (27)4.2.3 RT运行 (28)4.3RT发送模式 (29)4.3.1 RT设置 (29)4.3.2 RT消息设置 (30)4.3.3 RT运行 (31)4.4BM模式 (32)4.4.1 BM过滤选择 (33)4.4.2 BM参数设置 (33)4.4.3 BM运行 (34)第五章固件升级软件 (36)第六章开发应用软件 (37)6.1API库 (37)6.2函数说明 (38)6.3示例程序 (42)第七章产品维护和故障检修 (43)珠海欧比特控制工程股份有限公司- ii -7.1维护 (43)7.2故障检修 (43)附录A 产品装箱清单 (44)附录B 产品订购信息 (45)附录C 1553B总线介绍 (46)珠海欧比特控制工程股份有限公司- iii -第一章 概述1.1 关于EMBC1000-USB1553B-1图 1-1 EMBC1000-USB1553B-1模块实物图EMBC1000-USB1553B-1是一款基于USB接口形式的、具有标准MIL-STD-1553B 总线数据接口的模块,能让计算机方便的连接到MIL-STD-1553B总线上,实现MIL-STD-1553B总线协议的通讯模块,可广泛应用于航空电子中的系统、设备的搭建、维护、测试及故障检修等工作;同时,该模块也可为科研机构和高校开发、应用MIL-STD-1553B总线提供测试。

IC读卡器 DLL函数库参考手册

IC读卡器 DLL函数库参考手册

IC读卡器DLL函数库参考手册(USB接口)目录1. 函数说明 (3)1.1.S YSTEM F UNCTION (3)1.1.1. API_USBGetConnectedDeviceNum (3)1.1.2. API_USBOpenWithNum (3)1.1.3. API_USBCloseComm (3)1.1.4. API_USBControlLED (4)1.1.5. API_USBControlBuzzer (4)2. 附录 (5)2.1.API函数返回码(RETURN VALUE) (5)1.函数说明1.1.System Function1.1.1.API_USBGetConnectedDeviceNum功能查询一定连接,没有建立通讯的usb接口读卡器数量函数原型int __stdcall API_USBGetConnectedDeviceNum(void);描述输入参数:无输出参数:成功失败无返回值返回数为设备数减11.1.2.API_USBOpenWithNum功能打开usb设备函数原型int __stdcall API_USBOpenWithNum(HANDLE * hcomm,intdeviceIndex,WORD numInputBuffers);描述输入参数:deviceIndex :设备索引号,1台设备时,为0x00numInputBuffers=0x40输出参数:hcomm:设备句柄注:使用前可以用API_USBGetConnectedDeviceNum函数检测是否有设备返回值成功返回0, 否则返回非01.1.3.API_USBCloseComm功能关闭连接函数原型BOOL __stdcall API_USBCloseComm(HANDLE commHandle);描述输入参数:hcomm:设备句柄输出参数:无返回值成功返回TRUE, 否则返回flase1.1.4.API_USBControlLED功能控制LED灯函数原型int API_USBControlLED(HANDLE commHandle, int DeviceAddress,unsigned char freq, unsigned char duration, unsigned char *buffer)描述控制LED灯的工作状态(最多2个LED灯)输入参数:commHandle:端口句柄DeviceAddress :设备地址,1台设备时,为0x00,范围从0到255;freq:LED亮灯的时间(一般是20ms,最大值是50)duration:LED亮灯的次数输出参数:buffer:返回值注:使用前可以用API_USBGetConnectedDeviceNum函数检测是否有设备返回值成功返回0, 否则返回非01.1.5.API_USBControlBuzzer功能控制蜂鸣器函数原型int API_USBControlLED(HANDLE commHandle, int DeviceAddress,unsigned char freq, unsigned char duration, unsigned char *buffer)描述控制蜂鸣器的工作状态输入参数:commHandle:端口句柄DeviceAddress :设备地址,1台设备时,为0x00,范围从0到255;freq:蜂鸣器响铃的时长(一般是20ms,最大值是50)duration:蜂鸣器响铃的次数输出参数:buffer:返回值注:使用前可以用API_USBGetConnectedDeviceNum函数检测是否有设备返回值成功返回0, 否则返回非02.附录2.1.API函数返回码(return value)Return 描述0x00 表示命令执行成功0x02 表示接收数据长度不匹配0x03 表示串口发送失败0x04 表示串口未接到任何数据0x05 表示设备地址不匹配0x07 表示校验和不正确0x0A 表示输入参数有误,请参见不具体的函数说明。

python读取usb hid数据例程

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替换为您找到的设备的实际值。

基于VISUAL C#的USB接口通信程序设计

基于VISUAL C#的USB接口通信程序设计

摘要:详细介绍了usb接口的特点以及接口通信流程,研究在microsoft visual studio 2008环境下,运用visual c #调用windows api 函数方法进行usb接口通信程序设计的一般方法。

关键字:c#usb通信接口中图分类号:tp311.1 文献标识码:a 文章编号:1007-9416(2010)08-0090-021 hid、usb介绍hid(human interface device)类设备即人机接口设备,是usb设备类型中的一种,是直接与人交互的设备,如键盘、鼠标等。

hid类设备并不一定是标准的外设类型,只要交换的数据格式存储在报文的结构中,并且设备固件支持报文的格式,则任何工作在该限制之内的设备均可称为hid设备,如电压计、温度计、读卡器等。

hid设备与主机交换数据使用“报表”结构,报表格式富有弹性,可以处理任何类型的数据;一个报表可以使用多个事务,每笔事务可以携带小量和中量的数据,高速设备每笔事务最大是1024 b;主机定时轮询设备,设备可以为预期的时间传送信息给主机,hid设备除了传送数据给主机外,也会从主机接收数据。

usb协议定义和支持音频设备类、通信设备类、显示设备类、人机接口设备类(hid)和海量存储设备类等设备类型。

hid是windows完全支持的第一批usb设备类型,在运行win 98以上版本的pc机上,应用程序可以与使用操作系统内置驱动的hid类设备通信。

因此,基于hid类设计的usb设备易于设置和运行。

2 usb人机通信开发方法hid运行在windows98以上版本操作系统的pc机中,系统除了提供通用的usb设备的底层驱动以外,还单独提供了一些hid设备的完整驱动,应用程序可以很容易的与操作系统内部的hid通讯。

这样使得符合hid类的usb设备很容易开发与运行。

也就是说,我们如果想实现一个usb的hid类设备,不需要在windows下开发自己的驱动程序。

mfc 复位 usb设备函数

mfc 复位 usb设备函数

mfc 复位 usb设备函数MFC是一种基于微软Windows操作系统的编程框架,可以用于开发图形用户界面(GUI)应用程序。

在MFC中,复位USB设备是一个常见的需求,本文将重点介绍如何使用MFC编写复位USB设备的函数。

在MFC中,可以使用Windows提供的API函数来操作USB设备。

复位USB设备的函数主要涉及到以下几个步骤:1. 获取USB设备句柄:首先,我们需要通过设备路径或者设备ID 来获取USB设备的句柄。

设备路径可以通过Windows提供的设备管理器或者设备查找函数来获取。

设备ID可以通过设备管理器或者WMI接口来获取。

2. 打开USB设备:获取到USB设备句柄后,我们需要打开设备以便进行后续的操作。

可以使用Windows提供的CreateFile函数来打开设备。

在打开设备时,需要指定设备路径和访问权限。

3. 发送复位命令:打开设备后,我们可以使用设备句柄来发送复位命令。

复位命令的具体格式和内容需要根据USB设备的厂商和型号来确定,一般可以在设备的文档或者官方网站上找到相应的信息。

4. 关闭设备:复位命令发送完成后,我们需要关闭设备以释放资源。

可以使用Windows提供的CloseHandle函数来关闭设备。

下面是使用MFC编写复位USB设备函数的示例代码:```cpp// 复位USB设备函数BOOL ResetUSBDevice(LPCTSTR devicePath){// 获取USB设备句柄HANDLE hDevice = CreateFile(devicePath,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if (hDevice == INVALID_HANDLE_VALUE){// 打开设备失败return FALSE;}// 发送复位命令// TODO: 根据USB设备的具体要求发送复位命令// 关闭设备CloseHandle(hDevice);return TRUE;}```需要注意的是,上述代码中的复位命令部分需要根据实际情况进行修改。

linux libusb热拔插代码-概述说明以及解释

linux libusb热拔插代码-概述说明以及解释

linux libusb热拔插代码-概述说明以及解释1.引言1.1 概述概述部分旨在介绍本篇文章的主题和背景,为读者提供一个全面而简洁的理解。

本文将重点讨论Linux下libusb热拔插的代码实现,为读者提供有关如何在Linux系统中使用libusb库进行热插拔设备的操作的指导。

在这篇文章中,我们将深入探讨libusb的基本概念、原理和使用方法,以及如何使用libusb实现在Linux环境下热插拔设备的连接和断开。

热插拔技术是现代计算机技术中一个非常重要的概念,它允许用户在系统运行时插入和拔出硬件设备,而无需重新启动计算机。

这种灵活性和方便性使得热插拔回应了不断增长的计算需求和多设备管理的需求,使得我们不再受限于固定硬件的配置。

因此,了解和学习如何在Linux系统中使用libusb库实现热插拔设备的连接和断开对于应用开发人员和系统管理员来说是非常重要的。

在本文的后续部分,我们将首先对libusb进行简要介绍,包括其定义、核心功能和主要用途。

然后,我们将重点介绍热插拔技术的背景和原理,解释为什么热插拔设备的连接和断开是一个重要的技术问题,并探讨其对现代计算机系统的影响。

此外,我们将深入研究如何使用libusb库在Linux系统中实现热插拔设备的连接和断开。

我们将详细讨论libusb的主要API和函数,介绍如何编写代码来检测新设备的插入和拔出事件,并动态地与这些设备进行通信。

我们还将解释如何处理设备插入和拔出事件的错误情况,并提供一些实用的编程技巧和建议。

最后,在本文的结论部分,我们将简要总结我们讨论的主要观点和结果,并探讨libusb热插拔代码在未来的发展和应用前景。

我们将强调热插拔技术在计算机系统中的重要性,并指出可能的改进和扩展领域,鼓励读者进一步探索和研究。

通过对libusb热拔插代码的深入讨论和实践,本文旨在帮助读者更好地理解和应用Linux系统中的热插拔技术,为他们在开发和管理计算机系统时提供有价值的指导和建议。

pyusb常用函数及基础用法

pyusb常用函数及基础用法

pyusb常用函数及基础用法pyusb是Python的一个库,它允许用户在Python中进行USB设备的操作。

在使用pyusb之前,你需要了解USB设备的基本概念和通信协议。

USB设备分为不同类型,包括Host模式和Device模式。

pyusb支持这两种模式,但通常情况下,开发者更倾向于使用Device模式进行USB设备的操作。

一、pyusb的安装首先,你需要安装pyusb库。

可以通过pip命令来安装:```shellpipinstallpyusb```二、pyusb常用函数1.`open_device(vid,pid,**kwargs)`:这个函数用于打开一个USB设备。

需要提供设备的VendorID(vid)和ProductID(pid)。

`**kwargs`参数用于传递其他参数,如设备名、设备路径等。

2.`close_device()`:这个函数用于关闭已经打开的USB设备。

在完成对USB 设备的操作后,应该及时关闭设备。

3.`read(b,timeout=None)`:这个函数用于从USB设备读取数据。

`b`参数表示要读取的数据缓冲区,`timeout`参数表示读取超时时间(以秒为单位)。

4.`write(b,timeout=None)`:这个函数用于向USB设备写入数据。

`b`参数表示要写入的数据缓冲区,`timeout`参数表示写入超时时间(以秒为单位)。

5.`control_msg(msg,timeout=None)`:这个函数用于发送控制消息到USB设备。

`msg`参数是一个包含请求代码、请求枚举、缓冲区、数据长度的元组。

6.`detach_kernel_driver(dev,det_func)`:这个函数用于卸载USB设备的内核驱动。

在某些情况下,需要卸载内核驱动才能进行设备操作。

`dev`参数是要操作设备的句柄,`det_func`参数是一个回调函数,当卸载驱动成功时调用该函数。

libusb介绍

libusb介绍

libusb介绍⼀libusb 介绍libusb 设计了⼀系列的外部API 为应⽤程序所调⽤,通过这些API应⽤程序可以操作硬件,从libusb的源代码可以看出,这些API 调⽤了内核的底层接⼝,和kernel driver中所⽤到的函数所实现的功能差不多,只是libusb更加接近USB 规范。

使得libusb的使⽤也⽐开发内核驱动相对容易的多。

Libusb 的编译安装请查看Readme,这⾥不做详解⼆libusb 的外部接⼝2.1 初始化设备接⼝这些接⼝也可以称为核⼼函数,它们主要⽤来初始化并寻找相关设备。

usb_init函数定义:void usb_init(void);从函数名称可以看出这个函数是⽤来初始化相关数据的,这个函数⼤家只要记住必须调⽤就⾏了,⽽且是⼀开始就要调⽤的.usb_find_busses函数定义:int usb_find_busses(void);寻找系统上的usb总线,任何usb设备都通过usb总线和计算机总线通信。

进⽽和其他设备通信。

此函数返回总线数。

usb_find_devices函数定义:int usb_find_devices(void);寻找总线上的usb设备,这个函数必要在调⽤usb_find_busses()后使⽤。

以上的三个函数都是⼀开始就要⽤到的,此函数返回设备数量。

usb_get_busses函数定义:struct usb_bus *usb_get_busses(void);这个函数返回总线的列表,在⾼⼀些的版本中已经⽤不到了,这在下⾯的实例中会有讲解2.2 操作设备接⼝usb_open函数定义: usb_dev_handle *usb_open(struct *usb_device dev);打开要使⽤的设备,在对硬件进⾏操作前必须要调⽤usb_open 来打开设备,这⾥⼤家看到有两个结构体usb_dev_handle 和usb_device 是我们在开发中经常碰到的,有必要把它们的结构看⼀看。

C#实现USB接口的程序代码

C#实现USB接口的程序代码
Console.WriteLine("从U盘读出文件"); } public void InputFile() {
Console.WriteLine("往U盘写入文件"); } public void Dispose() {
Console.WriteLine("U盘已被拔出"); } }
//移动硬盘 public class MDisk : USB {
public MDisk() {
Console.WriteLine("移动硬盘准备就绪..."); } public void OutputFile() {
Console.WriteLine("从移动硬盘读出文件"); }
} public void InputFile() {
Console.WriteLine("往移动硬盘写入文件"); } public void Dispose() {
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
C#实现 USB接口的程序代码
C#实现USB接口的程序代码.
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
USB usb; usb = new UDisk();//插入U盘 usb.OutputFile();//从U盘读出文件 usb.InputFile();//往U盘写入文件 usb.Dispose();//拔出U盘 Console.WriteLine(""); usb = new MDisk();//插入移动硬盘 usb.OutputFile();//从移动硬盘读出文件 usb.InputFile();//往移动硬盘写入文件 usb.Dispose();//拔出移动硬盘 Console.WriteLine(""); usb = new MP4();//插入MP4 usb.OutputFile();//从MP4读出文件 usb.InputFile();//往MP4写入文件 usb.Dispose();//拔出MP4 Console.ReadKey(); }

webusb api的open方法

webusb api的open方法

webusb api的open方法WebUSB API的open方法是WebUSB API中的一个重要方法,它允许网站与通过USB连接的设备进行通信。

本文将详细介绍WebUSB API 的open方法的功能和使用方法。

让我们来了解一下WebUSB API。

WebUSB API是一种新的Web技术,它允许网站通过USB接口与用户的设备进行通信。

这包括连接到计算机的打印机、扫描仪、摄像头等各种外部设备。

通过WebUSB API,网站可以直接访问这些设备,而不需要安装任何驱动程序或插件。

这为Web应用程序提供了更广阔的应用场景,例如直接在网页上打印文档或操作摄像头拍摄照片。

在WebUSB API中,open方法是与设备建立连接的关键步骤。

通过open方法,网站可以获取设备的句柄,进而进行数据的读写操作。

open方法的语法如下:```b.requestDevice({ filters: [...] }).then(device => device.open()).then(() => {// 连接成功后的操作}).catch(error => {// 连接失败后的处理});```通过b.requestDevice方法可以弹出一个对话框,列出了满足指定过滤条件的USB设备。

用户可以从列表中选择一个设备进行操作。

然后,通过.then方法可以获取到选中设备的对象,通过调用open方法,可以建立与设备的连接。

如果连接成功,接下来的操作将在.then回调函数中执行;如果连接失败,将会在.catch回调函数中处理错误。

在open方法成功连接设备后,我们就可以使用其他方法进行数据的读写操作。

例如,可以使用device.claimInterface方法来声明要使用的接口,然后使用device.transferIn和device.transferOut 方法进行数据的发送和接收。

这些方法的详细使用方式可以参考WebUSB API的官方文档。

VB中用API调用USB驱动

VB中用API调用USB驱动

VB中用API调用USB驱动一、引言本文介绍了USB设备中的人机接口,HID设备与主机通信的要点与方式。

详细讲解了在VB中调用相关APl函数的方法,并介绍了一种基于USB总线的数据采集系统的设计方案及开发方法,采用的是USB2.0协议。

该系统主要是从设备的角度描述了人机接口设备通信,以及用来与主机进行数据交换的报告格式。

应用程序可以使用任何能访问API函数的编程语言,调用窗口函数并与USB设备实现通信。

掌握USB设备与计算机通讯规程,实现USB设备的自动识别。

为数据采集系统与计算机之间的通讯开辟了新的道路。

这几年,随着大量支持USB的个人电脑的普及,USB逐步成为PC机的标准接口已经是大势所趋了。

在主机(host)端,最新推出的PC机几乎100%支持USB;而在外设(device)端,使用USB接口的设备也与日俱增,例如数码相机、扫描仪、游戏杆、磁带和软驱、图像设备、打印机、键盘、鼠标等。

二、Windows系统选择USB驱动的过程当Windows检测到一个新的USB外设时,必须做的一件事情是找出应该使用哪个设备驱动应用软件来与设备通信,然后载入选定的驱动。

这是Windows 设备管理器的工作,设备管理器使用类、设备安装器和INF文件来找到这个匹配。

INF文件是一个文本文件,其中包括有利于Windows识别设备的信息。

文件告诉Win-dows要使用什么驱动、注册表里存储什么信息等。

三、Visual Basic与USB设备通信的设计与实现使用VB语言访问串行通信接口的方法。

Windows在底层实现了和串行通信有关的很多复杂的工作,给程序员提供了一个相对比较容易掌握的编程接口。

例如Windows自动将所有接收到的字符放到接收缓冲区中,而所有发送的字符也都进入发送缓冲区。

只要程序空闲,程序就可以读取接收缓冲区获得数据,或者向发送缓冲区发送数据。

1.主机寻找USB设备的过程第一个被Windows支持的USB外围设备类是人机接口设备。

PCAN USB API函数说明

PCAN  USB API函数说明

PCAN-Light API FunctionsThe PCAN-Light API provides the following functions for different programming languages: Basic functions valid for all hardware typesFunction DescriptionInit Non-Plug-and-Playhardware,Init Plug-and-Play hardware Initializes Non-Plug-and-Play hardware, sets the Baud rate. (初始化非-即插即用硬件,设置波特率)CloseCloses a previously initialized PCAN hardware.(关闭之前初始化的硬件)Write Transmits a CAN message.(发送CAN报文)ReadReads a CAN message from the receive queue.(从接收列表读取CAN报文)ReadEx Reads a CAN message from the receive queue and returns its reception time-stamp.(从接收列表读取CAN报文并显示报文接收时间标记)StatusGets the current status of a PCAN hardware.(获取当前硬件状态)VersionInfo Reads information about driver, driver version, and copyright information from the driver.(读取驱动程序版本和版权信息)DLLVersionInfoGets the version information of the used PCAN-Light DLL.(读取DLL版本信息)ResetClientResets the receive and transmit queues of the application.(重置程序的接收和发送列表)MsgFilter Configures the reception filter.(配置接收过滤器)ResetFilter Closes the reception filter. No more CAN messages will be received.(关闭接收滤波器)SetRcvEvent Sets the handle of the Receive-Event.(设置接收事件)Additional functions for PCAN-USB(针对PCAN-USB增加的函数)Function DescriptionSetUSBDeviceNr Sets the USB device number to a specified value.SetUSB2DeviceNr Sets the USB device number of a second PCAN-USB adapter to a specified value.GetUSBDeviceNr Fetches the device number of the USB hardware.GetUSB2DeviceNr Fetches the device number of a second PCAN-USB adapter.1、Close FunctionCloses a previously initialized PCAN hardware.(关闭之前初始化的硬件)SyntaxC / C++DWORD__stdcall CAN_Close();Return valuesCAN_ERR_OK, CAN_ERR_NOVXD2、DLLVersionInfo FunctionGets the version information of the used PCAN-Light DLL.(读取DLL版本信息)SyntaxC / C++DWORD__stdcall CAN_DLLVersionInfo(LPSTR TextBuff);ParametersTextBuff[Out] Pointer or reference to a text buffer. The returned text has a maximum length of 255 characters.【输出】(输出最大255个字符的文本)Return valuesCAN_ERR_OKRemarksThe DLLVersionInfo function is available since PCAN-Light version 2.0.3、Init Function (Plug-and-Play hardware)Initializes a Plug-and-Play hardware.(初始化非-即插即用硬件,设置波特率)SyntaxC / C++DWORD__stdcall CAN_Init(WORD wBTR0BTR1,int CANMsgType);ParametersBTR0BTR1[In] Baud rate initialisation. Valid Baud rate codes can be taken from the Baud rates table.【输入】(初始化波特率,有效波特率编码参考波特率定义表)CANMsgType[In] Defines the size of the CAN ID, 11 or 29 bits.【输入】定义CAN ID大小,11 or 29 bits。

Ginkgo USB-I2C适配器接口函数库使用手册 V2.0

Ginkgo USB-I2C适配器接口函数库使用手册 V2.0

uint16_t
tLOW;
uint16_t
tHIGH;
uint16_t
tSU_DAT;
uint16_t
tSU_STO;
uint16_t
tDH;
uint16_t
tDH_DAT;
uint16_t
tAA;
uint16_t
tR;
uint16_t
tF;
uint16_t
tBuf;
uint8_t
tACK[4];
uint16_t
时钟高电平时间,单位为微秒,该参数影响时钟输出频率大小。 tSU_DAT
数据输入建立时间,单位为微秒。 tSU_STO
停止信号建立时间,单位为微秒。 tDH
数据输出保持时间,单位为微秒。 tDH_DAT
数据输入保持时间,单位为微秒。 tAA
SCL 变低至 SDA 数据输出及应答信号,单位为微秒。 tR
typedef struct _VII_INIT_CONFIG{
uint8_t
MasterMode;
uint8_t
ControlMode;
uint8_t
AddrType;
uint8_t
SubAddrWidth;
uint16_t Addr;
uint32_t ClockSpeed;
}VII_INIT_CONFIG,*PVII_INIT_CONFIG;
3 函数库中数据结构定义
3.1 VII_BOARD_INFO
描述
VII_BOARD_INFO 结构体包含 Ginkgo USB-I2C 系列适配器的设备信息,结构体将在
VII_ReadBoardInfo 函数中被填充。
typedef struct _VII_BOARD_INFO{

libusb函数

libusb函数

libusb函数⼀、libusb常⽤数据结构libusb_device *list:设备列表libusb_device_handle *handle:设备句柄struct libusb_device_descriptor desc:设备描述符struct libusb_config_descriptor conf:配置描述符⼆、libusb常⽤API函数1 会话的开启和结束int libusb_init(libusb_context **ctx);void libusb_exit(libusb_context *ctx);2 设备列表的获取和释放ssize_t libusb_get_device_list(libusb_context *ctx, libusb_device ***list);void libusb_free_device_list(libusb_device **list, int unref_devices);3 设备的打开和关闭int libusb_open(libusb_device *dev, libusb_device_handle **dev_handle);libusb_device_handle *libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id, uint16_t product_id);void libusb_close(libusb_device_handle *dev_handle);4 描述符的获取和释放int libusb_get_device_descriptor(libusb_device *dev, struct libusb_device_descriptor *desc);int libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index, struct libusb_config_descriptor **config);void libusb_free_config_descriptor(struct libusb_config_descriptor *config);5 接⼝int libusb_claim_interface(libusb_device_handle *dev_handle, int interface_number);int libusb_release_interface(libusb_device_handle *dev_handle, int interface_number);6 传输⽅式:Control、Interrupt、Bulkint libusb_control_transfer(libusb_device_handle *dev_handle, uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout);int libusb_interrupt_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *actual_length, unsigned int timeout);int libusb_bulk_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int*actual_length, unsigned int timeout);7 内核设备int libusb_kernel_driver_active(libusb_device_handle *dev_handle, int interface_number);int libusb_attach_kernel_driver(libusb_device_handle *dev_handle, int interface_number);int libusb_detach_kernel_driver(libusb_device_handle *dev_handle, int interface_number);int libusb_set_auto_detach_kernel_driver(libusb_device_handle *dev_handle, int enable);8 热插拔int libusb_hotplug_register_callback(libusb_context *ctx, libusb_hotplug_event events, libusb_hotplug_flag flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *callback_handle);void libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle callback_handle);9 其他uint8_t libusb_get_bus_number(libusb_device *dev); //获取USB设备总线号uint8_t libusb_get_port_number(libusb_device *dev);uint8_t libusb_get_device_address(libusb_device *dev); //获取USB设备端⼝号int libusb_get_device_speed(libusb_device *dev);int libusb_get_max_packet_size(libusb_device *dev, unsigned char endpoint);int libusb_reset_device(libusb_device_handle *dev_handle);int libusb_has_capability(uint32_t capability);......使⽤时记得安装:sudo apt-get install libusb-devsudo apt-get install libusb-1.0-0-devlibusb函数介绍1 libusb_init函数原型:int libusb_init(libusb_context **ctx);功能说明:该函数进⾏libusb的初始化,必须最先调⽤。

usb代码

usb代码

枚举设备,再打开设备。

我这有一段代码,可以参考一下,网上也可以搜得到。

USB设备有很多种,要与USB设备通信,就要先获取你的USB设备类的GUID标识,然后再根据GUID来枚举该类的设备。

,然后从中找到你的设备。

要与USB设备通信,还得先安装DDK,把相应的头文件和库包含进去。

//获取本系统中HID类的GUID标识HidD_GetHidGuid(&HidGuid);HDEVINFO hDevInfo;HANDLE// 准备查找符合HID规范的USB设备hDevInfo=SetupDiGetClassDevs(&HidGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);if (hDevInfo == INV ALID_HANDLE_V ALUE){MessageBox("符合HID规范的USB设备发生错误");SetupDiDestroyDeviceInfoList(hDevInfo);return false;}DWORD MemberIndex = 0;BOOL bSuccess = false;SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);do{bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo, //已安装的HID设备的信息集的句柄NULL,&HidGuid, //HID类设备的GUIDMemberIndex, //起始索引号,函数会自动增加&DeviceInterfaceData); //用以保存单个设备的信息if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS)){//if(MemberIndex == 0)// MessageBox("抱歉,未找到可用的USB HID设备!");//else//MessageBox("没有更多的可用的USB HID设备!");SetupDiDestroyDeviceInfoList(hDevInfo);hHidHandle=NULL;bIsHIDCon=false;return false;}//若找到了一个USB设备,则获取该设备的细节信息PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData;DWORD Length = 0;SetupDiGetDeviceInterfaceDetail(hDevInfo,&DeviceInterfaceData,NULL,0,&Length,NULL);pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length); pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //MUST BE!!!if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&DeviceInterfaceData,pDeviceInterfaceDetailData,Length,NULL,NULL)){MessageBox("查找路径设备时出错!");DisplayError();free(pDeviceInterfaceDetailData);SetupDiDestroyDeviceInfoList(hDevInfo);}else//先以查询的方式打开设备句柄hHidHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,0, //0为查询方式,GENERIC_READ | GENERIC_WRITE为读写FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if (hHidHandle == INV ALID_HANDLE_V ALUE){MessageBox("无法打开设备");DisplayError();free(pDeviceInterfaceDetailData);SetupDiDestroyDeviceInfoList(hDevInfo);return false;}else{HIDD_ATTRIBUTES Attributes;HidD_GetAttributes(hHidHandle,&Attributes);//将有关该设备的标识显示出来HIDP_CAPS hidPCaps;if (Attributes.VendorID == V endorID && Attributes.ProductID == ProductID) {//获取设备的权能信息Capabilities.PHIDP_PREPARSED_DATA pHidpPreparsedData;/*****************************************************API函数: HidD_GetPreparsedData返回: 一个指向缓存区指针,该缓存区包含有设备的权能信息条件: 由CreateFile返回的句柄.不需要直接访问缓存区,但HidP_GetCaps和其它API函数需要一个.********************************************************/if (!HidD_GetPreparsedData(hHidHandle,&pHidpPreparsedData)){MessageBox("获取HID PREPARED DATA 失败!");MessageBox("获取HID 错误!");DisplayError();free(pDeviceInterfaceDetailData);SetupDiDestroyDeviceInfoList(hDevInfo);return false;}NTSTATUS status = HidP_GetCaps(pHidpPreparsedData,&hidPCaps);if (status == HIDP_STA TUS_SUCCESS){//以UsagePage和Usage ID判断,这个需要先定出来if( agePage==UsagePage && age==UsageID ) {//找到设备后则以读写的方式打开以进行操作CloseHandle(hHidHandle);hHidHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,GENERIC_READ | GENERIC_WRITE, //0为查询方式,GENERIC_READ | GENERIC_WRITE为读写FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);strHIDPath=pDeviceInterfaceDetailData->DevicePath;/*此处进行操作*/free(pDeviceInterfaceDetailData);SetupDiDestroyDeviceInfoList(hDevInfo);return true;}}}//释放句柄资源CloseHandle(hHidHandle);}MemberIndex++;} while(bSuccess);。

musbdeviceconnection claiminterface函数

musbdeviceconnection claiminterface函数

musbdeviceconnection claiminterface函数详解在嵌入式系统中,`musbdeviceconnection` 和`claiminterface` 函数通常与USB 设备交互有关,尤其是在使用MUSB(Mentor Universal Serial Bus)控制器时。

这些函数的功能涉及到USB 设备的接口声明和控制。

以下是关于`musbdeviceconnection` 和`claiminterface` 函数的一些基本解释:`musbdeviceconnection` 函数`musbdeviceconnection` 函数通常用于创建一个到USB 设备的连接。

这个函数可能包括以下参数:-设备句柄(Device Handle):指向表示USB 设备的结构体或对象的指针。

-接口号(Interface Number):表示要连接的USB 设备接口的编号。

-其他参数:具体取决于实际使用的库或框架。

这个函数的作用是建立应用程序与USB 设备之间的连接,以便进行后续的通信。

`claiminterface` 函数`claiminterface` 函数用于声明USB 设备的接口,以便应用程序可以与该接口进行通信。

在USB 设备上可能存在多个接口,而`claiminterface` 函数用于选择并声明特定的接口。

该函数可能包括以下参数:-设备句柄(Device Handle):表示USB 设备的结构体或对象的指针。

-接口号(Interface Number):表示要声明的USB 设备接口的编号。

-其他参数:具体取决于实际使用的库或框架。

声明接口后,应用程序就可以使用相应的接口进行数据传输和通信。

使用示例(伪代码)以下是一个伪代码示例,演示了如何使用`musbdeviceconnection` 和`claiminterface` 函数:```c#include "usb_library.h" // 你实际使用的USB 库的头文件// 初始化USB 库usb_init();// 获取USB 设备句柄usb_device_handle_t device_handle = musbdeviceconnection(...);// 声明并选择要使用的接口int interface_number = 1;claiminterface(device_handle, interface_number);// 使用声明的接口进行数据传输// ...// 关闭USB 连接usb_close(device_handle);```请注意,上述示例中的函数和参数名称是伪代码,实际使用时需要根据你使用的具体USB 库进行调整。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//直接从.c文件复制黏贴过来的,要用自己再把下面的代码另存份.c的.#define BYTE unsigned char//**************************************************// 基本定义函数//**************************************************BYTE FIFO_RD_CHECK(BYTE num){BYTE FIFO_FLAG=0;UCC|=num;//选择Endpoint,0,1,2,3,4,MISC&=0xf8;//低3位置0MISC|=0X00;//TX位置0;Delay_3us();MISC|=0X01;//Set RequestDelay_28us();if(MISC&0X40!=0) FIFO_FLAG=0x0f;//READYif(MISC&0x80!=0) FIF0_FLAG&=0xf0;//Len0 DetectedMISC&=0xfe;//clear REQreturn FIFO_FLAG;}BYTE FIFO_WR_CHECK(BYTE num){BYTE FIFO_FLAG=0;//后4位表示Ready位,前四位表示Len0位的状态是否有被设置UCC|=num;//选择Endpoint,0,1,2,3,4,MISC&=0xf8;//低3位置0MISC|=0X02;//TX位置0;Delay_3us();MISC|=0X01;//Set RequestDelay_28us();if(MISC&0X40!=0) FIFO_FLAG=0x0f;//READYif(MISC&0x80!=0) FIF0_FLAG&=0xf0;//Len0 DetectedMISC&=0xfe;//clear REQreturn FIFO_FLAG;}void Read_FIFO(BYTE *Fifo_Addr,BYTE Fifo_Size,BYTE *buffer){int i=0;MISC|=0x01;//Set Requestfor(i=0;i<Fifo_Size;i++){buffer[i]=Fifo_Addr[0];//从FIFO地址取值Delay_28us();if(MISC&0x40==0) break;//Not Ready}MISC^=0X02;//改变TX位状态Delay_3us();MISC&=0XFE;//Clear Request}void Write_FIFO(BYTE *Fifo_Addr,BYTE SendLenth,BYTE *buffer){int i=0;MISC|=0X01;//Set Requestfor(i=0;i<SendLenth;i++){Fifo_Addr[0]=buffer[i];//将要发送的数据放至相应的Fifo中Delay_28us();if(MISC&0x40==0) break;//Not Ready}MISC^=0X02;//改变TX位状态Delay_3us();MISC&=0XFE;//Clear Request}BOOL Check_Real_Cmd(){BYTE bFlag_Real_Cmd=FALSE;if(MISC&0X20!=0) bFlag_Real_Cmd=TRUE;if(MISC&0X80!=0) bFlag_Real_Cmd=TRUE;return bFlag_Real_Cmd;}void Send_hand(){BOOL IsRealCmd,Status_Flag;while(1){IsRealCmd=Check_Real_Cmd();if(IsRealCmd==TRUE)return;else{Status_Flag=FIFO_WR_CHECK(0);if(Status_Flag&0x0f!=0)//Fifo_Readybreak;elsecontinue;}}MISC|=0x01;//Set RequsetMISC^=0X02;//改变TX位状态Delay_3us();MISC&=0XFE;//Clear Request}void control_read(WORD *rom_dataptr,BYTE *buffer)//从中读取数据,{ //rom_dataptr是全局的在其他函数中赋值改变BYTE temp,i=0;if(buffer[7]!=0) //FIFO_WLENGTHHreturn;if(buffer[6]==0) //FIFO_WLENGTHLreturn;if(buffer[6]>data_start[0])//请求的数据超出ROM数据return;data_count=buffer[6];if(MISC&0x40!=0)//是控制指令return;if(data_count==0){Send_Hand_Shake();return;}//开始真正的control_readwhile(1){if(bFlag_RD_HTable==0)//Read Low Byte{bFlag_RD_HTable=1;buffer[i]=(BYTE )*rom_dataptr;//取其低位i++;data_count--;//全局变量,要发送的总长度if(data_count<=1)break;if(i+1==8)//FIFO_size=8break;}else//Read Hight Byte{bFlag_RD_HTable=0;buffer[i]=(BYTE )(*rom_dataptr)>>8;//取其高位rom_dataptr++;//将ROM指针前移if(buffer[i]==0x3f)continue;else{i++;if(data_count<=1)break;if(i+1==8)break;}}}//填充完毕,结束循环,开始向FIFO发送数据while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready}Write_FIFO(Fifo_0_Addr,0x02,buffer);}//**************************************************// SetAddress(): 重新设定Endpoint地址函数//**************************************************void SetAddress(BYTE *buffer){BYTE Dev_Addr;Dev_Addr=buffer[2]//FIFO_OUT3,FIFO_WVALUELSIES|=0x01;//主机从设备读操作后将更新在AWR中的地址,否则为0则立即更新Dev_Addr&=0XFE;USB_AWR=Dev_Addr;Send_Hand_Shake();}//**************************************************// SetConfiguration(): 设置配置函数//**************************************************void SetConfiguration(BYTE *buffer,BYTE *USB_Configuration){USVC|=0x80;PGA_CTRL|=0x80;*USB_Configuration=buffer[2];//FIFO_WVALUELSTALL&=0x00;//设置好以上的寄存器Send_Hand_Shake();}//**************************************************// ClearFeature(): 清徐Feature函数//************************************************** void ClearFeature(BYTE *buffer){BYTE temp;temp=buffer[2];//FIFO_wValueLif(temp=0x01){Send_Hand_Shake();}elseSTALL0|=0x01;//SendStall0();}void ClearFeature_Endpoint(BYTE *buffer){BYTE temp;temp=buffer[4];//FIFO_wIndexLif(bFlag_SetConfiguration_Ready==TRUE);//表明已经配置过了temp=GetPipeBit(temp);//获取对应位temp=~temp;//取反STALL=temp&STALL;//与STALL寄存器相与,将需要的位置0Send_Hand_Shake();}//**************************************************// SetFeature(): 设置Feature函数// 包括Endpoint部分//************************************************** void SetFeature(BYTE *buffer){BYTE FIFO_wValueL=buffer[2];BYTE FIFO_wValueH=buffer[3];if(FIFO_wValueH==0x00){if(FIFO_wValueL==0x01){Send_Hand_Shake();}elseSTALL0|=0x01;//SendStall0();}else if(FIFO_wValueH>=0X81<=0X84){if(FIFO_wValueL==0x00){Send_Hand_Shake();}elseSTALL0|=0x01;//SendStall0();}else STALL0|=0x01;//SendStall0();}void SetFeature_Endpoint(BYTE *buffer){BYTE temp;temp=buffer[4];//FIFO_wIndexLif(bFlag_SetConfiguration_Ready!=TRUE)return;//有没有被SetConfiguration()设置temp&=0x7f;temp=GetPipeBit(temp);//获取对应位STALL=temp|STALL;//将指定的Enpoint置1Send_Hand_Shake();}//**************************************************// SetInterface(): 设置Interface函数////**************************************************BOOL SetInterface(BYTE *buffer,BYTE *USB_Interface_Alt,BYTE *USB_Interface) {*USB_Interface_Alt=buffer[2];//FIFO_WVALUEL*USB_Interface=buffer[4];//FIFO_WINDEXLPA|=0X01;//Set PA.0Send_Hand_Shake();return TRUE;}//**************************************************// GetDescriptor(): 获取Descriptor// 描述的函数//************************************************** void GetDescriptor(BYTE *buffer){BYTE FIFO_WvalueH=buffer[3];BYTE FIFO_wIndexL=buffer[4];switch(FIFO_WvalueH){case 01://device, 80 06 00 01GetDeviceDescriptor();return;case 02://configurationDescriptor 80 06 00 02GetConfigurationDescriptor();return;case 03://string,80 06 00 03GetStringDescriptor();default:break;}//**********************************//****Then test for HID class Descriptor//***********************************if(FIFO_wIndexL==0x03)//Check Interface 3,被配置为HID {switch(FIFO_WvalueH){case 22://report,81 06 00 22GetReportDescriptor();break;case 21://HID,81 06 00 21GetHIDDescriptor();break;default:STALL0|=0x01;//SendStall0();//无法解析的情况break;}}elseSTALL0|=0x01;//SendStall0();//无法解析的情况}void GetDeviceDescriptor(BYTE *buffer){BYTE data_count;BYTE *data_start;data_count=device_desc_table[0];//低字节存放长度data_start=device_desc_table;}//**************************************************// GetStatus(): 设置USB状态的函数// 包括Endpoint部分//**************************************************void GetStatus(BYTE *buffer){BYTE FIFO_SendLen=0X02;buffer[0]=0x00;buffer[1]=0x01;while(1){if(Check_Real_Cmd()==TRUE) break;//估计是Len0=1,结束会话if(FIFO_WR_CHECK(0)==FALSE) continue;}Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}GetStatus_Endpoint(BYTE *buffer){BYTE FIFO_SendLen=0X02;BYTE temp;temp=buffer[4];//FIFO_wIndexL,表示要检测的Endpoint号temp&=0x7f;temp=GetPipeBit(temp);//获取位数如:0000 00101B => 0010 0000B if(temp&STALL==TRUE)//要检测的位置1buffer[0]=1;else buffer[0]=0;buffer[1]=0;while(1){if(Check_Real_Cmd()==TRUE) break;//估计是Len0=1,结束会话if(FIFO_WR_CHECK(0)==FALSE) continue;}Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}//**************************************************// GetConfiguration(): 设置配置的函数////************************************************** void GetConfiguration(BYTE *buffer,BYTE USB_Configuration) {BYTE FIFO_SendLen;buffer[0]=USB_Configuration;FIFO_SendLen=0x01;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0x0f!=0)//Fifo Readybreak;}Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}//************************************************** // GetInterface(): 获取Interface接口的函数////************************************************** void GetInterface(BYTE USB_Interface_Alt,BYTE *buffer){BYTE FIFO_SendLen;buffer[0]=USB_Interface_Alt;FIFO_SendLen=0x01;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer)}//************************************************** // SetReport(): 设置Report的函数////************************************************** BYTE SetReport(BYTE *buffer){BYTE FIFO_wValueH=buffer[3];BYTE nCmdIndex1;if(FIFO_wValueH==0x02)//set_output_report{if(buffer[4]!=0x03)//check interface{STALL|=0x01;//ENPOINT0 Errorreturn;}if(buffer[6]!=0x08)//FIFO_wLengthL,check length{STALL|=0x01;//ENPOINT0 Errorreturn;}nCmdIndex1=0x21;}return nCmdIndex1;//返回命令索引号}//**************************************************// SetCur(): 设置当前信息的函数// 包括VolumeControl,MuteControl//**************************************************void SetCur(BYTE *buffer)//;21 01{if(buffer[3]==0x01)//MUTE_CONTROLMuteControl();else if(buffer[3]==0x02)//VOLUME_CONTROLVolumeControl();elseSTALL0|=0x01;}BYTE MuteControl(BYTE *buffer) //21 01 00 01,if have more feature , the state must be modify!! {BYTE nCmdIndex1;if(buffer[5]==0x02)//FIFO_wIndexH,MuteControl_SetSpeaker();{nCmdIndex1=0x18;return nCmdIndex1;}else if(buffer[5]==0x06)//MuteControl_SetMic();{nCmdIndex1=0x19;return nCmdIndex1;}}BYTE VolumeControl(BYTE *buffer){BYTE nCmdIndex1;if(buffer[5]==0x02)//FIFO_wIndexH,VolumeControl_SetSpeaker() {nCmdIndex1=0x28;return nCmdIndex1;}else ifbuffer[5]==0x06){nCmdIndex1=0x29;return nCmdIndex1;}}//**************************************************// GetMin(): 获取各种最小信息的函数// 包括GetMin_SetSpeaker,GetMin_SetMic//**************************************************void GetMin(BYTE *buffer){if(buffer[5]==0x02)//FIFO_wIndexHGetMin_SetSpeaker();else if(buffer[5]==0x06)GetMin_SetMic();elseSTALL|=0X01;}void GetMin_SetSpeaker(BYTE *buffer){buffer[0]=0x00;buffer[1]=0xe0;//Min_Volumewhile(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}void GetMin_SetMic(BYTE *buffer){buffer[0]=0x00;buffer[1]=0x00;//MIC_Min_Volumewhile(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}//************************************************** // GetMax(): 获取各种最大信息的函数// 包括Speaker,Mic//************************************************** void GetMax(BYTE *buffer){if(buffer[5]==0x02)//FIFO_wIndexHGetMax_SetSpeaker();else if(buffer[5]==0x06)GetMax_SetMic();elseSTALL0|=0x01;}void GetMax_SetSpeaker(BYTE *buffer){buffer[0]=0x00;buffer[1]=0x0c;//Max_Volumewhile(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}void GetMax_SetMic(BYTE *buffer){buffer[0]=0x00;buffer[1]=0x0c;//MIC_Max_Volumewhile(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}//************************************************** // GetRes():////************************************************** void GetRes(BYTE *buffer){buffer[0]=0x00;buffer[1]=0x01;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}//************************************************** // GetCur():////************************************************** void GetCur(BYTE *buffer){BYTE FIFO_wLengthL=buffer[6];BYTE FIFO_wIndexH=buffer[5];BYTE FIFO_SendLen;FIFO_SendLen=FIFO_wLengthL;if(FIFO_SendLen==0x01)GetCurMute();else if(FIFO_SendLen==0x02)GetCur_Volume();elseSTALL|=0x01;}void GetCur_Mute(BYTE *buffer){if(FIFO_wIndexH==0x02)GetCur_Mute_Speaker();else if(FIFO_wIndexH==0x06)GetCur_Mute_Mic();elseSTALL|=0x01;}void GetCur_Mute_Mic(BYTE *buffer){if(bFlag_Mic_Mute==TRUE)buffer[0]=0x01;elsebuffer[0]=0x00;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO0_WR_CHECK()&0x0f==0) continue;//未准备好elsebreak;}Write_FIFO(Fifo_0_Addr,0x01,buffer);}void GetCur_Mute_Speaker(BYTE *buffer){if(bFlag_Audio_Mute==TRUE)buffer[0]=0x01;elsebuffer[0]=0x00;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO0_WR_CHECK()&0x0f==0) continue;//未准备好elsebreak;}Write_FIFO(Fifo_0_Addr,0x01,buffer);}void GetCur_Volume(BYTE *buffer){if(buffer[5]==0x02)//FIFO_wIndexHGetCur_Volume_Speaker();else if(buffer[5]==0x06)GetCur_Volume_Mic();elseSTALL|=0x01;}void GetCur_Volume_Mic(BYTE *buffer){buffer[0]=0x00;buffer[1]=PGA_CTRL&0x3f;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO0_WR_CHECK()&0x0f==0) continue;//未准备好else break;}Write_FIFO(Fifo_0_Addr,0x02,buffer);}void GetCur_Volume_Speaker(BYTE *buffer,BYTE VolumeL_Save,BYTE VolumeH_Save){buffer[0]=VolumeH_Save;buffer[1]=VolumeL_Save;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO0_WR_CHECK()&0x0f==0) continue;//未准备好else break;}Write_FIFO(Fifo_0_Addr,0x02,buffer);}//****************************************// Const String 常量//******************************************BYTE device_desc_table[]={//18 bytesWORD 0x0112 ,//descriptor type (device descriptor) , size of descriptor (18 bytes)WORD 0x0110 ,//USB spec release (ver 1.1)WORD 0x0000 ,//device sub-class , Communication device classWORD 0x0800 ,//bMaxPacketSize0 maximum packet size , bDeviceProtocolWORD 0x04D9 ,//vendor ID = 004D9HWORD 0x2851 ,//product version ID (Sample Device)WORD 0x0100 ,//product version ID Device Release CodeWORD 0x0201 ,//product string index , manufacturer string indexWORD 0x0103 ,//number of configurations , serial number string index}BYTE config_desc_table[]={//9 bytesWORD 0x0209 ,//descriptor type (config descriptor) , size of descriptorWORD 0x00D9 ,//total length of descriptor (D9 H=217 bytes)WORD 0x0104 ,//index of this configuration , 4 interfaceWORD 0x3F00 ,//configuration string indexWORD 0x3F80 ,//configuration attributes (bus supply)WORD 0x3FFA ,//maxpower (500ma)}。

相关文档
最新文档