linux驱动与dts匹配过程,自己编写从应用到DTS与驱动

这里的思路依然是从应用到drivers编写,只是贴出来重点部分。

import android.app.InoGpioManager;

((InoGpioManager) context.getSystemService(Context.INOGPIO_SERVICE)).ioctl(cmd,val);

InoGpioManager.java的编写:

public class InoGpioManager

{

private final IInoGpioManager mService;

InoGpioManager(IInoGpioManager service, Context ctx)

{

mService = sevice;

}

......

然后这里定义常用的API即可,

}

IInoGpioManager.aidl

package android.app;

interface IInoGpioManager{

int write_val(in int[] val,int size);

int[] read_val(int size);

int ioctl_val(int cmd,int val);

}

在这里需要把文件添加到Framework/base/Android.mk

LOCAL_SRC_FILES +=

core/java/android/app/IInoGpioManager.aidl \

一定要一次添加正确,防止出问题,后期找文件删除

这里啰嗦一句,

aidl_files := \

这里添加的都是类似这种文件

parcelable AlarmManager.AlarmClockInfo;

这种的aidl文件

SystemServiceRegistry.java里如下注册

registerService(Context.INOGPIO_SERVICE, InoGpioManager.class,

new CachedServiceFetcher() {

@Override

public InoGpioManager createService(ContextImpl ctx) {

IBinder b = ServiceManager.getService(Context.INOGPIO_SERVICE);

IInoGpioManager service = IInoGpioManager.Stub.asInterface(b);

return new InoGpioManager(service, ctx);

}});

此时此刻进入到

InoGpioService.java

这里多说一句,如果按照老罗的写法,此时此刻应该是

public class InoGpioService extends IInoGpioManager.stub

但是呢他的aidl文件实在Android.os下,我们这里的写的是Android.app下,最后应用也不一样

public class InoGpioService extends SystemService

{

这里的写法更简单,一个构造函数用来初始化init

再加几个API,不在啰嗦

}

这里需要在systemserver.java中进行注册

traceBeginAndSlog("StartInoGpioService");

mSystemServiceManager.startService(InoGpioService.class);

Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

使用这种时,可以在onStart里加入

publishBinderService(Context.ALARM_SERVICE, mService);

public void onStart()

{

final IBinder mService = new IInoGpioManager.Stub();

publishBinderService(Context.INOGPIO_SERVICE,mService);

}

这次就栽在这里。

/*try {

Slog.i(TAG,"InoGpioService +1");

ServiceManager.addService(Context.INOGPIO_SERVICE,new InoGpioService());

Slog.i(TAG,"InoGpioService +2 ");

} catch (Throwable e) {

Slog.e(TAG,"InoGpioService new error",e);

}*/

这里的两种方式都是可以的,

两种方式的差异如下:

