首页 > 其他分享 >DMA与ISA和LPC设备 【ChatGPT】

DMA与ISA和LPC设备 【ChatGPT】

时间:2023-12-09 16:56:34浏览次数:32  
标签:DMA 控制器 驱动程序 dma 传输 ISA LPC

DMA与ISA和LPC设备

作者

Pierre Ossman [email protected]

本文档描述了如何使用旧的ISA DMA控制器进行DMA传输。尽管ISA在今天已经基本淘汰,但LPC总线使用相同的DMA系统,因此它将在相当长的时间内存在。

头文件和依赖项

要进行ISA风格的DMA,您需要包括两个头文件:

#include <linux/dma-mapping.h>
#include <asm/dma.h>

第一个是用于将虚拟地址转换为总线地址的通用DMA API(有关详细信息,请参见使用通用设备进行动态DMA映射)。

第二个包含特定于ISA DMA传输的例程。由于这在所有平台上都不一定存在,请确保您构建的Kconfig依赖于ISA_DMA_API(而不是ISA),以便没有人尝试在不受支持的平台上构建您的驱动程序。

缓冲区分配

ISA DMA控制器对其可以访问的内存有一些非常严格的要求,因此在分配缓冲区时必须格外小心。

(通常,您需要为DMA传输分配一个特殊的缓冲区,而不是直接传输到您的常规数据结构中。)

可进行DMA的地址空间是“物理”内存的最低16 MB。此外,传输块不得跨页边界(这取决于您使用的通道,页边界为64或128 KiB)。

为了分配满足所有这些要求的内存块,您需要将标志GFP_DMA传递给kmalloc。

不幸的是,用于ISA DMA的内存是稀缺的,因此除非您在启动期间分配内存,否则最好也传递__GFP_RETRY_MAYFAIL和__GFP_NOWARN,以使分配器尝试更加努力。

(这种稀缺性也意味着您应尽可能早地分配缓冲区,并在驱动程序卸载之前不要释放它。)

地址转换

要将虚拟地址转换为总线地址,请使用通用DMA API。即使它执行相同的操作,请不要使用isa_virt_to_bus()。原因是函数isa_virt_to_bus()将需要对ISA的Kconfig依赖性,而不仅仅是ISA_DMA_API,这才是您真正需要的。请记住,即使DMA控制器起源于ISA,它也在其他地方使用。

注意:x86_64在涉及ISA时存在破损的DMA API,但已经修复。如果您的架构存在问题,请修复DMA API,而不是恢复到ISA函数。

通道

普通的ISA DMA控制器有8个通道。低四个用于8位传输,而高四个用于16位传输。

(实际上,DMA控制器实际上是两个独立的控制器,其中通道4用于为第二个控制器(0-3)提供DMA访问。这意味着在四个16位通道中,只有三个是可用的。)

您可以以与所有基本资源相似的方式分配这些通道:

extern int request_dma(unsigned int dmanr, const char * device_id);
extern void free_dma(unsigned int dmanr);

使用16位或8位传输的能力不取决于驱动程序作者,而取决于硬件支持。请检查您的规格或测试不同的通道。

传输数据

现在是有趣的部分,实际的DMA传输。

标签:DMA,控制器,驱动程序,dma,传输,ISA,LPC
From: https://www.cnblogs.com/pengdonglin137/p/17891165.html

相关文章

  • 动态DMA映射使用通用设备 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/dma-api.html动态DMA映射使用通用设备作者[email protected]本文档描述了DMAAPI。要了解API的更详细介绍(以及实际示例),请参阅动态DMA映射指南。该API分为两部分。第一部分描述了......
  • Isabelle上安装c-parser和autocorres
    c-parser,autocorres都是在Isabelle上形式验证c代码的工具,它们都是seL4项目的一部分,而这些所有的工具都是主要基于Linux的,所以建议在Linux上安装,以下内容是在WSL上安装的过程。进行安装前必要的步骤:支持WSL图形化的Windows系统,我个人用的是win10专业版,没有这个就别往下看了,别的......
  • 21_DMA多通道ADC
    1、硬件 使用ADC硬件触发,触发DMA转运,外设数据均存储在ADC_DR寄存器中,外设寄存器地址不用自增,存储器为SRAM,定义一个数组存储转运来的数据,存储器的地址需要自增,数据宽度为半字。 2、接线图使用外设与ADC多通道完全相同,此次通过DMA转运数据 3、软件程序 ......
  • DMA传输数据(M->P)
    前言  上文讨论了利用DMA将数据从一个存储器搬运到另一个存储器,本文讨论将数据从M->P。将数据从数组转移到串口外设并发送出去。代码voidMYDMA_Init(DMA_Stream_TypeDef*DMA_Streamx,u32chx,uint32_tpar,u32mar,u16ndtr){DMA_InitTypeDefDMA_InitStructure;......
  • DMA传输数据
    前言  DMA即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。本篇文章以STM32F4为例,不同型号可能略有不同。一.DMA特性简介  STM32F4有......
  • 图形渲染ISA指令集分析
    图形渲染ISA指令集分析1ISA定义就像任何语言都有有限的单词一样,处理器可以支持的基本指令/基本命令的数量也必须是有限的,这组指令通常称为指令集(instructionset),基本指令的一些示例是加法、减法、乘法、逻辑或和逻辑非。请注意,每条指令需要处理一组变量和常量,最后将结果保存在......
  • VSCode - Disable go test cache
    or Adding"-count=1"to"go.testFlags"candisablegotestcache.......
  • avdmanager 返回了非零退出代码: 1。
    最近做了一次系统还原,很多功能都出现了异常重装了VisualStudio之后创建安卓仿真器的时候遇到问题,说“avdmanager返回了非零退出代码:1。”解决思路1搜索问题使用Google搜索,前两条是开发者社区,点进去看看2.看帖子详情不要看到问题关闭就划走,看看下面都说了什么3.......
  • LISA(推理分割)笔记
    title:LISA(推理分割)笔记banner_img:https://cdn.studyinglover.com/pic/2023/08/10f885319b150cc20093124185e25c3b.pngindex_img:https://cdn.studyinglover.com/pic/2023/08/ded90e7e3f84739b187dd679c39bd8dd.pngdate:2023-8-1815:05:00categories:-笔记tags:-......
  • HAL_RS485发送接收_DMA:编码器
    RS485编码器使用RS485读取多个编码器接收数据:空闲中断+DMA发送数据:DMA配置串口:基本与串口通信一致,增加接收和发送DMA,正常模式,另外增加485使能IO      接收数据:使能空闲中断        __HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE);        _......