最近工作中又要做linux的sdiowifi和usb设备了,之前说的ros学习暂时放一下,工作很难连续在一个项目上干的时间长久,不过毕竟小公司,能接触的东西也比较多,所以需要及时做好文档,以便日后的查找和阅读。

目录

前言

为什么要叫初探呢,因为之前本科毕业的时候毕设就是usb设备相关的内容,所以之前有所了解,而且之前的驱动是当时老师给的,且没有跑系统,所以这次在原来的基础上加深一下。

linux启动流程

之前没有发过liinux相关的,先简单介绍一下启动流程吧

  • 一. 内核镜像Izmage被bootloader装载到内存中。zImage的入口代码是自引导程序。包含一些初始化代码。第一条指令在head.S文件中。解压内核,然后调用call_kernel启动vmlinux(解压后在正确位置上的内核)

  • 二. vmlinux开始部分的代码对应的文件也叫head.S.这个是体系结构相关的代码,进行页表的初级初始化后打开MMU,跳转到start_kernel函数中去。

  • 三. start_kernel负责初始化内核的各个子系统,然后调用rest_init().

  • 四.reset_init 调用kernel_thread启动init内核线程,执行init函数,init函数负责挂载跟文件系统,初始化设备驱动程序,启动用户空间的init进程。这些工作是内核中最重要的过程

  • 五. 用户空间init进程执行,init程序在根文件系统的/sbin下,负责启动一系列程序与脚本文件。init进程是所有的进程的发起着与控制者。init进程有两种启动方式:

        1.system V启动流程,这是一般桌面版Linux的启动方式,如ubuntu。

(1).执行的地一个脚本是/etc/rc.d/rc.sysinit,包含如下内容:检查磁盘,挂在其他的文件系统等

(2).执行缺醒的运行级别,这个在/etc/inittab中确定

(3).执行/etc/rc.c/rc.local脚本文件,用户可以在这个文件中添加启动后需要执行的命令

(4).执行/bin/login程序,提示用户输入用户名与密码,如果吻合则初始化环境,并将控制权转交shell

2.busybox 启动流程,这是嵌入式系统的启动流程,init程序在/sbin下面,这个是一个符号链接,链接到/bin/busybox上 >(1).为init进程设置信号处理程序

(2).对控制台进行初始化(串口终端)

(3).解析/etc/inittab文件

(4).运行/etc/init.d/rcS脚本,这个脚本设置一些环境变量,运行启动时的程序

usb简单介绍

关于usb接口分类这里就不再赘述了,其实USB接口虽然简单,但是他的协议很复杂。但是再复杂的东西也是遵循一定规律的。USB系统分为USB主机和USB设备,USB所有的协议都是为了主机和设备高效地进行数据交换。

usb通信架构

通信一定是双方面的,所以在usb通信中一定会存在两个方面,在USB世界里就是USB主机和USB设备,但这里有点像一夫多妻制,一个USB主机和一群USB设备。而且USB主机占据这绝对霸权的地位,所有的通信都是由他发起,USB设备几乎没有一点权利 重要概念: * USB主机(host)

先说USB主机,说起他我们就会想起电脑上的USB插口,对没错他就是USB主机,更确切的说是USB主机对外的窗口。这里所说的主机其实是USB主机和ROOT HUB的结合体,什么是HUB,什么又是ROOT HUB。HUB就是分线器,其实也属于USB设备的范畴,他的作用有两个:一是检测设备,二是提供更多的接口来连接设备。而ROOT HUB有点特殊,生来就是和USB主机形影不离,难舍难分。USB主机的功能就是负责检测设备,并发起USB通信。话说这个USB 主机也有很多标准,最流行的就三种UHCI,EHCI和OHCI。UHCI是PC机上用的USB主机接口标准,OHCI一般用在嵌入式设备上,EHIC是为了支持USB2.0而开发的。标准虽然不同,但都是大同小异。
  • usb设备(message)

    首先被人烧进去了一些固件程序,这还好点,最起码有了生命。然后被人插到USB主机上,被主机检测,实现功能还的看主机的脸色。USB虽然地位很低,但是兄弟倒是不少,有好几大类。什么人机接口,大容量存储设备,还有各种符合设备。可以这么说几乎现在所有的可移动设备都有USB的身影。USB设备还有一种分类的方法就是纯种USB设备,和复合USB设备。复合的USB设备本身集成了HUB和多个设备,可以看作是几个设备的集合,纯种的就不用说了,就是一个USB设备了。下面来分析一下USB设备的构成。USB设备当然最大的就是设备这个概念了,设备下来就是配置,配置下来就是接口,接口下来就是设置和端点了。先说配置,就是设备的几种功能的集合,而接口正是一种功能的代名词,所以配置包括一个或多个接口。接口就代表一种功能,比如USB音箱包括一个喇叭和一组按键,这就代表两个接口。接口下面是端点和设置,这两个在地位上应该是平行的,但是代表两类东西。先说端点,名字很抽象,其实就是USB设备里的负责接收和发送数据一块缓冲区。每个接口包括一个或多个端点,比如喇叭接口最起码有一个接受音频数据的端点吧。最后说这个设置,设置是接口的设置,还是举USB音箱的例子,喇叭是一个接口,那么可能有几种放音模式,就是由这个设置决定。设备最重要的组成部分就是固件程序了,他是设备的灵魂,没有固件程序的设备是不会工作的设备。幸好设备厂商早就将固件烧写到了设备里,如果不是开发USB设备的人就不用管他了。


