2149244_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2149244_zh-CN

2149244_zh-CN

在 VIV_VIDEO_EVENT_SET_CROP 或其他 mmap 操作中出现 isp_media_server 段故障

我目前正在使用恩智浦 IMX8MPLUS,并尝试为 MT9V024 摄像头传感器启用 ISP。

我目前的设置如下:

带有 IMAGE_INSTALL:append =" kernel-module-isp-vvcam gstreamer1.0 gstreamer1.0-plugins-base 的 Yocto 核心镜像gstreamer1.0-plugins-goodgstreamer1.0-plugins-badv4l-utils isp-imx libtinyxml2 media-ctl fmt".

Linux 5.15.71 Kirkstone
是一个无头版本

在外部,我版本:

- isp-imx-4.2.2.20.0
- isp-vvcam (lf-5.15.y_2.2.0)
然后我将生成的文件发送到板。

我目前的瓶颈是,当我运行

gst-用上市,不用发布-1.0-v v4l2src 设备=/dev/video0!"video/x-raw,format=YUY2,width=752,height=480" !队伍视频转换 !theoraenc!oggmux !filesink location=test_image.ogv

isp_media_server 在 VIV_VIDEO_EVENT_SET_CROP 情况下崩溃。更具体地说,它在这里崩溃了:

---(源 isp-imx-4.2.2.20.0/mediacontrol/daemon/V4l2Event.cpp)--

