当前位置: 首页 > news >正文

MT6765 android上层获取VCM lens位置

一般摄像头的VCM 自动对焦,对lens的寄存器自动写入位置值,也有些上层APP 应用需要获取VCM  lens的位置进行界面信息显示。APP 应用需要获取VCM  lens的位置值,需要读取节点值与开放selinux权限。

本文以为DW9714为例,简单说下上层如何获取lens位置.

1 定义lens

ProjectConfig.mk:

CUSTOM_HAL_LENS = dw9714af

CUSTOM_HAL_MAIN_LENS = dw9714af

k62v1_64_bsp_defconfig:

CONFIG_MTK_LENS_DW9714AF_SUPPORT=y

2 驱动调用

lens_info.h

定义模域与控制指令值

#define AF_MAGIC 'A'

#define AFIOC_T_GETPOS _IOR(AF_MAGIC, 18, u32)

main_lens.c

lens列表中找到DW9714AF.

stAF_DrvList g_stAF_DrvList[MAX_NUM_OF_LENS]

IOCOTRL:

static long AF_Ioctl(struct file *a_pstFile, unsigned int a_u4Command,
             unsigned long a_u4Param)
{

......

    default:
        if (g_pstAF_CurDrv)
            i4RetValue = g_pstAF_CurDrv->pAF_Ioctl(
                a_pstFile, a_u4Command, a_u4Param);
        break;

}

g_pstAF_CurDrv->pAF_Ioctl调用DW9714的

long DW9714AF_Ioctl(struct file *a_pstFile, unsigned int a_u4Command,
            unsigned long a_u4Param)
{

......

        /×添加读取位置代码×/

    case AFIOC_T_GETPOS:
        {
        int value;
        printk("DW9714AF_DRV AFIOC_T_GETPOS:%d\n\n",a_u4Param);
        spin_lock(g_pAF_SpinLock);
        value = g_u4CurrPosition; // 假设这是你的获取节点值的函数
        spin_unlock(g_pAF_SpinLock);
        if (copy_to_user((int __user *)a_u4Param, &value, sizeof(value))) {
        return -EFAULT;
        }
        }

......

}

3 节点权限开启与selinux权限开放给对应APP

alps/device/mediatek/mt6765/ueventd.mt6765.emmc.rc:

/dev/MAINAF                0777   root     root

alps/device/mediatek/mt6765/ueventd.mt6765.ufs.rc:

/dev/MAINAF                0777   root     root

alps/device/mediatek/sepolicy/basic/non_plat/file_contexts:

/dev/MAINAF u:object_r:supercam_device:s0

./mediatek/sepolicy/basic/non_plat/untrusted_app.te:

allow untrusted_app supercam_device:chr_file { open read write ioctl};

4 编写JNI接口

int readvalue(void)

{

int fd = open("/dev/MAINAF", O_RDONLY); // 打开设备文件

if (fd < 0) {

perror("Failed to open device");

}

int value;

if (ioctl(fd, AFIOC_T_GETPOS, &value) == -1) {

perror("Failed to perform IOCTL");

close(fd);

}

printf("Node value: %d\n", value);

close(fd);

}

http://www.xdnf.cn/news/225361.html

相关文章:

  • macOS 安装了Docker Desktop版终端docker 命令没办法使用
  • ‌阿里云dns服务器不可用怎么办?dns可以随便改吗?
  • Dockerfile最佳实践:构建高效、安全的容器镜像
  • AI生成Flutter UI代码实践(一)
  • 学习记录:DAY21
  • EasyRTC嵌入式音视频实时通话SDK技术,打造低延迟、高安全的远程技术支持
  • 【JavaEE】网络原理之初识(1.0)
  • M1 Mac pip3 install错误记录
  • 算法基础学习|03整数二分
  • 【工具变量】地级市李白消费指数及预期指数数据集(2012-2022年)
  • Java学习手册:Spring 中常用的注解
  • day11 python超参数调整
  • 在若依前后端分离项目中集成 ONLYOFFICE 以实现在线预览、编辑和协作功能
  • 网页出现502的报错是什么意思?
  • 泰迪杯特等奖案例学习资料:基于多模态数据融合与边缘计算的工业设备健康监测与预测性维护系统
  • GPU集群中的超节点
  • 基于Q学习的2048游戏智能体:制作一个自己会玩游戏的智能体
  • CSS实现DIV水平与垂直居中方法总结
  • tailwindcss如何改变antd子组件的样式
  • CSS:选择器-复合选择器
  • RHCSA Linux 系统 文件系统权限
  • Linux——HTTP协议理解
  • 7.计算机网络相关术语
  • Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)
  • 使用PyTorch进行热狗图像分类模型微调
  • 第四部分:实用应用开发
  • libevent详解
  • 深⼊理解指针(7)
  • Python网络爬虫核心技术拆解:架构设计与工程化实战深度解析
  • 【数据通信完全指南】从物理层到协议栈的深度解析