android 设备注册,Android平台上PMEM的使用及Platform设备注册(二)
三、注册PMEM设备
这里我们除了描述PMEM设备,还将注册一个拥有memory空间和IRQ资源的示例设备example_device。
对于example_device,定义如下结构体:
static struct resource example_resources[] = {
[0] = {
.start = 0xC0000000,
.end = 0xC0020000,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 30,
.end = 30,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device example_device = {
.name = "example",
.id = 0,
.num_resources = ARRAY_SIZE(example_resources),
.resource = example_resources,
};
example_device设备拥有IORESOURCE_MEM和IORESOURCE_IRQ两种资源,其IORESOURCE_MEM的起始地址为0xC0000000,结束地址为0xC0020000,IORESOURCE_IRQ的中断号为30。
对于PMEM设备,我们先要介绍一下结构体android_pmem_platform_data。它被定义在文件/kernel/include/linux/android_pmem.h中。其定义为:
struct android_pmem_platform_data
{
const char* name;
/* starting physical address of memory region */
unsigned long start;
/* size of memory region */
unsigned long size;
/* set to indicate the region should not be managed with an allocator */
unsigned no_allocator;
/* set to indicate maps of this region should be cached, if a mix of
* cached and uncached is desired, set this and open the device with
* O_SYNC to get an uncached region */
unsigned cached;
/* The MSM7k has bits to enable a write buffer in the bus controller*/
unsigned buffered;
};
我们为PMEM设备定义如下结构体:
static struct android_pmem_platform_data android_pmem0_pdata = {
.name = "pmem0",
.start = PMEM_0_BASE,
.size = PMEM_0_SIZE,
.no_allocator = 0,
.cached = 1,
};
static struct android_pmem_platform_data android_pmem1_pdata = {
.name = "pmem1",
.start = PMEM_1_BASE,
.size = PMEM_1_SIZE,
.no_allocator = 0,
.cached = 1,
};
struct platform_device android_pmem0_device = {
.name = "android_pmem",
.id = 0,
.dev = { .platform_data = &android_pmem0_pdata },
};
struct platform_device android_pmem1_device = {
.name = "android_pmem",
.id = 1,
.dev = { .platform_data = &android_pmem1_pdata },
};
然后将这几个设备结构体放置到一个platform_device的数组中,
static struct platform_device *devices[] __initdata = {
&example_device,
&android_pmem0_device,
&android_pmem1_device,
};
最后通过调用函数platform_add_devices()向系统中添加这些设备。
static void __init androidphone_init(void)
{
……
platform_add_devices(devices, ARRAY_SIZE(devices));
……
}
函数platform_add_devices()内部调用platform_device_register( )进行设备注册。要注意的是,这里的platform_device设备的注册过程必须在相应设备驱动加载之前被调用,即执行platform_driver_register()之前,原因是驱动注册时需要匹配内核中所有已注册的设备名。
函数platform_add_devices()定义在文件/kernel/driver/base/platform.c中,
/**
* platform_add_devices - add a numbers of platform devices
* @devs: array of platform devices to add
* @num: number of platform devices in array
*/
int platform_add_devices(struct platform_device **devs, int num)
{
int i, ret = 0;
for (i = 0; i < num; i++) {
ret = platform_device_register(devs[i]);
if (ret) {
while (--i >= 0)
platform_device_unregister(devs[i]);
break;
}
}
return ret;
}
EXPORT_SYMBOL_GPL(platform_add_devices);
最后,需要说明的结构体是platform_driver,它的原型定义,在
/kernel/include/linux/platform_device.h中,代码如下:
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver;
struct platform_device_id *id_table;
};
内核提供的platform_driver结构体的注册函数为platform_driver_register(),其原型定义在/kernel/driver/base/platform.c文件中,具体实现代码如下:
/**
* platform_driver_register
* @drv: platform driver structure
*/
int platform_driver_register(struct platform_driver *drv)
{
drv->driver.bus = &platform_bus_type;
if (drv->probe)
drv->driver.probe = platform_drv_probe;
if (drv->remove)
drv->driver.remove = platform_drv_remove;
if (drv->shutdown)
drv->driver.shutdown = platform_drv_shutdown;
return driver_register(&drv->driver);
}
EXPORT_SYMBOL_GPL(platform_driver_register);
如果想深入了解Platform机制,可以参考下面的文章:
Linux Platform驱动程序框架解析
Linux内核驱动的的platform机制
QQ:1226062415
Date:2011/5/14
Blog:http://blog.csdn.net/wxzking
欢迎交流,欢迎转载,转载时请保留以上信息。
Android平台上PMEM的使用及Platform设备注册(一)
Android中PMEM驱动程序是物理内存的驱动程序,可用于分配物理内存.PMEM在camera和video系统中频繁使用.下面,简单记录一下PMEM的使用方法.另外,由于PMEM设备做为Platfo ...
将Unity3D游戏移植到Android平台上
将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ...
Android平台上的Aplay与TinyAlsa移植使用
ALSA是高级Linux声音架构.提供了一系列音频的逻辑接口,包括PCM.CONTROL等.这些,不影响它的使用,了解一下就可以. 在Android设备上,linux 2.x的版本,要控制录制播放音频 ...
android平台上AES,DES加解密及问题
在使用java进行AES加密的时候,会用到如下方法: SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 但是在andr ...
(转)FS_S5PC100平台上Linux Camera驱动开发详解(二)
4-3 摄像头的初始化流程及v4l2子设备驱动 这个问题弄清楚了以后下面就来看获得Camera信息以后如何做后续的处理: 在fimc_init_global调用结束之后我们获得了OV9650的信息,之 ...
驱动开发学习笔记. 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 ...
驱动开发学习笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇
驱动开发读书笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇下面这段摘自 linux源码里面的文档 : Documentatio ...
Android 8.0的平台上,应用不能对大部分的广播进行静态注册
引言在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的. ...
随机推荐
MySQL 挺有意思
1, 修改密码 mysql -u root -p update user set Password = PASSWORD('NEWPWD') WHERE user = 'root'; FLUSH PR ...
PHP 生成随机字符串与唯一字符串
说明:生成随机字符串用到的方法有 mt_rand() 生成唯一字符串用到的方法有 md5(),uniqid(),microtime() 代码: <?php /* * 生成随机字符串 * @par ...
从汇编看c++成员函数指针(二)
下面先看一段c++源码: #include using namespace std; class X { public: virtual int get1() { ; } ...
iOS 10 创建iMessage App
android 设备注册,Android平台上PMEM的使用及Platform设备注册(二)相关推荐
- 高通平台android开发总结 MSM平台上的AMSS
http://blog.csdn.net/mirkerson/article/details/7691029 MSM平台上的AMSS REX启动分析--基于Qualcomm平台 1.高通平台andro ...
- FS_S5PC100平台上Linux Camera驱动开发详解(二)
http://blog.csdn.net/wh_19910525/article/details/18091915 这个问题弄清楚了以后下面就来看获得Camera信息以后如何做后续的处理: 在fimc ...
- linux设备驱动归纳总结(九):1.platform设备驱动
http://blog.chinaunix.net/uid-25014876-id-111745.html 这一节可以理解是第八章的延伸,从这节开始介绍platform设备驱动. 一.什么是paltf ...
- android摄像头框架,FS_S5PC100平台上Android Camera架构分析
1. Android-Camera架构分析 Android的camera系统架构自上而下分别为应用层-框架层-硬件抽象层-linux驱动层.层与层之间通过Binder.回调函数或者系统调用联系. 我们 ...
- android架构+vold,Android Vold 架构简析
李力琼(joni.kartorz.lee@gmail.com)软件工程师,热爱并致力于Linux平台的开源软件的开发,你可以用email与他联系.本文中Andorid系统的版本为4.3及以上. --- ...
- android 视频美颜,Android短视频中如何实现720P磨皮美颜录制?
视频中磨皮.美颜功能已成为刚需,那么如何在Android短视频中实现720P磨皮美颜录制?本篇文章中,网易云信资深开发工程师将向大家介绍具体的操作方法. 相关阅读推荐 在Android上要实现一个录制 ...
- Linux 设备驱动开发 —— platform 设备驱动
一.platform总线.设备与驱动 在Linux 2.6 的设备驱动模型中,关心总线.设备和驱动3个实体,总线将设备和驱动绑定.在系统每注册一个设备的时候,会寻找与之匹配的驱动:相反 ...
- Linux设备模型之platform设备
Linux设备模型之platform设备 1. Platform模块的软件架构 2. Platform设备 2.1 platform_device原型 2.2 注册添加device 2.2.1 pla ...
- STM32MP157驱动开发——platform设备驱动(中)
STM32MP157驱动开发--platform设备驱动(中) 0.前言 一.platform设备模块--设备信息解析 二.platform驱动模块--加载设备 三.测试App 四.编译及运行 相关文 ...
最新文章
- Tomcat正常启动,一访问就报错
- VTK:相机模糊CameraBlur用法实战
- 多股回测(backtrader+quantstats+akshare)
- 『电子书』分享一波码农必备编程开发类书籍[转]
- 基于STM32和W5500的Modbus TCP通讯
- 【计算机原理篇】原码、反码和补码
- linux自动异地备份,Linux本地加异地自动备份方案
- DBCC PAGE、DBCC LOG、DBCC EXTENTINFO、DBCC IND、DBCC SHOW_STATISTICS、DBCC SHOWCONTIG、DBCC SQLPERF...
- 2018年度最佳网页设计与开发教程
- 花卷云解读淘宝客APP定制开发应该避免哪些坑
- PR转场预设 模仿纸张翻转特效PR视频转场PR预设
- 青岛,一座浓艳的美色之城?
- 2021最全财富密码,95个即将发币项目概览
- IP地址冲突问题的解决方法
- 注意力机制最新综述解读
- String源码 spilt
- BZOJ2757 : [SCOI2012]Blinker的仰慕者
- java中 a-zA-z_关于java:Regex:/ w表示[a-zA-Z]还是[a-zA-Z0-9_],因为大多数教程都提到w-匹配单词字符?...
- hexo yilia 添加友言畅言评论支持
- ubuntu解决root登陆报stdin:is not tty
热门文章
- 如何做服务器安全维护,网站安全维护怎么做好
- 南网优惠电费接口API源码
- python使用Elasticsearch对wikipedia的数据进行检索(详细流程)
- EKL-日志收集系统安装
- 【ESP32 S3开发】在Arduino IDE中使用PSRAM
- java一维数组输入整数n_用键盘接受输入的整数,将输入的整数保存到一个一维数组,然后输出最大值...
- 表达式的LenB(123程序设计ABC)的值是27吗
- 重磅 | 逆天操作,修图神器Photoshop,真的可以,完美移植到手机上了
- 路由器IP地址的配置
- 万马股份旗下万马爱充遭通报下架:违规收集个人信息,未及时整改