libusb学习笔记(1)

API说明:

所需头文件是 libusb.h,可能位于 "/usr/include/libusb-1.0" 目录中。
所需动态库可能是 libusb-1.0.so,那么编译选项加 -lusb-1.0。
所需动态库可能位于 "/usr/lib/x86_64-linux-gnu" 这样的目录中。

int libusb_init(libusb_context **context);
用来初始化 libusb 环境上下文,通过 **context 返回环境上下文指针。
如果参数 **context 为 NULL 会初始化默认的环境上下文。
成功返回 LIBUSB_SUCCESS,失败返回其他错误码。

错误码列表:
LIBUSB_SUCCESS 0 成功
LIBUSB_ERROR_IO -1 输入输出错误
LIBUSB_ERROR_INVALID_PARAM -2 无效参数
LIBUSB_ERROR_ACCESS -3 访问被拒绝(权限不足)
LIBUSB_ERROR_NO_DEVICE -4 没有这个设备
LIBUSB_ERROR_NOT_FOUND -5 找不到实体
LIBUSB_ERROR_BUSY -6 资源繁忙
LIBUSB_ERROR_TIMEOUT -7 操作超时
LIBUSB_ERROR_OVERFLOW -8 溢出
LIBUSB_ERROR_PIPE -9 管道错误
LIBUSB_ERROR_INTERRUPTED -10 系统调用中断(可能是由于信号原因)
LIBUSB_ERROR_NO_MEM -11 内存不足
LIBUSB_ERROR_NOT_SUPPORTED -12 此平台不支持或未实现操作
LIBUSB_ERROR_OTHER -99 其他错误

void libusb_exit(libusb_context *context);
取消 libusb 环境上下文的初始化。
如果 *context 为 NULL 则取消默认环境上下文的初始化。

const char* libusb_error_name(int errcode);
返回错误码对应的名字,例如错误码是 LIBUSB_ERROR_ACCESS 就返回 "LIBUSB_ERROR_ACCESS"。
返回的是常量字符串,一定不要free(),其内容一定不要修改。

const char* libusb_strerror(int errcode);
返回错误代码的简短描述,此描述是UTF-8编码,其语言由 libusb_setlocale() 设置。
返回的是常量字符串,一定不要free(),其内容一定不要修改。

int libusb_setlocale(const char *locale);
设置消息语言,默认英语。*locale 使用 ISO 639-1 标准的语言代码。
返回值:
LIBUSB_SUCCESS 成功
LIBUSB_ERROR_INVALID_PARAM 区域设置不符合要求
LIBUSB_ERROR_NOT_FOUND 请求的语言不受支持

int libusb_has_capability(uint32_t capability);
在运行时检查加载的库是否具有给定的功能。
此调用应在 libusb_init() 之后执行。
返回0表示不支持,非0表示支持。
capability值列表:
LIBUSB_CAP_HAS_CAPABILITY 0x0000U libusb_has_capability()API可用。
LIBUSB_CAP_HAS_HOTPLUG 0x0001U 此平台上提供热插拔支持。
LIBUSB_CAP_HAS_HID_ACCESS 0x0100U 库可以访问HID设备,而无需用户干预。
LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER 0x0101U 如果操作系统内核设置了默认USB驱动程序,则库支持使用libusb_detach_kernel_driver()分离默认USB驱动程序。

const struct libusb_version *libusb_get_version(void);
返回libusb的版本信息。返回的指针一定不要free(),其内容一定不要修改。
struct libusb_version {
const uint16_t major; // 主版本号
const uint16_t minor; // 副版本号
const uint16_t micro; // 微版本号?
const uint16_t nano; // 纳版本号?
const char *rc; //
const char *describe; //
};

代码举例:

