We use PCIe to connect Intersil TW6865 chip for the surround view solution.
This is the connection of PCIe to iMX6Q SabreSD board.
This is the block diagram of the connection:
This is the 4 camera surround view:
Code base is L3.0.35_12.10.02 release. You can merge the patch file to the latest Freescale release.
Please check the attach file for the patch code.
Note: It is only a test version.
The last code for L3.0.35 BSP: L3.0.35_GA4.1.0 Patches.7z
The last code for L3.10.53 BSP: L3.10.53_TW686x_patch.7z
Patch for L4.1.15 1.1.0 GA BSP: TW6865 driver for Linux L4.1.15_1.1.0-ga.7z
What's the CPU occupancy when run the application? Thanks.
Tested on my local side:
Test with Top command:
Mem: 109772K used, 787076K free, 0K shrd, 3520K buff, 24616K cached
CPU: 12.2% usr 15.3% sys 0.0% nic 63.7% idle 0.0% io 0.0% irq 8.6% sirq
Load average: 7.02 5.16 2.56 4/94 3535
Test with MMDC tool:
root@freescale ~$ ./mmdc_prof
MMDC new Profiling results:
***********************
Total cycles count: 528091007
Busy cycles count: 385370313
Read accesses count: 9834967
Write accesses count: 10137409
Read bytes count: 466175272
Write bytes count: 379222896
Read: 444.58 MB/s / Write: 361.66 MB/s Total: 806.23 MB/s
Utilization: 13%
Bus Load: 72%
Bytes Access: 42
Hi JiangJustin
I am doing the same thing as you did above.
But my tw6865 card can't be identified. Bellow is what i have done.
1 . I add the patch file to the kernel, version is L3.0.35_4.1.0_130816
2. Change the kernel configure within make menuconfig to enable tw6865.
3. Build the kernel and write it to my SD card. I am using i.mx6q sabreSDB board.
4. Attach the mini-pcie=>PCIe adaptor and attch TW6865 card to adaptor's pcie slot.
5. Boot the board, when system is up. use "lspci" to display the device. But there is nothing.
6. Check the kernel boot message with "dmesg", there are errors as bellow:
iMX6 PCIe PCIe RC mode imx_pcie_pltfm_probe entering.
PCIE: imx_pcie_pltfm_probe start link up.
link up failed, DB_R0:0x004abc43, DB_R1:0x08000000!
IMX PCIe port: link down!
It seems like that link up was failed.
could you give me some advices to slove this?
Thank you very much.
No, I have not seen your config file. Maybe it will need some time for community administer’ s examination to attachment.
Please make sure you config file about pcie aligned to the following:
#
# MX6 Options:
#
CONFIG_IMX_PCIE=y
# CONFIG_IMX_PCIE_EP_MODE_IN_EP_RC_SYS is not set
# CONFIG_IMX_PCIE_RC_MODE_IN_EP_RC_SYS is not set
I buied the mini-pcie->pciex1 switch card from www.taobao.com.
and confirm it works with an intel gigabit ethernet card .
ethernet card can be recongnized by the board.
By the way,where can i buy the tw6865 daughter board you said?
Thank you
Hi
Thank you, could you confirm the pcie clock's enable mentioned at bellow message in another discussion.
>Hongxing, thank you for your response.
>I use L3.0.35_4.1.0_130816_source.tar.gz downloaded from freescale's IMX6QSD platform resource website.
>Now, the problem has been solved. The PCIe clock output was not enabled in the code when IMX6 worked as RC.
PCIE link up failed when booting the kernel on IMX6QSD board
And when you did this things at begin, before use the daughter card,
which switch card you used? Can you give me an url of it where i can buy it from.
Thank you.
Or can i borrow the daughter card,
or borrow(buy) your old environment (mini-pcie2pcie switch card & tw6865 pcie card)
Thank you very much.
The devices i am using are as bellow
1.[IdeaTrust出品] MINI PCI-E转PCI-E 1X minipcie转pcie 转接卡-淘宝网
2.http://item.taobao.com/item.htm?spm=a230r.1.14.1.gzXu6T&id=21941676978&ns=1#detail
If we enable CONFIG_IMX_PCIE_EP_MODE_IN_EP_RC_SYS item, the pice reference clock will not output by default , and it will work in separate clock mode. So we checked the .config file firstly.
If you can recognize other pcie device, I think your issue is not same with this.
Thank you.
I tried another case.
I put the tw6865 card and the minipcie2pcie switch to the notepc's mini-pcie slot,
And it can be linked up.
If there is no other way, i plan to create the daughter board use your board data.
but it will take a long time.
If that is ok, may i borrow your daughter board? or i wish to buy one.
Thank you very much.
I checked the information we bought from the following link:
1. http://item.taobao.com/item.htm?spm=a1z10.1.w4004-5299295193.32.YwybCE&id=22108840583
2. The daughter card num is limited, I have not found one more available.
Did you mean that, the switch board you buied from bellow link is tested
ok with the tw6865 pci board?
http://item.taobao.com/item.htm?spm=a1z10.1.w4004-5299295193.32.YwybCE&id=22108840583
Thank you very much.
Hello JiangJustin ,
Now I use Yocto project "fsl-yocto-3.10.17_1.0.0" & "fsl-community-bsp" with Sabre SD board and,I want to add "TW68" Patch file to linux-imx kernel(3.10.17-r0).
But I only have the patch file "pcie_cap_patch.patch.zip" from you, It's can't support Yocto linux kernal.
Would you please help me to make Patch file for Yocto project on linux kernel 3.10.17.
Thank you very much !! :smileyhappy:
Hi our Query is for Intersil TW6865
Data sheet says 4 realtime D1 video. Now Real time video is ~ 30fps.
No where in datasheet it speaks about frame rate of simultaneous 4 channel with D1 resolution.
Please some body help us to know what will be the frame rate of simultaneous (fps) of each channel, when 4 channel is running simultaneously.
Thank You in Advance!
Dear Mr. Zhao;
:smileyhappy:
Thanks for your info.
Regards;
Subrata
Hi, everyone
Now, we are designing the surrounding view hardware base on I.MX6 and TW68xx. This hardware platform is Integrated into one PCB and support 6 camera most. Now, we are developing the software and Image processing algorithm。 So anyone want to Cooperate with us? we can share this PCB platform, and you can share me your software and Image processing algorithm? If possible, please contact me. email: lisim51@126.com
HI Yuan Zhao,
do you support this demo now? could you send me your email address to my email lisim51@126.com? I have some question for you.thanks.
hi :
I used the same devices with you,and the devices can not be recongnized by the board(iMX6Q SabreSD board).
Have you fixed the problem?if so,how did you do it ? or can you send the images to my email lxl2988@163.com.
Thank you very much.
I am doing the same thing! I use the tw6865 and I can read the picture from the cameras.what confuse me is that I can not change the resolution of the caption.
I use V4L2 lib to config the camera,when it is configed with 720*576, i will get a full picture,just like this:
when it is configed with other resolution,such as 360*288,640*480 and 320*240, i will get a Incomplete picture ,just like this:
I use a definition to define the resolution:
#define IMAGEWIDTH 720
#define IMAGEHEIGHT 576
here is the configuration code:
int Camera_type ::init_v4l2()
{
if ((camera.fd = open(camera.device_add, O_RDWR| O_NONBLOCK,0)) == -1)
{
printf("Error opening V4L interface\n");
return (false);
}
//query cap
if (ioctl(camera.fd, VIDIOC_QUERYCAP, &camera.cap) == -1)/* 获取设备支持的操作 */
{
printf("Error opening device %s: unable to query device.\n",camera.device_add);
return (false);
}
else
{
printf("driver:\t\t%s\n",camera.cap.driver);
printf("card:\t\t%s\n",camera.cap.card);
printf("bus_info:\t%s\n",camera.cap.bus_info);
printf("version:\t%d\n",camera.cap.version);
printf("capabilities:\t%x\n",camera.cap.capabilities);
if ((camera.cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == V4L2_CAP_VIDEO_CAPTURE)
{
printf("Device %s: supports capture.\n",camera.device_add);
}
if ((camera.cap.capabilities & V4L2_CAP_STREAMING) == V4L2_CAP_STREAMING)
{
printf("Device %s: supports streaming.\n",camera.device_add);
}
}
//emu all support fmt
camera.fmtdesc.index=0;
camera.fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
printf("Support format:\n");
while(ioctl(camera.fd,VIDIOC_ENUM_FMT,&camera.fmtdesc)!=-1) /* 获取设置支持的视频格式 */
{
printf("\t%d.%s\n",camera.fmtdesc.index+1,camera.fmtdesc.description);
camera.fmtdesc.index++;
}
//set fmt
camera.fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
camera.fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
camera.fmt.fmt.pix.height = IMAGEHEIGHT;
camera.fmt.fmt.pix.width = IMAGEWIDTH;
camera.fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if(ioctl(camera.fd, VIDIOC_S_FMT, &camera.fmt) == -1)/* 设置捕获视频的格式 */
{
printf("Unable to set format\n");
return false;
}
if(ioctl(camera.fd, VIDIOC_G_FMT, &camera.fmt) == -1)/* 获取设置的视频格式 */
{
printf("Unable to get format\n");
return false;
}
{
printf("fmt.type:\t\t%d\n",camera.fmt.type);
printf("pix.pixelformat:\t%c%c%c%c\n",camera.fmt.fmt.pix.pixelformat & 0xFF, (camera.fmt.fmt.pix.pixelformat >> 8) & 0xFF,(camera.fmt.fmt.pix.pixelformat >> 16) & 0xFF, (camera.fmt.fmt.pix.pixelformat >> 24) & 0xFF);
printf("pix.height:\t\t%d\n",camera.fmt.fmt.pix.height);
printf("pix.width:\t\t%d\n",camera.fmt.fmt.pix.width);
printf("pix.field:\t\t%d\n",camera.fmt.fmt.pix.field);
}
//set fps
printf("init %s \t[OK]\n",camera.device_add);
return true;
}
could you please tell me where i am wrong?
Hi!@
I am doing the same thing! I use the tw6865 and I can read the picture from the cameras.what confuse me is that I can not change the resolution of the caption.
I use V4L2 lib to config the camera,when it is configed with 720*576, i will get a full picture,just like this:
when it is configed with other resolution,such as 360*288,640*480 and 320*240, i will get a Incomplete picture ,just like this:
I use a definition to define the resolution:
#define IMAGEWIDTH 720
#define IMAGEHEIGHT 576
here is the configuration code:
int Camera_type ::init_v4l2()
{
if ((camera.fd = open(camera.device_add, O_RDWR| O_NONBLOCK,0)) == -1)
{
printf("Error opening V4L interface\n");
return (false);
}
//query cap
if (ioctl(camera.fd, VIDIOC_QUERYCAP, &camera.cap) == -1)/* 获取设备支持的操作 */
{
printf("Error opening device %s: unable to query device.\n",camera.device_add);
return (false);
}
else
{
printf("driver:\t\t%s\n",camera.cap.driver);
printf("card:\t\t%s\n",camera.cap.card);
printf("bus_info:\t%s\n",camera.cap.bus_info);
printf("version:\t%d\n",camera.cap.version);
printf("capabilities:\t%x\n",camera.cap.capabilities);
if ((camera.cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == V4L2_CAP_VIDEO_CAPTURE)
{
printf("Device %s: supports capture.\n",camera.device_add);
}
if ((camera.cap.capabilities & V4L2_CAP_STREAMING) == V4L2_CAP_STREAMING)
{
printf("Device %s: supports streaming.\n",camera.device_add);
}
}
//emu all support fmt
camera.fmtdesc.index=0;
camera.fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
printf("Support format:\n");
while(ioctl(camera.fd,VIDIOC_ENUM_FMT,&camera.fmtdesc)!=-1) /* 获取设置支持的视频格式 */
{
printf("\t%d.%s\n",camera.fmtdesc.index+1,camera.fmtdesc.description);
camera.fmtdesc.index++;
}
//set fmt
camera.fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
camera.fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
camera.fmt.fmt.pix.height = IMAGEHEIGHT;
camera.fmt.fmt.pix.width = IMAGEWIDTH;
camera.fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if(ioctl(camera.fd, VIDIOC_S_FMT, &camera.fmt) == -1)/* 设置捕获视频的格式 */
{
printf("Unable to set format\n");
return false;
}
if(ioctl(camera.fd, VIDIOC_G_FMT, &camera.fmt) == -1)/* 获取设置的视频格式 */
{
printf("Unable to get format\n");
return false;
}
{
printf("fmt.type:\t\t%d\n",camera.fmt.type);
printf("pix.pixelformat:\t%c%c%c%c\n",camera.fmt.fmt.pix.pixelformat & 0xFF, (camera.fmt.fmt.pix.pixelformat >> 8) & 0xFF,(camera.fmt.fmt.pix.pixelformat >> 16) & 0xFF, (camera.fmt.fmt.pix.pixelformat >> 24) & 0xFF);
printf("pix.height:\t\t%d\n",camera.fmt.fmt.pix.height);
printf("pix.width:\t\t%d\n",camera.fmt.fmt.pix.width);
printf("pix.field:\t\t%d\n",camera.fmt.fmt.pix.field);
}
//set fps
printf("init %s \t[OK]\n",camera.device_add);
return true;
}
could you please tell me where i am wrong?
Hi~Dear
Now I encounted some problems when i use the patch in IMX6 Community.
My Applitcatin is mxc_v4l2_tvin.out. But It can't use V4L2_MEMORY_USERPTR mode to capture video stream,and it often displayed that "USERPTR is currently not supported ,buffer_prepare OOPS".And it burn down.But when i use V4L2_MEMORY_MMAPED,it can normally capture video stream.
The command is :
hdmi
./mxc_v4l2_tvin.out -x 0 -ot 0 -ol 0 -ow 960 -oh 540 -m 2 &
./mxc_v4l2_tvin.out -x 1 -ot 0 -ol 960 -ow 960 -oh 540 -m 2 &
./mxc_v4l2_tvin.out -x 2 -ot 540 -ol 0 -ow 960 -oh 540 -m 2 &
./mxc_v4l2_tvin.out -x 3 -ot 540 -ol 960 -ow 960 -oh 540 -m 2 &
hardware platform: IMX6Q-SABRESED + PCIE + TW6865
LTIB: L3.0.35_4.1.0_130816_source.tar.gz
Hi hu bing,
What about your problem of capture ?
It is kind that help me a demo about V4L2 code.There is my email 1058477863@qq.com.
Thanks!
Hi, Qingrong Jiang!
I'm a FAE from STC, one of the NXP distributors in Korea.
We made TW6865 test board, and we can see 4ch image on HDMI with MX6Q-SABRESDP.
But we can see afterimage when I move my hand fast in front of Camera. (Please see attached video clip.)
(BSP version : L3.0.35_4.1.0)
I met intersil FAE, and he said it is the problem of deinterlacing.
Do you have any guide or solution to solve this issue?
Dear Qingrong Jiang:
Hi
When I use this methord to get the data of images by the v4l2 capture.c,
I meet like this:
can you check with our Korea FAE. They should have some patches for it.
Dear JiangJustin ,
We have developed a camera board using Intersil TW6865 chip (As same as Freescale TW6865 miniPCIe Daughter Board) which can input two analog cameras to iMAX6Q Sabre Lite Development board using PCIe interface.
I need to clarify following >>
In iMAX6Q Sabre Lite for PCIe port there are 7 pin connections as follows. +3.3V, PCIE_RXM, PCIE_RXP, PCIE_TXM, PCIE_TXP, GND, GND.
Intersil TW6865 chip has REFCLK-, REFCLK+ pin connections for differential reference clock inputs.
Don't we need to connect this pins with iMAX6Q board if we want to interface with PCIe interface ?
Thank You,
Peter Amond.imx6_pcie_msi_handler
Hi, Justin Jiang .
Is it possible to use opencv to make surround view come true?
Our i.MX6 doesn't support OpenCV HW acceleration.OpenGL ES, OpenVG, OpengCL are supported.
We have less experience about the surround view stitching implementation. I think you can try to use it, but it rely on CPU's compute capability. I'm not sure if the performance is good enough.
Hi, Justin Jiang .
My board has a lvds lcd, now it is able to display the qt demo, I have also attached the tw68 to the board. The "lspci" command output is below:
00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01)
01:00.0 Non-VGA unclassified device: Intersil Techwell Device 6869 (rev 01)
So, is the command below able to display the video on the lvds lcd? If not, how to change it.
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=960 disp-height=540 &
gst-launch v4l2src device=/dev/video1 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=960 disp-height=540 axis-left=960 &
gst-launch v4l2src device=/dev/video2 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=960 disp-height=540 axis-top=540 &
gst-launch v4l2src device=/dev/video3 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=960 disp-height=540 axis-top=540 axis-left=960 &
BTW, my kernel version is 4.1.15.
Thanks!
I don't know your display resolution, you need change it according your LVDS display resolution. Like 1024x768 in our SDP board, change it to below:
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=512 disp-height=384 &
gst-launch v4l2src device=/dev/video1 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=512 disp-height=384 axis-left=512 &
gst-launch v4l2src device=/dev/video2 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=512 disp-height=384 axis-top=384 &
gst-launch v4l2src device=/dev/video3 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=512 disp-height=384 axis-top=384 axis-left=512 &
Thank you for your reply!
There are "tw68-core.c" "tw68-video.c"... files in the linux 4.1.15 source tree, I'm not sure whether they are working for tw6865, I have enabled the tw68 in kernel, but there is no corresponding /dev/videoX for the tw6865. So I want confirm that is this the driver for tw6865.
The source code is under "/drivers/media/pci/tw68/" directory in the linux 4.1.15 source tree.
--------------------------------------------------
I ask the tw68 driver author, it's not for the tw6865.
Tw6865 driver is here:
Hi Lei Ma,
try dmesg | grep tw68 and see whether you have a dma memory allocation error message. If yes, try passing coherent_pool = 128M (or a reasonable memory size) as a kernel parameter. i.e. setenv bootargs = "${bootargs} coherent_pool = 128M" in uboot or 6x_bootscript. This will enumerate your video device if the issue was with memory allocation. The mainline tw686x linux driver should work for your case !
Rgs
Anuradha
Hi,
I'm using the tw686x driver, but the gst-lanuch-1.0 doesn't work, I try the
"gst-launch-1.0 imxv4l2src device=/dev/video2" , output:
====== IMXV4L2SRC: 4.1.4 build on Jan 31 2017 20:15:40. ======
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
(gst-launch-1.0:990): GStreamer-CRITICAL **: gst_mini_object_ref: assertion 'mini_object != NULL' failed
** (gst-launch-1.0:990): CRITICAL **: gst_video_info_from_caps: assertion 'caps != NULL' failed
(gst-launch-1.0:990): GStreamer-CRITICAL **: gst_caps_get_structure: assertion 'GST_IS_CAPS (caps)' failed
** (gst-launch-1.0:990): CRITICAL **: gst_video_info_from_caps: assertion 'caps != NULL' failed
ERROR: from element /GstPipeline:pipeline0/GstImxV4l2Src:imxv4l2src0: Internal data flow error.
Additional debug info:
../../../../gstreamer-1.8.1/libs/gst/base/gstbasesrc.c(2948): gst_base_src_loop (): /GstPipeline:pipeline0/GstImxV4l2Src:imxv4l2src0:
streaming task paused, reason not-negotiated (-4)
ERROR: pipeline doesn't want to preroll.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
"dmesg" outputs:
ERROR: v4l2 capture: slave not found!
If I use "imxv4l2videosrc", it'll output:
ERROR: pipeline could not be constructed: no element "imxv4l2videosrc"
version:
gst-launch-1.0 version 1.8.1
GStreamer 1.8.1
=======================================================
If I use the old rootfs for L3.0.5, but with the same kernel used above, 4.1.15, the output is correct, command:
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv, format=(fourcc)UYVY' ! mfw_isink disp-width=512 disp-height=300 axis-left=0 axis-top=0
gst-launch version:
gst-launch-0.10 version 0.10.35
GStreamer 0.10.35