Q群:
电话:
邮箱:
地址:
接口 | 说明 |
---|---|
os_device_find() | 根据usb设备名称查找设备 |
os_device_open() | 打开usb设备 |
os_device_read() | 读数据 |
os_device_write() | 写数据 |
该函数根据usb设备名称查找设备,函数原型如下:
os_device_t *os_device_find(const char* name);
参数 | 说明 |
---|---|
name | usb设备名称 |
返回 | 说明 |
设备指针 | 查找到对应设备将返回相应的设备指针 |
OS_NULL | 没有找到相应的设备对象 |
该函数用于打开usb设备,函数原型如下:
os_err_t os_device_open(os_device_t *dev, os_uint16_t oflag);
参数 | 说明 |
---|---|
dev | 设备指针 |
oflag | 设备模式标志,一般以读写方式打开,即取值:OS_DEVICE_OFLAG_RDWR |
返回 | 说明 |
OS_EOK | 设备打开成功 |
OS_EBUSY | 设备忙 |
其他错误码 | 设备打开失败 |
该函数用于读取接收到的数据,函数原型如下:
os_size_t os_device_read(os_device_t *dev, os_off_t pos, void* buffer, os_size_t size);
参数 | 说明 |
---|---|
dev | 设备指针 |
pos | 读取数据偏移量,固定为0 |
buffer | 缓冲区指针,读取的数据将会被保存在缓冲区中 |
size | 读取数据的大小 |
返回 | 说明 |
读到数据的实际大小 | 返回读取到数据的个数 |
0 | 需要读取当前线程的 errno 来判断错误状态 |
该函数用于写入发送数据,函数原型如下:
os_size_t os_device_write(os_device_t *dev, os_off_t pos, const void *buffer, os_size_t size);
参数 | 说明 |
---|---|
dev | 设备指针 |
pos | 写入数据偏移量 |
buffer | 内存缓冲区指针,放置要写入的数据 |
size | 写入数据的大小 |
返回 | 说明 |
写入数据的实际大小 | 如果是字符设备,返回大小以字节为单位; |
0 | 需要读取当前线程的 errno 来判断错误状态 |
接口 | 说明 |
---|---|
os_usbd_reset_handler() | 复位事件处理函数 |
os_usbd_connect_handler() | 连接事件处理函数 |
os_usbd_disconnect_handler() | 断开连接事件处理函数 |
该函数用于驱动程序向usbd协议栈传递 reset 事件,函数原型如下:
os_err_t os_usbd_reset_handler(udcd_t dcd);
参数 | 说明 |
---|---|
dcd | usb设备控制对象 |
返回 | 说明 |
OS_EOK | 成功 |
该函数用于驱动程序向usbd协议栈传递 connect 事件,函数原型如下:
os_err_t os_usbd_connect_handler(udcd_t dcd);
参数 | 说明 |
---|---|
dcd | usb设备控制对象 |
返回 | 说明 |
OS_EOK | 成功 |
该函数用于驱动程序向usbd协议栈传递 disconnect 事件,函数原型如下:
os_err_t os_usbd_disconnect_handler(udcd_t dcd);
参数 | 说明 |
---|---|
dcd | usb设备控制对象 |
返回 | 说明 |
OS_EOK | 成功 |
本例程为usb模拟鼠标的测试例程:
#include <board.h>
#include <shell.h>
#include <stdint.h>
static int x = 0;
static int y = 0;
static int left = 0;
static int right = 0;
static int scroll = 0;
static void left_callback(void *args)
{
left = 1;
os_kprintf("left button click\r\n");
}
static void right_callback(void *args)
{
right = 1;
os_kprintf("right button click\r\n");
}
static void update_mouse(os_device_t *device)
{
uint8_t report[4];
if ((left | right) != 0)
{
report[0] = 0x08 | left | right << 1;
}
else
{
report[0] = 0;
}
report[1] = x;
report[2] = y;
report[3] = scroll;
os_device_write(device, HID_REPORT_ID_MOUSE, report, 4);
left = 0;
right = 0;
}
static int usbd_hid_test(int argc, char **argv)
{
int i, j;
os_device_t *device = os_device_find("hidd");
OS_ASSERT(device != OS_NULL);
os_device_open(device, OS_DEVICE_FLAG_WRONLY);
/* mouse left button */
if (key_table_size > 0)
{
os_pin_mode(key_table[0].pin, key_table[0].mode);
os_pin_attach_irq(key_table[0].pin, key_table[0].irq_mode, left_callback, NULL);
os_pin_irq_enable(key_table[0].pin, PIN_IRQ_ENABLE);
}
/* mouse right button */
if (key_table_size > 1)
{
os_pin_mode(key_table[1].pin, key_table[1].mode);
os_pin_attach_irq(key_table[1].pin, key_table[1].irq_mode, right_callback, NULL);
os_pin_irq_enable(key_table[1].pin, PIN_IRQ_ENABLE);
}
for (j = 0; j < 5; j++)
{
os_kprintf("loop %d/5\r\n", j + 1);
for (i = 0; i < 20; i++)
{
x = 10;
y = 0;
update_mouse(device);
os_task_msleep(100);
}
for (i = 0; i < 20; i++)
{
x = 0;
y = 10;
update_mouse(device);
os_task_msleep(100);
}
for (i = 0; i < 20; i++)
{
x = -10;
y = 0;
update_mouse(device);
os_task_msleep(100);
}
for (i = 0; i < 20; i++)
{
x = 0;
y = -10;
update_mouse(device);
os_task_msleep(100);
}
}
return 0;
}
SH_CMD_EXPORT(usbd_hid_test, usbd_hid_test, "usbd_hid_test");
运行结果如下:
sh>usbd_hid_test
loop 1/5
left button click
left button click
loop 2/5
right button click
loop 3/5
loop 4/5
loop 5/5