Linux驱动设计——硬件基础
Linux 驱动设计之硬件基础
0、开篇说明
本片内容主要来源于宋宝华老师《Linux设备驱动开发》
1、处理器
目前主流的通用处理器(GPP)多采用SoC(片上系统)的芯片设计方法,集成各种功能模块. ARM内核的设计技术被授权给数百家半导体厂商,做成不同的SoC芯片。ARM的功耗很低,在当今最活跃的无线局域网、3G、手机终端、手持设备、有线网络通信设备等中应用非常广泛。很多ARM主控芯片的集成度非常高,除了集成多核ARM以外,还可能集成图形处理器、视频编解码器、浮点协处理器、GPS、WiFi、蓝牙、基带、Camera等一系列功能.
主流供应商如下:
- 高通(Qualcomm)
- 三星(Samsung)
- 英伟达(Nvidia)
- 美满(Marvell)
- 联发科(MTK)
- 海思(HiSilicon)
- 展讯(Spreadtrum)
- 德州仪器(TI)
- 博通(Broadcom)
中央处理器的体系结构
- 冯诺依曼 (程序指令存储器和数据存储器在一起)
- 哈佛结构 (程序和数据分开存储)
如下图所示:
指令集
- RISC
- CICS
2、存储器
存储器分类如下图所示:
2.1 Flash读取接口
NOR Flash读写接口(SRAM): 公共闪存接口(Common Flash Interface,CFI)是一个从NOR Flash器件中读取数据的公开、标准接口。
NAND Flash接口:
- I/O总线:地址、指令和数据通过这组总线传输,一般为8位或16位。
·芯片启动(Chip Enable,CE#):如果没有检测到CE信号,NAND器件就保持待机模式,不对任何控制信号做出响应。 - 写使能(Write Enable,WE#):WE#负责将数据、地址或指令写入NAND之中。
- 读使能(Read Enable,RE#):RE#允许数据输出。
- 指令锁存使能(Command Latch Enable,CLE):当CLE为高电平时,在WE#信号的上升沿,指令将被锁存到NAND指令寄存器中。
- 地址锁存使能(Address Latch Enable,ALE):当ALE为高电平时,在WE#信号的上升沿,地址将被锁存到NAND地址寄存器中。
- 就绪/忙(Ready/Busy,R/B#):如果NAND器件忙,R/B#信号将变为低电平。该信号是漏极开路,需要采用上拉电阻。
2.2 Flash 优缺点对比
型号 | 价格 | 容量 | 擦写次数 | 速度 |
---|---|---|---|---|
NOR | 高 | 小 | 10万 | 慢 |
NAND | 低 | 大 | 100万 | 快 |
2.3 RAM 介绍
DRAM:
DRAM以电荷形式进行存储,数据存储在电容器中。由于电容器会因漏电而出现电荷丢失,所以DRAM器件需要定期刷新SRAM:
SRAM是静态的,只要供电它就会保持一个值,SRAM没有刷新周期DPRAM:
具有两套完全独立的数据总线、地址总线和读写控制线,可以端口同时访问CAM
内容寻址的存储器。用于数据查询FIFO
用于数据缓存
3、接口与总线
3.1 串口
- RS-232
- RS-422
- RS-485
以上均由EIA制定发布.
RS-232C标准接口有25条线,9根常用线:
- RTS:用来表示DTE请求DCE发送数据,当终端要发送数据时,使该信号有效。
- CTS:用来表示DCE准备好接收DTE发来的数据,是对RTS的响应信号。
- RxD:DTE通过RxD接收从DCE发来的串行数据。
- TxD:DTE通过TxD将串行数据
- DSR:有效(ON状态)表明DCE可以使用。
- DTR:有效(ON状态)表明DTE可以使用。
- DCD:当本地DCE设备收到对方DCE设备送来的载波信号时,使DCD有效,通知DTE准备接收,并且由DCE将接收到的载波信号解调为数字信号,经RxD线送给DTE。
- Ringing-RI:当调制解调器收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知终端,已被呼叫。
- SG: 地信号
最简单的RS-232C串口只需要连接RxD、TxD、SG这3个信号,并使用XON/XOFF软件流控。连接如下图所示
3.2 I2C
总线有两条:
- SDA:数据总线
- SDL:时钟总线
“线与”逻辑
要求:
1) 设备连接到总线的输出端必须是开漏极输出或是集电极开路输出
2)空闲时,上拉电阻保证两根线 均为高电平
I2C设备上的串行数据线SDA接口电路是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。同样地,串行时钟线SCL也是双向的,作为控制总线数据传送的主机要通过SCL输出电路发送时钟信号,并检测总线上SCL上的电平以决定什么时候发下一个时钟脉冲电平;作为接收主机命令的从设备需按总线上SCL的信号发送或接收SDA上的信号,它也可以向SCL线发出低电平信号以延长总线时钟信号周期。当SCL稳定在高电平时,SDA由高到低的变化将产生一个开始位,而由低到高的变化则产生一个停止位,如图2.10所示。开始位和停止位都由I2C主设备产生。在选择从设备时,如果从设备采用7位地址,则主设备在发起传输过程前,需先发送1字节的地址信息,前7位为设备地址,最后1位为读写标志。之后,每次传输的数据也是1字节,从MSB开始传输。每个字节传完后,在SCL的第9个上升沿到来之前,接收方应该发出1个ACK位。SCL上的时钟脉冲由I2C主控方发出,在第8个时钟周期之后,主控方应该释放SDA
开始位和停止位图:
I2C时序图:
3.3 SPI
SPI(Serial Peripheral Interface,串行外设接口)总线系统是一种同步串行外设接口,它可以使CPU与各种外围设备以串行方式进行通信以交换信息。一般主控SoC作为SPI的“主”,而外设作为SPI的“从”.
SPI四条线:
- 串行时钟线 SCLK
- 主机输入/从机输出数据线 MISO
- 主机输出/从机输入数据线 MOSI
- 低电平有效从机选择线 SS
主从机硬件连接图:
在SPI总线的传输中,SS信号是低电平有效的,当我们要与某外设通信的时候,需要将该外设上的SS线置低。此外,特别要注意SPI从设备支持的SPI总线最高时钟频率(决定了SCK的频率)以及外设的CPHA、CPOL模式,
SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性(CPOL)和相位(CPHA)可以进行配置。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
3.4 USB
USB2.0:
- 480Mbit/s,半双工
- 四根线
USB3.0:
- 5.0Gbit/s,全双工
- 九根线
USB3.0兼容USB2.0.
USB主机、设备及HUB的物理拓扑结构:
USB端点的四种传输模式:
- 控制
- 同步
- 中断
- 批量
3.5 以太网
组成:
- MAC : 以太网媒体接入控制器
- PHY: 物理接口收发器
硬件电路原理:
3.6 SD/SDIO
SD(Secure Digital)是一种关于Flash存储卡的标准,也就是一般常见的SD记忆卡,在设计上与MMC(Multi-Media Card)保持了兼容。SDHC(SD High Capacity)是大容量SD卡,支持的最大容量为32GB。2009年发布的SDXC(SD eXtended Capacity)则支持最大2TB大小的容量。SDIO(Secure Digital Input and Output Card,安全数字输入输出卡)在SD标准的基础上,定义了除存储卡以外的外设接口。现在已经有非常多的手机或者手持装置都支持SDIO的功能,以连接WiFi、蓝牙、GPS等模块。
SD/SDIO的传输模式:
- SPI
- 1位模式
- 4位模式
3.7 原理图
略
3.8 硬件时序
略
3.9 Datasheet
- Memory Map
3.10 仪器仪表的使用
- 万用表
- 示波器
- 逻辑分析仪
Linux驱动设计——硬件基础相关推荐
- 【Linux驱动】驱动设计硬件基础----串口、I2C、SPI、以太网接口、PCIE
1.前言 常见的外设接口与总线的工作方式,包括串口.I2C.SPI.USB.以太网接口.PCI和PCI-E.SD和SDIO等. 2.串口 RS-232.RS-422与RS-485都是串行数据接口标准, ...
- Linux设备驱动开发详解【二】_设备驱动相关硬件基础知识
本文简介 本文讲解底层驱动工程师必备的硬件基础,给出了嵌入式系统硬件原理及分析方法的全景视图. 2.1 节讲解微控制器.微处理器.数字信号处理器以及应用于特定领域的处理器各自的特点. ...
- Linux驱动设计(一):驱动是什么?
最近需要写个驱动,也看了LDD,也看了其他的blog.其实对于那些简单的一个字符设备的设计流程慢慢lvlv,大概知道这个流程是怎么跑的.但是还是不够流畅,对于驱动与内核的认识还是存在一些混淆.这里来做 ...
- linux系统怎样写单片机程序,单片机知识是Linux驱动开发的基础之一以及如何学单片机...
这是arm裸机1期加强版第1课第2.3节课程的wiki文字版. 为什么没前途也要学习单片机? 因为它是个很好的入口. 学习单片机可以让我们抛开复杂的软件结构,先掌握硬件操作,如:看原理图.芯片手册.写 ...
- Linux驱动设计ioctl函数的cmd参数不能为2
Linux驱动程序设计的时候偶然发现的ioctl()函数的cmd参数不能为2,如果为2,ioctl()函数返回-1,网上说就是这样的,正常,不知道为什么,stack overflow上有一个外国学友的 ...
- 领域驱动设计(DDD)-基础思想
一.序言 领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法.在领域驱动设计理念上,各路大侠的观点也是各有不同,能力有限.欢迎留言讨论. 二.领域驱动设计 DDD是什么 wiki释 ...
- linux驱动静态分配内存,Linux驱动设计——内存与IO访问
名词解释 内存空间与IO空间 内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内 ...
- Linux驱动无硬件设备,Linux设备驱动与硬件通信
Linux物理设备驱动,主要有几种类型,如:IO类.内存类.总线类.IO类我们平时接触的最多,其主要特点是,通过IO设备的寄存器操作硬件,具体需要去查看硬件手册. 1. IO端口和IO内存 在硬件层, ...
- Linux驱动设计——字符杂项设备
杂项设备 linux里面的misc杂项设备是主设备号为10的驱动设备,misc设备其实也就是特殊的字符设备,可自动生成设备节点. 定义头文件<linux/miscdevice.h> 杂项设 ...
最新文章
- PHP生成CSV之内部换行
- webpack/gulp的z-index被改写
- 强化学习(五)—— AlphaGo与Alpha Zero
- uboot: RTL8201 100M PHY驱动代码
- java中的string是什么_什么是String
- 果园机器人作文开头_易学好用的万能开头—热点事件引入式
- python获取服务器文件svn版本信息_如何编程获取SVN版本号?
- 在arxiv上看到自己的投稿署了别人的名字是什么体验?
- 分布式对象存储解决方案
- 软考初级程序员---题目(五)
- Conficker蠕虫作者可随时引爆“网络核武”
- 专访智齿科技徐懿丨企服公司四要素:智能、融合、产品复杂度、客单价
- InsecureProgramming-master——abo2
- VBS word/excel 转 PDF
- 莫以物喜 -=莫以己悲!
- Vue的video-player的视频无法加载出来,vue视频插件;显示叉号; The media could not be Loaded,
- word中审阅和修订、批注
- git-cz 一款git commit 统一规范的工具
- Android项目gen目下没有R.class文件 解决方法
- 【Java Collections类:sort()升序排序、reverse()降序排序、copy()复制、fill()填充题】