网络驱动
网络驱动硬件嵌入式网络硬件分为两部分: MAC 和 PHY,大家都是通过看数据手册来判断一款 SOC 是否支持网络,如果一款芯片数据手册说自己支持网络,一般都是说的这款 SOC 内置 MAC, MAC 类似 I2C 控制器、 SPI 控制器一样的外设。但是光有 MAC还不能直接驱动网络,还需要另外一个芯片: PHY,因此对于内置 MAC 的 SOC,其外部必须搭配一个 PHY 芯片。但是有些 SOC 内部没有 MAC,那也就没法搭配 PHY 芯片了,这些内部没有网络 MAC 的芯片如何上网呢?这里就要牵扯出常见的两个嵌入式网络硬件方案了
1、 SOC 内部没有网络 MAC 外设我们一般说某个 SOC 不支持网络,说的就是它没有网络 MAC。那么这个芯片就不能上网了吗?显然不是的,既然没有内部 MAC,那么可以找个外置的 MAC 芯片啊,不过一般这种外置的网络芯片都是 MAC+PHY 一体的。
这种方案的优点就是让不支持网络的 SOC 能够另辟蹊径,实现网络功能,但是缺点就是网络效率不高,因为一般芯片内置的 MAC 会有网络加速引擎,比如网络专用 DMA,网络处理效率会很高。而且此类 ...
块设备驱动开发
块设备介绍块设备是针对存储设备的,比如 SD 卡、 EMMC、 NAND Flash、 Nor Flash、 SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动,块设备驱动相比字符设备驱动的主要区别如下:①、块设备只能以块为单位进行读写访问,块是 linux 虚拟文件系统(VFS)基本的数据传输单位。字符设备是以字节为单位进行数据传输的,不需要缓冲。②、块设备在结构上是可以进行随机访问的,对于这些设备的读写都是按块进行的,块设备使用缓冲区来暂时存放数据,等到条件成熟以后再一次性将缓冲区中的数据写入块设备中。
linux 内 核 使 用 block_device 表 示 块 设 备 , block_device 为 一 个 结 构 体 , 定 义 在include/linux/fs.h 文件中,结构体内容如下:
1234567891011121314151617181920212223242526272829303132333435361 struct block_device {2 dev_t bd_dev; /* not ...
can通信协议
CAN通信协议CAN 的特点主要有一下几点:①、多主控制②、系统的柔软性③、通信速度快,距离远④、具有错误检测、错误通知和错误恢复功能⑤、故障封闭功能⑥、连接节点多
CAN 电气属性CAN 总线使用两根线来连接各个单元:CAN_H 和 CAN_L, CAN 控制器通过判断这两根线上的电位差来得到总线电平, CAN 总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,此时 CAN_H 电平比 CAN_L 高,分别为 3.5V 和 1.5V,电位差为 2V。隐形电平表示逻辑“1”,此时 CAN_H 和 CAN_L 电压都为 2.5V 左右,电位差为 0V。 CAN 总线就通过显性和隐形电平的变化来将具体的数据发送出去 。
CAN 总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一直处于隐性。
CAN协议帧CAN 协议提供了 5 种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)。
帧类型
帧用途
数据帧
用于 CAN ...
linux开发板安装第三方库
第三方库的安装配置串口(minicom和ncurse)ncurses (new curses)库是System V Release 4.0及curses更高版本中的免费软件仿真库。它使用terminfo格式,支持pads和color ,多种高亮显示,多形式字符和功能键映射,该库很容易移植到任何符合ANSI/ posix的类unix系统中运行。
下载地址Ncurses - Free Software
具体编译构建步骤如下:
1、构建配置1./configure --prefix=/home/moss/linux/tool/ncurse --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --with-shared --without-profile --disable-stripping --without-progs --with-manpages --without-tests
configure :配置脚本。(在命令行终端下运行)
–prefix: 用于指定编译结果的保存目录。
–host: 用于指定编译器 ...
音频驱动开发
音频解码处理器接收音频需要将声音通过ADC采集,将模拟信号转换成为数字信号,相反播放声音就需要将数字信号转换成为模拟信号使用DAC芯片。音频编解码芯片,英文名字就是 Audio CODEC 。
既然音频 CODEC 的本质是 ADC 和 DAC,那么采样率和采样位数就是衡量一款音频CODEC 最重要的指标。比如常见音频采样率有 8K、 44.1K、 48K、 192K 甚至 384K 和 768K,采样位数常见的有 8 位、 16 位、 24 位、 32 位。采样率和采样位数越高,那么音频 CODEC 越能真实的还原声音,也就是大家说的 HIFI。
模拟量转成数字量过程,一般可以分为三个过程,分别为采样、量化、编码。
①、此部分是 WM8960 提供的输入接口,作为立体声音频输入源,一共提供了三路,分别为 LINPUT1/RINPUT1、 LINPUT2/RINPUT2、 LINPUT3/RINPUT3。麦克风或线路输入就连接到此接口上。②、此部分是 WM8960 的输出接口,比如输出给耳机或喇叭, SPK_LP/SPK_LN 用于连接左声 ...
驱动程序编译进入内核(在内核编辑界面显示)
通常都是将驱动源码编译为.ok文件,然后通过insmod 或者modprobe加载进系统中,而在脱离网络的设备中就需要将驱动编译进入内核。
已知驱动类型操作步骤:
查看自己编写驱动的所属类型,例如编写一个led的驱动,那么寻找内核drivers目录中的led驱动目录
首先打开编写Kconfig文件
1tristate "内容"
这行的内容是显示在menuconfig的目录中,相当于这个驱动的说明。
之后修改leds这个目录的Makefile
1obj-$(CONFIG_GPIOLED) += gpioled.o
$()的内容是CONFIG_后面加上Kconfig里添加的内容,+=后面加上文件.o的名字
最后在内核中编译make menuconfig,可以在设备驱动的led驱动里面看到自己写的驱动。
未知驱动类型操作步骤:
在drivers的目录下自行创建一个目录
1mkdir nxpops
在此目录下创建Kconfig文件
12cd nxpopsvi Kconfig
123456789menuconfig NXPOPS bool ...
触摸屏驱动
触屏需要的知识点首先触摸屏的驱动,也是使用之前使用input的知识点。
通过注册函数注册到内核,
触控屏幕,电容屏幕是控制 IC ,所以要使用到IIC的驱动,因为触摸 IC 提供了中断信号引脚(INT),可以通过中断来获取触摸信息 ,上报屏幕坐标等信息需要使用input的系统上报。单点触摸和多点触摸触摸屏分为多点触摸屏幕和单点触摸屏幕,单点触摸设备只支持单点触摸,一个同步事件完成数据只包含一个触摸点信息,单点触摸设备以ABS_XXX事件承载、上报触摸点的信息,有的设备还支持其他事件例如压力,z轴坐标等数据。多点电容触摸的(Multi-touch,简称 MT), MT 协议被分为两种类型, TypeA 和 TypeB,这两种类型的区别如下:Type A:适用于触摸点不能被区分或者追踪,此类型的设备上报原始数据(此类型在实际使用中非常少! )。Type B:适用于有硬件追踪并能区分触摸点的触摸设备,此类型设备通过 slot 更新某一个触摸点的信息, FT5426 就属于此类型,一般的多点电容触摸屏 IC 都有此能力。
触摸点的信息通过一系列的 ABS_MT 事件(有的资料也叫消息)上报 ...
串口驱动
串口驱动程序层次结构
下层为串口驱动层,它直接与硬件相接触,需要填充一个 struct uart_ops 的结构体。上层为tty层,包括tty核心层及线路规程,它们各自都有一个 ops 结构体,用户空间可以通过tty注册的字符设备节点来访问串口设备。涉及到了4个 ops 结构体,层层进行跳转。
uart_driver包含了串口设备名、串口驱动名、主次设备号、串口控制台(可选)等信息
12345678910111213struct uart_driver{ struct module *owner; //拥有该uart_driver的模块,一般为THIS_MODULE constchar *driver_name; // 串口驱动名,串口设备文件名以驱动名为基础 constchar *dev_name; // 串口设备名 int major; //主设备号 int minor; //次设备号 int nr; // 该uart_driver支持的串口个数(最大) struct console *cons;// 其对应的console. ...
SPI驱动
SPI
SPI 控制器驱动程序SPI 主机驱动就是 SOC 的 SPI 控制器驱动,SPI 控制器不用关心设备的具体功能,它只负责把上层协议驱动准备好的数据按 SPI 总线的时序要求发送给 SPI 设备,同时把从设备收到的数据返回给上层的协议驱动,因此,内核把 SPI 控制器的驱动程序独立出来。
SPI 控制器驱动负责控制具体的控制器硬件,诸如 DMA 和中断操作等等,因为多个上层的协议驱动可能会通过控制器请求数据传输操作,所以,SPI 控制器驱动同时也要负责对这些请求进行队列管理,保证先进先出的原则。
申请必要的硬件资源,比如中断、DMA 通道、DMA 内存缓冲区等等
配置 SPI 控制器的工作模式和参数,使之可以和相应的设备进行正确的数据交换
向通用接口层提供接口,使得上层的协议驱动可以通过通用接口层访问控制器驱动
配合通用接口层,完成数据消息队列的排队和处理,直到消息队列变空为止
SPI 主机驱动的核心就是申请 spi_master,然后初始化 spi_master,最后向 Linux 内核注册spi_master。
12345678spi_alloc_master ...
linux下的IIC
linux的IIC体系结构Linux的IIC体系结构分为3个组成部分,分别是IIC核心、IIC总线驱动和IIC设备驱动!
(1)IIC核心
提供了IIC总线驱动与IIC设备驱动的注册、注销方法和与具体IIC控制器无关的代码,该部分用来管理IIC总线驱动与IIC设备驱动。
(2)IIC总线驱动
IIC总线驱动是适配器(IIC控制器)的驱动程序,包含了适配器(IIC控制器)的数据描述结构i2c_adapter、通信方法数据结构i2c_algorithm、控制适配器产生通信时序的函数。
(3)IIC设备驱动
是具体IIC设备的驱动,因为不同的IIC设备可能有不同的读写时序要求,比如at24cxx读写需要发送16位地址,而tmp75只需要8位地址即可。IIC设备驱动通过i2c_algorithm通信方法驱动适配器驱动程序去访问具体的IIC设备。
体系结构
架构层次分类 第一层:提供i2c adapter的硬件驱动,探测、初始化i2c adapter(如申请i2c的io地址和中断号),驱动soc控制的i2c adapter在硬件上产生信号(start、stop、ack)以及处理i2c中断。图 ...

