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

再Android10上实现检测AHD摄像头是否接入

项目有个需要,需要知道tp9951是否接入AHD摄像头

1,驱动层可以通过读取寄存器的值来检测是否接入AHD摄像头

    tp9951_write_reg(0x40, 0x00); //select decoder page
    tp9951_write_reg(0x41, ch);    
    val = tp9951_read_reg(TP_INPUT_STATUS_REG);
    pr_info("[%s] input_status ch %d : val:%x\n", __func__, ch, val);

        1号寄存器的bit7是检测是否接入摄像头的标记位。TP_INPUT_STATUS_REG为 0x01.

2,在/proc下增加一个文件节点来实现从kernel态设备状态传递到user态。

static char kbuf[28] = {0};
//open operation
static int proc_file_open(struct inode *inode, struct file *file)
{   
    MX_LOG_INF("come here.");
    return 0;
}
//read operation
static ssize_t proc_file_read(struct file *file, char __user *buffer, size_t len, loff_t *offset)
{
    int val=0;
    MX_LOG_INF("come here.");
    memset(kbuf, 0, sizeof(kbuf));
    val = mx_tp9951_ahd_det(0);
    if ((val & 0x0080) > 0)  {
        sprintf(kbuf, "%s\n", "unlink");
    } else {
        sprintf(kbuf, "%s\n", "link");
    }
    copy_to_user(buffer , kbuf , strlen(kbuf));
    return strlen(kbuf);
}
//write opertion
static ssize_t proc_file_write(struct file *file, const char __user *buffer, size_t len, loff_t *offset)
{
    MX_LOG_INF("come here.");
    //memset(kbuf, 0, sizeof(kbuf));
    //copy_from_user(kbuf , buffer , len);
    return len;
}
//release operation
int proc_file_release(struct inode *inode, struct file *file)
{
    MX_LOG_INF("come here.");
    return 0;
}

static const struct file_operations proc_file_ops = {
        .open           = proc_file_open,
        .read           = proc_file_read,
        .write          = proc_file_write,
        .release        = proc_file_release,
};

static int proc_file_init(void)
{
    proc_create_data("mx_ahd_det", 0644, NULL, &proc_file_ops, NULL);
    MX_LOG_INF("come here.");
    return 0;
}

static void proc_file_exit(void)
{
    remove_proc_entry("mx_ahd_det", NULL);
    MX_LOG_INF("come here.");
}

注:需要在模块初始化时调用proc_file_init函数,

      在模块退出函数地方调用proc_file_exit函数。

3, 用cat 命令可测试

$cat /proc/mx_ahd_det

 输出link表示当前接入了AHD摄像头。

输出unlink表示未接入AHD摄像头。


http://www.kler.cn/a/351148.html

相关文章:

  • Python线性混合效应回归LMER分析大鼠幼崽体重数据、假设检验可视化|数据分享...
  • Cesium中的CustomDataSource 详解
  • .net core 中使用AsyncLocal传递变量
  • 搭建Node.js后端
  • 像JSONDecodeError: Extra data: line 2 column 1 (char 134)这样的问题怎么解决
  • Pycharm 使用教程
  • RK3568平台开发系列讲解(调试篇)CGroup(Control Group)之CPU资源
  • 【python + Redis】hash值查增删
  • 【AI声音克隆本地整合包及教程】第二代GPT-SoVITS V2:声音克隆的新境界
  • 02-GIT
  • Vue2项目-自定义指令
  • Windows远程桌面到Ubuntu
  • 圈子系统该如何安装?前端UNI后端PHP论坛小程序源码 圈子小程序源码
  • Vxe UI vue vxe-table grid 如何滚动、定位到指定行或列
  • Python中的pool.map函数:高效处理数据与计算任务
  • C++ 图像处理框架
  • ide的使用技巧以及插件推荐
  • 【文档智能】文本文字识别、公式识别、表格文字识别核心算法及思路及实践-DBNet、CRNN、TrOCR
  • 介绍vue.js3的核心原理:响应式数据驱动虚拟 DOM 的渲染,认识渲染器、编译器、组件与三者的协同合作,理解其是如何实现从模板到视图的高效渲染的
  • 安装vue发生异常: idealTree:nodejs: sill idealTree buildDeps
  • asp.net core _ViewStart.cshtml 和 _ViewImports.cshtml
  • 【环境搭建】MAC M1安装ElasticSearch
  • C++编程:实现一个基于原始指针的环形缓冲区(RingBuffer)缓存串口数据
  • Python基础之输入与输出
  • LVGL-从入门到熟练使用
  • whaosoftの物联网各种设备协议