public class InoGpioService extends SystemService {

这里采用的是匿名内部类,函数接口都是定义在匿名内部类的内部,

private final IBinder mb = new IInoGpioManager.Stub() {

这里只能是函数,不能是单个句子。

//public class InoGpioService extends IInoGpioManager.Stub {

这种方式的API都是直接定义,不需要定义在匿名匿名内部类的。

然而INOGPIO_SERVICE这个的定义在Context.java中

此时此刻要修改SELinux的权限问题了

这里的inogpio是service的context的定义。

./app.te:allow untrusted_app inogpio_service:service_manager find;

./service_contexts:inogpio                              u:object_r:inogpio_service:s0

./service.te:type inogpio_service,    service_manager_type;

./system_app.te:allow system_app inogpio_service:service_manager find;

./system_server.te:allow system_server inogpio_service:service_manager find;

./system_server.te:allow system_server inogpio_service:service_manager add;

而后进入到JNI的C++世界,这里依然简单,

register_android_server_InoGpioService

这个再onload.cpp里添加

在当前目录的Android.mk也要添加

static const JNINativeMethod method_table[] = {

{ "init_native" , "()Z" , (void*)init_native},

{ "writeval_native" , "([II)I" , (void*)writeval_native},

{ "readval_native" , "(I)[I" , (void*)readval_native},

{ "ioctlval_native" , "(II)I" ,(void*)ioctlval_native},

};

static jboolean init_native(JNIEnv *env,jobject clazz)

struct innopro_gpio_module_t *module;

if((hw_get_module(INOGPIO_HARDWARE_MODULE_ID,(const struct hw_module_t **)&module) == 0)){

if(device_open(&(module->common),&gpio_device) == 0){

ALOGI("open the device success");

return 0;

}

这里只是写了一个init的接口,其他的接口类似

还有就是进入到hardware层,但是hardware层可以不写,直接在JNI里实现open read write ioctl

还是写一下的吧,权当练手

#define INOGPIO_HARDWARE_MODULE_ID "inogpio"

struct inogpio_module_t{

struct hw_module_t common;

};

struct inogpio_device_t{

struct hw_device_t common;

int fd;

int (*read_val)(struct inogpio_device_t *dev, int *val,int size);

int (*write_val)(struct inogpio_device_t *dev, int *val,int size);

int (*ioctl_val)(struct inogpio_device_t *dev,int cmd, int val);

};

struct inogpio_module_t HAL_MODULE_INFO_SYM={

.common = {

.tag = HARDWARE_MODULE_TAG,

.version_major = 1,

.version_minor = 0,

.id = INOGPIO_HARDWARE_MODULE_ID,

.name = "innopro gpio Module",

.author = "zwh",

.methods = &inogpio_module_methods,

},

};

static struct hw_module_methods_t inogpio_module_methods = {

.open = open_inogpio,

};

static int open_inogpio(const struct hw_module_t *module, char const *name, struct hw_device_t **device)

{

struct inogpio_device_t *dev = malloc(sizeof(struct inogpio_device_t));

ALOGI("name ++ ++  = %s",name);

if(dev == NULL){

ALOGE("fail to malloc the device space");

return -1;

}

memset(dev,0,sizeof(struct innogpio_device_t));

dev->common.tag = HARDWARE_DEVICE_TAG;

dev->common.version = 0;

dev->common.module = (struct hw_module_t *)module;

dev->common.close = close_inogpio;

dev->read_val = read_val;

dev->write_val = write_val;

dev->ioctl_val = ioctl_val;

dev->fd = open(DEV_NAME,O_RDWR);

if(dev->fd == -1){

ALOGE("open the /dev/innopro_gpio fail");

free(dev);

return -1;

}

*device = &(dev->common);

ALOGI("innopro_device open successfuly");

return 0;

}

类似这种风格,其他的按照ioctl 等操作即可

进入到kernel的世界

static const struct of_device_id gpio_dt_match[] = {

{ .compatible = "amlogic, innopro_gpio"},

{},

};

设备树在dts里的定义

tatic struct platform_driver gpio_driver = {

.driver = {

.name = "innopro_gpio",

.owner = THIS_MODULE,

.of_match_table = gpio_dt_match,

},

.probe = gpio_probe,

#ifdef CONFIG_PM

.suspend = gpio_suspend,

.resume = gpio_resume,

#endif

.shutdown = gpio_shutdown,

};

static __init  int innopro_init(void)

ret = platform_driver_register(&gpio_driver);

static int gpio_probe(struct platform_device *pdev)

{

int ret = -1;

pr_info("probe\n");

aml_gpio_dt_parse(pdev);

gpio_dev.cdev_.owner = THIS_MODULE;

cdev_init(&(gpio_dev.cdev_), &gpio_ops);

alloc_chrdev_region(&(gpio_dev.devno), 0, 1,

gpio_dev.dev_name);

ret = cdev_add(&(gpio_dev.cdev_), gpio_dev.devno, 1);

if (ret) {

pr_info("cdev_add fail\n");

return  -EINVAL;

}

if (IS_ERR(gpio_dev.class_)) {

pr_info("Create class error\n");

return -1;

}

device_create(gpio_dev.class_, NULL, gpio_dev.devno,

NULL, gpio_dev.dev_name);

return 0;

}

设备树的产生还与那句fuck the ARM Linux 有关

这里的ioctl和read write的操作都是一个寄存器的操作。

不再啰嗦

进入到设备树看看

innopro_gpio{

compatible = "amlogic, innopro_gpio";

dev_name = "innopro_gpio";

status = "okay";

ao6_pins = ;

ao6_name = "GPIOAO_6";

ao6_value = <1 1="">;

ao9_pins = ;

ao9_name = "GPIOAO_9";

ao9_value = <0 1="">;

};

如此而已,这里只是啰嗦大致的写的流程,代码细节不做啰嗦。细节都跑通了,其他也就容易的多了。

这里嘟囔几句曾经遇到而且反复犯的错误,

问题一:uboot的编程,

编译方式:在uboot的目录下,./mk gxl_p212_v1

生成目录:/uboot/fip

那么问题来了,为什么打包成aml*.img时,不能自动更新呢?那就是出在不能自动拷贝了,所以需要自动拷贝下,如下目录out/target/product/p212/upgrade

问题二:修改完或者加入hardware时,并不能自动编译,需要先mmm hardware时才能继续打包

问题三:aidl问题,

aidl开始放错问题,需要把生成的out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src/android/app

类似目录的文件删掉,然后继续打包,否则也会打包进去,我觉得这里非常不智能,没办法做到删除不相干文件。

问题四:函数的public,默认,private,protect问题

private 只能被类内使用,protect子类访问,default在包内使用,public都可以使用。

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

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

相关文章

完全用 gnu/linux 工作,怎样完全用 GNU/Linux 工作

怎样完全用 GNU/Linux 工作说了这么多 Windows 的不好。我还没有告诉你我怎么用 Linux 处理有些必要的事情。半年以前我由于中文老是配置不好&#xff0c;一直是双系统&#xff0c;不时需要重起到 Win2k 来处理汉字。后来我找到了 miniChinput, XSIM 和 SCIM 输入法。这下可以处…

c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

本文以实例形式讲述了C语言实现二叉树的非递归遍历方法。是数据结构与算法设计中常用的技巧。分享给大家供大家参考。具体方法如下&#xff1a;先序遍历&#xff1a;void preOrder(Node *p) //非递归{if(!p) return;stack s;Node *t;s.push(p);while(!s.empty()){ts.top();prin…

c语言标识符的文法表示,第三章文法和语法[lly]3.ppt

第三章文法和语法[lly]3第3章文法和语言;1、语言;研究程序设计语言及研究的三个方面&#xff1a; 每个程序构成的规律(语法 Syntax)每个程序的含义(语义 Semantics)每个程序和使用者的关系(语用 Pragmatics)语言三个方面定义&#xff1a;语法 -- 表示构成语言句子的各个记号之间…

c语言编程函数补充上机题,2011年计算机二级C语言上机操作题及答案(10)

/********found********/void fun(char *s, *t1, *t2, *w){int i;char *p, *r, *a;strcpy(w, s);while (*w){p w;r t1;/********found********/while (r)if (*r *p){r;p;}else{break;}if (*r ’\0’){a w;r t2;while (*r){*a *r;a;r;}w strlen(t2);}else{w;}}}main(…

苏州大学实验报告模板C语言,苏州大学实验报告-实验flash在线编程实验

1、实验Flash在线编程实验一实验目的1进一步熟悉MT-IDE嵌入式开发系统环境、汇编、C语言、调试方式。2进一步学习SCI通信的内容。3掌握Flash存储器在线编程的基本概念。4熟悉GP32芯片Flash存储器的在线编程擦除和写入的步骤。5理解课本中的程序代码。二预习要求1仔细阅读本实验…

c55x汇编语言,TMS320C55x汇编语言编程A.ppt

TMS320C55x汇编语言编程A例4-17,无效定义的表达式。 .global Y ; 定义Y为全局外部符号 badsym1.set Y ; Y在当前文件中未定义 badsym2.set 50h Y ; 无效的表达式 badsym3.set 50h Z ; 无效的表达式&#xff0c;Z还未定义 Z .set 60h; 定义Z&#xff0c;但应在表达式使用之前 …

c语言课程笔记格式,C语言课程学习笔记.docx

C语言课程学习笔记C语言基础语言排行榜C——java——objective-C进制&#xff1a;进制&#xff1a;进位机制。用普通的话讲&#xff0c;应该为人为的定义一种度量来标识一样东西。计算机常用的进制有&#xff1a;十进制、二进制、八进制和十六进制。十进制&#xff1a;0-9(十个…

c语言 手机图形库,c语言的图形库 - osc_opiar5rp的个人空间 - OSCHINA - 中文开源技术交流社区...

图形库链接http://www.easyx.cn/ 使用图形库头文件easyx.h或graphics.h同样在里面下载图形库帮助文档进行查询vs vc都可使用图形库图形库窗口&#xff1a;initgraph打开窗口closegraph关闭窗口颜色RGB值 RGB(,,)&#xff1a;red green blue 下表值都可以在函数中直接使用填充颜…

android 自动挂断,[转]android 来电自动接听和自动挂断

注意&#xff1a;android2.3版本不支持下面的自动接听方法。(会抛异常&#xff1a;java.lang.SecurityException:Neither user xxxxx nor current process hasandroid.permission.MODIFY_PHONE_STATE.)第一步&#xff1a;准备应用环境需要的系统包和aidl文件。(1)在应用中创建包…

Android实现mp3分析,Android编程实现播放MP3功能示例

本文实例讲述了Android编程实现播放MP3功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在android中播放mp3非常简单&#xff0c;也是项目中经常使用的&#xff0c;比如说要做项目的背景音乐&#xff0c;应用中某些功能的提示音等的。应用非常广泛,下面提供一个简单…

android 投票功能,腾讯新闻Android客户端更新 加入投票功能

腾讯近日更新了其应用《腾讯新闻》安卓版&#xff0c;加入了新闻专题&#xff0c;投票两大新功能&#xff0c;同事还优化了用户界面&#xff0c;大家在浏览各类新闻方面又有了新的选择。新版特点&#xff1a;1、新闻专题&#xff1a;热门新闻专题呈现&#xff0c;聚合浏览&…

android8.1自定义通知栏,Android 8.1隐藏状态栏图标的实例代码

近期客户需求&#xff0c;状态栏只显示时间和电池图标&#xff0c;如图状态栏图标的布局文件在frameworks\base\packages\SystemUI\res\layout\status_bar.xml,主要包括通知&#xff0c;定位&#xff0c;蓝牙&#xff0c;信号&#xff0c;时间&#xff0c;电池等图标&#xff0…

广州城市地图为android,广州无障碍地图

广州无障碍地图是一款非常不错的手机导航app&#xff0c;专门为老人与残障人士打造的哦。该app将准确的为残障用户规划出一条没有任何障碍的出行路线&#xff0c;并且该软件拥有语音、文字等不同的播报方式。特色说明1、智能化的手机导航的系统&#xff0c;语音识别2、最为准确…

如何将系统退回上个版本Android,vivo NEX A降级教程,如何回退到旧版本系统的方法...

也来分享一下这个vivo NEX A手机的相关降级操作了&#xff0c;因为看到有的小伙伴对对于新升级的系统不是特别的满意&#xff0c;这个时候就会考虑进行系统的降级回退操作 &#xff0c;一般直接刷官方的全量包是降不了&#xff0c;需要一个安卓10.0的中转降级包才行的&#xff…

支持3d android 模拟器,真正免root的3D神器详细使用教程

3D神器的功能众所周知&#xff0c;Android手机的GPU(图像显示芯片)是内置在CPU中的&#xff0c;而由于各个手机所采用的CPU不同&#xff0c;其GPU也不一样&#xff0c;不同的GPU&#xff0c;其内置的渲染模式也不一样。这就导致了不同手机的CPU平台需要使用对应的游戏数据包才能…

jays+android耳机,android – 响应多按钮有线耳机

我正在驾驶一对JAYS四耳机(有线遥控器/麦克风上有3个按钮)插入Galaxy Nexus(ICS 4.0.2)进行实验.我的问题是,只有中间的按钮被我写的测试应用程序’识别’,即按键时触发了Intent.ACTION_MEDIA_BUTTON和/或Activity.onKeyDown回调与KeyCode 79.按另外两个按钮不会触发任何以前的…

华为副总鸿蒙,“哄蒙”败北!华为副总裁落实最新消息,鸿蒙3月31日正式亮剑...

原标题&#xff1a;“哄蒙”败北&#xff01;华为副总裁落实最新消息&#xff0c;鸿蒙3月31日正式亮剑不得不说&#xff0c;最近的华为生态建设又取得了重大的突破。在2020年不到一年的时间里&#xff0c;华为HMS生态注册开发者的数量就已经快要突破200万了&#xff0c;如此庞大…

android sonar 简书,SonarQube对ios、android代码检测

一、sonar安装利用sonar检测代码需要安装下面几个软件SonarQube、Sonar-Scanner、OClint、sonar plugin for objective-c、sonar-I10n-zh(安装步骤参考http://www.cnblogs.com/ishawn/p/3959521.html )二、ios检测脚本cp -rf /Users/conf/ios/sonar-project.properties ${WORKS…

android afw模式,[HUAWEI-TITANC328]手机加密功能开启后,工作区中添加超级备份手机不断重启的分析报告...

工作区中添加超级备份手机不断重启的分析报告【华为反馈】 【TIT-AL00C328B120_AFW_必现】创建工作空间后升级系统,升级失败&#xff0c;手机循环重启。通过分析log发现&#xff0c;实际上这个问题与OTA无关&#xff0c;而与工作区应用发出的notification有关。经过沟通和自测&…

html淡化效果,jQuery实现基本淡入淡出效果的方法详解

本文实例讲述了jQuery实现基本淡入淡出效果的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;jQuery fadeIn()方法&#xff1a;用于淡入已隐藏的元素jQuery fadeOut()方法&#xff1a;用于淡出可见的元素$(document).ready(function(){$("button").clic…