织梦CMS - 轻松建站从此开始!

罗索实验室

mt9d131 驱动简介

落鹤生 发布于 2013-03-21 14:34 点击:次 
mt9d131 效果一般, 因为海思带它的驱动, 所以用的人还挺多, 呵呵.很多芯片的驱动比较简单, 就是直接给某个寄存器赋某个值, 就ok, 具体这个寄存器是什么意思, 值是什么意思, 看datasheet就可以了.
TAG:

mt9d131 效果一般, 因为海思带它的驱动, 所以用的人还挺多, 呵呵.

很多芯片的驱动比较简单, 就是直接给某个寄存器赋某个值, 就ok, 具体这个寄存器是什么意思, 值是什么意思, 看datasheet就可以了.

mt9d131 要略微复杂一点

因为 mt9d131 里面可以配置的东西很多,  所以 mt9d131 把可以设置的东西分成3类

1. 硬件寄存器

2. driver变量

3. MCU内存

 

1.硬件寄存器

硬件寄存器和普通芯片的寄存器没有区别, 只是因为mt9d131的寄存器比较多, 所以, 一共分成了3页, page0,page1,page2

page0包含sensor的一些核心功能

page1包含颜色管线的一些控制

page2包含jpeg和其他一些处理

因此, 给mt9d131的某个寄存器赋值之前,先要明确是赋值给那一page,这是通过写入 0xF0寄存器来实现的.

写入0,表示后续操作都是针对page0, 写入1表示后续操作都是针对page1, 写入2表示page2

明确哪一页之后,就可以正常读写需要的寄存器了

 

比如下面的代码用于读取芯片标识


gpio_i2c_write(I2C_MT9D131, 0xf0, 0x00);
gpio_i2c_write(I2C_MT9D131, 0xf1, 0x00);

上面2行,表示切换到 page0

这里需要注意的是, 如果操作的目标是16位的,

而我们如果一次读写8位,需要额外读写0xf1寄存器,来读写后8位.

 

下面2行表示,读取page0的,r0寄存器,

因为一个寄存器是16位的, 所以要每次读写0xf1,把数据读写完整
unsigned char regvalue = gpio_i2c_read(I2C_MT9D131, 0x00);
int loop1 = gpio_i2c_read(I2C_MT9D131, 0xf1);
if((regvalue != 0x15) || (loop1 != 0x19))
{
        printk("read Prodect ID Number MSB is %x\n",regvalue);
        printk("read Prodect ID Number LSB is %x\n",loop1);
        printk("check mt9d131 ID error.\n");
}

通过datasheet,我们知道r0只读,恒为0x1519

其他对于寄存器的读写与此类似.

 

2.driver变量

mt9d131里面很多功能通过driver方式实现, 每个driver有一个id

所有这些driver组成mt9d131的固件, 这个固件可以运行在6811兼容的处理器(带数学协处理器)上.

比如

driver id 1 对应序列控制相关

driver id 2 对应自动曝光

driver id 3 对应自动白平衡

等等

每个driver有很多变量, 通过给这些变量赋值,来控制对应driver的行为

这是通过 0xC6 和 0xC8寄存器来实现的.

0xC6 是由driver id 和 相应的变量偏移组成

0xC8 是给对应的变量赋的值.

根据Datasheet, 给0xC6的赋值,由四部分组成

8~12位 为 driver id

0~7位 为 这个driver里面对应的变量的偏移

13~14位 为 1 表示 逻辑操作

15 为 0 表示 16位操作, 为 1 表示8位操作

 

比如下面的代码, 用于把 上下文A 的输出宽高设为 800x600

gpio_i2c_write(I2C_MT9D131, 0xf0, 0x00);

gpio_i2c_write(I2C_MT9D131, 0xf1, 0x01);  

上面的代码切换到page1

 

根据datasheet,我们知道 对应的驱动为7, 变量偏移为3和5
gpio_i2c_write(I2C_MT9D131,0xC6, 0x27);

gpio_i2c_write(I2C_MT9D131,0xf1, 0x03);

gpio_i2c_write(I2C_MT9D131,0xC8, 0x03);

gpio_i2c_write(I2C_MT9D131,0xf1, 0x20);

上面的代码赋值 0x2703 给 0xC6

按规则分解开,可以知道

driver id = 7

变量地址 = 3

16位,逻辑操作

0x0320 也就是 800, 赋值给 0xC8

 

gpio_i2c_write(I2C_MT9D131,0xC6, 0x27);

gpio_i2c_write(I2C_MT9D131,0xf1, 0x05);

gpio_i2c_write(I2C_MT9D131,0xC8, 0x02);

gpio_i2c_write(I2C_MT9D131,0xf1, 0x58);

上面的代码赋值 0x2705 给 0xC6

按规则分解开,可以知道

driver id = 7

变量地址 = 5

16位,逻辑操作

0x0258 也就是 600, 赋值给 0xC8

当然,要完整地改变图像大小,还需要其他操作.

 

3. MCU内存

(xipiaoyouzi)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/201303/16553.html]
本文出处:CSDN博客 作者:xipiaoyouzi 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容