关键代码
ISP:
/amp/a7_liteos/mpp/component/isp/user/sensor/hi3559v200/yx2m4u/yx2m4u_cmos.c
/amp/a7_liteos/mpp/component/isp/user/sensor/hi3559v200/yx2m4u/yx2m4u_sensor_ctl.c
yx2m4u_init()
make menuconfig 对应的全局配置文件:SDK_V1.0.1.2/.config
里面配置了主芯片(CONFIG_HI3556V200)、
Flash Configure(CONFIG_SPINOR=y) 配置flash内存类型、
Sensor Configure(CONFIG_SNS0_YX2M4U=y) 配置VI输入sensor、
Build Configure(CONFIG_ROOTFS_JFFS2=y;CONFIG_APPFS_JFFS2=y)、
User Configuration(CONFIG_CVBS_OUT=y)、视频VO输出类型
1.配置文件
yx2m4u/config.ini sensor输入配置:
(reference/samplecam/modules/scene/inicfg/hi3559v200/yx2m4u/config.ini)
配置亮度,对比度,分辨率resolution,帧率framerate,色温,翻转等参数。
开关:图像增强,十字光标,BT1120输出开关等。
[Config]
luma = 50 ; 亮度[0,100]
contrast = 50 ; 对比度[0,100]
resolution = 1 ; 分辨率, 0:1080P 1:720P
framerate = 1 ; 帧率, 0:50fps 1:30fps 2:25fps 3:20fps 4:15fps 5:60fps 6:50+25
colortemp = 0 ; 色温, 0:自动色温 其他:手动色温[1500,15000]
flip = 0 ; 翻转, 0:原图 1:镜像 2:倒置 3:镜像及倒置
gamma = 0
[Switch]
3dnr = 0 ; 图像增强功能(3D降噪开关), 0:关闭 1-3:3级调节,3级最高
daynight = 0 ; 彩色黑白转换开关,0:彩色 1:自动转换 2:手动黑白
bt1120 = 0 ; BT1120输出开关, 0:关 1:开
ioenable = 0 ; 是否由IO_R线控制BT1120输出, 0:由串口命令控制 1:由IO_R线控制
cross = 0 ; 十字光标开关, 0:关 1:开
abate = 0 ; 强光抑制开关, 0:关 1-3档依次增强
dehaze = 0 ; 去雾开关, 0:关 1-4档依次增强
ldc = 0 ; 畸变校正开关, 0:关 1-5档依次增强
lowdelay = 0 ; 低延时开关,0:关,1:开
selftest = 1 ; 自检开关,0:关,1:开
wdr = 0 ; 宽动态开关,0:关,1:开
Hi3559V200_MobileCam_SDK_V1.0.1.2/reference/samplecam/rootfs/Makefile
根据配置,二次设置输出帧率。
ifeq ($(CONFIG_SDI_OUT),y)
@sed -i 's/framerate *= *[0-9] *;/framerate = 2 ;/g;s/flip *= *[0-9] *;/flip = 0 ;/g' $(APPFS_PATH)/sharefs/config.ini
else ifeq ($(CONFIG_BT1120_OUT),y)
@sed -i 's/framerate *= *[0-9] *;/framerate = 1 ;/g;s/flip *= *[0-9] *;/flip = 0 ;/g' $(APPFS_PATH)/sharefs/config.ini
else ifeq ($(CONFIG_PAL_OUT),y)
@sed -i 's/framerate *= *[0-9] *;/framerate = 2 ;/g;s/flip *= *[0-9] *;/flip = 3 ;/g' $(APPFS_PATH)/sharefs/config.ini
else ifeq ($(CONFIG_CVBS_OUT),y)
@sed -i 's/framerate *= *[0-9] *;/framerate = 0 ;/g;s/flip *= *[0-9] *;/flip = 3 ;/g' $(APPFS_PATH)/sharefs/config.ini
endif
g_resolution = getinikeyint("Config", "resolution", "/app/sharefs/config.ini");
取得配置文件里面的配置数据
CONFIG_CVBS_OUT (SDK_V1.0.1.2/.config中)。
#if defined(CONFIG_CVBS_OUT) // 是否定义了CONFIG_CVBS_OUT
...
#endif
rootfs/Makefile(Hreference/samplecam/rootfs/Makefile)里面的 framerate, day, night,
是配置VO输出的分辨率:g_outframe, g_resolution
#if defined(CONFIG_SDI_OUT) || defined(CONFIG_BT1120_OUT)
CHECK_RET(InitMedia(wdr_enable, PARAM_DISPLAY_TYPE_BT1120, g_outframe, g_resolution));
配置中的选项备选项,如何添加?
sensor配置修改:[yx2m4u_sensor_ctl.c]
(MobileCam_SDK_V1.0.1.2/amp/a7_liteos/mpp/component/isp/user/sensor/hi3559v200/yx2m4u/yx2m4u_sensor_ctl.c)
2m4u_i2c_init() // 初始化i2c
yx2m4u_init() // 根据配置的帧率、分辨率、模式,给2m4u寄存器写入值。
(reference/samplecam/rootfs/appfs/sharefs/config.ini)
g_FarmeRate = getinikeyint("Config", "framerate", "/app/sharefs/config.ini");
make menuconfig:
对应的配置文件,保存在SDK_V1.0.1.2/.config中.
make menuconfig:配置输入输出芯片。主芯片Hi3556V200、ProductType...
Flash配置:spinor,spinand,emmc
配置输出 CVBS_OUT, 输入sensor:yx2m4u
2.vio:(reference/samplecam/app/vio/vio_main.c)
vio_main.c/ main();
2.0 InitGPIO();
HI_MAPI_Sys_Init();
HI_MSG_CLIENT_Init();
YX_UARTMSG_ServerInit();
2.1 GM7122 芯片初始化,set i2c device address,主模式推荐参数.
ret = ioctl(fd, I2C_SLAVE_FORCE, gm7122_i2c_addr >> 1);
2.2 获取配置文件中的[Config] wdr,framerate,resolution等字段。
g_resolution = getinikeyint("Config", "resolution", "/app/sharefs/config.ini"); // 0:1080p; 1:720p
2.3 根据读取的配置config,设置VI, VO的分辨率和帧率。
CHECK_RET(InitMedia(wdr_enable, PARAM_DISPLAY_TYPE_BT1120, g_outframe, g_resolution));
2.4 InitMedia(), DeinitMedia()
static HI_VOID DeinitMedia(HI_VOID)
{
HI_PDT_MEDIA_VideoOutStop();
HI_PDT_MEDIA_VideoOutDeinit();
HI_PDT_MEDIA_VideoDeinit();
HI_PDT_MEDIA_Deinit();
}
// 初始化VI,VO
static HI_S32 InitMedia(HI_S32 snsIdx, PARAM_DisplayType dispType, int frame, int resolution)
{
MEDIA_Cfg mediaCfg;
CHECK_RET(HI_PARAM_GetMediaCfg(snsIdx, dispType, &mediaCfg, frame, resolution));
CHECK_RET(HI_PDT_MEDIA_Init(&mediaCfg.viVpssMode, &mediaCfg.vbCfg));
CHECK_RET(HI_PDT_MEDIA_VideoInit(&mediaCfg.videoCfg));
CHECK_RET(HI_PDT_MEDIA_VideoOutInit(&mediaCfg.videoOutCfg));
CHECK_RET(HI_PDT_MEDIA_VideoOutStart(&mediaCfg.videoOutCfg));
extern HI_S32 PDT_INIT_OSD();
PDT_INIT_OSD();
YX_UARTMSG_ServerDefault();
Set_LOCAL_CAC(); // 去紫边
return HI_SUCCESS;
exit:
DeinitMedia();
return HI_FAILURE;
}
2.5 CONFIG_BT1120_OUT
int value = gpio_get_in_value(gpio_chip_num, gpio_offset); // 读取gpio中的值。
Contrl_Image_Color,设置彩色图像,黑白图像。
hi_gpio.c 设置gpio的值。
vio_params.c vio参数的封装。
3. app初始化相关代码(reference/samplecam/modules/init/amp/liteos/src/hi_product_init_main.c)
app_init(HI_VOID)
// 加入printf日志,能在LiteOS端,通过串口看到输出。
/reference/samplecam/modules/init/amp/liteos/src/hi_product_init_hi3559v200.c
load_mpp(void)
视频sensor采集,vi 传递给芯片。
芯片处理后,传输给VO。
4.通信部分
Linux与LiteOS 如何通信的?
reference/samplecam/app/vio/yx_uartmsg.c 封装设置指令,查询指令
YX_UARTMSG_RecvCbk 根据msgId,区分不同的msg。
/middleware/ndk/code/mediaserver/vcap/mapi_vcap.
HI_MAPI_VCAP_GetAttrEx()
HI_MAPI_VCAP_SetAttrEx() 的作用是?
hi_uartmsg_server.c
HI_MSG_CLIENT_Init
YX_UARTMSG_ServerInit 通信端初始化?
hi_appcomm_msg.c
MSG_Handler(), MSG_Response() 接收消息,返回msg结果。
设置BT656 显示配置,输出分辨率:720*576
static HI_VOID GenerateBT656DisplayCfg(MEDIA_DispCfg* dispCfg, SIZE_S* dispSize, int frame, int resolution)
{
dispCfg->dispAttr.stPubAttr.u32BgColor = 0xff;
dispCfg->dispAttr.stPubAttr.enIntfType = VO_INTF_BT656;
#if 1
dispCfg->dispAttr.stUserInfoAttr.u32DevFrameRate = 25;
dispCfg->dispAttr.stPubAttr.enIntfSync = VO_OUTPUT_PAL; // 25fps * 2
dispSize->u32Width = 720;
dispSize->u32Height = 576;
小需求改动:
sensor50Fps,BT1120 25Fps, black
yx2m4u_sensor_ctl.c~ yx2m4u_4lane_1080P_50_12bit_init(); // 设置sensor的输入帧率
/reference/samplecam/modules/scene/inicfg/hi3559v200/yx2m4u/config.ini
framerate,daynight设置输出帧率25fps,手动黑白。
修改双核通信使用HI_MSG_SendSync接口. 发送消息。
YX_UARTMSG_Get3DNR--> HI_MSG_SendSync
hi_uartmsg_server.h .c 定义的方法,在哪里调用?
hi_uartmsg_defines.h