Android中PMEM驱动程序是物理内存的驱动程序,可用于分配物理内存。PMEM在camera和video系统中频繁使用。下面,简单记录一下PMEM的使用方法。另外,由于PMEM设备做为Platform设备存在,所以我们将对Platform设备做以简单描述。

一、PMEM的使用

使用PMEM需要包含如下几个头文件:

#include <sys/ioctl.h>

#include <binder/MemoryHeapBase.h>

#include <binder/MemoryHeapPmem.h>

#include <linux/android_pmem.h>

定义如下几个数据结构:

#define PMEM_DEV "/dev/pmem0" //PMEM设备的路径

#define kBufferCount 3 //申请的buffer数目

sp<MemoryBase> mBuffers[kBufferCount];//存储PMEM buffer的数组

int mBuffersPhys[kBufferCount];//存储PMEM buffer的物理地址

int8 *mBuffersVirt[kBufferCount]; //存储PMEM buffer的逻辑地址

sp<MemoryHeapBase> masterHeap;

sp<MemoryHeapPmem>  mPreviewHeap;

下面,我们分配3个大小为mPreviewFrameSize的buffer,同时获取每个buffer的物理地址和逻辑地址,将3个buffer放入数组mBuffers中。具体代码如下:

Int mem_size = kBufferCount  * mPreviewFrameSize;

masterHeap = new

MemoryHeapBase(PMEM_DEV,mem_size,MemoryHeapBase::NO_CACHING);

mPreviewHeap = new MemoryHeapPmem(masterHeap,MemoryHeapBase::NO_CACHING);

if (mPreviewHeap->getHeapID() >= 0) {

mPreviewHeap->slap();

masterHeap.clear();

struct pmem_region region;

int fd_pmem = 0;

fd_pmem = mPreviewHeap->getHeapID();

::ioctl(fd_pmem,PMEM_GET_PHYS,&region);//获取物理地址

for(int i = 0; i  < kBufferCount; i++){

mBuffersPhys[i] = region.offset + i * mPreviewFrameSize;

mBuffersVirt[i] = (int8 *)mPreviewHeap->getBase() + i * mPreviewFrameSize;

mBuffers[i] = new MemoryBase(mPreviewHeap,  i * mPreviewFrameSize, mPreviewFrameSize);

ssize_t offset;

size_t size;

mBuffers[i]->getMemory(&offset, &size);

LOGD("Preview buffer %d: offset: %d, size: %d.", i, offset, size);

}

}

else LOGE("Camera preview heap  error: could not create master heap!");

mPreviewFrameSize:一帧的大小,即byte数;

MemoryHeapBase::NO_CACHING:表示该区域不会被cache;

::ioctl(fd_pmem,PMEM_GET_PHYS,&region);获取被分配的区域对应的物理地址;

mBuffersPhys[i] = region.offset + i * mPreviewFrameSize;获取每个buffer对应的物理地址;

mBuffersVirt[i] = (int8 *)mPreviewHeap->getBase() + i * mPreviewFrameSize;获取每个buffer对应的逻辑地址;

mBuffers[i] = new MemoryBase(mPreviewHeap,  i * mPreviewFrameSize, mPreviewFrameSize);被分配区域对应的每个buffer的信息;

mBuffers[i]->getMemory(&offset, &size);获取每个buffer的offset和大小;

由于将PMEM做为Platform设备,下面将对Platform设备做以简单描述。

二、Platform设备

在Linux 2.6的设备驱动模型中,我们关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。

一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2 C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设等确不依附于此类总线。基于这一背景,Linux发明了一种虚拟的总线,称为platform总线,相应的设备称为platform_device,而驱动成为platform_driver。

