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

embedded/2024/10/21 22:47:36/

项目有个需要,需要知道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;

    int ret, writen;

    MX_LOG_INF("come here.");

    if (*offset) {

        return 0;

    }

    memset(kbuf, 0, sizeof(kbuf));

    val = mx_tp9951_ahd_det(0);

    if ((val & 0x0080) > 0)  {

        writen = snprintf(kbuf, 10, "%s\n", "unlink");

    } else {

        writen = snprintf(kbuf, 10, "%s\n", "link");

    }

    if (clear_user(buffer, len)) {

        printk(KERN_ERR "clean error.\n");

        return -EIO;

    }

    ret = copy_to_user(buffer , kbuf , strlen(kbuf));

    if (0 != ret) {

        printk(KERN_ERR "copy error.\n");

        return -EIO;

    }

    *offset += writen;

    return writen;


}
//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.ppmy.cn/embedded/129384.html

相关文章

React开发一个WebSocket

export default class SocketService {static instance null;static get Instance() {if (!this.instance) {this.instance new SocketService();}return this.instance;}// 和服务端连接的socket对象ws null;// 存储回调函数callBackMapping {};// 标识是否连接成功connec…

ITSS服务项目经理的的认证价值

ITSS 个人认证足以印证持证者拥有 IT 服务从业的基础能力。获取 ITSS 认证对于个人及企业于 IT 服务领域的发展具备关键意义。以下为 ITSS 认证的作用所体现的若干方面: (1)能力认证:其乃是一套客观且量化的准则,用以…

下载Edge/Chrome浏览器主题的背景图片

当我们为Edge安装了心仪的主题后,希望把对应的背景图片下载保存要怎么做呢,以下图的“湖心小屋”主题为例。如下图,我们已经在应用商店中按照了该主题。 当打开新标签页后,可以欣赏这个主题内置的背景图片。 如果想要下载这个背景…

Jmeter学习深入

Jmeter学习深入 一、jmeter接口关联 提取器: 。 CS5:给网页使用 。JSON:给JSON数据使用 。 边界:给字符串使用 。正则:更加高级的字符使用 。XPath:给网页使用 必须掌握: JSON边界 JSON 正则 1.边界提取器 给定两边取中间 2.正则提取器 正则:强大并且复杂 通过指定正则表…

10 django管理系统 - 管理员管理 - 新建管理员(通过模态框和ajax实现)

在文章“04 django管理系统 - 部门管理 - 新增部门”中&#xff0c;我们通过传统的新增页面来实现部门的添加。 在本文中&#xff0c;我们通过模态框和ajax来实现管理员的新增。 首先在admin_list.html中新建入口&#xff0c;使用按钮 <div class"panel-heading&quo…

全方面熟悉Maven项目管理工具(一)认识Maven、Maven如何安装?

1. Maven 1.1 应用场景&#xff1a; 本地仓库&#xff1a; 我们使用的jar依赖于maven的本地仓库 自动部署&#xff1a; 本地仓库推送到远程仓库&#xff0c; 远程库通知 Jenkins工具&#xff0c;Jenkins 调用Maven构建war包&#xff0c;Jenkins 再调用准备好的脚本程序&…

C++11 异常处理:优势、劣势与规范

目录 一、传统错误处理方式 二、C11 异常处理机制 三、C11 异常处理的优点 四、C11 异常处理的缺点 五、总结 在 C 编程中&#xff0c;异常处理是一种重要的错误处理机制。C11 对异常处理进行了一些改进和规范&#xff0c;本文将详细介绍 C11 异常处理的特点、优势、劣势以…

建筑智能化:为你打造智能生活

在当今科技迅猛发展的时代&#xff0c;建筑智能化成为了现代社会中不可或缺的一环。它让我们的生活更加便利舒适&#xff0c;也提高了工作效率和安全性。视频监控、系统集成、智能照明、安防管理、消防管理、停车场管理、电梯管理以及信息发布&#xff0c;这些都是建筑智能化的…