海思平台-------------------------------------------------
本文档简述了如何在海思平台(以原版SDK为例)更换一块新屏幕和新sensor,并完成采集显示;
调试sensor--VI------------------------------------------
阅读手册可知imx214的设备地址为0x20;
1:首先判断主控与sensor IIC通讯是否成功,可以使用i2cdetect -l来查看启用了几路I2C,再对照原理图查看自己的sensor挂载在哪一路总线上;样例挂载在I2C0上,可以读一下设备ID以判断I2C通讯是否正常,Sony的sensor设备id一般存放在0x16和0x17这两个寄存器中--------i2c_read 0 0x34 0x0016 0x0017 2 1,读出正确说明I2C读取没问题
注:如果此处的iic一直通讯不成功可以按如下步骤排查问题
(1)检查sensor上电是否正常;
(2)使用万用表测量空闲时的SCL以及SDA,应都为高电平,因为空闲状态下,SCL和SDA均应为高电平以实现线与;如果不全是高电平,则可能线路断了,可以用万用表测一下线路是否正常;
(3) 如果第一步正常,则在读ID的时候使用示波器测量一下SCL以及SDA的波形,如果仍有波形但依旧读取失败,则对照原理图以及pcb看一下SCL和SDA有没有接错。
补充:在终端直接操作gpio
海思GPIO转化公式:例如GPIO_4_0==>4*8+0=32
cd /sys/class/gpio
echo 32 > export
cd gpio32
echo out > direction
echo 1 > value
cat value
若出现devices busy则cat /sys/kernel/debug/gpio
如果gpio口被占用,则要修改设备树;
2:IIC测试正常后就可以编写驱动程序了,这里需要用到的资料有:
《MIPI使用指南》《HIMPP开发参考》《sensor调试指南》《硬件原理图》;
使用的是sample里的vio例程,路径为:
HI3526_AR/smp/a7_linux/mpp->sample->vio这里选case 9
新增一款imx214
1:首先增加imx214驱动文件,路径为:
/HI3526_AR/smp/a7_linux/mpp/component/isp/user/sensor,
主要修改ctrl.c文件中的寄存器配置,此文件主要是底层控制,使用iic来向sensor的相应寄存器写入相应的数据,cmos.c主要定义上层以及回调函数;
注意:新增sensor后要重新生成新的驱动库,需要修改一下Makefile以及重新make一下生成新的驱动,Make的路径:
/HI3526_AR/smp/a7_linux/mpp/component/isp/user先make clean再make生成驱动;
至此,驱动添加成功。
2:接着修改sample中的vio例程,实质上调用的都是common的的程序,主要修改sample_comm_vi.c以及sample_comm_isp.c;
(1)sample_common.h中添加,以及加载相应的库
(2)首先获得sensor的类型,这里可以看到是从Makefile.param中获取到sensor type的;
Makefile.Param
(3)sample_comm_vi_getsize里添加一个case,sample_comm_sys_getpicsize也自己添加一下(如果有新的分辨率的话)
(4)
sample_comm_vi_startvi-->sample_comm_vi_startmipi-->sample_comm_vi_setmipiattr-->sample_comm_vi_getcomboattrbysns中新增一条case,这里是4lane,标号为0,1,2,3,如果只有2lane则为0,1,-1,-1
(5)sample_comm_vi_startvi-->sample_comm_vi_createvi-->sample_comm
_createsinglevi-->sample_comm_vi_satrtdev-->sample_comm_vi_getattrbysns中新增一个case
(6)sample_comm_vi_startvi中重点看一下sample_comm_createisp函数--->sample_comm_vi_startisp-->sample_comm_vi_getpipesttrbysns添加一个case,这里主要设置管道的属性
接着是sample_comm_isp_getispttrbysns同样添加一条case,主要是isp的一些公共属性
最后是注册一下回调函数
sample_comm_isp_sensor_register_callback-->sample_comm_isp_getsensob;
至此VI部分更改完成。
注意:
1:海思平台的sensor驱动是应用层驱动,目的是为了方便快速更换sensor;