很多时候我们需要从 HAL 层(Hardware Abstract Layer)传一个标志给 kernel 层。一般这种传递是不能直接通过定义全局变量来实现的。

此时可以通过读写文件来实现该标志。

譬如我们有这样一个需求,在录像过程中去掉持续对焦功能,而录像预览时开启持续对焦功能。

在 HAL 层中有开始录像和停止录像的接口。

/trunk/ALPS.JB3.TDD.MP.V2_TD_xxx/mediatek/platform/mt6572/hardware/camera/hal/client/CamClient/Record/RecordClient.cpp 文件中

在 /sys/devices/platform/lens_actuator/ 目录下创建一个 VideoRec_Flag 这样的文件,在开始录像时将该文件中写入一个字节的值为1,而在停止录像时将该文件中写入一个字节的值为0。

  1. bool
  2. RecordClient::
  3. startRecording()
  4. {
  5. bool ret = false;
  6. //
  7. MY_LOGD("+");
  8. //
  9. Mutex::Autolock _l(mModuleMtx);
  10. //
  11. #if 1
  12. int flag[]= {};
  13.  
  14. FILE *fd = NULL;
  15. fd = fopen("/sys/devices/platform/lens_actuator/VideoRec_Flag","w");
  16.  
  17. if(fd == NULL)
  18. MY_LOGD("BBN_TestMode open failed");
  19. else{
  20. MY_LOGD("BBN_TestMode open ok");
  21. fwrite(&flag,,,fd);
  22. fclose(fd);
  23. }
  24. #endif
  25.  
  26. if(isEnabledState())
  27. {
  28. MY_LOGE("Recording has been started");
  29. goto lbExit;
  30. }
  31. //
  32. MY_LOGD("+ current mIsRecStarted=%d", mIsRecStarted);
  33. ::android_atomic_write(, &mIsRecStarted);
  34. //
  35. mpParamsMgr->getVideoSize(&mi4RecWidth, &mi4RecHeight);
  36. MY_LOGD("+ record: WxH=%dx%d, format(%s)", mi4RecWidth, mi4RecHeight, MtkCameraParameters::PIXEL_FORMAT_YUV420I);//CameraParameters::PIXEL_FORMAT_YUV420P);
  37. //
  38. mTimeStart = systemTime();
  39. mTimeEnd = mTimeStart;
  40. mFrameCount = ;
  41. mLastTimeStamp = ;
  42. //
  43. ret = onStateChanged();
  44. //
  45. lbExit:
  46. //
  47. MY_LOGD("-");
  48. //
  49. return ret;
  50. }
  51.  
  52. /******************************************************************************
  53. *
  54. ******************************************************************************/
  55. bool
  56. RecordClient::
  57. stopRecording()
  58. {
  59. bool ret = false;
  60. status_t status = NO_ERROR;
  61. //
  62. MY_LOGD("+");
  63. //
  64. #if 1
  65. int flag[]= {};
  66.  
  67. FILE *fd = NULL;
  68. fd = fopen("/sys/devices/platform/lens_actuator/VideoRec_Flag","w");
  69.  
  70. if(fd == NULL)
  71. MY_LOGD("BBN_TestMode open failed");
  72. else{
  73. MY_LOGD("BBN_TestMode open ok");
  74. fwrite(&flag,,,fd);
  75. fclose(fd);
  76. }
  77. #endif
  78.  
  79. Mutex::Autolock _l(mModuleMtx);
  80. //
  81. if(!isEnabledState())
  82. {
  83. MY_LOGE("Recording has been stopped");
  84. goto lbExit;
  85. }
  86. //
  87. MY_LOGD("getThreadId(%d), getStrongCount(%d), this(%p)", getThreadId(), getStrongCount(), this);
  88. //
  89. MY_LOGD("+ current mIsRecStarted=%d", mIsRecStarted);
  90. ::android_atomic_write(, &mIsRecStarted);
  91. //
  92. ret = onStateChanged();
  93. //
  94. mpImgBufQueue->pauseProcessor();
  95. //
  96. lbExit:
  97. //
  98. MY_LOGD("-");
  99. //
  100. return ret;
  101. }

在/trunk/ALPS.JB3.TDD.MP.V2_TD_xxx/mediatek/custom/common/kernel/imgsensor/ov5645_mipi_yuv/ov5645mipiyuv_Sensor.c 文件中

在 OV5645_FOCUS_OVT_AFC_Constant_Focus() 函数中读取之前VideoRec_Flag那个文件中的值,若为1,则进行持续对焦,否则,放弃持续对焦。在驱动文件中是通过写寄存器来实现的。

  1. static void OV5645_FOCUS_OVT_AFC_Constant_Focus(void)
  2. {
  3. printk("FM50AF_VideoRec_Flag=%d \n",FM50AF_VideoRec_Flag);
  4.  
  5. if(FM50AF_VideoRec_Flag)
  6. {
  7. OV5645MIPI_write_cmos_sensor(0x3023,0x01);
  8. OV5645MIPI_write_cmos_sensor(0x3022,0x06);
  9. }
  10. else{
  11. OV5645MIPI_write_cmos_sensor(0x3023,0x01);
  12. OV5645MIPI_write_cmos_sensor(0x3022,0x80);
  13. mDELAY();
  14. OV5645MIPI_write_cmos_sensor(0x3024,0x00);
  15. OV5645MIPI_write_cmos_sensor(0x3023,0x01);
  16. OV5645MIPI_write_cmos_sensor(0x3022,0x04);
  17. }
  18. }