usb通信流程

通信是怎么发起的吧。USB插上主机接口到USB实现自己的功能还是有很长一段路的。在这之前先说说USB硬件接口,一共四条线,一根电源线,一根地线,两根差分信号线,这就是他们通信的全部的桥梁,要说通信就是靠这这两根差分信号线,电源线和地底线都是给设备供电的。差分信号线当然是一正一反,同时传输,但是符号相反。我是0,你就得是1,这样设计好处多多,什么防止电磁干扰的就不用说了。这对差分信号线还有一个作用就是检测设备。既然说了检测设备了,那么就开始USB设备的慢慢人生路吧。

首先他从插上USB接口开始,本来接口的两根信号线在没有插上设备的时候都是处于低电平的状态,从USB设备插上接口的那一刹那,设备内的上拉电阻会使两根信号线的一根变高,这也许是USB设备唯一一次主动的时候。就像是对USB主机说,我来了,赶快接受我。然后敏感的USB主机收的这个信号后,就会给他一个回应–复位。话说主机可以接受那么多的设备,在这之前肯定有设备已经和USB主机建立起了通信关系,那么主机怎么找到这个新的USB设备。这里不得不谈到USB世界里的地址机制了。每个一个连接的USB的设备都会被主机分配一个八位的地址,至于怎么样分配后面再说,这个地址不能为0,因为0是给新设备的,也就是说所有新设备的地址都是0。USB主机检测设备的时候,在没有给设备配置地址的时候,就是和0地址的设备通信的,这个肯定就是刚插上的设备。你也许会说,我同时插上两个设备,那么主机不是分不清谁是谁了吗,也许你的手速像闪电一样,但是终究还是有个先后,最先插上的那个先服务,另外一个只有等的份了。

咱们先忽略通信的细节,重点在USB主机怎样识别这个设备的。话说USB设备一大堆,而主机就一个,主机怎样分清谁是谁,这确实是一个问题。山人自由妙计,USB主机自然有他的办法,当然这得USB设备来配合。说设备的时候说了一下端点,那么每个USB设备都有一个特殊的端点,代号零。这个是硬指标,没有这个端点就不是USB设备。USB主机就是通过这个端点,控制设备与识别设备的。这个过程有一下几步,这几步都需要USB设备配合,我让你返回啥,你就返回啥。如果返不回来,主机只好无奈的说:对不起不认识你。

  • 第一步:发送标准请求获得设备描述符,得到端点0的最大数据长度。这里又有几个新名词,标准请求是什么?设备描述符又是什么?什么最大长度?先不管这些,带着疑问上路。
  • 第二步:给设备配置的新地址。至于如何配置,后面在详说。
  • 第三步:以新的地址,获得配置描述符。
  • 第五步:根据配置描述符配置设备
  • 第六步:根据配置描述符,识别设备的功能然后找到具体的USB驱动,然后就交给USB驱动处理。

经过以上几步USB主机就算是认识USB设备了,然后具体实现什么功能就由更了解他的驱动程序来完成了。

上面我们提到了描述符还有标准请求。那么就不得不深入到USB通信的细节来了。

USB设备可谓是千变万化,各种各样但是他们之所以叫做USB设备,说明他们都有一些相同的地方。

统一的接口不用说了,他们还遵循USB协议,就像上面说的那样得配合主机。另外他们还得有识别自己的名片,要不就会分不请你我了。这个名片就是各种描述符。话说他们都在哪里,当然是保存在USB设备的特定存储区了。主机要求他返回什么么,他就从存储取读出这个描述符,传给主机。

主要的USB描述符有四个,号称四大金刚。他们是设备描述符配置描述符接口描述符端点描述符。还有其他的一些描述符但不是必须的,只有这四大金刚才是每个设备都具有的。这四大金刚就是USB设备的身份证,USB主机就是通过这几个描述符来认识设备的,步骤就是上面的那六步。

一些参考

ROS的社区级概念是ROS网络上进行代码发布的一种表现形式。结构如下图所示:

参考网站

总结