WinCE CEDDK之DMA相关函数

CEDDK提供了DMA的相关函数,在CEDDK/DDK_DMA/ddk_dma.c中定义。实际上里面最有用的就两个函数,HalAllocateCommonBuffer(..)和HalFreeCommonBuffer(..)分别用于为DMA申请和释放

  首先介绍一下会用到的DMA适配器结构,在ceddk.h中定义,如下:

typedef struct _DMA_ADAPTER_OBJECT_

{

  USHORT ObjectSize;        //该结构的大小

  INTERFACE_TYPE InterfaceType;  //接口类型,一般用做DMA时设置为Internal

  ULONG BusNumber;         //一般设置为0

} DMA_ADAPTER_OBJECT, *PDMA_ADAPTER_OBJECT;

  下面介绍一下函数:

  1. DMA内存分配函数:

  PVOID HalAllocateCommonBuffer(PDMA_ADAPTER_OBJECT DmaAdapter, ULONG Length, PPHYSICAL_ADDRESS LogicalAddress, BOOLEAN CacheEnabled)

  DmaAdapter:    DMA适配器结构指针

  Length:        要分配的内存的大小

  LogicalAddress:  分配成功后,内存的物理起始地址

  CacheEnabled:  是否使用Cache

  实际上该函数通过调用AllocPhysMem函数来分配一段物理地址连续的内存,这段内存默认是64KB字节对齐的,这完全可以理解,DMA操作的物理内存必须是连续的。该函数调用成功以后,返回值是虚拟地址,可以在

  2. DMA内存释放函数:

  VOID HalFreeCommonBuffer(PDMA_ADAPTER_OBJECT DmaAdapter, ULONG Length, PHYSICAL_ADDRESS LogicalAddress, PVOID VirtualAddress, BOOLEAN CacheEnabled)

  DmaAdapter:    DMA适配器结构指针

  Length:        内存的大小

  LogicalAddress:  内存的物理起始地址

  VirtualAddress:  内存的虚拟地址

  CacheEnabled:   是否使用Cache

  该函数通过调用FreePhysMem函数来完成内存的释放,所以在使用该函数的时候,只有函数的第四个参数是必须的,也就是内存的虚拟地址,其他的都可以忽略。

  下面给个使用上面两个函数的例子:

DMA_ADAPTER_OBJECTdmaAdapter;

//初始化DMA适配器

dmaAdapter.ObjectSize=sizeof(dmaAdapter);

dmaAdapter.InterfaceType=Internal;

dmaAdapter.BusNumber=0;

//分配DMA内存

m_pDMABuf=(PBYTE)HalAllocateCommonBuffer(&dmaAdapter,256*1024,&m_pDMABufPhys,FALSE);

//将物理地址赋值给DMA控制器

vm_pDMAreg->DST=(int)m_pDMABufPhys.LowPart;

  

...

  

//释放DMA内存

if(m_pDMABuf!=NULL)

{

  HalFreeCommonBuffer(NULL,0,0,m_pDMABuffer,FALSE);

  m_pDMABuf=NULL;

}

  在ddk_dma.c中,还可以看到其他很多DMA相关的

  一般来说,DMA驱动会配合其他设备驱动来完成数据传输,所以很少会被单独作为一个设备来使用,大多数情况我们开发设备驱动时需要用到DMA的时候,会用到上面两个函数来申请和释放内存。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xinchow/archive/2010/04/12/5477723.aspx

转载于:https://www.cnblogs.com/gmh915/archive/2010/06/12/1945412.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat中无法自定义标量值函数的问题

目录自定义标量函数代码自定义函数无法创建问题自定义标量函数代码 我的思路:我要创建一个自定义标量函数。使用软件:navicat12.1版本。点击Fx图标进行创建。代码中,使用num作为入参,根据num的大小返回颜色。num大于0返回白色&am…

把十六进制字符转换成十进制数

2019独角兽企业重金招聘Python工程师标准>>> /*** Get the hex value of a character (base16).* param c A character between 0 and 9 or between A and F or* between a and f.* return An int between 0 and 15, or -1 if c was not a hex digit.*/public stat…

明白90/10的原理吗?

什么是90/10原理?即在您的一生中,只有10的事情您无能为力,而90的事情都在您的把握之中。 我们无法阻止汽车老化出故障,我们无法预料飞机晚点,我们的行程可能被司机耽误在路上,等等,这些都是我们…

SQL Server更新某一列中多个字典码对应内容(sql示例)

目录示例-查询出多个字典码对应的内容示例-替换多个字典码对应的内容说明CHARINDEXFOR XML PATH示例-查询出多个字典码对应的内容 建立表格:学生-学习科目表student_study 注意:科目kemu列内容是字典码,需要更换成对应内容。 建立表格&…

DirectX支配游戏!历代GPU架构全解析

http://tech.163.com/digi/10/0430/08/65GM21CJ001618J7.html转载于:https://www.cnblogs.com/qilinzi/archive/2010/06/23/1940494.html

mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题

