zoukankan      html  css  js  c++  java
  • Android驱动入门-LED--HAL硬件访问服务层②

    硬件平台: FriendlyARM Tiny4412 Cortex-A9

    操作系统: UBUNTU 14.04 LTS

    时间:2016-09-21  16:58:56

    为了避免访问冲突,则创建了硬件访问服务层。

    硬件服务需要注册到service manager。

    首先:内核驱动 <<-->> LED-HAL硬件抽象层 <<-->>  CPP文件 <<-->> 服务类JAVA。

    服务类JAVA包含: aidl 、硬件服务 、注册到ServerManger。

    首先编写aidl文件。

    在 Android-5.0.2/frameworks/base/core/java/android/os/ 下创建接口文件 ILedServiece.aidl 以Vibrator为基准。

    package android.os;
    
    /** {@hide} */
    interface ILedService    //下面的函数为我们需要的接口函数。
    {
        int LedOpen();
        int LedOn( int no );
        int LedOff( int no );    
    
    }

    为了转化到java文件 则修改mk文件。

    在 Android-5.0.2/frameworks/base/Android.mk文件中  添加 core/java/android/os/ILedService.aidl

    开始编译

    . setenv  //配置环境变量
    lunch  
    mmm frameworks/base  //编译

    编译完成后会自动生成文件JAVA文件: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/ILedService.java

    创建服务类: 在frameworks/base/services/core/java/com/android/server/目录下。

    以Vibrator为基准。创建 LedService.java

    package com.android.server;
    
    import android.util.Slog;
    import android.os.ILedService;    //来自自动生成的文件
    
    public class LedService extends ILedService.Stub {
        private static final String TAG = "LedService";
        
        public int LedOpen() throws android.os.RemoteException    //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
        {
            return native_LedOpen();
        }
        
        public int LedOn(int no) throws android.os.RemoteException  //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
        {
            return native_LedOn( no );
        }
        
        public int LedOff(int no) throws android.os.RemoteException  //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
        {
            return native_LedOff( no );
        }
    
        public LedService()
        {
            Slog.d(TAG,"LedService");
        }
    
        public static native int native_LedOpen();      //jni的函数声明
        public static native int native_LedOn( int no );   //jni的函数声明
        public static native int native_LedOff( int no );   //jni的函数声明
        
    }

    注册到manager。

    修改文件 frameworks/base/services/java/com/android/server/SystemServer.java 。

    以Vibrator为基准。

    添加以下代码:

    LedService led = null;

    ~~~~~~~~~

    Slog.i(TAG, "Led Service");
                led = new LedService();
                ServiceManager.addService("led", led);

    修改cpp文件。

    在frameworks/base/services/core/jni/ 目录下以Vibrator为基准创建文件com_android_server_LedService.cpp

    #define LOG_TAG "LedService"
    
    #include "jni.h"
    #include "JNIHelp.h"
    #include "android_runtime/AndroidRuntime.h"
    
    #include <utils/misc.h>
    #include <utils/Log.h>
    #include <hardware/led.h>
    
    #include <stdio.h>
    struct led_device_t *led_dev;    //此为在HAL硬件抽象层中自己定义的结构体
    
    namespace android
    {
    
    static jint LedOpen( JNIEnv *env, jobject clazz )  //前面两个参数必须要有
    {
        hw_module_t *module;
        hw_device_t *device;
        hw_get_module( "led", (hw_module_t const **)&module );  //依靠”led“获取HAL抽象层中的结构体指针
    
        module->methods->open( module, NULL, &device);      //依旧是在抽象层中实现的
    
        led_dev = (struct led_device_t *)device;
    
        return 0;
    }
    
    static jint LedOn( JNIEnv *env, jobject clazz, int no )  //前面两个参数必须要有,后面的为函数自身的参数
    {
        led_dev->set_on( led_dev, no );
        return 0;
    }
    
    static jint LedOff( JNIEnv *env, jobject clazz, int no )
    {
        led_dev->set_off( led_dev, no );
        return 0;
    }
    
    static JNINativeMethod method_table[] = {
        { "native_LedOpen", "()I", (void*)LedOpen },  //需要的用到的函数名字( ”java中用到的名字“, (参数)返回值, 在cpp中具体实现的名字 )
        { "native_LedOn", "(I)I", (void*)LedOn },
        { "native_LedOff", "(I)I", (void*)LedOff },
    };
    
    int register_android_server_LedService(JNIEnv *env)
    {
        return jniRegisterNativeMethods(env, "com/android/server/LedService",    //哪个类需要用到
                method_table, NELEM(method_table));
    }
    
    };

    完成之后,需要调用  int register_android_server_LedService(JNIEnv *env)  函数。

    在frameworks/base/services/core/jni/onload.cpp文件中添加以下代码:

    申明:int register_android_server_LedService(JNIEnv *env);

    调用:register_android_server_LedService(env);

     修改frameworks/base/services/core/jni/Android.mk

    添加: $(LOCAL_REL_DIR)/com_android_server_LedService.cpp

    编译: mmm frameworks/base/services/

    成功后 生成system.img映像即可。

  • 相关阅读:
    组织过程资产
    事业环境因素
    一起来学习Android自定义控件2-简单的写字板控件
    Android自定义控件1
    一起来学习Android自定义控件1
    Java你可能不知道的事(3)HashMap
    Java你可能不知道的事(3)HashMap
    Java你可能不知道的事(3)HashMap
    java你可能不知道的事(2)--堆和栈
    java你可能不知道的事(2)--堆和栈
  • 原文地址:https://www.cnblogs.com/ynxf/p/5893345.html
Copyright © 2011-2022 走看看