linux内核配置usb虚拟串口,Linux USB虚拟串口设备

Linux内核中usb设备侧驱动程序分成3个层次:UDC驱动程序、Gadget API和Gadget驱动程序。UDC驱动程序(USB控制器)直接访问硬件,控制USB设备和主机间的底层通信,向上层提供与硬件相关操作的回调函数。Gadget API是UDC驱动程序回调函数的简单包装,这部分程序内核都已经写好。Gadget驱动程序具体控制USB设备功能的实现,使设备表现出“U盘”、“虚拟串口”等特性。

简单看个usb 虚拟串口例子

Overview

--------

The gadget serial driver is a Linux USB gadget driver, a USB device

side driver.  It runs on a Linux system that has USB device side

hardware; for example, a PDA, an embedded Linux system, or a PC

with a USB development card.

The gadget serial driver talks over USB to either a CDC ACM driver

or a generic USB serial driver running on a host PC.

Host

-------------------------------------- | Host-Side   CDC ACM       USB Host   | | Operating |   or        | Controller |   USB | System    | Generic USB | Driver     |-------- | (Linux or | Serial      | and        |        | | Windows)    Driver        USB Stack  |        | --------------------------------------         | | | | Gadget                                         | --------------------------------------         | | Gadget                   USB Periph. |        | | Device-Side |  Gadget  | Controller  |        | | Linux       |  Serial  | Driver      |-------- | Operating   |  Driver  | and         | | System                   USB Stack   | --------------------------------------

On the device-side Linux system, the gadget serial driver looks

like a serial device.

On the host-side system, the gadget serial device looks like a

CDC ACM compliant class device or a simple vendor specific device

with bulk in and bulk out endpoints, and it is treated similarly

to other serial devices.

The host side driver can potentially be any ACM compliant driver

or any driver that can talk to a device with a simple bulk in/out

interface.  Gadget serial has been tested with the Linux ACM driver,

the Windows usbser.sys ACM driver, and the Linux USB generic serial

driver.

With the gadget serial driver and the host side ACM or generic

serial driver running, you should be able to communicate between

the host and the gadget side systems as if they were connected by a

serial cable.

The gadget serial driver only provides simple unreliable data

communication.  It does not yet handle flow control or many other

features of normal serial devices.

内核版本:3.15                    硬件:ATMEL  SAMA5D3            编译环境:ubuntu 12.04

1、配置内核

这里之所以都选择为模块的形式,是为了调试方便,有些模块,比如U盘加载时还需要提供介质,就是说加载模块时还需要参数,否则加载不上

Device Drivers  --->

[*] USB support  --->

  USB Gadget Support  --->

  USB Gadget Drivers

< >     USB functions configurable through configfs

< >     Gadget Zero (DEVELOPMENT)

< >     Ethernet Gadget (with CDC Ethernet support)

< >     Network Control Model (NCM) support

< >     Gadget Filesystem

< >     Function Filesystem

< >     Mass Storage Gadget

< >     USB Gadget Target Fabric Module

    Serial Gadget (with CDC ACM and CDC OBEX support)

< >     Printer Gadget

保存退出,编译内核。在drivers/usb/gadget目录下会生成以下驱动文件

-rw-rw-r-- 1 a_tu a_tu  9710  3月  5 15:14 ./g_serial.ko

-rw-rw-r-- 1 a_tu a_tu 49319  3月  5 15:14 ./libcomposite.ko

-rw-rw-r-- 1 a_tu a_tu 11473  3月  5 15:14 ./usb_f_acm.ko

-rw-rw-r-- 1 a_tu a_tu  9485  3月  5 15:14 ./usb_f_obex.ko

-rw-rw-r-- 1 a_tu a_tu  8011  3月  5 15:14 ./usb_f_serial.ko

-rw-rw-r-- 1 a_tu a_tu 15970  3月  5 15:14 ./u_serial.ko

2、操作开发板

把编译好的内核烧入开发板,加载生成的驱动文件,注意加载顺序,否则会出现错误。

insmod  u_serial.ko

insmod  libcomposite.ko

insmod   usb_f_serial.ko

insmod  usb_f_obex.ko

insmod  usb_f_acm.ko

insmod  g_serial.ko

出现内核信息如下:

[   27.310000] --------file=composite.c-------usb_composite_probe------1830

[   27.320000] ------------402

[   27.320000] -----usb_gadget_probe_driver------411

[   27.330000] -------udc_bind_to_driver-----342

[   27.330000] g_serial gadget: Gadget Serial v2.4

[   27.340000] g_serial gadget: g_serial ready

[   18.960000] g_serial gadget: high-speed config #2: CDC ACM config

说明加载成功。

此时你打开设备管理器会发现多了一个串口设备,

ELMO GMAS(COM10)

0818b9ca8b590ca3270a3433284dd417.png

Win7操作系统可以自动加载基于udc标准的serial驱动。

对于WinXP操作系统,要使用ACM串口,需要WindowsXP机器上有gserial.inf和usbser.sys这两个文件,其中gserial.inf的配置如下:

