X2000 freeRTOS usb_bulk通信

news2024/10/6 10:30:05

例程

官方例程..\freertos\example\usb\device\gadget_generic_bulk.c,代码如下:

#include <common.h>
#include <usb/gadget_bulk.h>
#include <os.h>

static const struct gadget_id bulk_id = {
    .vendor_id = 0x1CBE,
    .product_id = 0x0003
};

static void bulk_connect_callback(int connect)
{
    printf("generic_bulk_connect_callback %d\n", connect);
}

static unsigned char usb_test_buf[1024];
static const char *usb_test_char = "hello world!\r\n";
static void usb_gadget_bulk_thread(void *data)
{
    int len, i;

    while (1) {
        msleep(1000);
        gadget_bulk_write((const unsigned char *)usb_test_char, strlen(usb_test_char), 1, THREAD_COND_TIMEOUT_NO_LIMIT_MS);
        len = gadget_bulk_read(usb_test_buf, sizeof(usb_test_buf), 0, 0);
        if (len > 0) {
            for(i = 0; i < len; i++)
                printf("usb bulk read data %d\n", usb_test_buf[i]);
        }

    }
}

int gadget_usb_bulk_test(void)
{
    gadget_bulk_init(&bulk_id, bulk_connect_callback);
    thread_create("usb gadget bulk thread", 4096, usb_gadget_bulk_thread, NULL);
    return 0;
}

 只能修改vendor_id和product_id,描述的内容是固定的,如需修改描述符等信息,需要..\freertos\drivers\usb\gadget\generic_bulk\generic_bulk.c文件,代码如下:

#include <common.h>
#include <os.h>
#include <usb/gadget_bulk.h>

#include "../composite.h"

#define DRIVER_DESC        "Generic Bulk Device"

extern struct usb_function *generic_bulk_device_alloc(connect_callback_t connect_cb);
extern void generic_bulk_device_free(void);

/*-------------------------------------------------------------------------*/

/*
 * DESCRIPTORS ... most are static, but strings and (full) configuration
 * descriptors are built on demand.
 */

static struct usb_device_descriptor device_desc = {
    .bLength =        sizeof device_desc,
    .bDescriptorType =    USB_DT_DEVICE,
    /* .bcdUSB = DYNAMIC */
    .bDeviceClass =        USB_CLASS_VENDOR_SPEC,
    .bDeviceSubClass =    0,
    .bDeviceProtocol =    0,
    /* .idVendor = DYNAMIC */
    /* .idProduct = DYNAMIC */
    .bNumConfigurations =    1
};

/*-------------------------------------------------------------------------*/

/* static strings, in UTF-8 */
static struct usb_string        strings [] = {
    [USB_GADGET_MANUFACTURER_IDX].s = "INGENIC",
    [USB_GADGET_PRODUCT_IDX].s = DRIVER_DESC,
    [USB_GADGET_SERIAL_IDX].s = "ingenic",
    {  }        /* end of list */
};

static struct usb_gadget_strings    stringtab_dev = {
    .language    = 0x0409,    /* en-us */
    .strings    = strings,
};

static struct usb_gadget_strings *dev_strings[] = {
    &stringtab_dev,
    NULL,
};

static struct usb_configuration generic_bulk_cfg_driver = {
    .label            = DRIVER_DESC,
    .bConfigurationValue    = 1,
};

static connect_callback_t bulk_connect_cb;

static int generic_bulk_do_config(struct usb_configuration *c)
{
    static struct usb_function *f_bulk;
    int            status = 0;

    f_bulk = generic_bulk_device_alloc(bulk_connect_cb);
    if (IS_ERR(f_bulk))
        return PTR_ERR(f_bulk);

    status = usb_add_function(c, f_bulk);
    if (status < 0)
        generic_bulk_device_free();

    return status;
}

static int generic_bulk_bind(struct usb_composite_dev *cdev)
{
    int ret;

    ret = usb_string_ids_tab(cdev, strings);
    if (ret < 0)
        return ret;

    device_desc.iManufacturer = strings[USB_GADGET_MANUFACTURER_IDX].id;
    device_desc.iProduct = strings[USB_GADGET_PRODUCT_IDX].id;
    device_desc.iSerialNumber = strings[USB_GADGET_SERIAL_IDX].id;

    ret = usb_add_config(cdev, &generic_bulk_cfg_driver, generic_bulk_do_config);

    return ret;
}

static int generic_bulk_unbind(struct usb_composite_dev *cdev)
{
    generic_bulk_device_free();

    return 0;
}

static struct usb_composite_driver generic_bulk_driver = {
    .name           = "generic_bulk",
    .dev            = &device_desc,
    .strings        = dev_strings,
    .max_speed      = USB_SPEED_HIGH,
    .bind        = generic_bulk_bind,
    .unbind        = generic_bulk_unbind,
};

