在 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 中所述相同的问题。
此致
記事全体を表示