CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 7286|回复: 2

手动添加led接口-掌握系统架构

[复制链接]
发表于 2015-3-16 16:47:39 | 显示全部楼层 |阅读模式
在Android的HAL层和JNI层添加led的接口,包含以下一些步骤:
1. 在HAL层添加Light的接口
     a. 定义LED的文件节点路径:
         char const * const TORCH_FILE  = "/sys/class/leds/orange:ph21:led2/brightness";
     b. 定义控制LED的接口:
         static int set_light_torch(struct light_device_t* dev, struct light_state_t const* state)
         {
             int err = 0;
             pthread_mutex_lock(&g_lock);
             err = write_int(TORCH_FILE, state->color & 0xFF);
             pthread_mutex_unlock(&g_lock);
             return err;
          }
      c. 定义对应的Light ID:
          在Lights.h中添加 #define LIGHT_ID_TORCH          "torch"
      d. 在open_lights函数里面添加如下代码:
           else if (0 == strcmp(LIGHT_ID_TORCH, name))
                  set_light = set_light_torch;
2. 在JNI层添加相应的接口
     a. 在com_android_server_LightsService.cpp文件的init_native( )函数中添加led的Light结构体:
         devices->lights[LIGHT_INDEX_TORCH]  = get_device(module, LIGHT_ID_TORCH);
     b. 在Light类型的enum变量中添加led的类型索引
          LIGHT_INDEX_TORCH = 8,
     c. 在LightService.java文件中添加led Light的Id
         public static final int LIGHT_ID_TORCH = 8;
3. 在Java服务层添加LightServices的接口
     a. 在PowerManagerService.java文件中添加相应的接口,具体如下:
         在PowerManagerService的类定义中增加 led Light的对象
                 private LightsService.Light mTorchLight;
         在systemReady( )接口中创建led Light的实例
                 mTorchLight = mLightsService.getLight(LightsService.LIGHT_ID_TORCH);
         在PowerManagerService的类定义中添加调用led Light的接口
                 @Override // Binder call
                 public void setTorchLight(int brightness) {
                       mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
                       final long ident = Binder.clearCallingIdentity();
                       try {
                           setTorchLightBrightness(brightness);
                       } finally {
                       Binder.restoreCallingIdentity(ident);
                       }
                 }
                 public void setTorchLightBrightness(int brightness) {
                     LightsService.Light light;
                     synchronized (mLock) {
                         if (!mSystemReady) {
                             return;
                         }
                         light = mTorchLight;
                     }
                     // Control light outside of lock.
                     light.setBrightness(brightness);
                 }
       b. 在PowerManager.java文件里面定义供应用层调用的led API:
            public void setTorchBrightness(int brightness) {
                try {
                    mService.setTorchLight(brightness);
                } catch (RemoteException e) {
                }
            }
       c. 在IPowerManager.aidl文件中添加led的接口:
           void setTorchLight(int brightness);
       d. 在BridgePowerManager.java文件中添加接口:
           @Override
           public void setTorchLight(int arg0) throws RemoteException {
           // pass for now.
           }
至此,从HAL到JNI的所有接口都已经添加完毕,应用层可以通过LightService来获取led的Light对象,然后对手led进行操作。

转载:Android绕开Camera打开手电筒的LED的实现方法另外还可参考:android平台led开发之内核硬件驱动层


回复

使用道具 举报

发表于 2015-3-16 18:42:10 | 显示全部楼层
看着有点晕,,哈哈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2022-11-26 23:55 , Processed in 0.016947 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部