X2000 freeRTOS usb_bulk通信

news/2024/10/17 17:21:56/

例程

官方例程..\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_BULKextern 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.ppmy.cn/news/107321.html

相关文章

算法综合应用实验:供给系统问题

目录 实验内容实验流程实验过程伪代码代码实现分析算法复杂度用例测试 总结 实验内容 外星人指的是地球以外的智慧生命。外星人长的是不是与地球上的人一样并不重要&#xff0c;但起码应该符合我们目前对生命基本形式的认识。比如&#xff0c;我们所知的任何生命都离不开液态水…

基于深度学习的人脸识别与人员信息管理软件【python源码+UI界面+功能源码详解】

人脸识别功能演示 摘要&#xff1a;人脸识别&#xff08;Face Recognition&#xff09;是基于人的脸部特征信息进行身份识别的一种生物识别技术&#xff0c;可以用来确认用户身份。本文详细介绍了人脸识别基本的实现原理&#xff0c;并且基于python与pyqt开发了人脸识别与信息管…

C++11新特性:decltype类型推导

上一节所讲的 auto&#xff0c;用于通过一个表达式在编译时确定待定义的变量类型&#xff0c;auto 所修饰的变量必须被初始化&#xff0c;编译器需要通过初始化来确定 auto 所代表的类型&#xff0c;即必须要定义变量。若仅希望得到类型&#xff0c;而不需要(或不能)定义变量的…

计算机视觉实战--OpenCV进行红绿灯识别

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 OpenCV是一个开源的计算机视觉库&#xff0c;可以用于实现各种图像和视频处理任务&#xff0c;包括红绿灯识别。可以帮助自动驾驶汽车、智能交通系统等设备准确地识别红绿灯的状态&#xff0c;以便做出正确的决策。今天&a…

ArcGis系列-java调用GP分析

1,实现流程 创建GPServer,使用ArcgisPro添加GP工具运行,然后使用共享web服务发布运行成功的GP任务根据发布成功的GPServer发布地址&#xff0c;解析出GP服务的输入参数和输出参数前端输入gp服务需要的参数&#xff0c;发送给后端来异步提交后端提交后创建轮询任务等待执行结果…

python常用库汇总

文章目录 文件处理图像处理大数据与科学计算人工智能与机器学习数据库网 络Web 框架安 全 Chardet→字符编码探测器&#xff0c;可以自动检测文本、网页、xml的编码。 colorama →主要用来给文本添加各种颜色&#xff0c;并且非常简单易用。 Prettytable → 主要用于在终端或浏…

背靠背储能变流器的原理分析

背靠背变流器是一种用于电力转换的设备,通常由两个相互独立的变流器组成,并通过一定的控制方式进行连接和协调工作。它可以将直流电源转换为交流电源,并具有一定的功率因数调节和电网调节功能。其主要应用领域包括太阳能、风能、能源储存等方面。 背靠背变流器是一种采用对称…

Promise.all()和Promise.race()

Promise.all接收的是数组&#xff0c;得到的结果也是数组&#xff0c;并且一一对应&#xff0c;也可以理解为Promise.all照顾跑的最慢的&#xff0c;最慢的跑完才结束。Promise.race接收的也是数组&#xff0c;不过&#xff0c;得到的却是数组中跑的最快的那个&#xff0c;当最…