libusb示例
Posted dozeoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = 0; /* return codes from libusb functions */ libusb_device_handle* handle = 0; /* handle for USB device */ int kernelDriverDetached = 0; /* Set to 1 if kernel driver detached */ int numBytes = 0; /* Actual bytes transferred. */ uint8_t buffer[64]; /* 64 byte transfer buffer */ /* Initialise libusb. */ res = libusb_init(0); if (res != 0) { fprintf(stderr, "Error initialising libusb.\n"); return 1; } /* 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(0, 0x04d8, 0x0070); if (!handle) { fprintf(stderr, "Unable to open device.\n"); return 1; } /* Check whether a kernel driver is attached to interface #0. If so, we‘ll * need to detach it. */ if (libusb_kernel_driver_active(handle, 0)) { res = libusb_detach_kernel_driver(handle, 0); if (res == 0) { kernelDriverDetached = 1; } else { fprintf(stderr, "Error detaching kernel driver.\n"); return 1; } } /* Claim interface #0. */ res = libusb_claim_interface(handle, 0); if (res != 0) { fprintf(stderr, "Error claiming interface.\n"); return 1; } /* We can now send and receive messages. For example, set normal mode. */ memset(buffer, 0, 64); buffer[58] = 0; /* CANCTRL = Normal mode. */ buffer[60] = 0x02; /* SPI command = Write. */ buffer[61] = 0x0f; /* Register = CANCTRL */ buffer[62] = 0; /* Data = 0 (normal mode) */ /* Send the message to endpoint 1 with a 100ms timeout. */ res = libusb_interrupt_transfer(handle, 1, buffer, 64, &numBytes, 100); if (res == 0) { 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, 64, &numBytes, 5000); if (0 == res) { if (numBytes == 64) { 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, 0); if (0 != 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, 0); } /* Shutdown libusb. */ libusb_exit(0); return 0; } /*----------------------------------------------------------------------*/ void processMessage(const uint8_t* buffer) { unsigned index = 0; /* 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 = 0; ++index; if (extendedID) /* 29 bit identifier */ { canID = buffer[index] << 21; ++index; canID |= (((buffer[index] & 0xe0 >> 5) | (buffer[index] & 0x03)) << 16); ++index; canID |= (buffer[index] << 8); ++index; canID |= (buffer[index]); ++index; } else /* standard 11 bit identifier */ { canID = buffer[index] << 3; ++index; canID |= ((buffer[index] >> 1) & 7); ++index; } printf("CAN ID: 0x%x [%s] ", canID, extendedID ? "extended" : "standard"); if (rtr) { printf("RTR\n"); } else { unsigned i = 0; for (i = 0; i < dataLength; ++i) { printf("0x%02x ", buffer[index]); ++index; } printf("\n"); } } printf("CAN Status: 0x%02x\n", buffer[57]); printf("Transmit Errors: %u\n", buffer[55]); printf("Receive Errors: %u\n", buffer[56]); /* If the command was read, we have received the result. */ if (buffer[60] == 0x03) { printf("Read from register 0x%02x returned 0x%02x\n", buffer[61], buffer[62]); } }
#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 = 0; 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(512); memset(data,0,512); index = config->iConfiguration; libusb_get_string_descriptor_ascii(hDevice,index,data,512); 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 0; } 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=0,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=0;interface_index<config->bNumInterfaces;interface_index++) { const struct libusb_interface *iface = &config->interface[interface_index]; for(altsetting_index=0;altsetting_index<iface->num_altsetting;altsetting_index++) { const struct libusb_interface_descriptor *altsetting = &iface->altsetting[altsetting_index]; int endpoint_index; for(endpoint_index=0;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 = 1; 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 = 0,config2; int i = 0,index; char str1[64], str2[64]; char found = 0; // Init libusb r = libusb_init(NULL); if(r < 0) { printf("\nfailed to initialise libusb\n"); return 1; } else printf("\nInit Successful!\n"); // Get a list os USB devices cnt = libusb_get_device_list(NULL, &devs); if (cnt < 0) { printf("\nThere are no USB devices on bus\n"); return -1; } printf("\nDevice Count : %d\n-------------------------------\n",cnt); while ((dev = devs[i++]) != NULL) { r = libusb_get_device_descriptor(dev, &desc); if (r < 0) { printf("failed to get device descriptor\n"); libusb_free_device_list(devs,1); libusb_close(handle); break; } e = libusb_open(dev,&handle); if (e < 0) { printf("error opening device\n"); libusb_free_device_list(devs,1); 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 < 0) { libusb_free_device_list(devs,1); libusb_close(handle); break; } printf("\nManufactured : %s",str1); e = libusb_get_string_descriptor_ascii(handle, desc.iProduct, (unsigned char*) str2, sizeof(str2)); if(e < 0) { libusb_free_device_list(devs,1); libusb_close(handle); break; } printf("\nProduct : %s",str2); printf("\n----------------------------------------"); if(desc.idVendor == 0xffff && desc.idProduct == 0x4) { found = 1; break; } }//end of while if(found == 0) { printf("\nDevice NOT found\n"); libusb_free_device_list(devs,1); libusb_close(handle); return 1; } else { printf("\nDevice found"); dev_expected = dev; hDevice_expected = handle; } e = libusb_get_configuration(handle,&config2); if(e!=0) { printf("\n***Error in libusb_get_configuration\n"); libusb_free_device_list(devs,1); libusb_close(handle); return -1; } printf("\nConfigured value : %d",config2); if(config2 != 1) { libusb_set_configuration(handle, 1); if(e!=0) { printf("Error in libusb_set_configuration\n"); libusb_free_device_list(devs,1); libusb_close(handle); return -1; } else printf("\nDevice is in configured state!"); } libusb_free_device_list(devs, 1); if(libusb_kernel_driver_active(handle, 0) == 1) { printf("\nKernel Driver Active"); if(libusb_detach_kernel_driver(handle, 0) == 0) printf("\nKernel Driver Detached!"); else { printf("\nCouldn‘t detach kernel driver!\n"); libusb_free_device_list(devs,1); libusb_close(handle); return -1; } } e = libusb_claim_interface(handle, 0); if(e < 0) { printf("\nCannot Claim Interface"); libusb_free_device_list(devs,1); libusb_close(handle); return -1; } else printf("\nClaimed Interface\n"); active_config(dev_expected,hDevice_expected); // Communicate char *my_string, *my_string1; int transferred = 0; int received = 0; int length = 0; my_string = (char *)malloc(nbytes + 1); my_string1 = (char *)malloc(nbytes + 1); memset(my_string,‘\0‘,64); memset(my_string1,‘\0‘,64); 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,0); if(e == 0 && 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(3); i = 0; for(i = 0; i < length; i++) { e = libusb_bulk_transfer(handle,BULK_EP_OUT,my_string1,64,&received,0); //64 : Max Packet Lenght if(e == 0) { printf("\nReceived: "); printf("%c",my_string1[i]); //will read a string from lcp2148 sleep(1); } else { printf("\nError in read! e = %d and received = %d\n",e,received); return -1; } } e = libusb_release_interface(handle, 0); libusb_close(handle); libusb_exit(NULL); printf("\n"); return 0; }
以上是关于libusb示例的主要内容,如果未能解决你的问题,请参考以下文章