int gadget_bulk_init(const struct gadget_id *id, connect_callback_t connect_cb)
{
    int ret;

    if (id == NULL)
        panic("gadget_generic_bulk_init param id is NULL! \n");

    device_desc.idVendor = id->vendor_id;
    device_desc.idProduct = id ->product_id;
    bulk_connect_cb = connect_cb;
    ret = usb_composite_probe(&generic_bulk_driver);

    return ret;
}

void gadget_bulk_cleanup(void)
{
    usb_composite_unregister(&generic_bulk_driver);
}

驱动的头文件为..\freertos\include\usb\gadget_bulk.h,内容如下:

#ifndef _GADGET_BULK_H_
#define _GADGET_BULK_H_

#include "gadget_common.h"

#ifdef CONFIG_USB_GADGET_BULK

extern int gadget_bulk_init(const struct gadget_id *id, connect_callback_t connect_cb);
extern void gadget_bulk_cleanup(void);

extern int gadget_bulk_read(uint8_t *buffer, uint32_t len, uint8_t block, uint32_t timeout_ms);
extern int gadget_bulk_write(const uint8_t *buffer, uint32_t len, uint8_t block, uint32_t timeout_ms);
extern int gadget_bulk_flush_data(uint32_t timeout_ms)
;
extern int gadget_bulk_get_connect_status(void);
extern int gadget_bulk_wait_connect(uint32_t timeout_ms);
#endif

#endif /* _GADGET_BULK_H_ */

需要定义CONFIG_USB_GADGET_BULK宏才能使用驱动函数。

config文件中定义CONFIG_USB_GADGET_BULK宏

保存配置文件,退出。 

测试

将例程gadget_generic_bulk.c中的代码加入主代码,然后编译、下载。设备启动后连接到电脑的USB口,可以看到电脑的设备管理中出现了一个"Generic Bulk Device"设备。

可以用zadig工具为其生成驱动。

安装驱动后,在电脑的设备管理器中可以看到一个libusb的设备:

 

查看描述符

可运行testlibusb-win.exe应用查看USB配置信息:

 从描述符显示有一个接口,包含两个端点,一个输入端点0x81,一个输出端点0x01,数据包长度最大为512字节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.1. 字符串与StringBuilder

1. 字符串&#xff08;String&#xff09; 在Java中&#xff0c;字符串由String类表示。字符串是一系列字符的组合&#xff0c;用于表示文本数据。字符串是不可变的&#xff0c;这意味着一旦创建了一个字符串对象&#xff0c;就不能修改它的内容。 创建字符串 创建字符串的方…

真的裂开了呀,现在的00后,真是卷死了,辞职信已经写好了

谁说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;上个月我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪22K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …

Android 应用打包和编译技术

Android 应用打包和编译技术非常重要&#xff0c;因为它们可以帮助开发者将代码转换成可执行的应用程序&#xff0c;并优化应用程序的性能和稳定性。 1. Gradle Gradle 是基于 Groovy 语言和 Java 虚拟机&#xff08;JVM&#xff09;运行的构建工具&#xff0c;通过它来配置应…

【目标检测】yolov5代码实战

文章目录 一、yolov5介绍二、yolov5安装2.1 yolov5的源码下载2.2 预训练模型下载2.3 安装yolov5的依赖项2.4 检测是否安装成功 三、yolov5训练自己的数据集参考资料 一、yolov5介绍 YOLO 是 “You only look once” 缩写 , 是将图像划分为网格系统的对象检测算法&#xff0c;网…

110.(cesium篇)cesium动态河流流水

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: cesium动态河流流水 下面献上完整代码,代码重要位置会做相应解释 <html lang="en

HHDESK及HHDBCS快捷升级功能

为提升用户体验&#xff0c;HHDESK及HHDBCS新增了一项功能&#xff0c;一键升级。 1 使用软件时快捷升级 在产品首页点击帮助&#xff0c;选择软件升级 弹出如下对话框&#xff1b;点击确定 随即弹出对话框&#xff1b;点击浏览&#xff0c;选择下载到本机上的新版本产品…

踢碎破局陷阱,来一场酣畅淋漓的 SLG!

SLG 作为深度策略游戏品类的代表&#xff0c;一直是展现人类智慧之光的最佳舞台之一。欣赏顶尖玩家间的对决是一场大脑的狂欢&#xff0c;奇谋频出、神机莫测般的对局让人不禁摩拳擦掌&#xff0c;跃跃欲试。但当我们打开游戏时&#xff0c;往往是高玩难觅&#xff0c;人机相陪…

3.4. Java集合框架(List、Set、Map等)

Java集合框架是Java提供的一套用于存储和操作数据的接口和类。它包括以下几个主要部分&#xff1a; 接口&#xff1a;集合框架定义了一系列接口&#xff0c;如Collection、List、Set、Map等。实现类&#xff1a;集合框架提供了一些实现这些接口的类&#xff0c;如ArrayList、L…