具体的读取方式如下:

  1. int FM50AF_VideoRec_Flag;
  2.  
  3. EXPORT_SYMBOL(FM50AF_VideoRec_Flag);
  4.  
  5. static ssize_t show_VideoRec_Flag(struct device *dev,struct device_attribute *attr, char *buf)
  6. {
  7. // xlog_printk(ANDROID_LOG_DEBUG, "show_VideoRec_Flag test", "[Battery] show_BN_TestMode : %x\n", g_BN_TestMode);
  8.  
  9. printk("show_VideoRec_Flag FM50AF_VideoRec_Flag=%d \n",FM50AF_VideoRec_Flag);
  10. return sprintf(buf, "%u\n", FM50AF_VideoRec_Flag);
  11.  
  12. }
  13. static ssize_t store_VideoRec_Flag(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
  14. {
  15. char *pvalue = NULL;
  16. unsigned int reg_BN_TestMode = ;
  17. printk( "store_VideoRec_Flag \n");
  18. if(buf != NULL && size != )
  19. {
  20. printk("store_VideoRec_Flag test111", "[Battery] buf is =%s , size is =%d \n",buf,size);
  21. printk("store_VideoRec_Flag buf= %d ,size=%d \n", *buf,size);
  22. // reg_BN_TestMode = simple_strtoul(buf,&pvalue,10);
  23. FM50AF_VideoRec_Flag=*buf;
  24. }
  25. // return size;
  26. return FM50AF_VideoRec_Flag;
  27. }
  28. static DEVICE_ATTR(VideoRec_Flag, , show_VideoRec_Flag, store_VideoRec_Flag);

这其中涉及到一些驱动文件中读写文件的格式的写法需要注意下。

至此,就可以实现该需求了。

如何在 kernel 和 hal 层读取同一个标志的更多相关文章

  1. Android HAL层与Linux Kernel层驱动开发简介

    近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...

  2. 高通HAL层之Sensor HAL

    高通的HAL层其实分为两种,一种是直接从kernel这边报数据上来的,由sensor HAL层来监听,另一种是走ADSP的模式,HAL层是通过qmi的形式进行监听的: 走ADSP架构的可以看下面的博客 ...

  3. Android Hal层简要分析

    Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...

  4. 【Android】Sensor框架HAL层解读

    Android sensor构建 Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer).磁力传感器(magnetic field).方向传感器( ...

  5. 〖Android〗OK6410a的Android HAL层代码编写笔记

    一.编写LED灯的Linux驱动程序代码 之所以使用存在HAL层,是为了保护对硬件驱动过程的逻辑与原理: 所以,残留在Linux驱动层的代码,只保留了基本的读写操作,而不含有关键的逻辑思维: 1. l ...

  6. Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

    有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...

  7. ZT Android4.2关于bluetooth在HAL层的分析(1)

    我的电子杂烩饭 http://blog.sina.com.cn/wuchuchu2012 [订阅][手机订阅] 首页 博文目录 图片 关于我 正文 字体大小:大 中 小 Android4.2关于blu ...

  8. 读取properties文件------servletcontext及dao层读取

    用servletcontext读取properties文件-------1) 重点在于:InputStream in=this.getServletContext().getResourceAsStr ...

  9. 51全志R58平台Android4.4下Camera的HAL层修改

    51全志R58平台Android4.4下Camera的HAL层修改 2018/11/7 15:20 版本:V1.0 开发板:SC5806 1.系统编译: (略) 2.全志R58平台Android4.4 ...

随机推荐

  1. Struts2(十四)拦截器实现权限管理

    一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...

  2. IOS开发之SVN的使用

    关于SVN的一个使用细节    

  3. 调研Android平台的开发环境的发展演变

    ·  安卓是以linux为基础的开放源码操作系统.因为安卓的开源等原因,所以现在市场上会有大量的APP可供使用,且各个方面都功能强大. ·  也许是因为开源的原因,安卓过于碎片化.每个APP互相独立. ...

  4. git 一般的开发流程中的代码管理

    一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...

  5. Spring 通过XML配置文件以及通过注解形式来AOP 来实现前置,环绕,异常通知,返回后通知,后通知

    本节主要内容: 一.Spring 通过XML配置文件形式来AOP 来实现前置,环绕,异常通知     1. Spring AOP  前置通知 XML配置使用案例     2. Spring AOP   ...

  6. 【温故而知新-Javascript】使用数组

    Javascript 数组的工作方式与大多数编程语言的数组类似. <!DOCTYPE html> <html lang="en"> <head> ...

  7. 不会UML的程序员不是好构架师?

    情况描述 我已经工作两年半, 参加过一个网页游戏项目和一个IOS应用项目, 自以为参与度非常高, 也经常涉及到底层引擎和主逻辑业务. 目前想更快的向构架师方向发展. 最近在看\<Learning ...

  8. HDU 4267 A Simple Problem with Integers --树状数组

    题意:给一个序列,操作1:给区间[a,b]中(i-a)%k==0的位置 i 的值都加上val  操作2:查询 i 位置的值 解法:树状数组记录更新值. 由 (i-a)%k == 0 得知 i%k == ...

  9. ZOJ 3233 Lucky Number --容斥原理

    这题被出题人给活活坑了,题目居然理解错了..哎,不想多说. 题意:给两组数,A组为幸运基数,B组为不幸运的基数,问在[low,high]区间内有多少个数:至少被A组中一个数整除,并且不被B中任意一个数 ...

  10. Codeforces Zepto Code Rush 2014 -C - Dungeons and Candies

    这题给的一个教训:Codeforces没有超时这个概念.本来以为1000*(1000+1)/2*10*10要超时的.结果我想多了. 这题由于k层都可能有关系,所以建一个图,每两个点之间连边,边权为n* ...