目录mybatisPlus中null值插入和更新问题实际项目解决方法示例一实际项目解决方法示例二field-strategy字段更新插入策略介绍枚举类FieldStrategy源码枚举类字段简介mybatisPlus中null值插入和更新问题 配置mybatisPlus的项目中,默认进行了不是全量更新的策略&#…

javascript变量声明语法的应用和分号讲究适用性

变量声明语法:var变量名,通常应用在语句的代码当中。在语句ECMAScript中必须与关键字var变量名之间至少有一个空格。(也就是变量名需要遵守一定的规范,至少不应该出现中文;如出现中文那就使语法中的语句代码不能相应连接到有关系地对数据处理…

SQL Server和MysQL中的联表更新sql示例

目录需求说明SQL Server中联表更新sql示例MySQL中联表更新sql示例需求说明 需求说明:把表B的报名号数据,更新到另一张表A的报名号列。通过表A证件号码和表B身份证号相等。 SQL Server中联表更新sql示例 UPDATE a SET a.bmhb.bmh FROM A aINNER J…

Mybatis中(#{ })模糊查询like(使用oracle的concat函数嵌套拼接SQL)

需求: 模糊查询需要左右各拼接一个’%’,如:like %key% 。 项目情况: mybatis中动态传参一般采用占位符#{key}。使用数据库:orecle。 错误的尝试: 尝试使用: like % #{key} %这样写不起作用…

linux构建主从域名服务器

实验步骤:一、构建主域名服务器1、安装域名服务(BIND服务器软件包)BIND软件包是目前Linux下使用最广泛的DNS服务器安装包,它可以运行到大多数UNIX服务器中,也包括Linux系统。RHEL4默认没有安装BIND服务器软件包&#x…

HashMap的put方法(Java7)和putVal方法(Java8)

目录数组链表:存在性能最坏情况O(n)Java7的HashMap的put方法思路数组链表红黑树:性能提高到O(logn)Java8的HashMap的putVal方法思路数组链表:存在性能最坏情况O(n) Java8以前,HashMap底层数据结构采用数组链表的结构。 数组特点&…

管道过滤器(Pipe-And-Filter)模式

按照《POSA(面向模式的软件架构)》里的说法,管道过滤器(Pipe-And-Filter)应该属于架构模式,因为它通常决定了一个系统的基本架构。管道过滤器和生产流水线类似,在生产流水线上,原材料在流水线上经一道一道的…

Java创建对象的方式——反序列化创建对象

目录Java创建对象的几种方式反序列化创建对象思路代码示例Java创建对象的几种方式 Java创建对象的方式共有4种。分别为: 1、通过new语句实例化一个对象。 2、通过反射机制创建对象。 3、通过clone()方法创建一个对象。 4、通过反序列化的方式创建对象。 思考&#…

redis知识归纳

目录Redis有哪些数据结构?有大量key需要设置同一时间过期,需要注意什么?Redis分布式锁怎么回事?假设Redis里有1亿个key,其中有10万个key是以同一个固定前缀开头,如何将它们全部找出?如何用Redis…

PCI_Express规范第七章解读-Software Initialization and configuration

7.Software Initialization and configuration PCI EXPRESS Configuration model 支持两种配置空间的访问机制: -PCI 兼容配置机制:100%的二进制兼容PCI 2.3中定义的,以及兼容早期的OS或类似的总线枚举和配置软件。 -PCI Express增强配置机制…

List「Object[]」转Map「Integer,String」处理

题目 有一个List<Object[]>&#xff0c;里面的元素分别是[1,“a”]&#xff0c;[2,“b”]&#xff0c;[1,“c”]&#xff0c;[2,“d”]…&#xff0c;请写一个函数将其转换为一个Map<Integer,String>&#xff0c;以List的Object[]第一个元素为关键字&#xff0c;将…

Asp.net基础概念之 事件

.NET Framework中的事件 事件体系结构 引发事件的对象叫做事件源。事件源发布它可以引发的事件。事件的类型总是委托类型&#xff0c;这个委托类型的签名定义了处理该事件的方法的签名。定义事件处理程序方法的对象称为事件接收方。事件接收方预订要在事件源上处理的事件事件接…

synchronized同步方法概述

synchronized同步方法 1、“线程安全”与“非线程安全”&#xff1a; 非线程安全情况&#xff1a;多个线程对同一个对象中的实例变量进行并发访问时&#xff0c;产生脏读。 解决方法&#xff1a;对实例变量的值进行同步处理。 2、方法内的变量为线程安全 3、实例变量非线程安…

as3:sprite作为容器使用时,最好不要指定width,height

官方解释&#xff1a; 除 TextField 和 Video 对象以外&#xff0c;没有内容的显示对象&#xff08;如一个空的 Sprite&#xff09;的高度为 0&#xff0c;即使您尝试将 height 设置为其它值&#xff0c;也是这样。 如果您设置了 height 属性&#xff0c;则 scaleY 属性会相应调…

1002 写出这个数 (20分)-Java

题目 读入一个正整数 n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;即给出自然数 n 的值。这里保证 n 小于 10 ​100。 输出格式&#xff1a; 在一行内输出 n 的各位数字之和…