case VIV_VIDEO_EVENT_SET_CROP: {
ALOGI("VIV_VIDEO_EVENT_SET_CROP"); // 我添加这个是为了调试。

如果 (bufMap.find(event.addr)== bufMap.end()){
bufMap[event.addr]= ::mmap(NULL, VIV_JSON_BUFFER_SIZE,
PROT_READ | PROT_WRITE, MAP_SHARED, eventDevice, event.addr);
}
struct viv_rect *rect = (struct viv_rect *)bufMap[event.addr];// gdb 指向这一行。

// 这里的失败很奇怪,因为 v4l2-ctl --all -d /dev/video0 运行良好(查看日志)。

-----


---
当我执行任何其他操作,如 v4l2-ctl -d 0 -c viv_ext_ctrl='{:;:false}' 时,它也会崩溃。

为了测试,我对代码进行了大量修改:

case VIV_VIDEO_EVENT_EXTCTRL:{
ALOGI("VIV_VIDEO_EVENT_EXTCTRL: Event received.");
ALOGI("VIV_VIDEO_EVENT_EXTCTRL: event.addr = 0x%llx", (long long)event.addr);
ALOGI("VIV_VIDEO_EVENT_EXTCTRL: eventDevice =%d", eventDevice);
ALOGI("VIV_VIDEO_EVENT_EXTCTRL:VIV_JSON_BUFFER_SIZE =%zu", (size_t)VIV_JSON_BUFFER_SIZE);

{

struct stat st; i
f (fstat (eventDevice, & st) == -1) {
perror (" fstat 失败 ");
} else {p
rintf (" EventDevice 大小:%ld 字节\n ",(长度)st.st_size);
printf("Trying to mmap at offset:%lld\n", (long long)event.addr);
}
}
{

struct v4l2_requestbuffers req = {0};
req.count = 1;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;

如果 (ioctl(eventDevice, VIDIOC_REQBUFS,&req) == -1) {
ALOGE("VIDIOC_REQBUFS failed:%s", strerror(errno));
} else {
ALOGI("Requested%u buffers, got%u", req.count, req.count);
}

struct v4l2_buffer buf = {0};
buf.index = 0;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;

if (ioctl(eventDevice, VIDIOC_QUERYBUF,&buf) == 0) { // if request buffer succeded
ALOGI("Buffer offset from VIDIOC_QUERYBUF: 0x%x", buf.m.offset);
}


if (event.addr% getpagesize() != 0) {
ALOGE("event.addr is not page-aligned:0x%llx", (long long)event.addr);
break;
}
if (fcntl(eventDevice, F_GETFD) == -1){
ALOGI("Invalid File descriptor");

}

void *test_map = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, eventDevice, 0);
if (test_map == MAP_FAILED) {
ALOGE("Test mmap failed with fd=%d, errno=%d (%s)", eventDevice, errno, strerror(errno));
} else {
ALOGI("Test mmap succeeded.地址:%p", test_map);
munmap(test_map, 4096);
}

long page_size = getpagesize ();
off_t small_offset = page_size;//尝试偏移量 4096 size_t small_size = page_size;//4096 字节

void* second_test_map = mmap(NULL, small_size, PROT_READ | PROT_WRITE, MAP_SHARED, eventDevice, small_offset);
if (second_test_map == MAP_FAILED) {
ALOGE("第二次测试 mmap 失败:fd=%d, offset=0x%llx, errno=%d (%s)",
eventDevice, (long long)small_offset, errno, strerror(errno));
} else {
ALOGI("Second test mmap succeeded.地址:%p (offset=0x%llx)",
second_test_map, (long long)small_offset);
munmap(second_test_map, small_size);
}

}

void *mapped_json_buffer = NULL; // 为毫米映射结果使用临时指针

ALOGI("Calling mmap(NULL,%u, PROT_READ|PROT_WRITE, MAP_SHARED,%d, 0x%llx)",
VIV_JSON_BUFFER_SIZE, eventDevice, (long long)event.addr);

// 检查地址是否已经映射到 bufMap
auto it = bufMap.find(event.addr);
if (it == bufMap.end()){
ALOGI("VIV_VIDEO_EVENT_EXTCTRL:在 bufMap 中找不到 event.addr。Attempting mmap...");
// Not found, attempt to mmap
mapped_json_buffer = ::mmap(NULL, VIV_JSON_BUFFER_SIZE,
PROT_READ | PROT_WRITE, MAP_SHARED, eventDevice, event.addr);

if (mapped_json_buffer == MAP_FAILED) {
// CRITICAL ERROR: mmap failed
ALOGE("VIV_VIDEO_EVENT_EXTCTRL:FAILED to mmap memory for event.addr=0x%llx、fd=%d,size=%zu。errno=%d (%s)",
(long long)event.addr、eventDevice, (size_t)VIV_JSON_BUFFER_SIZE, errno, strerror(errno));
}
// mmap 成功,存储在 bufMap
ALOGI("VIV_VIDEO_EVENT_EXTCTRL: mmap 成功。映射地址:0x%p", mapped_json_buffer);
bufMap[event.addr].= mapped_json_buffer;
} else {
// 已经映射,从 bufMap 获取
ALOGI("VIV_VIDEO_EVENT_EXTCTRL: event.addr found in bufMap." );
mapped_json_buffer = it->second;
}

ALOGI("VIV_VIDEO_EVENT_EXTCTRL: Mapped buffer pointer: 0x%p", mapped_json_buffer);

// 在使用指针之前再次检查指针是否有效
if (mapped_json_buffer == MAP_FAILED || mapped_json_buffer == NULL) {
ALOGE("VIV_VIDEO_EVENT_EXTCTRL:在 mmap/lookup 之后,映射缓冲区无效 (0x%p)。跳过 JSON 解析。" 、mapped_json_buffer);
}

Json:: Reader reader;
//现在,安全地使用 mapped_json_buffer
STD::string str = (char *)mapped_json_buffer; //此行崩溃

---
第二张测试图失败,这让我觉得是在试图映射一个空白空间。


--------
这是我的启动序列

cd c
d build-out/sdk 导出 ld_library_path=$pwd:$LD_LIBRARY_PATH
导出 GST_DEBUG=4 systemctl 停止 imx8-isp.service


export ISP_LOG_LEVEL=8

rmmod vvcam-video
rmmod vvcam-dwe
rmmod vvcam-isp
rmmod imx8-media-dev.ko
insmod mt9v024.ko
insmod vvcam-isp.ko
insmod vvcam-dwe.ko
insmod vvcam-video.ko # 这将把先前的驱动程序设置为媒体
insmod imx8-media-dev.ko
./isp_media_server摄像机 0&

然后使用之前提到的命令(gts 或 v4l2)
---
我几乎没有修改 OS08a20_8M_10_1080p_hdr.xml 和 sensor_dwe_os08a20_1080P_config.json,因此我得到了我的自定义文件,但我认为这应该足以获得图像,即使质量不好,我将分辨率改为 720x480p,
文件概览:

root @imx8mp:~/版本-out/sdk# ls
MT9V024_8M_10_480p_linear.xml libadpcc.so libcam_device.so libhal.so libsom_ctrl.so
OS08a20_8M_10_1080p_hdr.xml libadpf.so libcam_engine.so libi2c_drv.so libversion.so
OS08a20_8M_10_1080p_linear.xml libaec.so libcameric_drv.so libibd.so libvom_ctrl.so
OS08a20_8M_10_4k_hdr.xml libaee.so libcameric_reg_drv.so libisi.so libvvdisplay_shared.so
OS08a20_8M_10_4k_linear.xml libaf.so libcim_ctrl.so libjsoncpp.so mt9v024.drv
Sensor0_Entry.cfg libaflt.so libcommon.so libjsoncpp.so.1.9.0 mt9v024.ko
Sensor0_Entry_mt9v024.cfg libahdr.so libcppnetlib-client-connections.so libjsoncpp.so.21 os08a20.drv
Sensor0_Entry_os08a20.cfg libappshell_ebase.so libcppnetlib-client-connections.so.0 libmedia_server.so os08a20.ko
Sensor1_Entry.cfg libappshell_hal.so libcppnetlib-client-connections.so.0.13.0 libmim_ctrl.so ov2775.ko
Sensor1_Entry_mt9v024.cfg libappshell_ibd.so libcppnetlib-server-parsers.so libmipi_drv.so run.sh
Sensor1_Entry_os08a20.cfg libappshell_oslayer.so libcppnetlib-server-parsers.so.0 libmom_ctrl.so start_isp.sh
VSI_Monitor.cfg libavs.so libcppnetlib-server-parsers.so.0.13.0 libmt9v024.so test_image.ogv
basler-camera-driver-vvcam.ko libawb.so libcppnetlib-uri.so libmt9v024.so.1 video_test
dewarp_config libawdr3.so libcppnetlib-uri.so.0 libmt9v024.so.1.0.0 vvcam-dwe.ko
imx8-media-dev.ko libbase64.so libcppnetlib-uri.so.0.13.0 libos08a20.so vvcam-isp.ko
isp_media_server libbufferpool.so libdewarp_hal.so libos08a20.so.1 vvcam-video.ko
liba2dnr.so libbufsync_ctrl.so libebase.so libos08a20.so.1.0.0 vvext
liba3dnr.so libcam_calibdb.so libfpga.so liboslayer.so
\root@imx8mp:~/版本-out/sdk# ls dewarp_config/
sensor_dwe_bypass_480P_config.json sensor_dwe_os08a20_1080P_config.json sensor_dwe_os08a20_4K_config.json
root @imx8mp:~/版本-out/sdk# cat dewarp_config/sensor_dwe_bypass_480p_config.json
{
" dewarpConfigArray":[
{
" source_image":{
" width": 752,
" height": 480
}、

"dewarpType" :"LENS_CORRECTION, FISHEYE_EXPAND, SPLIT_SCREEN",
" dewarpType" :"fisheye_dewarp" 、

"标度" :{
" roix": 0,
" roiy": 0,
" factor": 1.0
}、

"split" :{
" horizon_line": 240,
" vertical_line_up": 367,
" vertical_line_down" :367
}、

"bypass": true,
" hflip": false,
" vflip": false、

"camera_matrix": [ 3.9177894938743270e+003, 0., 1.9716642989691159e+003, 0.,3.9177894938743270e+003、1.1024451486734267e+003, 0., 0., 1. ],
" distortion_coeff": [ -1.3019040624278982e-001, 2.2621318183135611e-001,1.2109476203374344e-003, 9.4317229120640680e-004,-7.1053958306120402e-001 ],
" perspective": [1.0, 0, 0, 0, 1, 0, 0, 1].

}
]

}
root@imx8mp:~/版本-out/sdk# cat Sensor0_Entry.cfg
name="mt9v024"
drv = "mt9v024.drv"
模式= 0

[mode.0]
xml ="MT9V024_8M_10_480p_linear.xml"
dwe = " dewarp_config/Sensor_dwe_bypass_480p_config.json " root @imx8mp:~/版本-out/sdk#

---
这就是我的媒体的样子(我记得我试过另一个 isp 项目,我也有 media1,但那是在 yocto scarthgap 中,所以我不知道这里是否应该一样):

root @imx8mpmk5:~/build-out/sdk# media-ctl-p-d /dev/media0 媒体控制器 API 版本 5.15.71

媒体设备信息

驱动程序 mxc-md
型号 FSL 捕获媒体设备
串行
总线信息
硬件修订版 0
x0 驱动程序版本 5.15.71

设备拓扑
-实体 1:mxc-mipi-csi2.0(8 个焊盘,1 个链接)
类型节点子类型 V4L 标志 0
设备节点名称 /dev/v4l-subdev2 pad0:Sink
<-" mt9v024 2-0048 ": 0 [启用,不可变] pad1:Sink pad3:Sink p
ad4:来源 pad5:来源 pad6:来源 pad7:来源 pad7:来源 pad7:来源 pad7:来源 pad7:来源 pad7






-实体 10:mt9v024 2-0048(1 个焊盘,1 个链接)
类型 V4L2 子开发子类型传感器标志 0
设备节点名称 /dev/v4l-subdev3 pad0:来源 [fmt: unknown/0x0]-> " mxc-mipi-cs
i2.0 ": 0 [启用,不可变]

root @imx8mpm:~/build-out/sdk# media-ctl-p-d /dev/media1 无法枚举 /dev/media1 (-2)

----

我希望有人能提示我如何进一步调试这个问题,或者指出哪个元器件正在生成这个问题。

Re: isp_media_server segmentation fault at VIV_VIDEO_EVENT_SET_CROP or other mmap operations嘿,我认为 isp-imx-4.2.2.20.0 没有上述迁移问题。

我使用以下方法修复了它:
./build-all-isp.sh 版本部分 V4L2 而不

/build-all-isp.sh 版本部分

我正在阅读 yocto scarthgap 的手册,默认模式是 V4L2,所以我是在原生模式而不是 V4L2 下构建,因为在 isp-imx-4.2.2.20.0 中,默认模式是 " 原生传感器 "。
Re: isp_media_server segmentation fault at VIV_VIDEO_EVENT_SET_CROP or other mmap operations

Hello

https://docs.nxp.com/bundle/AN13712/page/topics/start_isp_media_server.html

提取的 isp-imx保留在你的资源库中,用于定制驱动程序的开发。然而,使用差异工具时,并没有发现.so的差异文件从isp-imx-4.2.2.6.0迁移到 isp-imx-4.2.2.11.0 的过程中。因此,他们保持与isp-imx-4.2.2.6.0相同,并面临与IMX8M-Plus 相机集成和使用 ISP 中所述相同的问题。


此致


Tags (1)
No ratings
Version history
Last update:
‎11-21-2025 01:01 AM
Updated by: