linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见。dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率。...1、dma驱动在什么地方 drivers/dma 2、如何看s3c的dma驱动,先看Kconfig config S3C24XX_DMAC bool "Samsung S3C24XX DMA support....name = "s3c24xx-dma", }, .id_table = s3c24xx_dma_driver_ids, .probe = s3c24xx_dma_probe...); dma_cap_set(DMA_CYCLIC, s3cdma->slave.cap_mask); dma_cap_set(DMA_PRIVATE, s3cdma->slave.cap_mask...只要完成dma接口的适配,dma就可以正常使用了。当然,前提是,两个engine要进行注册使用。
上一节 我们学习了: IIC接口下的24C02 驱动分析 接下来本节, 学习Linux下如何利用linux下I2C驱动体系结构来操作24C02 1....I2C体系结构分析 1.1首先进入linux内核的driver/i2c目录下,如下图所示: ?...从设备地址值,并回应ACK } 通过上面的代码和注释,发现主要是写入IIC从设备地址,然后发送起始信号+IIC从设备地址值,并回应ACK 显然IIC总线驱动i2c-s3c2410.c,主要设置适配器adapter.../kernel.h> #include #include #include #include #include #include #include #include <asm/uaccess.h
1.I2C体系结构分析 1.1首先进入linux内核的driver/i2c目录下,如下图所示: 其中重要的文件介绍如下: 1)algos文件夹(algorithms) 里面保存I2C的通信方面的算法...//链表头,用来存放i2c_driver结构体的表头 struct i2c_driver *driver; //i2c_driver,用来描述一个IIC...从设备地址值,并回应ACK } 通过上面的代码和注释,发现主要是写入IIC从设备地址,然后发送起始信号+IIC从设备地址值,并回应ACK 显然IIC总线驱动i2c-s3c2410.c,主要设置适配器...#include #include #include #include #...include #include #include #include #include
每一块BLSP对应六位,每一位对应一个GPIO,每一位的GPIO都可以作为UART、SPI、IIC的链接线 2.
I2C设备器件发送的数据 IIC硬件连接结构图 ? IIC硬件连接主要包括IIIC主机、IIC从机、IC总线及上拉电阻。...IIC主机:一条总线中一般只会有一个IIC主机,一般为可编程芯片。通过软件编程控制主机连接在IIC总线上的GPIO电平,生成符合IIC总线协议的时序。...IIC从机:具备IIC接口的设备器件(例如AT24C02)。硬件连接好后,等待IIC总线访问。 IIC总线协议 ?...iic时序图.png 空闲状态:由iic硬件连接结构图可知,当IIC总线没有数据传输时,SCL和SDA都保持高电平。 起始信号:总线SCL保持高电平,SDA从高电平降为低电平,即IIC通讯开始。...IIC总线上所有的IIC从机设备对应一个唯一的地址。
1.两种DMA映射类型 1.1. 一致性DMA映射(Consistent DMA mappings ) 主要用于映射长时间使用的区域。...1.2 流式DMA映射(streaming DMA mapping) 主要用于一次性DMA传输,传输完成后就会释放。...2.指定DMA设备的寻址范围 include/linux/dma-mapping.h // 用于一致性内存映射的映射范围 static inline int dma_set_coherent_mask...mask); 3.DMA映射接口 3.1一致性DMA接口 分配较大DMA buffer // dev DMA控制器设备 // size 要分配的DMA buffer大小...释放的DMA buffer大小 // cpu_addr DMA buf的虚拟地址 // dma_handle DMA buf的物理地址 void dma_free_coherent
下图是一个嵌入式系统中处理器仅通过2根线的IIC总线控制多个IIC外设的典型应用图 ?...IIC 通信协议 IIC 串行总线一般有两根信号线,一根是双向的数据线 SDA ,另一根是时钟线 SCL ,其时钟信号是由主控器件产生。...所有接到 IIC 总线设备上的串行数据 SDA 都接到总线的 SDA 上,各设备的时钟线 SCL 接到总线的 SCL 上。对于并联在一条总线上的每个 IIC 都有唯一的地址。...空闲状态 当 IIC 总线的数据线 SDA 和时钟线 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。...IIC 总线操作 对 IIC 总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操作情况: 主设备往从设备中写数据 数据包括从机寄存器地址和需要写入寄存器的数据data ?
(IIC是半双工,而不是全双工)。 b.每个连接到总线的器件都可以通过唯一的地址和其它器件通信,主机/从机角色和地址可配置,主机可以作为主机发送器和主机接收器。...c.IIC是真正的多主机总线,(而这个SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。...一个典型的IIC接口如下图(1)所示 ? 图(1) (3)IIC的协议层 IIC的协议层才是掌握IIC的关键。...设备里写东西,然后再紧接着写入IIC设备里的寄存器地址,而我直接写入了0x68,导致出错},每次数据传送总是由主机产生的终止信号结束。...即使是含有IIC硬件的单片机(如stm32 103系列)也有一定的缺陷,所以一般也会模拟IIC的时序。现将具体时间截图如下: ?
这两天整理了调用流程,也找到了dma-coherent的用法。Linux的文档里没有详细说明dma-coherent的用法。...根据代码,如果dma的设备树里有dma-coherent,Linux则认为硬件会维护cache一致性,不会在dma运行过程中执行cache操作。...的定义 dma_map_single()和dma_unmap_single()都在include\linux\dma-mapping.h里定义。...也许Linux之前遇到一些问题,才改成这样的操作。 dma-coherent DMA的设备树里可以配置属性"dma-coherent"。...dev_is_dma_coherent的定义在文件include\linux\dma-noncoherent.h中。
System DMA是将DMA作为中心位置挂在总线上,能够被总线上的任何设备所使用。BMD是目前为止发现的基于PCIe总线使用最多的DMA类型(使用Endpoint设备)。...MWr和MRd的TLPs会通过PIO(程控输入输出)被放松到endpoint端 并且被用来监视和控制DMA硬件.目标逻辑的功能是为了更新状态控制寄存器,所有即将到来的MWr数据包是32位宽并且包含一个双字的负载...初始化逻辑在从endpoint传输数据到系统存储中时产生内存写TLPs,DMA写控制和状态寄存器指定发送的地址、大小、负载内容以及TLPs的个数。
1.DMA方式的特点 主存和DMA接口之间有一条直接数据通路。由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作。...2.DMA控制器的组成 对数据传送过程中进行控制的硬件称为DMA控制器(DMA接口)。...当I/O设备需要进行数据传送时,通过DMA控制器向CPU提出DMA传送请求,CPU响应之后让出系统总线,由DMA控制器接管总线进行数据传送。 1)接受外设发出的DMA请求,并向CPU发出总线请求。...DMA请求触发器:每当I/O设备准备好数据后给出一个控制信号,使DMA请求触发器置位。...由此可见,DMA控制器必须具有控制系统总线的能力。 3.DMA的传送方式 主存和DMA控制器之间有一条数据通路,因此主存和I/O设备之间交换信息时。不通过CPU。
直接内存访问(Direct Memory Access,DMA):在计算机体系结构中,DMA 是一种数据传输方式,允许外部设备直接访问计算机的内存,而无需通过中央处理单元(CPU)的干预。...那么,DMA究竟有多快呢? 实践出真知 恰好,最近有个多通道数据采集的项目,受限于通道数多、分辨率高,而系统带宽有限,为了尽可能充分利用有限带宽,就得想办法优化时序,把时间都留给数据采集和传输。...优化方向就是DMA。 硬件链路是ADC通过SPI接口将数据发送给STM32单片机,单片机再将数据发送到上位机。 咱们的目标就是优化SPI这边,先看普通采集模式。...再看下,开启DMA之后的效果。SPI可以连续工作,时钟速率稳定在20MHz,高效工作。 这就是DMA的强大之处! 问题来了,为什么上图中的波形,有这么大的震荡呢?
DMA中断 1.1在linux中,分配释放DMA缓冲区,只能使用以下几个函数 1) /*该函数只禁止cache缓冲,保持写缓冲区,也就是对注册的物理区写入数据,也会更新到对应的虚拟缓存区上*/ void...和DMASKTRIGn[1]=1才有效,DMA传输时,该位自动清0 1.3接下来就开始讲linux注册DMA中断 首先,DMA的每个通道只能有一个源- >目的,所以输入命令 cat /proc/interrupts...,找到DMA3中断未被使用 所以在linux中使用: request_irq(IRQ_DMA3, s3c_dma_irq, NULL, "s3c_dma", 1);// s3c_dma_irq:中断服务函数...,还是直接两个地址之间的拷贝 -> 2.2)若是DMA启动,则设置DMA的相关硬件,并启动DMA传输 2.1 所以,驱动代码如下所示: #include #include... #include #include #include #include <linux
引言 单片机的IIC编程中,如果我们直接一点,只需要控制IIC硬件GPIO脚,然后根据IIC协议模拟各种电平时序实现与IIC设备的通信。...但是这种编程方法,移植性较差(假如新加了一种IIC设备,同样的代码,又要重新复制一份)。...这种做法完全不适应Linux的通用性的设计理念,对于Linux来讲:同样的事情我只做一遍,向外提供接口,不管你是什么IIC设备挂载那条IIC总线上,都可以用。...因此,这就需要Linux在代码架构上有非常严谨的模块化设计。 架构设计 在Linux设计中,将I2C代码框架分为三个部分:I2C总线、I2C核心、I2C驱动。...本篇主要对IIC总线驱动的总结。 i2c总线结构体 Linux在分层中,必不可少的将每一层模块封装成一个结构体,然后将结构体作为一个与外接交互的桥梁。
本文将从实测的IIC波形入手,带你看到真实的IIC样子,进而去理解IIC的通信原理。...1 IIC基础知识 首先复习一下IIC基础知识,这部分看不懂的请先带着疑问,然后我们通过分析IIC的真实波形,这些疑问可能就豁然开朗了~ 1.1 IIC是什么 IIC(Inter Integrated...在 CPU (单片机)与IIC模块之间、IIC模块与IIC模块之间进行双向传送。...IIC通信线只有只有两根,数据线SDA的高低电平传输2进制的数据,时钟线SCL通过方波信号提供时钟节拍 多个IIC器件可以并联在IIC总线上,每个器件有特定的地址,分时共享IIC总线 实际使用IIC当然还要连接电源以及共地哦...因为IIC应答是一种相互关系,单片机发数据给IIC器件,IIC器件要进行应答,表示收到了数据,同样,单片机接收IIC器件的数据后,也要给IIC器件一个应答。
IIC读写时序 先来回顾IIC的读写时序,首先记住两句话: ①时钟SCL低,数据SDA发生变化; ②时钟SCL高,数据SDA保持稳定; S 器件地址+0 A 写入首地址 A DATA1 A ··· DATAn...程序用伪代码表示: 读字节: u8 IIC_readbyte() { IIC_start();//起始信号 IIC_putbyte();//器件地址 IIC_Putbyte();...//首地址 IIC_stop(); IIC_start(); IIC_Putbyte();//器件地址+1 for( i = 0 ; i < length; i++)...} u8 IIC_writebyte() { IIC_start();//起始信号 IIC_putbyte();//器件地址 IIC_Putbyte();//写入首地址...for(i=0;i<length;i++) IIC_putbyte();//写入数据 IIC_stop(); } START 器件地址+0 A 读出首地址 A 器件地址
创作目的 互联网、Linux内核书籍上充满了各种关于Linux DMA ZONE和dma_alloc_coherent、dma_map_single等的各种讲解,由于很多童鞋缺乏自身独立的思考,人云亦云...那么ISA上面假设有个网卡,要DMA,超过16MB以上的内存,它根本就访问不到。所以Linux内核干脆简单一点,把16MB砍一刀,这一刀以下的内存单独管理。...比如我在CSR工作的时候,CSR的primaII芯片,尽管除SD MMC控制器以外的所有的DMA都可以访问整个4GB内存,但MMC控制器的DMA只能访问256MB,我们就把primaII对应Linux的...下面我们架空历史,假设有一个如下的芯片,里面有5个DMA,A、B、C都可以访问所有内存,D只能访问32MB,而E只能访问64MB,你觉得Linux的设计者会把DMA ZONE设置为多大?...当我grep内核源代码的时候,我发现部分SoC确实是这样实现的: baohua@baohua-VirtualBox:~/develop/linux/arch/arm$ git grep arm_coherent_dma_ops
协议转输进行探究 ---- 概要 ---- IIC协议转输 要求 使用 IIC 协议在 ARM 板上24C02芯片中存取数据 IIC 原理图 IIC总线连接方式 AT24C02A电路原理图 创建项目...Default_IRQ_ISR ISR_UART2_Handle B Default_IRQ_ISR ISR_LCD_Handle B Default_IRQ_ISR ISR_DMA0..._Handle B Default_IRQ_ISR ISR_DMA1_Handle B Default_IRQ_ISR ISR_DMA2_Handle B Default_IRQ_ISR...ISR_DMA3_Handle B Default_IRQ_ISR ISR_SDI_Handle B Default_IRQ_ISR ISR_SPI0_Handle B...= 1; //收到IIC中断后,给f_nGetACK置1 ClearPending(BIT_IIC); //清掉IIC中断 }
前言 Linux的IIC驱动想必大家都耳熟能详,网上也有很多相关的教程。 网上的教程总结,比如: 方法问题描述Linux 3.X.X版本之后,设备树+驱动此方法是比较符合linux驱动的写法的。...他将会操作多个文件 上面的做法都有些困难及弊端存在,经过摸索了一遍Linux的I2C驱动框架,我发现可以很精简的写一个I2C设备的设备驱动。...分析I2C总线驱动说明 I2C总线驱动的代码在linux的源码中--i2c-dev.c中。 在代码中可以看到他提供一套文件操作接口,open,read,write,close接口。
05 STM32少个DMA资源? 对于大容量的STM32芯片有2个DMA控制器,DMA1有7个通道,DMA2有5个通道。每个通道都可以配置一些外设的地址。...在这里插入图片描述 有DMA传输: 有DMA的话, DMA传输时外设对DMA控制器发出请求。 DMA控制器收到请求,触发DMA工作。...07 DMA传输方式 方法1:DMA_Mode_Normal,正常模式 当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次。...当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时,DMA传输结束。...17 DMA中断标志清除寄存器 (DMA_IFCR) DMA_IFCR 的各位就是用来清除 DMA_ISR 的对应位的,通过写 0 清除。
领取专属 10元无门槛券
手把手带您无忧上云