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)

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",才会把数据一股脑发出来。

至此测试完毕。

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

linux内核配置usb虚拟串口,Linux USB虚拟串口设备相关推荐

  1. Linux内核配置选项的说明,Linux内核配置选项翻译

    Linux内核配置选项翻译 Linux内核配置选项翻译2.6.19.1(转) 内容目录 1. Code maturity level options 2 2. General setup 常规安装选项 ...

  2. linux内核配置高精度时钟,关于linux内核中使用的时钟

    linux内核里面用了很多的时钟,其实这些时钟的用处无外乎就几种:1.作为心跳,中断cpu:2.使得用户可以获取当前时间:3.实时测量:4.定时 服务.知道了使用目的后,我们来看看到底有哪些时钟供我们 ...

  3. linux 内核配置v4l2,深入理解linux内核v4l2框架之videobuf2【转】

    Videobuf2框架 1. 什么是videobuf2框架? 它是一个针对多媒体设备的v4l2兼容驱动框架,是用户空间应用程序和设备驱动的中间层.它为驱动提供更为底层的模块化的内存管理功能. 它能够使 ...

  4. Linux内核配置(转)

    2.5  Linux内核配置选项 下面以最新的Linux 2.6.20内核为例,介绍比较常用的一些Linux内核配置选项,其他选项读者可以参考系统提供的帮助信息. 需要说明的是,在内核配置中,某项选择 ...

  5. linux内核配置大全

    linux内核配置选项大全 Posted by isnull  on December 20, 2010  in SHELL | 0 Comment Code maturity level optio ...

  6. Linux 内核配置选项

    Linux 内核配置选项 第一部分 01.Code maturity level options ---> 代码成熟等级选项 01.01. [ ] Prompt for development ...

  7. Linux 内核配置选项(转)

    Linux 内核配置选项 from http://www.mitbbs.com/mitbbs_article_t.php?board=Linux&gid=10715608&ftype= ...

  8. Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成   那么如何将驱动直接编译进内核 ...

  9. linux内核启动配置,启动linux内核配置

    启动linux内核配置 发布时间:2005-09-22 20:04:48来源:红联作者:ccs LILO 入门 现在是最后来重新配置 LILO 的时候了,它将负责载入新的内核.LILO 是最流行的 L ...

  10. linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解-转

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? ...

最新文章

  1. mysql数据库出现无法登录(ERROR 1045 ),预防和解决及系列问题解决方法。
  2. cnn中关于平均池化和最大池化的理解
  3. ThinkPHP采用模块和操作
  4. Symbol Mc1000 Text文本阅读器整体代码
  5. python tkinter图片为什么要设置全局变量_为什么这里一定要设置全局变量
  6. 馀承东发布鸿蒙,鸿蒙系统一无是处?鸿蒙有何优势?
  7. S5PV210体系结构与接口09:SD卡启动详解
  8. [CF1073E]Segment Sum
  9. 手机连接电脑wifi上网_手机设置无线路由器方法教你一分钟学会WIFI上网(无需电脑)...
  10. 实变函数与计算机有关系吗,《复变函数与实变函数》
  11. Filezilla Server使用教程
  12. 千万不要攻击中国网站!传奇美国黑客凯文·米特尼克的警告
  13. 接口请求 Provisional headers are shown
  14. 【ONES 校招前端笔试+一面】
  15. matlab回车键,在Matlab中启动.exe文件后,以编程方式按一下回车键
  16. 如何查看GPU的计算能力?
  17. Python3 03 网络爬虫 <下载漫画>
  18. (CVPR-2020)GaitPart:基于时间部分的步态识别模型(一)
  19. 拆解KinectFusion算法之TSDF
  20. 软件测试工程师面试的时候可能被提到的问题

热门文章

  1. matlab 大于并且小于,Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列
  2. c语言链表写贪吃蛇思路,C语言构建的链表贪吃蛇
  3. python如何设计系统界面教程_python中pycharm软件界面介绍与配置
  4. oracle 中文脚本,ORACLE常用脚本
  5. 常见的股票技术因子学习以及计算
  6. openssl php api,PHP7使用openssl解密易班API中的用户数据
  7. beta冲刺(1/7)
  8. Tensorflow笔记(一)
  9. SocketServer模块,hmac模块验证client合法性
  10. 关键字驱动小例子_example2