Android平台上PMEM的使用及Platform设备注册(二)_pmem.h-程序员宅基地

技术标签: 8 Android开发  

https://blog.csdn.net/gabbzang/article/details/20708425

三、注册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驱动程序框架解析

http://www.linuxidc.com/Linux/2011-01/31291.htm

Linux内核驱动的的platform机制

http://intq.blog.163.com/blog/static/671231452010124112546491/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Windgs_YF/article/details/104041187

智能推荐

VS2019中使用QT建立信号和槽函数连接(包括重载函数的情况)_vs2019 sln项目qt新建按钮的信号与槽函数-程序员宅基地

文章浏览阅读4.3k次。QT开发文档和网上提供了多种实现方法,参考https://doc.qt.io/qt-5/signalsandslots.html。这里分享个人认为比较好用和好理解的一种。1.在实现文件.c文件中用connect函数连接。使用方式:QObject::connect(信号发出者地址,信号发出者函数名称(信号发出者函数参数...),信号接收者地址,信号接收者槽函数名称(信号接收者槽函数参数...));注意:若在QObject子类内部定义信号槽,可直接调用connect函数。举个栗子:要实_vs2019 sln项目qt新建按钮的信号与槽函数

程序员可选择的个博客论坛网站_个人博客设计论坛官网-程序员宅基地

文章浏览阅读1.1k次。为想写技术博客的程序员推荐的个平台网站“对网上既有的一些帖子总结优化目录掘金CSDNGithubSegmentFault开源中国51CTO博客知乎专栏简书慕课网手记腾讯云社区阿里云社区博客网码云以上按个人好感度排序,展示方式为a.网站名称 网址b.logoc.百度简介d.主页界面1.掘金:https://juejin.im/timeline2.CSDN:https://blog.csdn.net/3.Github: https:/_个人博客设计论坛官网

【音视频开发好书推荐1】,androidstudio开发app教程-程序员宅基地

文章浏览阅读604次,点赞19次,收藏20次。RTC程序设计:实时音视频权威指南》系统地介绍了实时音视频系统的基础概念、工具、编程方法。《RTC程序设计:实时音视频权威指南》分为10章,第1章介绍信息与文字编码的基础知识,以及跨平台网络编程的基本方法。第2、3章介绍视频的采集与渲染技术。第4、5章介绍音频的采集与渲染技术。第6章介绍编解码相关的压缩技术。第7章介绍信令与媒体流的建连过程。第8章介绍网络传输过程中的优化技术。第9章介绍实时音视频的应用与可扩展架构。第10章介绍音视频系统核心指标及其计算方法。

【手把手】ios苹果打包——遇见项目实战|超详细的教程分享_如何编译 ios源码打包-程序员宅基地

文章浏览阅读1w次,点赞44次,收藏59次。六年代码两茫茫,不思量,自难忘6年资深前端主管一枚,只分享技术干货,项目实战经验关注博主不迷路~文章目录前言weex介绍eeui介绍一、安装CocoaPods1.CocoaPods介绍2.CocoaPods的安装二、登录开发者中心四、添加测试手机设备五、打包总结前言本教程手把手教你用weex+eeui框架打测试包ipa安装到手机(打正式包也有介绍)。eeui项目创建可看我的另一篇文章一文带你吃透eeui安卓开发weex介绍Weex是一个构建移动端跨平台UI框架。Weex使开发人员_如何编译 ios源码打包

Python 日期时间格式化输出,带年、月、日、时、分、秒_python日期格式化输出-程序员宅基地

文章浏览阅读2.9w次,点赞12次,收藏62次。Python 日期时间格式化输出,带年、月、日、时、分、秒输出中文日期格式:2022年01月03日 17时20分30秒**年**月**日**时**分**秒_python日期格式化输出

android app字体库,Android 自定义APP字体-程序员宅基地

文章浏览阅读449次。一、设置全局字体方法1:使用反射机制进行设置(1)把系统的typeface替换为自定义的Typeface typeFace = Typeface.createFromAsset(getAssets(), "fonts/aa.ttf");try {// xml属性值与Typeface属性值对应// normal Typeface.DEFAULT// sans Typeface..._android app 设置字体库

随便推点

java有趣的技术分享ppt,java面试数据结构与算法高频考-程序员宅基地

文章浏览阅读736次。前言本文涵盖了阿里巴巴、腾讯、字节跳动、京东、华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样会研究大厂的面试题。与此同时,今年算法面试一定是会被问的,而算法不是光靠背面试题就有用的,它是需要数学逻辑思维的,因此,小编会在文末为大家准备一份非常优质的算法学习手册,重点在于学习思维方法,话不多说,直接开始上精选的大厂面试真题!在校生如果你是在校生,你应该趁着在学校的时间夯实基础(比如计算机系统、_java有趣的技术分享

MapReduce统计以某字母开头的单词的平均长度_mapreduce计算平均单词长度-程序员宅基地

文章浏览阅读1.7k次。MapReduce统计以某字母开头的单词的平均长度用MapReduce编写程序主要的就是编写Map和Reduce函数、main函数java代码如下package section1;import java.io.IOException;import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuratio..._mapreduce计算平均单词长度

Java实现iOS内购实现记录_java ios内购-程序员宅基地

文章浏览阅读817次。支付凭证解析工具import javax.net.ssl.*;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.security.cert.CertificateException;import java.security.cer_java ios内购

vagrant up报错 process_builder.rb:44:in `encode: “xE5“ to UTF-8 in conversion from ASCII-8BIT to UTF-_encode': "\\xe5" to utf-8 in conversion from ascii-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏2次。今天早上vagrant up 重装了都是报错了。报错信息:process_builder.rb:44:in `encode!': "\\xE5" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to UTF-16LE (Encoding::UndefinedConversionError)解决方案:找到报错信息的process_builder.rb 44行,编码位置换成一下:#newstr.encode!('UTF-16LE')newstr_encode': "\\xe5" to utf-8 in conversion from ascii-8bit to utf-8 to gbk (enc

LED数码管段码_十六进制led段码数怎么求啊-程序员宅基地

文章浏览阅读4k次,点赞3次,收藏17次。LED数码管断码显示字符共阴极字形码共阳极字形码03FHC0H106HF9H25BHA4H34FHB0H466H99H56DH92H67DH82H707HF8H87FH80H96FH90HA77H88Hb7CH83HC39HC6HD5EHA1HE79H86HF71H8EHP73H8CHU3EHC1HT31_十六进制led段码数怎么求啊

Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题_flutter scrollview嵌套tabbar-程序员宅基地

文章浏览阅读406次,点赞2次,收藏4次。最近写flutter项目,遇到NestedScrollView与TabBar双列表滚动位置同步问题,下面是解决方案,希望帮助到大家。这就是Flutter解决NestedScrollView与TabBar双列表滚动位置同步问题相关代码,希望能帮助到你!_flutter scrollview嵌套tabbar