一 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 是我们在开发中经常碰到的,有必要把它们的结构看一看。在libusb 中的usb.h和usbi.h中有定义。这里我们不妨理解为返回的 usb_dev_handle 指针是指向设备的句柄,而行参里输入就是需要打开的设备。usb_close 函数定义: int usb_close(usb_dev_handle *dev); 与usb_open相对应,关闭设备,是必须调用的, 返回0成功,Libusb库的使用使用libusb之前你的linux系统必须装有usb文件系统,这里还介绍了使用hiddev设备文件来访问设备,目的在于不仅可以比较出usb的易用性,还提供了一个转化成libusb驱动的案例。3.1 find设备任何驱动第一步首先是寻找到要操作的设备,我们先来看看HID驱动是怎样寻找到设备的。我们假设寻找设备的函数Device_Find(注:代码只是为了方便解说,不保证代码的健全)
int Device_Find()
{
char dir_str[100];
char hiddev[100];
DIR dir;
memset (dir_str, 0 , sizeof(dir_str));
memset (hiddev, 0 , sizeof(hiddev));
dir=opendir("/dev/usb/hid");
if(dir){
sprintf(dir_str,"/dev/usb/hid/");
closedir(dir);
}else{
sprintf(dir_str,"/dev/usb/");
}
for(i = 0; i
sprintf(hiddev, "%shiddev%d", dir_str,i);
fd = open(hiddev, O_RDWR);
if(fd > 0) {
ioctl(fd, HIDIOCGDEVINFO, &a