/*
所需头文件是 libusb.h,可能位于 "/usr/include/libusb-1.0" 目录中。
所需动态库可能是 libusb-1.0.so,那么编译选项加 -lusb-1.0。
所需动态库可能位于 "/usr/lib/x86_64-linux-gnu" 这样的目录中。

int libusb_init(libusb_context **context);
    用来初始化 libusb 环境上下文,通过 **context 返回环境上下文指针。
    如果参数 **context 为 NULL 会初始化默认的环境上下文。
    成功返回 LIBUSB_SUCCESS,失败返回其他错误码。

错误码列表:
    LIBUSB_SUCCESS                0  成功
    LIBUSB_ERROR_IO              -1  输入输出错误
    LIBUSB_ERROR_INVALID_PARAM   -2  无效参数
    LIBUSB_ERROR_ACCESS          -3  访问被拒绝(权限不足)
    LIBUSB_ERROR_NO_DEVICE       -4  没有这个设备
    LIBUSB_ERROR_NOT_FOUND       -5  找不到实体
    LIBUSB_ERROR_BUSY            -6  资源繁忙
    LIBUSB_ERROR_TIMEOUT         -7  操作超时
    LIBUSB_ERROR_OVERFLOW        -8  溢出
    LIBUSB_ERROR_PIPE            -9  管道错误  
    LIBUSB_ERROR_INTERRUPTED    -10  系统调用中断(可能是由于信号原因)
    LIBUSB_ERROR_NO_MEM         -11  内存不足
    LIBUSB_ERROR_NOT_SUPPORTED  -12  此平台不支持或未实现操作
    LIBUSB_ERROR_OTHER          -99  其他错误

void libusb_exit(libusb_context *context);
    取消 libusb 环境上下文的初始化。
    如果 *context 为 NULL 则取消默认环境上下文的初始化。

const char* libusb_error_name(int errcode);
    返回错误码对应的名字,例如错误码是 LIBUSB_ERROR_ACCESS 就返回 "LIBUSB_ERROR_ACCESS"。
    返回的是常量字符串,一定不要free(),其内容一定不要修改。

const char* libusb_strerror(int errcode);
    返回错误代码的简短描述,此描述是UTF-8编码,其语言由 libusb_setlocale() 设置。
    返回的是常量字符串,一定不要free(),其内容一定不要修改。

int libusb_setlocale(const char *locale);
    设置消息语言,默认英语。*locale 使用 ISO 639-1 标准的语言代码。
    返回值:
    LIBUSB_SUCCESS              成功
    LIBUSB_ERROR_INVALID_PARAM  区域设置不符合要求
    LIBUSB_ERROR_NOT_FOUND      请求的语言不受支持

int libusb_has_capability(uint32_t capability);
    在运行时检查加载的库是否具有给定的功能。
    此调用应在 libusb_init() 之后执行。
    返回0表示不支持,非0表示支持。
    capability值列表:
    LIBUSB_CAP_HAS_CAPABILITY                 0x0000U  libusb_has_capability()API可用。
    LIBUSB_CAP_HAS_HOTPLUG                    0x0001U  此平台上提供热插拔支持。
    LIBUSB_CAP_HAS_HID_ACCESS                 0x0100U  库可以访问HID设备,而无需用户干预。
    LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER  0x0101U  如果操作系统内核设置了默认USB驱动程序,则库支持使用
                                                       libusb_detach_kernel_driver()分离默认USB驱动程序。

const struct libusb_version *libusb_get_version(void);
    返回libusb的版本信息。返回的指针一定不要free(),其内容一定不要修改。
    struct libusb_version {
        const uint16_t major;    // 主版本号
        const uint16_t minor;    // 副版本号
        const uint16_t micro;    // 微版本号?
        const uint16_t nano;     // 纳版本号?
        const char    *rc;       // 
        const char    *describe; // 
    };
*/

#include <stdio.h>
#include <stdlib.h>
#include "libusb.h"

