ov9650摄像头驱动之——linux内核v4l2架构分析1

2023-10-27

本系列准备分为3-4篇来讲,因为说的太多会比较乱

 

v4l2视频驱动主要涉及几个知识点:

    摄像头方面的知识(摄像头厂家提供的芯片手册可以查看

要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。

    Camera解码器、控制器(主控芯片的芯片手册里面有摄像头相关的寄存器设置,比如2410里,里面主要是设置相关控制功能使能,芯片内部自己的架构

如果摄像头是模拟量输出的,要熟悉解码器的配置。最后数字视频信号进入camera控制器后,还要熟悉camera控制器的操作。

    V4L2API和数据结构控制(主要是用户空间需要的一些v4l2的操作,然后针对这些操作必须在底层实现相应的驱动

编写驱动前要熟悉应用程序访问V4L2的方法及设计到的数据结构。

    V4L2的驱动架构(这个是在底层写驱动,为用户空间提供相应的访问接口,可以参照内核里面的/drivers/media/video//zc301/zc301_core.c 中的ZC301视频驱动代码

它是内核提供的非常完善的v4l2架构的例子,基本上都可以在它的基础上进行修改!

最后编写出符合V4L2规范的视频驱动。

 

NO.1 摄像头方面的知识

 

ov9650摄像头,暂时先不说,先了解一下camera解码器、控制器,不同的主控芯片的camera控制器都差不多

 

static  struct  ov9650_reg
 
{
 
unsigned char  subaddr;
 
unsigned char  value;
 
}regs[] = {
 
/* OV9650 intialization parameter table for VGA application */
 
{0x12, 0x40}, // Camera Soft reset. Self cleared after reset.
 
{CHIP_DELAY, 10},
 
{0x11,0x81},{0x6a,0x3e},{0x3b,0x09},{0x13,0xe0},{0x01,0x80},{0x02,0x80},{0x00,0x00},{0x10,0x00},
 
{0x13,0xe5},{0x39,0x43},{0x38,0x12},{0x37,0x91},{0x35,0x91},{0x0e,0xa0},{0x1e,0x04},{0xA8,0x80},
 
{0x14,0x40},{0x04,0x00},{0x0c,0x04},{0x0d,0x80},{0x18,0xc6},{0x17,0x26},{0x32,0xad},{0x03,0x00},
 
{0x1a,0x3d},{0x19,0x01},{0x3f,0xa6},{0x14,0x2e},{0x15,0x10},{0x41,0x02},{0x42,0x08},{0x1b,0x00},
 
{0x16,0x06},{0x33,0xe2},{0x34,0xbf},{0x96,0x04},{0x3a,0x00},{0x8e,0x00},{0x3c,0x77},{0x8B,0x06},
 
{0x94,0x88},{0x95,0x88},{0x40,0xc1},{0x29,0x3f},{0x0f,0x42},{0x3d,0x92},{0x69,0x40},{0x5C,0xb9},
 
{0x5D,0x96},{0x5E,0x10},{0x59,0xc0},{0x5A,0xaf},{0x5B,0x55},{0x43,0xf0},{0x44,0x10},{0x45,0x68},
 
{0x46,0x96},{0x47,0x60},{0x48,0x80},{0x5F,0xe0},{0x60,0x8c},{0x61,0x20},{0xa5,0xd9},{0xa4,0x74},
 
{0x8d,0x02},{0x13,0xe7},{0x4f,0x3a},{0x50,0x3d},{0x51,0x03},{0x52,0x12},{0x53,0x26},{0x54,0x38},
 
{0x55,0x40},{0x56,0x40},{0x57,0x40},{0x58,0x0d},{0x8C,0x23},{0x3E,0x02},{0xa9,0xb8},{0xaa,0x92},
 
{0xab,0x0a},{0x8f,0xdf},{0x90,0x00},{0x91,0x00},{0x9f,0x00},{0xa0,0x00},{0x3A,0x01},{0x24,0x70},
 
{0x25,0x64},{0x26,0xc3},{0x2a,0x00},{0x2b,0x00},{0x6c,0x40},{0x6d,0x30},{0x6e,0x4b},{0x6f,0x60},
 
{0x70,0x70},{0x71,0x70},{0x72,0x70},{0x73,0x70},{0x74,0x60},{0x75,0x60},{0x76,0x50},{0x77,0x48},
 
{0x78,0x3a},{0x79,0x2e},{0x7a,0x28},{0x7b,0x22},{0x7c,0x04},{0x7d,0x07},{0x7e,0x10},{0x7f,0x28},
 
{0x80,0x36},{0x81,0x44},{0x82,0x52},{0x83,0x60},{0x84,0x6c},{0x85,0x78},{0x86,0x8c},{0x87,0x9e},
 
{0x88,0xbb},{0x89,0xd2},{0x8a,0xe6},
 
};

  

 

上面是需要顺序写ov9650的寄存器的地址和写入的数值(采用I2C子系统传输)

I2C子系统传输已经分析过,平台设备的资源可以在板文件中初始化:

 

1.修改vi drivers/i2c/busses/Kconfig

 

修改

config I2C_S3C2410

tristate "S3C2410 I2C Driver"

depends on ARCH_S3C2410 || ARCH_S3C64XX

help

  Say Y here to include support for I2C controller in the

  Samsung S3C2410 based System-on-Chip devices.

 

为:

config I2C_S3C2410

tristate "S3C2410 I2C Driver"

depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5PC100

help

  Say Y here to include support for I2C controller in the

  Samsung S3C2410 based System-on-Chip devices.

2.内核配置并重新编译内核

$ make menuconfig

Device Drivers  --->

<*> I2C support  --->

<*>   I2C device interface

I2C Hardware Bus support  --->

<*> S3C2410 I2C Driver

3.修改vi arch/arm/mach-s5pc100/mach-smdkc100.c

 

查看原理图可以知道摄像头是接在I2C-0或1上,假设在1上,根据原理图修改i2c_devs1添加ov9650的内容,主要是ov9650的地址,这个在芯片手册上可以查到是0x60

而下面为什么是0x30呢?在我的另外一篇I2C子系统分析里面讲过。给个链接解释

修改:

static struct i2c_board_info i2c_devs1[] __initdata = {

};

 

为:

static struct i2c_board_info i2c_devs1[] __initdata = {

{

I2C_BOARD_INFO("ov9650", 0x30),

},

};

 

添加s5pc100 摄像头控制器平台设备相关内容,这些内容我们可以通过查看S5PC100的芯片手册查到

static struct resource s3c_camif_resource[] = {

[0] = {

.start = 0xEE200000,

.end   = 0xEE200000 + SZ_1M - 1,

.flags = IORESOURCE_MEM,

},

[1] = {

.start = IRQ_FIMC0,

.end   = IRQ_FIMC0,

.flags = IORESOURCE_IRQ,

}

 

};

 

static u64 s3c_device_camif_dmamask = 0xffffffffUL;

 

struct platform_device s3c_device_camif = {

.name  = "s5pc100-camif",

.id  = 0,

.num_resources  = ARRAY_SIZE(s3c_camif_resource),

.resource  = s3c_camif_resource,

.dev              = {

.dma_mask = &s3c_device_camif_dmamask,

.coherent_dma_mask = 0xffffffffUL

}

};

 

EXPORT_SYMBOL(s3c_device_camif);

 

注册摄像头控制平台设备:

smdkc100_devices中添加s3c_device_camif

 

static struct platform_device *smdkc100_devices[] __initdata = {

&s3c_device_camif,  //添加内容

};

 

4. 添加驱动(video

Make menuconfig

Device Drivers  --->  

 <*> Multimedia support  --->

 <*>   Video For Linux 

[*]     Enable Video For Linux API 1 (DEPRECATED) (NEW)

[*]   Video capture adapters (NEW)  --->

[*]   V4L USB devices (NEW)  ---> 

<*>   USB Video Class (UVC) 

[*]     UVC input events device support (NEW)

 <*>   USB ZC0301[P] webcam support (DEPRECATED)

 

这样device已经注册好了!

 

/* write a register */

static int ov9650_reg_write(struct i2c_client *client, u8 reg, u8 val)

{

int ret;

u8 _val;

unsigned char data[2] = { reg, val };

struct i2c_msg msg = {

.addr= client->addr,

.flags= 0,

.len= 2,

.buf= data,

};

//构建i2c_msg 

ret = i2c_transfer(client->adapter, &msg, 1);  //I2C适配器和I2C设备之间的一组消息的交换

return 0;

}

 

 

 

static void ov9650_init_regs(void)

{

int i;

for (i=0; i<ARRAY_SIZE(regs); i++)

 

{

if (regs[i].subaddr == 0xff) 

{

mdelay(regs[i].value);

continue;

}

ov9650_reg_write(ov9650_client, regs[i].subaddr, regs[i].value);

}

}

 至此,通过I2C总线已经将摄像头的寄存器初始化好了。

下一部分将讲解Camera解码器、控制器。



from: http://www.cnblogs.com/liugf05/archive/2012/12/11/2812997.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ov9650摄像头驱动之——linux内核v4l2架构分析1 的相关文章

  • EDA笔记(1)--VHDL语言

    目的 摘录点自己容易忘的知识点 也可以供读者参考学习 EDA技术的概念 工作平台 计算机 开发环境 EDA软件 设计语言 硬件描述语言 HDL 试验载体 可编程逻辑器件 PLD 目标器件 ASIC芯片 应用方向 电子系统设计 EDA应用领域
  • LVM磁盘挂载&扩容

    磁盘不够了怎么使用逻辑卷的方式扩充磁盘呢 因为之前踩过坑 用混了fdisk和mount挂载 这次梳理下LVM挂盘和扩容方式 下载lvm2 预先下载程序包 若已下载则忽略 yum y install lvm2 离线下载可上腾讯软件源把rpm包
  • mysql数据库

    索引相当于字典的目录 用于查找数据 一般用B Tree索引 用该种数据结构来存储索引 InnoDB mysql的存储引擎 支持事务安全的引擎 支持外键 行锁 事务是他的最大特点 如果有大量的update和insert 转载于 https w
  • 玩转ChatGPT:Code interpreter (vol. 1)

    一 写在前面 喜大普奔 GPT 4传说中的Code interpreter插件已经可以用了 二 什么是Code interpreter 代码解释器 Code Interpreter 是一个工具 它能够读取和执行编程代码 这里有几个主要的功能
  • 如何将项目部署到服务器:从选择服务器到维护应用程序的全流程指南

    将项目部署到服务器是一个重要的技能 对于开发人员来说 它是必不可少的 在本文中 我将介绍一些关于如何将项目部署到服务器的最佳实践 一 选择服务器 在部署项目之前 你需要先选择一个适合你的服务器 如果你已经有一个可用的服务器 你可以直接使用它
  • 对象服务器文件服务器,传送对象到服务器

    h 文件中 h文件 png 代码如下 import interface LBNetWorkManager NSObject LBNetWorkManager netManager void Post NSString urlStr obj
  • nmap 操作系统探测

    1 操作系统探测原理 nmap 最著名的功能之一是用 TCP IP 协议栈 fingerprinting 进行远程操作系统探测 Nmap 发送一系列 TCP 和 UDP 报文到远程主机 检查响应中的每一个比特 在进行一打测试如 TCP IS
  • 【java】数组反转 已知一个数组 arr = {19, 28, 37, 46, 50}; 用程序实现把数组中的元素值交换,交换后的数组 arr = {50, 46, 37, 28

    public class Test05 public static void main String args 定义一个数组 用静态初始化完成数组元素的初始化 int arr 19 28 37 46 50 循环遍历数组 这一次初始化语句定义

随机推荐

  • 正则表达式校验邮箱

    正则表达式是一种用于匹配字符串的模式的工具 它可以用于验证邮箱地址的有效性 要用正则表达式校验邮箱地址 需要使用以下正则表达式 a zA Z0 9 a zA Z0 9 a zA Z0 9 0 61 a zA Z0 9 a zA Z0 9 a
  • ESP32的开发环境SDK4.3.1版本和编译环境搭建

    首先 到乐鑫的官网下载一个最完整的安装包 地址为 https dl espressif com dl esp idf idf 4 3 在这分为两种 在线安装和离线安装 在线安装与离线安装的区别 在线安装程序非常小 可以安装 ESP IDF
  • Mysql建表出现错误:ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that correspo

    Mysql命令行sql语句建表报错 这里是你的SQL语法有错误 查看与MySQL服务器版本对应的手册 以确定使用 我的问题是sql语句里反引号用成了单引号 我这里用的是英文中的单引号 所以会有语法报错 正确的应该是键盘ESC键下的反引号 此
  • Python, Numpy求 list 数组均值,方差,标准差

    代码如下 import numpy as np array 1 3 5 7 9 求均值 arr mean np mean array 求方差 arr var np var array 求标准差 arr std np std array dd
  • 第二十八篇 SeNet模型解析

    文章目录 一 SENet概述 二 SENet 结构组成详解 三 详细的计算过程 SE模块代码详解 SENet 在具体网络中应用 代码实现SE ResNet 第一个残差模块 第二个残差模块 SEResNet18 SEResNet34模型的完整
  • 毕业设计 基于stm32的智能快递仓库环境监控系统 - 物联网 嵌入式

    本次设计的快递仓库的火灾报警系统通过主控单元将各个传感器的参数值采集回来 包括与消防安全相关的温度 湿度 烟雾等 主控制器 数据采集回来之后通过无线的方式将数据上传到远端的上位机上 由于这些参数都是有一个安全阈值的 当达到这个阈值的时候很可
  • ubuntu 17.10, cuda 9.1, cuDNN 7.0 安装caffe时runtest报错

    如果在runtest caffe时报如下错误 则 可将Makefile中 Debugging ifeq DEBUG 1 COMMON FLAGS DDEBUG g O0 NVCCFLAGS G else COMMON FLAGS DNDEB
  • 最全的cursor问题解答 The most complete Cursor question answer 2023.6.27

    2023 6 27 目前最新版本是Cursor Setup 0 2 35 x64 官网是https www cursor so 作者是https twitter com amanrsanger 使用操作 Ctrl k Edit Instru
  • 终于满足了我司QA的接口自动化测试统计报表要求

    以前我司接口测试用的工具比较多 有postman jmeter等 不同部门用的工具还不一样 即使同一部门开发自测用的接口测试工具和测试用的可能都不一样 项目到提测阶段 QA都会要求我们测试人员统计 项目有多少接口 是否每个接口都有被接口自动
  • 人生感悟之——因果关系

    2020年了 31岁 算是步入中年 偶有感悟 记录在案 待来年回头印证 近年来的感悟是 做事踏踏实实 实事求是很重要 有一是一 适当夸大我自己的能力是可以 但是夸的太大 未来的某一天我会付出代价 至少夸大的部分我需要花费足够的时间的努力来补
  • Protobuf如何集成到C++环境中(VS2019)

    文章目录 前言 下载安装Protocol Compiler和Protobuf Runtime 下载 编译安装Protobuf Runtime 使用Protocol Compiler生成 cc和 h文件 VS工程的配置 测试 前言 Proto
  • Spark集群搭建超详细教程

    Spark3 0 0集群搭建 前言 集群搭建具体步骤 Standalone模式 1 下载 spark 3 0 0 的jar包 2 上传并解压 3 配置SPARK HOME环境变量 4 修改配置 4 1 修改 spark defaults c
  • 课题:交通标志识别——设计思路与实现步骤记录

    一 准备数据集 选取两个典型的交通标志数据集 德国交通标志数据集GTSRB 与比利时交通标志数据集 选取两个数据集原因 1 便于后续对测试结果的对比 以及准确率差别的分析 2 二者图片格式相似 同样的程序二者兼容 无需重新编写代码 3 二者
  • 第10节 文件共享服务器—创建/访问共享文件及禁用共享服务

    这里写目录标题 0 引言 1 共享服务器概述 2 创建共享实验 2 1 创建共享文件夹并访问 2 2 创建隐藏共享文件夹并访问 3 权限控制逻辑 3 1 父子级文件共享权限的继承 3 2 远程权限与NTFS权限的控制关系 4 常用的与共享相
  • Vue+MySQL实现登录注册案例

    Vue MySQL实现登录注册案例 1 新建vue项目并连接数据库 具体步骤见vue连接mysql数据库 2 新建登录页面 注册页面和首页 在src views文件夹下 新建 login vue 登录页面 register vue 注册页面
  • 淘宝商品列表数据接口(支持价格、销量排序)

    淘宝商品列表数据接口是淘宝提供的一种可以获取淘宝商品信息的接口 通过该接口 可以获取到具有一定规则的商品信息 例如按照价格排序 按照销量排序等 接口返回的数据格式为JSON格式 可以方便地处理数据 我们可以通过调用淘宝提供的API 使用GE
  • Python计算机视觉编程 第一章 基本的图像操作和处理

    第一章 基本的图像操作和处理 1 1 PIL Python图像处理类库 1 1 1转换图像格式 1 1 2创建缩略图 1 1 3复制和粘贴图像区域 1 1 4调整尺寸和旋转 1 2Matplotlib 1 2 1绘制图像 点和线 1 2 2
  • 剑指 Offer 68 - II. 二叉树的最近公共祖先 -- 递归

    0 题目描述 leetcode原题链接 剑指 Offer 68 II 二叉树的最近公共祖先 1 递归解法 代码思路 递归查询两个节点p q 如果某个节点等于节点p或节点q 则返回该节点的值给父节点 如果当前节点的左右子树分别包括p和q节点
  • python--hashlib加密模块

    Python的hashlib提供了常见的摘要算法 如MD5 SHA1等等 什么是摘要算法呢 摘要算法又称哈希算法 散列算法 它通过一个函数 把任意长度的数据转换为一个长度固定的数据串 通常用16进制的字符串表示 摘要算法就是通过摘要函数f
  • ov9650摄像头驱动之——linux内核v4l2架构分析1

    本系列准备分为3 4篇来讲 因为说的太多会比较乱 v4l2视频驱动主要涉及几个知识点 摄像头方面的知识 摄像头厂家提供的芯片手册可以查看 要了解选用的摄像头的特性 包括访问控制方法 各种参数的配置方法 信号输出类型等 Camera解码器 控