libusb 介绍
libusb是开源的C库,使用该库是的用户可以在应用程序中直接访问 USB 设备,无需为 USB 设备编写内核驱动。libusb支持多个平台 (linux, window, ios),所以可以很方便地将应用程序移植到其他平台。
linux libusb 安装
从网上下载libusb的源码,下载地址:http://www.libusb.org/, 下载后编译安装。
# tar jxvf libusb-1.0.20.tar.bz2
# cd libusb-1.0.20
# ./configure
# make
# sudo make install
ubuntu下可以通过以下命令快速安装。
sudo apt-get isntall libusb*
安装后,libusb的头文件被安装在/usr/local/include/libusb-1.0 ,链接库被安装在/usr/loacal/lib目录下。
usb bulk 传输例程
这个例程演示如何使用 libusb 库,编写 USB bulk xfer 上位机demo,可以正常接收和发送数据。注意,修改程序中的 VID 和 PID 的值和你 device 板子上所定义的一致,传输数据块的大小不要超过 device 定义的最大传输长度。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "unistd.h"
#include "libusb.h"
#define VID 0x8888
#define PID 0x0088
#define edp2in 0x82
#define edp2out 0x02
int main(void)
{
libusb_device **devs, *dev;
int ret, i;
ssize_t cnt;
usb_pro_t usb_pro;
struct libusb_device_handle *handle = NULL;
libusb_context *ctx = NULL;
ret = libusb_init(&ctx);
if (ret < 0)
return -1;
libusb_set_debug(ctx, 3);
cnt = libusb_get_device_list(NULL, &devs);
if (cnt < 0) {
printf("no usb dev on bus\r\n");
return -1;
}
i = 0;
while((dev = devs[i++]) != NULL) {
ret = libusb_get_device_descriptor(dev,&desc);
if (ret < 0) {
printf("failed to get device descriptor");
goto error;
}
if ((desc.idVendor == VID) && (desc.idProduct == PID)) {
printf("bLength: 0xx\r\n", desc.bLength);
printf("bDescriptorType: 0xx\r\n", desc.bDescriptorType);
printf("bcdUSB: 0xx\r\n", desc.bcdUSB);
printf("bDeviceClass: 0xx\r\n", desc.bDeviceClass);
printf("bDeviceSubClass: 0xx\r\n", desc.bDeviceSubClass);
printf("bDeviceProtocol: 0xx\r\n", desc.bDeviceProtocol);
printf("bMaxPacketSize0: 0xx\r\n", desc.bMaxPacketSize0);
printf("vendor id: 0xx\r\n", desc.idVendor);
printf("product id: 0xx\r\n", desc.idProduct);
printf("bcdDevice: 0xx\r\n", desc.bcdDevice);
printf("iManufacturer: 0xx\r\n", desc.iManufacturer);
printf("iProduct: 0xx\r\n", desc.iProduct);
printf("iSerialNumber: 0xx\r\n", desc.iSerialNumber);
printf("bNumConfigurations: 0xx\r\n", desc.bNumConfigurations);
}
}
handle = libusb_open_device_with_vid_pid(ctx, VID, PID);
if (handle == NULL) {
printf("cant't open device\r\n");
goto error;
} else {
printf("open device\r\n");
}
libusb_free_device_list(devs, 1);
if (libusb_kernel_driver_active(handle, 0) ==1) {
printf("kernel driver active, detach it \r\n");
if (libusb_detach_kernel_driver(handle, 0) == 0) {
printf("detached kernel driver\r\n");
}
else {
goto error;
}
}
ret = libusb_claim_interface(handle, 0);
if (ret < 0) {
printf("can't claim interface\r\n");
goto error;
} else {
printf("claimed interface\r\n");
}
char data[64];
int actual_len = 0;
int didi = 1000;
for (int i = 0; i< 1000; i++) {
memset(data, 0, sizeof(data));
// receive data from device
//ret = libusb_bulk_transfer(handle, edp2in, data, 64, &actual_len, 0);
//if (actual_len = 0) {
// printf("received nothing\r\n");
//} else {
// printf("bulk transfer: %s\r\n", data);
//}
//usleep(200000);
char *str = "am host";
sprintf(data, "am host %d\r\n", i);
ret = libusb_bulk_transfer(handle, edp2out, data, strlen(data), &actual_len, 0);
if (actual_len != 0) {
printf("send data: %s\r\n", data);
}
usleep(200000);
}
libusb_close(handle);
error:
printf("free device list\r\n");
libusb_free_device_list(devs, 1);
libusb_exit(NULL);
return 0;
}
编译
编译代码可以使用 makefile 文件,也可以是使用命令行命令编译,这里给出两种编译方法。
makefile
CC = gcc
# your libusb library path, be careful your path.
LDIR = /usr/loacal/lib
# link flag
LFLAG = -lusb-1.0
# libusb hearder file path
INCLUDES = /usr/local/include/libusb-1.0
CFLAGS = -I$(INCLUDES) -std=c99
src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))
.PHONY: all clean
all: main
main: $(obj)
$(CC) $(obj) -o main -L$(LDIR) $(LFLAG)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
@-rm -f main $(obj)
命令行编译
命令中-I/usr/local/include/libusb-1.0 告诉编译器 libusb 的头文件所在的路径。-L/usr/local/lib/ 告诉链接器所要链接的库文件路径。-lusb-1.0 告诉编译器需要链接 libusb-1.0.so这个库。
gcc -I/usr/local/include/libusb-1.0 -std=c99 main.c -o main -L/usr/local/lib/ -lusb-1.0
运行
编译后会在当前目录下生成一个名叫“main“的可执行文件,运行这个文件。如果打开USB设备时出错提示permission error,那么使用
# sudo ./main
运行后,HOST每隔200ms 向 device 发送一个数据包。
源码下载
我的源码已上传到http://download.csdn.net/detail/chengwenyang/9479835 ,包含STM32F4Discovery板子的 usb bulk 传输的工程文件和 使用 libusb 编写的上位机程序。
上一篇:进入存量市场,硬件巨头要开辟哪些新市场?
下一篇:arm-none-eabi-gcc编译STM32优化删除代码解决办法
推荐阅读
史海拾趣
Davies Molding公司在追求经济效益的同时,始终关注社会责任和可持续发展。公司积极参与环保公益活动,推动绿色生产,降低对环境的影响。此外,Davies Molding公司还注重员工福利和社会公益事业,为员工提供良好的工作环境和发展空间,为社会做出积极贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。
位于广东东莞的锋鸣电子有限公司,自2010年成立以来,便明确了自己的市场定位——专注于汽车电子配件的研发与生产。随着汽车行业的快速发展,公司敏锐地捕捉到智能驾驶和车载娱乐系统对高质量电声器件的需求,迅速调整产品结构,推出了一系列符合市场需求的蜂鸣器、扬声器等产品。凭借精准的市场定位和优质的产品质量,锋鸣电子在汽车电子配件领域站稳了脚跟。
随着全球环保意识的提高,BROTHER公司也积极践行环保理念,推动绿色生产。公司注重节能减排和资源循环利用,采用环保材料和生产工艺,减少对环境的影响。同时,BROTHER还开展了一系列环保公益活动,宣传环保理念,提高公众环保意识。通过践行环保理念,BROTHER不仅赢得了社会的认可和尊重,还为公司的可持续发展奠定了坚实基础。
以上五个故事只是BROTHER公司在电子行业发展历程中的一部分缩影。实际上,BROTHER的发展还涉及更多的细节和方面。但无论如何,BROTHER始终坚持创新、质量、服务和环保的理念,不断追求卓越和完美,为电子行业的发展做出了重要贡献。
随着科技的不断发展,AR RF/Microwave Instrumentation意识到要想在激烈的市场竞争中保持领先地位,必须不断进行技术创新。公司投入大量资源进行研发,成功推出了一系列具有创新性的产品,如宽带高功率放大器、固态射频放大器等。这些产品不仅性能卓越,而且能够满足不同客户的需求,进一步巩固了公司在行业内的地位。
随着科技的进步和市场的变化,Carlisle Interconnect Technologies敏锐地捕捉到了新型材料的发展潜力。公司成为第一批采用PTFE(聚四氟乙烯)这种独特材料生产高温电线和电缆的公司之一。PTFE材料具有出色的耐高温、耐腐蚀和电气性能,使得公司的产品在航空航天、电子通信等领域得到了广泛应用。这一创新举措不仅提升了公司的市场竞争力,也为整个行业的技术进步做出了贡献。
作者:武汉大学电气工程学院 张蔷 蒋云峰 宫鑫 李洪涛 本文在分析电压空间矢量调制基本原理的基础上,组成了以TMS320F2812为核心的单片机控制系统,实现SVPWM,对交流电机进行变频调速。关键词:TMS320F2812; 电压空间矢量调制;交流变频调速 & ...… 查看全部问答∨ |
当今的设计工程师受到面积、功率和成本的约束,不能采用GHz级的计算机实现嵌入式设计。在嵌入式系统中,通常是由相对数量较少的算法决定最大的运算需求。使用设计自动化工具可以将这些算法快速转换到硬件协处理器中。然后,协处理器可以有效地连接 ...… 查看全部问答∨ |
买不起房,生不起娃,心情及其郁闷发资料!!!!!!!!!!!!! 搞个技术有啥用,后悔搞电子这一行.................... 嵌入式,linux,还有天天惦记的运动控制,go with death.............… 查看全部问答∨ |
WINCE启动时,显示EBOOT中LOGO LCD都显示很正常,可档ARM读FLASH中NK时,LCD就闪烁的非常厉害。在WINCE正常启动后,如果移动鼠标,LCD 也非常闪烁。有人遇到这种情况吗,怎么处理的?… 查看全部问答∨ |
目前,我在调试eboot,现在卡在网卡芯片lan91c96,在lan91cinit(*,*)函数里头第一件事情就是去读0x33这个标志,但我读到的数据是0 软硬件相关情况,PXA270+CE5.0,网卡芯片Lan91c96通过nCS2片 ...… 查看全部问答∨ |
GUI一开始在vc中仿真 pc机的键盘支持得很好 现在移植到arm板子中,我用的键盘是zlg7290 I2C键盘,现在输入过程中比pc机的键盘功能相差很远,我想应该是少一层键盘驱动,麻烦问下这个驱动应该怎么写,才能达到pc机键盘的功能。… 查看全部问答∨ |
问下各位,USB口的最大电流500ma需要在驱动下设置吗?? 问题1、)我在自己的机器上接sp2102芯片的设备加51欧姆的负载,5.0伏特的电压被拉低到4.2伏特;正常吗??? 问题2、)5个51欧姆的并联接入,5.0伏特的电压被拉低到2.6伏特;正常吗?? 问题3、)usb协议里说枚举的时候可以申请大功率(由100ma开 ...… 查看全部问答∨ |