static char* languages[] = {
    "aa", "阿法尔语",
    "fr", "法语",
    "zh", "汉语",
    "li", "林堡语",
    "se", "北萨米语",
    "ab", "阿布哈兹语",
    "fy", "弗里西亚语",
    "ln", "林加拉语",
    "sg", "桑戈语",
    "ae", "阿维斯陀语",
    "ga", "爱尔兰语",
    "lo", "老挝语",
    "sh", "塞尔维亚-克罗地亚语",
    "af", "阿非利堪斯语",
    "gd", "苏格兰盖尔语",
    "lt", "立陶宛语",
    "si", "僧加罗语",
    "ak", "阿坎语",
    "gl", "加利西亚语",
    "lu", "卢巴-加丹加语",
    "sk", "斯洛伐克语",
    "am", "阿姆哈拉语",
    "gn", "瓜拉尼语",
    "lv", "拉脱维亚语",
    "sl", "斯洛文尼亚语",
    "an", "阿拉贡语",
    "gu", "古吉拉特语",
    "mg", "马达加斯加语",
    "sm", "萨摩亚语",
    "ar", "阿拉伯语",
    "gv", "马恩岛语",
    "mh", "马绍尔语",
    "sn", "绍纳语",
    "as", "阿萨姆语",
    "ha", "豪萨语",
    "mi", "毛利语",
    "so", "索马里语",
    "av", "阿瓦尔语",
    "he", "希伯来语",
    "mk", "马其顿语",
    "sq", "阿尔巴尼亚语",
    "ay", "艾马拉语",
    "hi", "印地语",
    "ml", "马拉亚拉姆语",
    "sr", "塞尔维亚语",
    "az", "阿塞拜疆语",
    "ho", "希里莫图语",
    "mn", "蒙古语",
    "ss", "斯瓦特语",
    "ba", "巴什基尔语",
    "hr", "克罗地亚语",
    "mo", "摩尔达维亚语",
    "st", "南索托语",
    "be", "白俄罗斯语",
    "ht", "海地克里奥尔语",
    "mr", "马拉提语",
    "su", "巽他语",
    "bg", "保加利亚语",
    "hu", "匈牙利语",
    "ms", "马来语",
    "sv", "瑞典语",
    "bh", "比哈尔语",
    "hy", "亚美尼亚语",
    "mt", "马耳他语",
    "sw", "斯瓦希里语",
    "bi", "比斯拉玛语",
    "hz", "赫雷罗语",
    "my", "缅甸语",
    "ta", "泰米尔语",
    "bm", "班巴拉语",
    "ia", "国际语A",
    "na", "瑙鲁语",
    "te", "泰卢固语",
    "bn", "孟加拉语",
    "id", "印尼语",
    "nb", "书面挪威语",
    "tg", "塔吉克语",
    "bo", "藏语",
    "ie", "国际语E",
    "nd", "北恩德贝勒语",
    "th", "泰语",
    "br", "布列塔尼语",
    "ig", "伊博语",
    "ne", "尼泊尔语",
    "ti", "提格里尼亚语",
    "bs", "波斯尼亚语",
    "ii", "四川彝语",
    "ng", "恩敦加语",
    "tk", "土库曼语",
    "ca", "加泰隆语",
    "ik", "依努庇克语",
    "nl", "荷兰语",
    "tl", "塔加洛语",
    "ce", "车臣语",
    "io", "伊多语",
    "nn", "新挪威语",
    "tn", "塞茨瓦纳语",
    "ch", "查莫罗语",
    "is", "冰岛语",
    "no", "挪威语",
    "to", "汤加语",
    "co", "科西嘉语",
    "it", "意大利语",
    "nr", "南恩德贝勒语",
    "tr", "土耳其语",
    "cr", "克里语",
    "iu", "伊努伊特语",
    "nv", "纳瓦霍语",
    "ts", "宗加语",
    "cs", "捷克语",
    "ja", "日语",
    "ny", "尼扬贾语",
    "tt", "塔塔尔语",
    "cu", "教会斯拉夫语",
    "jv", "爪哇语",
    "oc", "奥克语",
    "tw", "特威语",
    "cv", "楚瓦什语",
    "ka", "格鲁吉亚语",
    "oj", "奥吉布瓦语",
    "ty", "塔希提语",
    "cy", "威尔士语",
    "kg", "刚果语",
    "om", "奥洛莫语",
    "ug", "维吾尔语",
    "da", "丹麦语",
    "ki", "基库尤语",
    "or", "奥利亚语",
    "uk", "乌克兰语",
    "de", "德语",
    "kj", "宽亚玛语",
    "os", "奥塞梯语",
    "ur", "乌尔都语",
    "dv", "迪维希语",
    "kk", "哈萨克语",
    "pa", "旁遮普语",
    "uz", "乌兹别克语",
    "dz", "不丹语",
    "kl", "格陵兰语",
    "pi", "巴利语",
    "ve", "文达语",
    "ee", "埃维语",
    "km", "高棉语",
    "pl", "波兰语",
    "vi", "越南语",
    "el", "现代希腊语",
    "kn", "卡纳达语",
    "ps", "普什图语",
    "vo", "沃拉普克语",
    "en", "英语",
    "ko", "朝鲜语、韩语",
    "pt", "葡萄牙语",
    "wa", "沃伦语",
    "eo", "世界语",
    "kr", "卡努里语",
    "qu", "凯楚亚语",
    "wo", "沃洛夫语",
    "es", "西班牙语",
    "ks", "克什米尔语",
    "rm", "利托-罗曼语",
    "xh", "科萨语",
    "et", "爱沙尼亚语",
    "ku", "库尔德语",
    "rn", "基隆迪语",
    "yi", "依地语",
    "eu", "巴斯克语",
    "kv", "科米语",
    "ro", "罗马尼亚语",
    "yo", "约鲁巴语",
    "fa", "波斯语",
    "kw", "康沃尔语",
    "ru", "俄语",
    "za", "壮语",
    "ff", "富拉语",
    "ky", "吉尔吉斯语",
    "rw", "基尼阿万达语",
    "fi", "芬兰语",
    "la", "拉丁语",
    "sa", "梵语",
    "zu", "祖鲁语",
    "fj", "斐济语",
    "lb", "卢森堡语",
    "sc", "撒丁语",
    "fo", "法罗语",
    "lg", "干达语",
    "sd", "信德语",
    "io", "伊多语",
    "wa", "瓦龙语",
    "li", "林堡语",
    "ii", "四川彝文",
    "an", "阿拉贡语",
    "ht", "海地克里奥耳语"
};

