mt9d131 驱动简介
来源:互联网 发布:xbox360淘宝 编辑:程序博客网 时间:2024/05/18 23:12
很多芯片的驱动比较简单, 就是直接给某个寄存器赋某个值, 就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内存
略
- mt9d131 驱动简介
- 驱动简介
- 驱动简介
- Linux 内核驱动简介
- 测试驱动开发简介
- 测试驱动开发简介
- 1设备驱动简介
- linux音频驱动简介
- Windows CE 驱动简介
- platform设备驱动简介
- platform设备驱动简介
- WINCE 触摸屏驱动简介
- platform设备驱动简介
- platform设备驱动简介
- Linux驱动模型简介
- platform设备驱动简介
- platform驱动简介
- linux驱动之简介
- 11198 - Dancing Digits
- hql查询方式 和 criteria 查询
- js中innerHTML用法
- CarParts3
- char,nchar,varchar,nvarchar之间的区别
- mt9d131 驱动简介
- Ubuntu上安装启动SSH Server
- 11.MAP查询每年的世界杯冠军
- 详细介绍ORACLE sqlplus命令
- 一天一个设计模式(2): 外观模式
- Xen 环境配置
- rsync+inotify 配置实时同步服务器
- windows取得串口列表
- Java 线程池的原理与实现