全部文档
OneOS简介 硬件支持 编译构造工具 API参考文档 高级语言 用户编程手册 应用笔记 FAQ

USB设备


应用API 列表

接口 说明
os_device_find() 根据usb设备名称查找设备
os_device_open() 打开usb设备
os_device_read() 读数据
os_device_write() 写数据

os_device_find

该函数根据usb设备名称查找设备,函数原型如下:

os_device_t *os_device_find(const char* name);
参数 说明
name usb设备名称
返回 说明
设备指针 查找到对应设备将返回相应的设备指针
OS_NULL 没有找到相应的设备对象

os_device_open

该函数用于打开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_device_read

该函数用于读取接收到的数据,函数原型如下:

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_device_write

该函数用于写入发送数据,函数原型如下:

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 来判断错误状态

USBD事件处理函数API列表

接口 说明
os_usbd_reset_handler() 复位事件处理函数
os_usbd_connect_handler() 连接事件处理函数
os_usbd_disconnect_handler() 断开连接事件处理函数

os_usbd_reset_handler

该函数用于驱动程序向usbd协议栈传递 reset 事件,函数原型如下:

os_err_t os_usbd_reset_handler(udcd_t dcd);
参数 说明
dcd usb设备控制对象
返回 说明
OS_EOK 成功

os_usbd_connect_handler

该函数用于驱动程序向usbd协议栈传递 connect 事件,函数原型如下:

os_err_t os_usbd_connect_handler(udcd_t dcd);
参数 说明
dcd usb设备控制对象
返回 说明
OS_EOK 成功

os_usbd_disconnect_handler

该函数用于驱动程序向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

results matching ""

    No results matching ""

    返回顶部