int main(int argc, char* argv[]){
    // 打印错误码名字。
    putchar('\n');
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_SUCCESS,             libusb_error_name(LIBUSB_SUCCESS));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_IO,            libusb_error_name(LIBUSB_ERROR_IO));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_INVALID_PARAM, libusb_error_name(LIBUSB_ERROR_INVALID_PARAM));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_ACCESS,        libusb_error_name(LIBUSB_ERROR_ACCESS));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_NO_DEVICE,     libusb_error_name(LIBUSB_ERROR_NO_DEVICE));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_NOT_FOUND,     libusb_error_name(LIBUSB_ERROR_NOT_FOUND));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_BUSY,          libusb_error_name(LIBUSB_ERROR_BUSY));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_TIMEOUT,       libusb_error_name(LIBUSB_ERROR_TIMEOUT));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_OVERFLOW,      libusb_error_name(LIBUSB_ERROR_OVERFLOW));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_PIPE,          libusb_error_name(LIBUSB_ERROR_PIPE));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_INTERRUPTED,   libusb_error_name(LIBUSB_ERROR_INTERRUPTED));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_NO_MEM,        libusb_error_name(LIBUSB_ERROR_NO_MEM));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_NOT_SUPPORTED, libusb_error_name(LIBUSB_ERROR_NOT_SUPPORTED));
    printf("errCode=%3d, errName=\"%s\"\n", LIBUSB_ERROR_OTHER,         libusb_error_name(LIBUSB_ERROR_OTHER));
    putchar('\n');
    
    // 打印错误码描述,语言默认为英语。
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_SUCCESS,             libusb_strerror(LIBUSB_SUCCESS));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_IO,            libusb_strerror(LIBUSB_ERROR_IO));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_INVALID_PARAM, libusb_strerror(LIBUSB_ERROR_INVALID_PARAM));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_ACCESS,        libusb_strerror(LIBUSB_ERROR_ACCESS));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_NO_DEVICE,     libusb_strerror(LIBUSB_ERROR_NO_DEVICE));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_NOT_FOUND,     libusb_strerror(LIBUSB_ERROR_NOT_FOUND));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_BUSY,          libusb_strerror(LIBUSB_ERROR_BUSY));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_TIMEOUT,       libusb_strerror(LIBUSB_ERROR_TIMEOUT));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_OVERFLOW,      libusb_strerror(LIBUSB_ERROR_OVERFLOW));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_PIPE,          libusb_strerror(LIBUSB_ERROR_PIPE));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_INTERRUPTED,   libusb_strerror(LIBUSB_ERROR_INTERRUPTED));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_NO_MEM,        libusb_strerror(LIBUSB_ERROR_NO_MEM));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_NOT_SUPPORTED, libusb_strerror(LIBUSB_ERROR_NOT_SUPPORTED));
    printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_OTHER,         libusb_strerror(LIBUSB_ERROR_OTHER));
    putchar('\n');
    
    // 打印错误码描述,语言设置为其他语言。
    // 本次实测结果仅支持 en-英语、fr-法语、nl-荷兰语、ru-俄语。
    int i, errCode;
    int number = sizeof(languages)/sizeof(char*);
    for(i=0; i<number; i+=2){
        errCode = libusb_setlocale(languages[i]);
        if(errCode == LIBUSB_SUCCESS){
            printf("libusb_setlocale(%s,%s): errCode=%3d, errName=\"%s\"\n", languages[i], languages[i+1], errCode, libusb_error_name(errCode));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_SUCCESS,             libusb_strerror(LIBUSB_SUCCESS));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_IO,            libusb_strerror(LIBUSB_ERROR_IO));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_INVALID_PARAM, libusb_strerror(LIBUSB_ERROR_INVALID_PARAM));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_ACCESS,        libusb_strerror(LIBUSB_ERROR_ACCESS));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_NO_DEVICE,     libusb_strerror(LIBUSB_ERROR_NO_DEVICE));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_NOT_FOUND,     libusb_strerror(LIBUSB_ERROR_NOT_FOUND));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_BUSY,          libusb_strerror(LIBUSB_ERROR_BUSY));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_TIMEOUT,       libusb_strerror(LIBUSB_ERROR_TIMEOUT));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_OVERFLOW,      libusb_strerror(LIBUSB_ERROR_OVERFLOW));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_PIPE,          libusb_strerror(LIBUSB_ERROR_PIPE));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_INTERRUPTED,   libusb_strerror(LIBUSB_ERROR_INTERRUPTED));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_NO_MEM,        libusb_strerror(LIBUSB_ERROR_NO_MEM));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_NOT_SUPPORTED, libusb_strerror(LIBUSB_ERROR_NOT_SUPPORTED));
            printf("errCode=%3d, errString=\"%s\"\n", LIBUSB_ERROR_OTHER,         libusb_strerror(LIBUSB_ERROR_OTHER));
            putchar('\n');
        }
    }
    
    // 初始化libusb环境上下文
    libusb_context *libusbCtx = NULL;
    errCode = libusb_init(&libusbCtx);
    if(errCode) return -1;
    
    // 检查此平台的libusb支持的功能
    if(libusb_has_capability(LIBUSB_CAP_HAS_CAPABILITY)){
        printf("支持 LIBUSB_CAP_HAS_CAPABILITY \n");
    }
    if(libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)){
        printf("支持 LIBUSB_CAP_HAS_HOTPLUG \n");
    }
    if(libusb_has_capability(LIBUSB_CAP_HAS_HID_ACCESS)){
        printf("支持 LIBUSB_CAP_HAS_HID_ACCESS \n");
    }
    if(libusb_has_capability(LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER)){
        printf("支持 LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER \n");
    }
    
    // 打印libusb版本号
    const struct libusb_version *libusbVersion = libusb_get_version();
    if(libusbVersion){
        printf("libusbVersion = %u.%u.%u\n", libusbVersion->major, libusbVersion->minor, libusbVersion->micro);
    }
    
    // 取消libusb环境上下文的初始化
    libusb_exit(libusbCtx);
    return 0;
}
INCLUDE=-I/usr/include/libusb-1.0/
LIBDIR=-L/usr/lib/x86_64-linux-gnu/ -lusb-1.0