[Version] Signature='$Windows NT$' Class=Ports ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} Provider=%LINUX% DriverVer=08/17/2004,0.0.2.0 ; Copyright (C) 2004 Al Borchers (alborchers@steinerpoint.com) [Manufacturer] %LINUX%=GSerialDeviceList [GSerialDeviceList] %GSERIAL%=GSerialInstall, USB\VID_0525&PID_A4A7 [DestinationDirs] DefaultDestDir=10,System32\Drivers [GSerialInstall] CopyFiles=GSerialCopyFiles AddReg=GSerialAddReg [GSerialCopyFiles] usbser.sys [GSerialAddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,usbser.sys HKR,,EnumPropPages32,,'MsPorts.dll,SerialPortPropPageProvider' [GSerialInstall.Services] AddService = usbser,0x0002,GSerialService [GSerialService] DisplayName = %GSERIAL_DISPLAY_NAME% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\System32\Drivers\usbser.sys LoadOrderGroup = Base [Strings] LINUX = 'Linux' GSERIAL = 'Gadget Serial' GSERIAL_DISPLAY_NAME = 'USB Gadget Serial Driver'

安装成功后,在设备管理器中可以看到 “Gadget Serial (COM11) '这个端口。

开发板的/dev/下会出现/dev/ttyGS0这个设备。当然如果你怕这个设备重名,可以更改这个设备节点。操作如下:

cat /proc/devices

Character devices: 1 mem 2 pty 3 ttyp 4 /dev/vc/0 4 tty 4 ttyS 5 /dev/tty 5 /dev/console 5 /dev/ptmx 7 vcs 10 misc 13 input 90 mtd 128 ptm 136 pts 153 spi 251 ttyGS

mknod /dev/usb_serial c 254 0

以后可以直接按照串口通讯的方式打开该节点 /dev/usb_serial,进行数据读写操作。

3、通信测试

开发板上执行命令  cat /dev/usb_serial(当然你也可以编写程序,打开设备读写),这里只是简单的测试设备通信是否正常 ,pc机上打开串口调试助手,打开com10,通过字符串输入框发送数据。此时发现开发板没有收到数据,而串口助手却收到自己发送的数据。这让我很是纳闷,折腾了2天,终于睡醒了。

又测试了另一通路:开发板给pc发。echo 12345 > /dev/usb_serial

这是完全正常的,通过串口助手收到的数据来看。每次收到的数据都有换行现象,会不会是数据没有从缓冲区中刷出来?我就换了数据格式,发送简单文件

111111111111111111

222222222222222222

222222222222222222

444444444444444444

此时开发板收到数据

# cat /dev/usb_serial

111111111111111111

222222222222222222

222222222222222222

444444444444444444

原来真的是 "\n" 在作怪!!!,如果你的文件只有一行,且没有换行。那么你的开发板是收不到数据的,这些数据并没有丢失,而是存储在串口的缓冲区中,直到遇到 "\n",才会把数据一股脑发出来。

至此测试完毕。

本人水平有限,文章仅代表个人观点,如有错误,请指正!!!

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

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

相关文章

linux 内核移植和根文件系统的制作【转载】

原文地址&#xff1a;http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html1.1 Linux内核基础知识 在动手进行Linux内核移植之前&#xff0c;非常有必要对Linux内核进行一定的了解&#xff0c;下面从Linux内核的版本和分类说起。 1.1.1 Linux版本 Linux内核的版本…

Chunked coding converter插件的使用方法

burp插件----Chunked coding converter url下载&#xff1a;https://github.com/zxl2605/chunked-coding-converter 安装步骤&#xff1a;BurpSuite -> Extender -> Extensions -> Add -> Extension Type: Python -> Select file: chunked-coding-converter.0.…

linux 提升cpu权限,CPUlimit有效防止Linux系统CPU过载

最近使用Nginx服务器测试 pagespeed 的加速效果时&#xff0c;发现这货会造成 CPU 占用过高&#xff0c;Nginx 经常 100%&#xff0c;尽管使用的是静态缓存&#xff0c;总是触发主机商的CPU占用上限&#xff0c;不停的被强制关机。发现 CPULimit 这款工具刚好可以解决这个问题&…

什么是CSS?你真的理解?

什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中&#xff0c;是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CSS 文件中多个样式定义可层叠为一个 样…

大数据公司

合肥盈云科技信息有限公司 中润普达&#xff08;集团&#xff09;公司转载于:https://www.cnblogs.com/hugh2006/p/4587232.html

domain hunter pro插件的使用方法

bilibili教程&#xff1a;https://www.bilibili.com/video/BV1eA411P7xC/ 安装 获取软件的Jar包&#xff0c;由于该软件是基于BurpSuite的插件程序。需要与BurpSuite一起使用。 安装后的界面效果 项目管理 创建一个新的项目&#xff0c;也可以打开已有的项目文件&#xf…

qt linux opensource ,QT opensource embedded linux 编…

建立自己的编译链文件夹 mkdir linux-mick-omap拷贝别的文件夹下&#xff0c;譬如linux-arm-g中的qmake.conf qplatformdefs.h到linux-mick-omap修改qmake.conf, 把arm-linux-gcc 和 arm-linux-g改成自己的arm-none-linux-gnueabi-gcc 和 arm-none-linux-gnueabi-g只需要修改前…

CSS基本语法?

CSS 实例 CSS 规则由两个主要的部分构成&#xff1a;选择器&#xff0c;以及一条或多条声明: 选择器通常是您需要改变样式的 HTML 元素。 每条声明由一个属性和一个值组成。 属性&#xff08;property&#xff09;是您希望设置的样式属性&#xff08;style attribute&#x…

java中远程连接忽略证书_忽略Java中的自签名证书

java中远程连接忽略证书我在职业生涯中遇到过几次问题&#xff0c;就是我们有时希望允许自签名证书用于开发或测试目的。 Google的快速搜索显示了多年来无数Java开发人员遇到的麻烦。 根据确切的证书问题&#xff0c;您可能会收到类似以下内容之一的错误&#xff0c;尽管我几乎…

BurpSuite插件 -- FastjsonScan(反序列化检测)

你可以因为现任不好二分手&#xff0c;但千万不要认为别人更好&#xff0c;永远有人更好&#xff0c;眼下便是更好。。。 ---- 网易云热评 一、插件介绍&#xff1a; 一个简单的Fastjson反序列化检测burp插件&#xff0c;我在挖洞的时候看到一些json请求总是想要检测一下有没有…

开发人员对Spring vs JavaEE的看法

在Java社区中&#xff0c;Spring vs JavaEE是一个永无止境的争论。 在这样的辩论中&#xff0c;人们组成一个团体&#xff0c;由两个传播者&#xff0c;建筑师和一个平台的核心粉丝组成&#xff0c;并且不断进行辩论。 参与辩论的人可能是负责平台选择的架构师。 但是开发人员会…

使自定义控件居中于父容器的计算公式

frm.Top (this.panelListView.Height - frm.Height) / 2; frm.Left (this.panelListView.Width - frm.Width) / 2; 设置两个值&#xff0c;top和left&#xff0c;公式&#xff1a;用父容器的长宽减去自定义控件的长宽然后除以二。转载于:https://www.cnblogs.com/llcdbk/p/46…

查看linux电脑总内存,如何查看Linux系统中的内存使用情况的命令呢?

有些命令可用于检查Linux系统中的内存使用情况。这是一些更好的命令。有很多工具可以查看Linux系统中的内存使用情况。一些命令被广泛使用&#xff0c;例如free和ps。其他命令允许以多种方式显示系统的性能统计信息&#xff0c;例如top。在本文中&#xff0c;我们将介绍一些命令…

如何玩转CSS的Id 和 Class选择器?

目录 id 和 class 选择器 id 选择器 class 选择器 id 和 class 选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置”id” 和 “class”选择器。 id 选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式。 HTML元素以id属性来设置id选择器,CSS 中 id…

【工具使用】Xray与Burp联动--流量转发插件Passive Scan Client

Burp被动扫描流量转发插件:Passive Scan Client 0x01 插件编译 插件地址&#xff1a;https://github.com/c0ny1/passive-scan-client rootkali:~# git clone https://github.com/c0ny1/passive-scan-client.git rootkali:~# cd passive-scan-client/ rootkali:~/passive-scan…

linux 用mutex定义一个linkedlist,【基于LINUX的操作系统实验教程最终版材料】

(基于LINUX的操作系统实验教程)(最终版)《基于LINUX的操作系统实验教程.doc》由会员分享&#xff0c;可免费在线阅读全文&#xff0c;更多与《(基于LINUX的操作系统实验教程)(最终版)》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、b&#xff1b;*Waitonthe…

怎么玩转CSS内部样式表与外部样式表?

CSS 创建 当读到一个样式表时,浏览器会根据它来格式化 HTML 文档。 如何插入样式表 插入样式表的方法有三种: 外部样式表(External style sheet)内部样式表(Internal style sheet)内联样式(Inline style)外部样式表 当样式需要应用于很多页面时,外部样式表将是理想的选择。…

服务器硬件监控转载:

转载&#xff1a;http://nolinux.blog.51cto.com/4824967/1664664 前一周上架服务器&#xff0c;本来准备把针对服务器的硬件监控这一部分总结下成文&#xff0c;结果过个端午给过忘了。。。今天就又整理了下&#xff0c;在这里分享给51博友&#xff0c;也算是对自己前段工作的…

java 分析java死锁_有益的CountDownLatch和棘手的Java死锁

java 分析java死锁您是否曾经使用过java.util.concurrent.CountDownLatch &#xff1f; 这是在两个或多个线程之间实现同步的非常方便的类&#xff0c;在该类中&#xff0c;一个或多个线程可以等待&#xff0c;直到在其他线程中执行的一组操作完成为止&#xff08;请参阅javado…

验证码识别Burp reCAPTCHA插件使用

介绍 Burp的reCAPTCHA也可用来识别验证码&#xff0c;github地址&#xff1a;https://github.com/bit4woo/reCAPTCHA&#xff0c;下载相应的jar包添加到burp中&#xff0c;位置在extender-extensions-add下&#xff0c;添加成功后burp模块栏会多出reCAPTCHA一栏&#xff0c;如下…