Linux USB HID Device 测试代码

/*****************************************************************
* Author:        DriverMonkey
* Mail:        bookworepeng@Hotmail.com
* Phone:        18575593141
* QQ:        196568501
* Blog:        http://blog.csdn.net/drivermonkey
* Date:        02/07/2015
 *****************************************************************/
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/hid.h>
#include <linux/hidraw.h>

#define HID_MAX_PACKET_SIZE 64
#define HID_BUFFER_SIZE (10*1024*1024)// 10M bytes
 
typedef struct 
{
    char null_array[HID_MAX_PACKET_SIZE];
}buffer_offset_size_t;
 
 
static char hid_read_buffer[HID_BUFFER_SIZE];
static char hid_write_buffer[HID_BUFFER_SIZE];
 
static int hid_file_handle = 0;
static const char* hid_file_name = "/dev/hidraw1";
 
static int hid_init(void);
static int hid_read(void* buffer, int buffer_size);
static int hid_write(void* buffer, int buffer_size);
 
/*****************************************************************
 * Function name:             main
 * Author:                DriverMonkey
 * Function Description:     main function just for hid temp testing
 * Input argv:
 * Output argv:
 * Return:
 * Be careful:
 *****************************************************************/
int main(void)
{
    int read_size = 0;
    int test_count = 100;
    struct hidraw_devinfo raw_info;
    hid_init();

    if(-1 == ioctl(hid_file_handle, HIDIOCGRAWINFO, &raw_info)){
        printf("1");
       }
    if(4096 == raw_info.product && 1546 == raw_info.vendor)//
    {
        printf("prot:%d",raw_info.product);
    }

    while(test_count--)
    {
        memset(hid_read_buffer, 0x00, HID_BUFFER_SIZE);
        read_size = hid_read(hid_read_buffer, HID_BUFFER_SIZE);
        // printf("getting report::%s \n", hid_read_buffer);
 
        memset(hid_write_buffer, 0x00, HID_BUFFER_SIZE);
        strcpy(hid_write_buffer, hid_read_buffer);
        hid_write(hid_write_buffer, read_size);
    }
    
    return 0;
}
/*****************************************************************
 * Function name:             hid_init
 * Author:                DriverMonkey
 * Function Description:     init HID
 * Input argv:
 * Output argv:
 * Return:                >= 0 - no error
                         < 0 - reading error
 * Be careful: Must be called befoore HID be used!
 *****************************************************************/
static int hid_init(void)
{
    if ((hid_file_handle = open(hid_file_name, O_RDWR, 0666)) < 0)
    {
        perror(hid_file_name);
        return hid_file_handle;
    }else
    {
        return hid_file_handle;
    }
}
 
/*****************************************************************
 * Function name:             hid_read
 * Author:                DriverMonkey
 * Function Description:     Read data form hid driver
 * Input argv:                buffer_size - buffer size 
 * Output argv:            buffer - buffer to save reading out data
 * Return:                >= 0 - read size
                         < 0 - reading error
 * Be careful: 
 *****************************************************************/
static int hid_read(void* buffer, int buffer_size)
{
    if(buffer == NULL)
    {
        perror("hid_read::pointer error!");
        return -1;
    }
    return read(hid_file_handle, buffer, buffer_size);
}
 
/*****************************************************************
 * Function name:             hid_read
 * Author:                DriverMonkey
 * Function Description:     Read data form hid driver
 * Input argv:                buffer_size - buffer size 
 * Output argv:            buffer - buffer to save reading out data
 * Return:                >= 0 - no error
                         < 0 - reading error
 * Be careful: 
 *****************************************************************/
static int hid_write(void* buffer, int buffer_size)
{
    int return_v = 0;
    int writting_count = buffer_size / HID_MAX_PACKET_SIZE;
    int remainding_size = buffer_size % HID_MAX_PACKET_SIZE;
    buffer_offset_size_t* buffer_offset = (buffer_offset_size_t*)buffer;
    
    if(buffer == NULL)
    {
        perror("hid_write::pointer error!");
        return -1;
    }
 
    while(writting_count--)
    {
        return_v = write(hid_file_handle, buffer_offset,HID_MAX_PACKET_SIZE);
        if(return_v < 0)
        {
            perror("hid_write::writting error!");
            return return_v;
        }
        buffer_offset++;
    }
 
    return_v = write(hid_file_handle, buffer_offset, remainding_size);
 
    return return_v;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值