以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
本文演示如何修改sensor的驱动源码,修改之后如何编译与运行。
一、sensor的注册接口分析
这部分内容见第4季4:图像sensor的驱动源码解析。
二、黑电平
关于黑电平的概念,见博客:技术科普丨黑电平:你真的懂“黑”吗?
简单点理解,就是LCD显示为黑色时所对应的电平。黑色对应的RGB数值是000,但这里的000并不是说在LCD上施加的电平为0时LCD显示为黑色。LCD要显示黑色的话,实际上需要施加一定的电压,这个电压我们就叫做“黑电平”。
三、sensor驱动编译实验
1、修改黑电平对应的数值
AR0130的黑电平设置函数是cmos_get_isp_black_level,位于mpp/component/isp/sensor/ar0130/ar0130_cmos.c文件中717行附近。
sensor_register_callback //位于ar0130_cmos.c文件文件
cmos_init_sensor_exp_function //位于ar0130_cmos.c文件文件
cmos_get_isp_black_level //位于ar0130_cmos.c文件文件
cmos_get_isp_black_level函数内容如下,可知给AR0130设置的黑电平数值是0xC8。这个数值是sensor工程师多次调试得到的最佳数值。我们可以修改这个数值,来看看修改之后的图像质量,这里修改为0x00。
HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel)
{
HI_S32 i;
if (HI_NULL == pstBlackLevel)
{
printf("null pointer when get isp black level value!\n");
return -1;
}
/* Don't need to update black level when iso change */
pstBlackLevel->bUpdate = HI_FALSE;
switch (genSensorMode)
{
default :
case WDR_MODE_NONE :
for (i=0; i<4; i++)
{
pstBlackLevel->au16BlackLevel[i] = 0xC8;
//pstBlackLevel->au16BlackLevel[i] = 0x00;//修改这个数值
}
break;
}
2、生成库形式的“应用层驱动”
这一步主要是编译(进行上述更改后的)sensor层驱动源码,以生成库形式的“应用层驱动”。
首先在mpp/component/isp下执行make(不用执行make clean,因为Makefile感知到源码的修改,会自动更新目标文件(这里的目标是库文件))。
然后可以通过修改时间来确认一下mpp/lib目录下的libsnsxxx.a/so已经被更新。
3、编译sample并运行查看效果
接着我们在mpp/sample_ortp_ar0130/venc目录下执行make clean再执行make(这里就需要先执行make clean,因为之前的操作,没有修改源码sample_venc.c,而只是修改了库文件,该目录下的Makefile不会感知到库文件的更新,从而不会更新sampl_venc。如果不make clean,执行make的时候将不进行任何操作),生成samp_venc这个可执行程序。
接着将sample_venc文件拷贝到虚拟机/home/xjh/iot/hisi_development/hisi_rootfs/目录中,然后将该目录挂载到板载系统的/mnt目录,在/mnt目录下执行“./sample_venc 0”,输入c。
接着在VLC播放器中,选择媒体,打开文件,选择sdp文件(提取码ms4a)(注意这文件里的设置要与实际对应)。此时可以看到实时画面,我们截图进行对比。
黑电平设置为0xC8时的画面:
黑电平设置为0x00时的画面: