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.pswp.cn/news/443170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443170.shtml
英文地址,請注明出處:http://en.pswp.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…