all: 
    gcc -o test1.exe test1.c $(INCLUDE) $(LIBDIR) -Wall

运行结果:

test@test-PC:~/TMP/libusb$ ./test1.exe 

errCode=  0, errName="LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED"
errCode= -1, errName="LIBUSB_ERROR_IO"
errCode= -2, errName="LIBUSB_ERROR_INVALID_PARAM"
errCode= -3, errName="LIBUSB_ERROR_ACCESS"
errCode= -4, errName="LIBUSB_ERROR_NO_DEVICE"
errCode= -5, errName="LIBUSB_ERROR_NOT_FOUND"
errCode= -6, errName="LIBUSB_ERROR_BUSY"
errCode= -7, errName="LIBUSB_ERROR_TIMEOUT"
errCode= -8, errName="LIBUSB_ERROR_OVERFLOW"
errCode= -9, errName="LIBUSB_ERROR_PIPE"
errCode=-10, errName="LIBUSB_ERROR_INTERRUPTED"
errCode=-11, errName="LIBUSB_ERROR_NO_MEM"
errCode=-12, errName="LIBUSB_ERROR_NOT_SUPPORTED"
errCode=-99, errName="LIBUSB_ERROR_OTHER"

errCode=  0, errString="Success"
errCode= -1, errString="Input/Output Error"
errCode= -2, errString="Invalid parameter"
errCode= -3, errString="Access denied (insufficient permissions)"
errCode= -4, errString="No such device (it may have been disconnected)"
errCode= -5, errString="Entity not found"
errCode= -6, errString="Resource busy"
errCode= -7, errString="Operation timed out"
errCode= -8, errString="Overflow"
errCode= -9, errString="Pipe error"
errCode=-10, errString="System call interrupted (perhaps due to signal)"
errCode=-11, errString="Insufficient memory"
errCode=-12, errString="Operation not supported or unimplemented on this platform"
errCode=-99, errString="Other error"