【HISI IC萌新虚拟项目】cpu_if模块方案文档

该文档仅为参考,如果在进行本系列虚拟项目的学习与实践,请自行完成本部分内容。 由于文档格式在之前博客中已展现,因此本文只针对关键点写一下方案。 cpu_if模块概述 cpu_if模块主要是寄存器单元以及寄存器访问通路的处理,可以看下整体结构图: 因此我们可以概括cpu_if模…

看完这篇 教你玩转渗透测试靶机vulnhub—DarkHole

Vulnhub靶机DarkHole渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;逻辑漏洞&#xff1a;③&#xff1a;文件上传GetShell&#xff1a;④…

用可编程逻辑器件FPGA LCMXO2-4000HC-6MG132I 实现智能汽车解决方案设计

LCMXO2-4000HC-6MG132I lattice莱迪斯深力科 MachXO2 可编程逻辑器件 (PLD) 由六个超低功耗、即时启动、非易失性 PLD 组成&#xff0c;可提供 256 至 6864 个查找表 (LUT) 的密度。 MachXO2 系列 PLD 提供多种特性&#xff0c;例如嵌入式块 RAM (EBR)、分布式 RAM 和用户闪存 …

PhoneHelper

不一样的手机管理工具 一款基于 Golang 语言开发的手机管理软件——PhoneHelper。 PhoneHelper 是一款支持无线&#xff08;安卓11及以上支持扫码连接&#xff09;和有线的adb方式连接设备并且管理设备的软件&#xff0c;同时已适配 Windows、Linux、MacOS 平台&#xff0c;在不…

在Linux设备上让程序在任意目录都能执行

目录 0. 前言1. 编写代码2. 创建软链接3. 其他Linux文章 0. 前言 在Ubuntu上使用espidf中往往需要先设置环境变量&#xff0c;再执行export.sh&#xff0c;对环境装的乱七八糟的我造成了很大的不便我希望无论我在哪个目录&#xff0c;都能快速执行某个命令 我先是使用了编写b…

2023年高级系统架构设计师 如何备考?

高级架构有一定的难度&#xff0c;但是值得挑战一下 新版《系统架构设计师考试大纲》出版了&#xff01; 可以去官网看看 系统架构设计师是软考的高级科目之一&#xff0c;系统架构设计师一年只有一次考试机会&#xff0c;是在下半年11月份考试 考试科目分为&#xff1a;综合…

Spring5 学习笔记

前置知识&#xff1a; 掌握Java基础知识&#xff08;特别是反射&#xff09;掌握Java注解掌握XML掌握Maven Spring5学习笔记 1、Spring概述1.1、简介1.2、优点1.3、组成1.4、拓展 2、IOC理论推导2.1、分析实现2.2、IOC本质 3、HelloSpring3.1、导入jar包3.2、编写代码3.3、思考…

KUC720AE01 3BHB003431R0001 基于浏览器的简单配置

实时自动化是工业通信领域的最高权威&#xff0c;拥有广泛的网关&#xff0c;可将最多产的工业协议连接到您的MicroLogix、KUC720AE01 3BHB003431R0001、CompactLogix、PLC-5和SLC 5/05 PLC&#xff0c;因此用户可以获得一个简单易用的连接解决方案来集成他们的各种设备。像所有…

黄金期货CFD会亏损吗?有哪些黄金期货CFD常见问题

差价合约(Contract For Difference&#xff0c;CFD)是一种热门的衍生性金融商品&#xff0c;CFD 可以在不实际持有资产的情况下&#xff0c;透过保证金方式来针对股市指数、外汇、贵金属、原物料等商品进行多、空任一方向之交易。投资者在选择黄金交易时&#xff0c;会遇到哪些…

数据结构(二)—— 链表(2)

文章目录 1 143 重排链表1.1 找到原链表的中点&#xff08;「876. 链表的中间结点」&#xff09;。2.2 将原链表的右半端反转&#xff08;「206. 反转链表」&#xff09;3.3 交叉合并两个链表&#xff08;与「21. 合并两个有序链表」思路不同&#xff09;3.4 补充 21 合并两个有…

JavaScript高级一、作用域解构箭头函数

零、文章目录 JavaScript高级一、作用域&解构&箭头函数 1、作用域 &#xff08;1&#xff09;局部作用域 局部作用域分为函数作用域和块作用域。 **函数作用域&#xff1a;**在函数内部声明的变量所在作用域。 函数内部声明的变量&#xff0c;在函数外部无法被访问…

项目冲突3大管理原则及管理模式

1、系统思考原则 此原则即从全局出发&#xff0c;追求全局最优。系统思考原则的关键在于能够从全局出发&#xff0c;发现冲突的“杠杆点”&#xff0c;即可引起结构上重要而持久改善的点。一旦找到最佳的杠杆点&#xff0c;我们便能以小而专注的行动&#xff0c;创造最大的效果…