Linux platform. driver机制和传统的device driver 机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform. device提供的标准个字段,分别标明资源的开始值、结束值和类型,flags可以为IORESOURCE_IO、IORESOURCE_MEM、IORESOURCE_IRQ、IORESOURCE_DMA等。start、end的含义会随着flags而变更,如当flags为IORESOURCE_MEM时,start、end分别表示该platform_device占据的内存的开始地址和结束地址;当flags为IORESOURCE_IRQ时,start、end分别表示该platform_device使用的中断号的开始值和结束值,如果只使用了1个中断号,开始和结束值相同。对于同种类型的资源而言,可以有多份,譬如说某设备占据了2个内存区域,则可以定义2个IORESOURCE_MEM资源。

下面,我们以PMEM设备为例,对Platform设备的注册流程做以描述。

(待续)

Android平台上PMEM的使用及Platform设备注册(一)的更多相关文章

  1. Android平台上PMEM的使用及Platform设备注册(二)

    三.注册PMEM设备 这里我们除了描述PMEM设备,还将注册一个拥有memory空间和IRQ资源的示例设备example_device. 对于example_device,定义如下结构体: stati ...

  2. 将Unity3D游戏移植到Android平台上

    将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ...

  3. Android平台上的Aplay与TinyAlsa移植使用

    ALSA是高级Linux声音架构.提供了一系列音频的逻辑接口,包括PCM.CONTROL等.这些,不影响它的使用,了解一下就可以. 在Android设备上,linux 2.x的版本,要控制录制播放音频 ...

  4. android平台上AES,DES加解密及问题

    在使用java进行AES加密的时候,会用到如下方法: SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 但是在andr ...

  5. 驱动开发学习笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇

    驱动开发读书笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇 下面这段摘自 linux源码里面的文档 : 内核版本2.6.22Doc ...

  6. 驱动开发学习笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇

    驱动开发读书笔记. 0.04  linux 2.6 platform device register 平台设备注册  1/2 共2篇下面这段摘自 linux源码里面的文档 : Documentatio ...

  7. GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

    1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...

  8. Android 8.0的平台上,应用不能对大部分的广播进行静态注册

    引言在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的. ...

  9. 在不同平台上CocosDenshion所支持的音频格式

    在大多数平台上,cocos2d-x调用不同的SDK API来播放背景音乐和音效.CocosDenshion在同一时间只能播放一首背景音乐,但是能同时播放多个音效. 背景音乐 Platform supp ...

随机推荐

  1. MySql数据快速导入

    使用LOAD DATA INFILE 插入速度可以提升很多 左侧是直接导入100W花费135s ,Dos界面通过Load方式导入450W只用时23s,性能一下子显示出来了.

  2. CSS实现微信对话框

  3. Python OOP面向对象

    一.什么是面向对象的程序设计 1.面向过程 程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是 ...

  4. bzoj2119 股市的预测

    传送门 感觉智商莫名其妙的就变低了……写这题的时候死活想不出来…… 做法其实不难…… 题目要求形如ABA的串的个数,我们可以枚举A的长度,利用标记关键点的方法统计答案.设枚举到的答案为k,每k个点标记 ...

  5. 用CSS隐藏页面元素的5种方法

    1.opacity设置一个元素的透明度只是从视觉上隐藏元素,对页面布局还是有影响,读屏软件会原样读出 2.visibility设置为hidden将隐藏我们的元素,对网页布局还是起作用,子元素也会被隐藏 ...

  6. 24_BlockingQueue接口

    [BlockingQueue常见] [ ArrayBlockingQueue ] 基于数组的阻塞队列的实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,其 ...

  7. Revit

    log file Windows Vista or Windows 7:%LOCALAPPDATA%\Autodesk\Revit\Autodesk Revit 2016\Journals

  8. 【转】My App Crashed, Now What? – Part 1

    原文地址:http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1  By Matthijs Hollemans on Mar ...

  9. centos7主机名的修改

    在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty).“静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始 ...

  10. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.3.垃圾收集器与内存分配策略

    1.学习目的 当需要排查各种内存溢出. 内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节. Java内存运行时区域的各个部分,其中程序计数 ...