很多时候我们需要从 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 层读取同一个标志的更多相关文章

  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. 用二进制大对象类型Blob实现图片入库与出库的操作

    package readclobDemo.bao; import java.io.FileInputStream; import java.io.FileNotFoundException; impo ...

  2. NSNumber和NSValue

    在进行数据处理的时候,因为对象类型的不同, 并不能进行相应的数据处理,所以必须要进行数据类型的转换,这也就是NSNumber,NSValue这两类值对象出现的原因. 简而言之,NSNumber就是实现 ...

  3. 《只是为了好玩:Linux之父林纳斯自传》

    <只是为了好玩:Linux之父林纳斯自传> 基本信息 作者: (美)Linus Torvalds    David Diamond 译者: 陈少芸 出版社:人民邮电出版社 ISBN:978 ...

  4. 大写金额字符串生成 C#实现

    思路: 中文对金额的描述以四位为一组, 只考虑一万亿以内的数字则每组内以千.百.十和[亿\万\元]区分各位 连续的零按一个处理,组内最低位的零可略去 无角无分说整,有角无分只说角,无角有分说零X分,有 ...

  5. j-query应用---鼠标悬停不同文字显示不同背景图片banner动画

    源代码部分:注意事项:样式表的引用的路径要一致. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  6. 算法(三)粒子群算法PSO的介绍

    一.引言 在讲算法之前,先看两个例子: 例子一:背包问题,一个书包,一堆物品,每个物品都有自己的价值和体积,装满书包,使得装的物品价值最大. 例子二:投资问题,n个项目,第i个项目投资为ci 收益为p ...

  7. 删除CListCtrl中具有某一相同数据的所有行

    删除CListCtrl中具有某一相同数据的所有行 ================================== 本文原创,转载请注明出处:http://blog.csdn.net/wlsgzl ...

  8. kettle初探

    Kettle是Pentaho的一个组件,主要用于数据库间的数据迁移,到我用过的4.2版,还不支持noSQL,不知道4.4是不是支持了. Kettle自己有三个主要组件:Spoon,Kitchen,Pa ...

  9. Lighttpd

    一.简介 Lighttpd 是一个德国人领导的开源Web服务器软件,其根本的目的是提供一个专门针对高性能网站,安全.快速.兼容性好并且灵活的web server环境.具有非常低的内存开销,cpu占用率 ...

  10. iBus

    0.闲言 闲来无事,重新玩玩Ubuntu,于是先把Ubuntu13.04删了(为什么是13.04?我也不知道)翻出14.04U盘安装,还算顺利,就是不知道为什么DiskGenius为什么一直提示分区表 ...