libusb_setlocale(fr,法语): errCode=  0, errName="LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED"
errCode=  0, errString="Succès"
errCode= -1, errString="Erreur d'entrée/sortie"
errCode= -2, errString="Paramètre invalide"
errCode= -3, errString="Accès refusé (permissions insuffisantes)"
errCode= -4, errString="Périphérique introuvable (peut-être déconnecté)"
errCode= -5, errString="Elément introuvable"
errCode= -6, errString="Resource déjà occupée"
errCode= -7, errString="Operation expirée"
errCode= -8, errString="Débordement"
errCode= -9, errString="Erreur de pipe"
errCode=-10, errString="Appel système abandonné (peut-être à cause d’un signal)"
errCode=-11, errString="Mémoire insuffisante"
errCode=-12, errString="Opération non supportée or non implémentée sur cette plateforme"
errCode=-99, errString="Autre erreur"

libusb_setlocale(nl,荷兰语): errCode=  0, errName="LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED"
errCode=  0, errString="Gelukt"
errCode= -1, errString="Invoer-/uitvoerfout"
errCode= -2, errString="Ongeldig argument"
errCode= -3, errString="Toegang geweigerd (onvoldoende toegangsrechten)"
errCode= -4, errString="Apparaat bestaat niet (verbinding met apparaat verbroken?)"
errCode= -5, errString="Niet gevonden"
errCode= -6, errString="Apparaat of hulpbron is bezig"
errCode= -7, errString="Bewerking verlopen"
errCode= -8, errString="Waarde is te groot"
errCode= -9, errString="Gebroken pijp"
errCode=-10, errString="Onderbroken systeemaanroep"
errCode=-11, errString="Onvoldoende geheugen beschikbaar"
errCode=-12, errString="Bewerking wordt niet ondersteund"
errCode=-99, errString="Andere fout"

libusb_setlocale(en,英语): errCode=  0, errName="LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED"
errCode=  0, errString="Success"
errCode= -1, errString="Input/Output Error"
errCode= -2, errString="Invalid parameter"
errCode= -3, errString="Access denied (insufficient permissions)"
errCode= -4, errString="No such device (it may have been disconnected)"
errCode= -5, errString="Entity not found"
errCode= -6, errString="Resource busy"
errCode= -7, errString="Operation timed out"
errCode= -8, errString="Overflow"
errCode= -9, errString="Pipe error"
errCode=-10, errString="System call interrupted (perhaps due to signal)"
errCode=-11, errString="Insufficient memory"
errCode=-12, errString="Operation not supported or unimplemented on this platform"
errCode=-99, errString="Other error"

libusb_setlocale(ru,俄语): errCode=  0, errName="LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED"
errCode=  0, errString="Успех"
errCode= -1, errString="Ошибка ввода/вывода"
errCode= -2, errString="Неверный параметр"
errCode= -3, errString="Доступ запрещён (не хватает прав)"
errCode= -4, errString="Устройство отсутствует (возможно, оно было отсоединено)"
errCode= -5, errString="Элемент не найден"
errCode= -6, errString="Ресурс занят"
errCode= -7, errString="Истекло время ожидания операции"
errCode= -8, errString="Переполнение"
errCode= -9, errString="Ошибка канала"
errCode=-10, errString="Системный вызов прерван (возможно, сигналом)"
errCode=-11, errString="Память исчерпана"
errCode=-12, errString="Операция не поддерживается данной платформой"
errCode=-99, errString="Неизвестная ошибка"

支持 LIBUSB_CAP_HAS_CAPABILITY 
支持 LIBUSB_CAP_HAS_HOTPLUG 
支持 LIBUSB_CAP_HAS_HID_ACCESS 
支持 LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER 
libusbVersion = 1.0.22
test@test-PC:~/TMP/libusb$
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容