项目有个需要,需要知道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摄像头。