libusb示例
#include <stdio.h>
#include <libusb-1.0/libusb.h>
#include <stdint.h>
#include <string.h> void processMessage(const uint8_t*); /*----------------------------------------------------------------------*/
int main(int argc, char*argv[])
{
int res = ; /* return codes from libusb functions */
libusb_device_handle* handle = ; /* handle for USB device */
int kernelDriverDetached = ; /* Set to 1 if kernel driver detached */
int numBytes = ; /* Actual bytes transferred. */
uint8_t buffer[]; /* 64 byte transfer buffer */ /* Initialise libusb. */
res = libusb_init();
if (res != )
{
fprintf(stderr, "Error initialising libusb.\n");
return ;
} /* Get the first device with the matching Vendor ID and Product ID. If
* intending to allow multiple demo boards to be connected at once, you
* will need to use libusb_get_device_list() instead. Refer to the libusb
* documentation for details. */
handle = libusb_open_device_with_vid_pid(, 0x04d8, 0x0070);
if (!handle)
{
fprintf(stderr, "Unable to open device.\n");
return ;
} /* Check whether a kernel driver is attached to interface #0. If so, we'll
* need to detach it.
*/
if (libusb_kernel_driver_active(handle, ))
{
res = libusb_detach_kernel_driver(handle, );
if (res == )
{
kernelDriverDetached = ;
}
else
{
fprintf(stderr, "Error detaching kernel driver.\n");
return ;
}
} /* Claim interface #0. */
res = libusb_claim_interface(handle, );
if (res != )
{
fprintf(stderr, "Error claiming interface.\n");
return ;
} /* We can now send and receive messages. For example, set normal mode. */
memset(buffer, , );
buffer[] = ; /* CANCTRL = Normal mode. */
buffer[] = 0x02; /* SPI command = Write. */
buffer[] = 0x0f; /* Register = CANCTRL */
buffer[] = ; /* Data = 0 (normal mode) */ /* Send the message to endpoint 1 with a 100ms timeout. */
res = libusb_interrupt_transfer(handle, , buffer, , &numBytes, );
if (res == )
{
printf("%d bytes transmitted successfully.\n", numBytes);
}
else
{
fprintf(stderr, "Error sending message to device.\n");
} /* Listen for a message. Note that for a normal application you'll need
* to use asynchronous mode because we can't predict when messages will be
* available. This involves setting up a callback function to handle incoming
* messages - refer to libusb documentation. */ /* Wait up to 5 seconds for a message to arrive on endpoint 0x81. */
res = libusb_interrupt_transfer(handle, 0x81, buffer, , &numBytes, );
if ( == res)
{
if (numBytes == )
{
processMessage(buffer);
}
else
{
printf("Received %d bytes, expected 64.\n", numBytes);
}
}
else
{
fprintf(stderr, "Error receiving message.\n");
} /* Release interface #0. */
res = libusb_release_interface(handle, );
if ( != res)
{
fprintf(stderr, "Error releasing interface.\n");
} /* If we detached a kernel driver from interface #0 earlier, we'll now
* need to attach it again. */
if (kernelDriverDetached)
{
libusb_attach_kernel_driver(handle, );
} /* Shutdown libusb. */
libusb_exit(); return ;
} /*----------------------------------------------------------------------*/
void processMessage(const uint8_t* buffer)
{
unsigned index = ; /* Most significant bit set indicates a CAN message is present. */
while(buffer[index] & 0x80)
{
unsigned extendedID = buffer[index] & 0x20;
unsigned rtr = buffer[index] & 0x10;
unsigned dataLength = buffer[index] & 0x0f;
unsigned canID = ; ++index; if (extendedID) /* 29 bit identifier */
{
canID = buffer[index] << ;
++index;
canID |= (((buffer[index] & 0xe0 >> ) |
(buffer[index] & 0x03)) << );
++index;
canID |= (buffer[index] << );
++index;
canID |= (buffer[index]);
++index;
}
else /* standard 11 bit identifier */
{
canID = buffer[index] << ;
++index;
canID |= ((buffer[index] >> ) & );
++index;
} printf("CAN ID: 0x%x [%s] ", canID,
extendedID ? "extended" : "standard"); if (rtr)
{
printf("RTR\n");
}
else
{
unsigned i = ;
for (i = ; i < dataLength; ++i)
{
printf("0x%02x ", buffer[index]);
++index;
}
printf("\n");
}
} printf("CAN Status: 0x%02x\n", buffer[]);
printf("Transmit Errors: %u\n", buffer[]);
printf("Receive Errors: %u\n", buffer[]); /* If the command was read, we have received the result. */
if (buffer[] == 0x03)
{
printf("Read from register 0x%02x returned 0x%02x\n",
buffer[], buffer[]);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include </usr/local/include/libusb-1.0/libusb.h> #define BULK_EP_OUT 0x82
#define BULK_EP_IN 0x08 int interface_ref = ;
int alt_interface,interface_number; int print_configuration(struct libusb_device_handle *hDevice,struct libusb_config_descriptor *config)
{
char *data;
int index; data = (char *)malloc();
memset(data,,); index = config->iConfiguration; libusb_get_string_descriptor_ascii(hDevice,index,data,); printf("\nInterface Descriptors: ");
printf("\n\tNumber of Interfaces : %d",config->bNumInterfaces);
printf("\n\tLength : %d",config->bLength);
printf("\n\tDesc_Type : %d",config->bDescriptorType);
printf("\n\tConfig_index : %d",config->iConfiguration);
printf("\n\tTotal length : %lu",config->wTotalLength);
printf("\n\tConfiguration Value : %d",config->bConfigurationValue);
printf("\n\tConfiguration Attributes : %d",config->bmAttributes);
printf("\n\tMaxPower(mA) : %d\n",config->MaxPower); free(data);
data = NULL;
return ;
} struct libusb_endpoint_descriptor* active_config(struct libusb_device *dev,struct libusb_device_handle *handle)
{
struct libusb_device_handle *hDevice_req;
struct libusb_config_descriptor *config;
struct libusb_endpoint_descriptor *endpoint;
int altsetting_index,interface_index=,ret_active;
int i,ret_print; hDevice_req = handle; ret_active = libusb_get_active_config_descriptor(dev,&config);
ret_print = print_configuration(hDevice_req,config); for(interface_index=;interface_index<config->bNumInterfaces;interface_index++)
{
const struct libusb_interface *iface = &config->interface[interface_index];
for(altsetting_index=;altsetting_index<iface->num_altsetting;altsetting_index++)
{
const struct libusb_interface_descriptor *altsetting = &iface->altsetting[altsetting_index]; int endpoint_index;
for(endpoint_index=;endpoint_index<altsetting->bNumEndpoints;endpoint_index++)
{
const struct libusb_endpoint_desriptor *ep = &altsetting->endpoint[endpoint_index];
endpoint = ep;
alt_interface = altsetting->bAlternateSetting;
interface_number = altsetting->bInterfaceNumber;
} printf("\nEndPoint Descriptors: ");
printf("\n\tSize of EndPoint Descriptor : %d",endpoint->bLength);
printf("\n\tType of Descriptor : %d",endpoint->bDescriptorType);
printf("\n\tEndpoint Address : 0x0%x",endpoint->bEndpointAddress);
printf("\n\tMaximum Packet Size: %x",endpoint->wMaxPacketSize);
printf("\n\tAttributes applied to Endpoint: %d",endpoint->bmAttributes);
printf("\n\tInterval for Polling for data Tranfer : %d\n",endpoint->bInterval);
}
}
libusb_free_config_descriptor(NULL);
return endpoint;
} int main(void)
{
int r = ;
struct libusb_device **devs;
struct libusb_device_handle *handle = NULL, *hDevice_expected = NULL;
struct libusb_device *dev,*dev_expected; struct libusb_device_descriptor desc;
struct libusb_endpoint_descriptor *epdesc;
struct libusb_interface_descriptor *intdesc; ssize_t cnt;
int e = ,config2;
int i = ,index;
char str1[], str2[];
char found = ; // Init libusb
r = libusb_init(NULL);
if(r < )
{
printf("\nfailed to initialise libusb\n");
return ;
}
else
printf("\nInit Successful!\n"); // Get a list os USB devices
cnt = libusb_get_device_list(NULL, &devs);
if (cnt < )
{
printf("\nThere are no USB devices on bus\n");
return -;
}
printf("\nDevice Count : %d\n-------------------------------\n",cnt); while ((dev = devs[i++]) != NULL)
{
r = libusb_get_device_descriptor(dev, &desc);
if (r < )
{
printf("failed to get device descriptor\n");
libusb_free_device_list(devs,);
libusb_close(handle);
break;
} e = libusb_open(dev,&handle);
if (e < )
{
printf("error opening device\n");
libusb_free_device_list(devs,);
libusb_close(handle);
break;
} printf("\nDevice Descriptors: ");
printf("\n\tVendor ID : %x",desc.idVendor);
printf("\n\tProduct ID : %x",desc.idProduct);
printf("\n\tSerial Number : %x",desc.iSerialNumber);
printf("\n\tSize of Device Descriptor : %d",desc.bLength);
printf("\n\tType of Descriptor : %d",desc.bDescriptorType);
printf("\n\tUSB Specification Release Number : %d",desc.bcdUSB);
printf("\n\tDevice Release Number : %d",desc.bcdDevice);
printf("\n\tDevice Class : %d",desc.bDeviceClass);
printf("\n\tDevice Sub-Class : %d",desc.bDeviceSubClass);
printf("\n\tDevice Protocol : %d",desc.bDeviceProtocol);
printf("\n\tMax. Packet Size : %d",desc.bMaxPacketSize0);
printf("\n\tNo. of Configuraions : %d\n",desc.bNumConfigurations); e = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, (unsigned char*) str1, sizeof(str1));
if (e < )
{
libusb_free_device_list(devs,);
libusb_close(handle);
break;
}
printf("\nManufactured : %s",str1); e = libusb_get_string_descriptor_ascii(handle, desc.iProduct, (unsigned char*) str2, sizeof(str2));
if(e < )
{
libusb_free_device_list(devs,);
libusb_close(handle);
break;
}
printf("\nProduct : %s",str2);
printf("\n----------------------------------------"); if(desc.idVendor == 0xffff && desc.idProduct == 0x4)
{
found = ;
break;
}
}//end of while
if(found == )
{
printf("\nDevice NOT found\n");
libusb_free_device_list(devs,);
libusb_close(handle);
return ;
}
else
{
printf("\nDevice found");
dev_expected = dev;
hDevice_expected = handle;
} e = libusb_get_configuration(handle,&config2);
if(e!=)
{
printf("\n***Error in libusb_get_configuration\n");
libusb_free_device_list(devs,);
libusb_close(handle);
return -;
}
printf("\nConfigured value : %d",config2); if(config2 != )
{
libusb_set_configuration(handle, );
if(e!=)
{
printf("Error in libusb_set_configuration\n");
libusb_free_device_list(devs,);
libusb_close(handle);
return -;
}
else
printf("\nDevice is in configured state!");
} libusb_free_device_list(devs, ); if(libusb_kernel_driver_active(handle, ) == )
{
printf("\nKernel Driver Active");
if(libusb_detach_kernel_driver(handle, ) == )
printf("\nKernel Driver Detached!");
else
{
printf("\nCouldn't detach kernel driver!\n");
libusb_free_device_list(devs,);
libusb_close(handle);
return -;
}
} e = libusb_claim_interface(handle, );
if(e < )
{
printf("\nCannot Claim Interface");
libusb_free_device_list(devs,);
libusb_close(handle);
return -;
}
else
printf("\nClaimed Interface\n"); active_config(dev_expected,hDevice_expected); // Communicate char *my_string, *my_string1;
int transferred = ;
int received = ;
int length = ; my_string = (char *)malloc(nbytes + );
my_string1 = (char *)malloc(nbytes + ); memset(my_string,'\0',);
memset(my_string1,'\0',); strcpy(my_string,"prasad divesd");
length = strlen(my_string); printf("\nTo be sent : %s",my_string); e = libusb_bulk_transfer(handle,BULK_EP_IN,my_string,length,&transferred,);
if(e == && transferred == length)
{
printf("\nWrite successful!");
printf("\nSent %d bytes with string: %s\n", transferred, my_string);
}
else
printf("\nError in write! e = %d and transferred = %d\n",e,transferred); sleep();
i = ; for(i = ; i < length; i++)
{
e = libusb_bulk_transfer(handle,BULK_EP_OUT,my_string1,,&received,); //64 : Max Packet Lenght
if(e == )
{
printf("\nReceived: ");
printf("%c",my_string1[i]); //will read a string from lcp2148
sleep();
}
else
{
printf("\nError in read! e = %d and received = %d\n",e,received);
return -;
}
} e = libusb_release_interface(handle, ); libusb_close(handle);
libusb_exit(NULL); printf("\n");
return ;
}
libusb示例的更多相关文章
- libusb 示例
#include <usb.h> #include <stdio.h> #define VERSION "0.1.0" #define VENDOR_ID ...
- 基于libUSB的USB设备固件更新程序(下载数据)(转)
源:基于libUSB的USB设备固件更新程序(下载数据) 本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步. libU ...
- libusb: android上集成libusb库
1. 下载libusb库. 可以到libusb库的官网(https://libusb.info/)或者是其官方的github仓库(https://github.com/libusb/libusb/re ...
- Ubuntu15下Qt+libusb开发
下载和安装libusb-1.0 在Ubuntu15中可以从软件仓库安装libusb,当前的libusb版本为1.0.可以使用如下命令安装libusb的全部内容. $sudo apt-get insta ...
- 树莓派Zero 2 W(ubuntu-22.04)通过.NET6和libusb操作USB读写
有这个想法的初衷 喜欢电子和DIY硬件的朋友对稚晖君应该都不陌生,他定期都会分享一些自己做的好玩的硬件,他之前做了一个ElectronBot桌面机器人我就很感兴趣,所以就自己也做了一个. 起初我只是自 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1
微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
随机推荐
- 【洛谷p1031】均分纸牌
[博客园的第一条随笔,值得纪念一下] 均分纸牌[传送门] 洛谷上的算法标签是 这道题是一道贪心题,过了四遍才过(蒟蒻有点废) 第一遍的时候考虑的非常少,只想到了求出平均数→求差值→从左往右加差值: 这 ...
- Windows自动登录设置 Windows免密登录
设置方法如下:开始-运行-control userpasswords2:打开用户账号管理页面,将“要使用本机,用户必须输入用户名和密码”前面的勾去掉:点击 应用,确定之后.会提示用户输入需要自动登陆系 ...
- thinkphp或者kohana 导入和读取文件
1.无论是那个框架的导入,其实都是一样的原理的,但是首先我们要导入包,可能就这点不同. kohana的导入包的方法:require_once(Kohana::find_file('vendor','P ...
- SpringBoot项目Shiro的实现(一)
一.Shiro的简单介绍 Shiro是Apache下的一个开源项目,我们称之谓Apache Shiro,它是一个易用与Java项目的安全框架,提供了认证.授权.加密.会话管理,与Spring Secu ...
- 利用sqlldr从MySQL导出一张表数据到Oracle
根据业务需求,需要从MySQL库中同步一张表tap_application到Oracle中,下面是记录的导入过程. 1. 查看MySQL表结构 desc tap_application; +----- ...
- CP-ABE ToolKit 安装笔记(转载)
博主论文狗,好久没有来贴博客,最近做实验需要用到属性加密,了解了下CP-ABE,前来记录一下: 网上相关的博文较多,博主看了大部分的,认为下面这两个看完了基本就可以成功安装. 可参见博文: http: ...
- [LeetCode] 111. Minimum Depth of Binary Tree ☆(二叉树的最小深度)
[Leetcode] Maximum and Minimum Depth of Binary Tree 二叉树的最小最大深度 (最小有3种解法) 描述 解析 递归深度优先搜索 当求最大深度时,我们只要 ...
- 牛客网 PAT 算法历年真题 1011 : 个位数统计 (15)
个位数统计 (15) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定一个k位整数N = dk-1*10k- ...
- cmp的值到底是0还是1还是-1的问题
返回值不局限于这三个数返回负数,表示第一个参数小于第二个参数返回整数,表示第一个参数大于第二个参数返回0,表示他们相等
- css 改变浏览器滚动条的样式
/*滚动条样式*/ .innerbox::-webkit-scrollbar {/*滚动条整体样式*/ width: 4px; /*高宽分别对应横竖滚动条的尺寸*/ height: 4px; } .i ...