如何在 kernel 和 hal 层读取同一个标志
很多时候我们需要从 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。
- bool
- RecordClient::
- startRecording()
- {
- bool ret = false;
- //
- MY_LOGD("+");
- //
- Mutex::Autolock _l(mModuleMtx);
- //
- #if 1
- int flag[]= {};
- FILE *fd = NULL;
- fd = fopen("/sys/devices/platform/lens_actuator/VideoRec_Flag","w");
- if(fd == NULL)
- MY_LOGD("BBN_TestMode open failed");
- else{
- MY_LOGD("BBN_TestMode open ok");
- fwrite(&flag,,,fd);
- fclose(fd);
- }
- #endif
- if(isEnabledState())
- {
- MY_LOGE("Recording has been started");
- goto lbExit;
- }
- //
- MY_LOGD("+ current mIsRecStarted=%d", mIsRecStarted);
- ::android_atomic_write(, &mIsRecStarted);
- //
- mpParamsMgr->getVideoSize(&mi4RecWidth, &mi4RecHeight);
- MY_LOGD("+ record: WxH=%dx%d, format(%s)", mi4RecWidth, mi4RecHeight, MtkCameraParameters::PIXEL_FORMAT_YUV420I);//CameraParameters::PIXEL_FORMAT_YUV420P);
- //
- mTimeStart = systemTime();
- mTimeEnd = mTimeStart;
- mFrameCount = ;
- mLastTimeStamp = ;
- //
- ret = onStateChanged();
- //
- lbExit:
- //
- MY_LOGD("-");
- //
- return ret;
- }
- /******************************************************************************
- *
- ******************************************************************************/
- bool
- RecordClient::
- stopRecording()
- {
- bool ret = false;
- status_t status = NO_ERROR;
- //
- MY_LOGD("+");
- //
- #if 1
- int flag[]= {};
- FILE *fd = NULL;
- fd = fopen("/sys/devices/platform/lens_actuator/VideoRec_Flag","w");
- if(fd == NULL)
- MY_LOGD("BBN_TestMode open failed");
- else{
- MY_LOGD("BBN_TestMode open ok");
- fwrite(&flag,,,fd);
- fclose(fd);
- }
- #endif
- Mutex::Autolock _l(mModuleMtx);
- //
- if(!isEnabledState())
- {
- MY_LOGE("Recording has been stopped");
- goto lbExit;
- }
- //
- MY_LOGD("getThreadId(%d), getStrongCount(%d), this(%p)", getThreadId(), getStrongCount(), this);
- //
- MY_LOGD("+ current mIsRecStarted=%d", mIsRecStarted);
- ::android_atomic_write(, &mIsRecStarted);
- //
- ret = onStateChanged();
- //
- mpImgBufQueue->pauseProcessor();
- //
- lbExit:
- //
- MY_LOGD("-");
- //
- return ret;
- }
在/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,则进行持续对焦,否则,放弃持续对焦。在驱动文件中是通过写寄存器来实现的。
- static void OV5645_FOCUS_OVT_AFC_Constant_Focus(void)
- {
- printk("FM50AF_VideoRec_Flag=%d \n",FM50AF_VideoRec_Flag);
- if(FM50AF_VideoRec_Flag)
- {
- OV5645MIPI_write_cmos_sensor(0x3023,0x01);
- OV5645MIPI_write_cmos_sensor(0x3022,0x06);
- }
- else{
- OV5645MIPI_write_cmos_sensor(0x3023,0x01);
- OV5645MIPI_write_cmos_sensor(0x3022,0x80);
- mDELAY();
- OV5645MIPI_write_cmos_sensor(0x3024,0x00);
- OV5645MIPI_write_cmos_sensor(0x3023,0x01);
- OV5645MIPI_write_cmos_sensor(0x3022,0x04);
- }
- }
具体的读取方式如下:
- int FM50AF_VideoRec_Flag;
- EXPORT_SYMBOL(FM50AF_VideoRec_Flag);
- static ssize_t show_VideoRec_Flag(struct device *dev,struct device_attribute *attr, char *buf)
- {
- // xlog_printk(ANDROID_LOG_DEBUG, "show_VideoRec_Flag test", "[Battery] show_BN_TestMode : %x\n", g_BN_TestMode);
- printk("show_VideoRec_Flag FM50AF_VideoRec_Flag=%d \n",FM50AF_VideoRec_Flag);
- return sprintf(buf, "%u\n", FM50AF_VideoRec_Flag);
- }
- static ssize_t store_VideoRec_Flag(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
- {
- char *pvalue = NULL;
- unsigned int reg_BN_TestMode = ;
- printk( "store_VideoRec_Flag \n");
- if(buf != NULL && size != )
- {
- printk("store_VideoRec_Flag test111", "[Battery] buf is =%s , size is =%d \n",buf,size);
- printk("store_VideoRec_Flag buf= %d ,size=%d \n", *buf,size);
- // reg_BN_TestMode = simple_strtoul(buf,&pvalue,10);
- FM50AF_VideoRec_Flag=*buf;
- }
- // return size;
- return FM50AF_VideoRec_Flag;
- }
- static DEVICE_ATTR(VideoRec_Flag, , show_VideoRec_Flag, store_VideoRec_Flag);
这其中涉及到一些驱动文件中读写文件的格式的写法需要注意下。
至此,就可以实现该需求了。
如何在 kernel 和 hal 层读取同一个标志的更多相关文章
- Android HAL层与Linux Kernel层驱动开发简介
近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...
- 高通HAL层之Sensor HAL
高通的HAL层其实分为两种,一种是直接从kernel这边报数据上来的,由sensor HAL层来监听,另一种是走ADSP的模式,HAL层是通过qmi的形式进行监听的: 走ADSP架构的可以看下面的博客 ...
- Android Hal层简要分析
Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...
- 【Android】Sensor框架HAL层解读
Android sensor构建 Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer).磁力传感器(magnetic field).方向传感器( ...
- 〖Android〗OK6410a的Android HAL层代码编写笔记
一.编写LED灯的Linux驱动程序代码 之所以使用存在HAL层,是为了保护对硬件驱动过程的逻辑与原理: 所以,残留在Linux驱动层的代码,只保留了基本的读写操作,而不含有关键的逻辑思维: 1. l ...
- Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务
有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...
- ZT Android4.2关于bluetooth在HAL层的分析(1)
我的电子杂烩饭 http://blog.sina.com.cn/wuchuchu2012 [订阅][手机订阅] 首页 博文目录 图片 关于我 正文 字体大小:大 中 小 Android4.2关于blu ...
- 读取properties文件------servletcontext及dao层读取
用servletcontext读取properties文件-------1) 重点在于:InputStream in=this.getServletContext().getResourceAsStr ...
- 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 ...
随机推荐
- Struts2(十四)拦截器实现权限管理
一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...
- IOS开发之SVN的使用
关于SVN的一个使用细节
- 调研Android平台的开发环境的发展演变
· 安卓是以linux为基础的开放源码操作系统.因为安卓的开源等原因,所以现在市场上会有大量的APP可供使用,且各个方面都功能强大. · 也许是因为开源的原因,安卓过于碎片化.每个APP互相独立. ...
- git 一般的开发流程中的代码管理
一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...
- Spring 通过XML配置文件以及通过注解形式来AOP 来实现前置,环绕,异常通知,返回后通知,后通知
本节主要内容: 一.Spring 通过XML配置文件形式来AOP 来实现前置,环绕,异常通知 1. Spring AOP 前置通知 XML配置使用案例 2. Spring AOP ...
- 【温故而知新-Javascript】使用数组
Javascript 数组的工作方式与大多数编程语言的数组类似. <!DOCTYPE html> <html lang="en"> <head> ...
- 不会UML的程序员不是好构架师?
情况描述 我已经工作两年半, 参加过一个网页游戏项目和一个IOS应用项目, 自以为参与度非常高, 也经常涉及到底层引擎和主逻辑业务. 目前想更快的向构架师方向发展. 最近在看\<Learning ...
- HDU 4267 A Simple Problem with Integers --树状数组
题意:给一个序列,操作1:给区间[a,b]中(i-a)%k==0的位置 i 的值都加上val 操作2:查询 i 位置的值 解法:树状数组记录更新值. 由 (i-a)%k == 0 得知 i%k == ...
- ZOJ 3233 Lucky Number --容斥原理
这题被出题人给活活坑了,题目居然理解错了..哎,不想多说. 题意:给两组数,A组为幸运基数,B组为不幸运的基数,问在[low,high]区间内有多少个数:至少被A组中一个数整除,并且不被B中任意一个数 ...
- Codeforces Zepto Code Rush 2014 -C - Dungeons and Candies
这题给的一个教训:Codeforces没有超时这个概念.本来以为1000*(1000+1)/2*10*10要超时的.结果我想多了. 这题由于k层都可能有关系,所以建一个图,每两个点之间连边,边权为n* ...