Template:C792-Software: Difference between revisions

 
(10 intermediate revisions by the same user not shown)
Line 8: Line 8:


For kernel driver usage, ensure your system is updated. As the 5.4 kernel included key changes, these guidelines are valid for kernel 5.4 and newer releases. Verify your kernel version with <code>uname -a</code>; if it is below 5.4, fix this before continuing.
For kernel driver usage, ensure your system is updated. As the 5.4 kernel included key changes, these guidelines are valid for kernel 5.4 and newer releases. Verify your kernel version with <code>uname -a</code>; if it is below 5.4, fix this before continuing.
<pre>
<pre style="margin-left: 1em;">
pi@raspberrypi:~ $ uname -a
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l GNU/Linux
Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l GNU/Linux
Line 14: Line 14:


<mark>1.</mark> Update and upgrade your Raspberry Pi system (time required varies by country/region).
<mark>1.</mark> Update and upgrade your Raspberry Pi system (time required varies by country/region).
  sudo apt-get update
<pre style="margin-left: 1em;">
sudo apt-get upgrade
sudo apt-get update
 
sudo apt-get upgrade
</pre>


<mark>2.</mark> Enable the camera module (enabled by default on Raspberry Pi Bullseye OS).
<mark>2.</mark> Enable the camera module (enabled by default on Raspberry Pi Bullseye OS).
<pre>
<pre style="margin-left: 1em;">
sudo raspi-config
sudo raspi-config
sudo reboot
sudo reboot
Line 40: Line 41:


*Edit the <code>/boot/firmware/config.txt</code> file (sudo privileges required):
*Edit the <code>/boot/firmware/config.txt</code> file (sudo privileges required):
<pre>
<pre style="margin-left: 1em;">
sudo nano /boot/firmware/config.txt
sudo nano /boot/firmware/config.txt
</pre>
</pre>
Line 48: Line 49:


*Add the line:
*Add the line:
<pre>
<pre style="margin-left: 1em;">
dtoverlay=tc358743
dtoverlay=tc358743
</pre>
</pre>


*Add the line if your shield support audio like C790 or C792:
*Add the line if your shield support audio like C790 or C792:
<pre>
<pre style="margin-left: 1em;">
dtoverlay=tc358743-audio
dtoverlay=tc358743-audio
</pre>
</pre>


*Add the line '''only if''': your device (e.g., C790/C792) supports a 22-pin connector with all 4 lanes connected, and the compute module has the '''CAM1 interface''' with all 4 lanes connected:
*Add the line '''only if''': your device (e.g., C790/C792) supports a 22-pin connector with all 4 lanes connected, and the compute module has the '''CAM1 interface''' with all 4 lanes connected:
<pre>
<pre style="margin-left: 1em;">
dtoverlay=tc358743,4lane=1
dtoverlay=tc358743,4lane=1
</pre>
</pre>
Line 66: Line 67:


*Use the following command to check the amount of memory allocated to the CMA heap:
*Use the following command to check the amount of memory allocated to the CMA heap:
<pre>
<pre style="margin-left: 1em;">
dmesg | grep cma
dmesg | grep cma
</pre>
</pre>


*The first line should look like:
*The first line should look like:
<pre>
<pre style="margin-left: 1em;">
pi@raspberrypi:~ $ dmesg | grep cma
pi@raspberrypi:~ $ dmesg | grep cma
[0.000000] cma: Reserved 256 MiB at 0x000000001ec00000
[0.000000] cma: Reserved 256 MiB at 0x000000001ec00000
Line 77: Line 78:


*If the reported CMA allocated memory is less than 96MB, edit the <code>/boot/cmdline.txt</code> file and add the following at the start of the line <span class="tb_red">(do not add a newline character)</span>:
*If the reported CMA allocated memory is less than 96MB, edit the <code>/boot/cmdline.txt</code> file and add the following at the start of the line <span class="tb_red">(do not add a newline character)</span>:
<pre>
<pre style="margin-left: 1em;">
cma=96M
cma=96M
</pre>
</pre>
Line 85: Line 86:


*Reboot the device. If everything works properly, you should see the <code>/dev/video0</code> device, and running the following command will show it is provided by Unicam:
*Reboot the device. If everything works properly, you should see the <code>/dev/video0</code> device, and running the following command will show it is provided by Unicam:
<pre>
<pre style="margin-left: 1em;">
v4l2-ctl --list-devices
v4l2-ctl --list-devices
</pre>
</pre>
Line 93: Line 94:


*After connecting all cables, power on the Raspberry Pi and enter the commands below:
*After connecting all cables, power on the Raspberry Pi and enter the commands below:
<pre>
<pre style="margin-left: 1em;">
pi@raspberrypi:~ $ ls /dev/video0
pi@raspberrypi:~ $ ls /dev/video0
/dev/video0
/dev/video0
Line 118: Line 119:


*Several EDID editors are available on the market. You need to first create an edid.txt file (you can use the <code>command nano edid.txt</code> to create and edit the file), then copy the content below into the edid.txt file:
*Several EDID editors are available on the market. You need to first create an edid.txt file (you can use the <code>command nano edid.txt</code> to create and edit the file), then copy the content below into the edid.txt file:
<pre>
<pre style="margin-left: 1em;">
00ffffffffffff005262888800888888
00ffffffffffff005262888800888888
1c150103800000780aEE91A3544C9926
1c150103800000780aEE91A3544C9926
Line 138: Line 139:


*After the edid.txt file is created, execute the command <code>v4l2-ctl --set-edid=file=edid.txt --fix-edid-checksums</code> in the terminal, and you will see output similar to the following:
*After the edid.txt file is created, execute the command <code>v4l2-ctl --set-edid=file=edid.txt --fix-edid-checksums</code> in the terminal, and you will see output similar to the following:
<pre>
<pre style="margin-left: 1em;">
     pi@raspberrypi:~ $ v4l2-ctl --set-edid=file=edid.txt --fix-edid-checksums
     pi@raspberrypi:~ $ v4l2-ctl --set-edid=file=edid.txt --fix-edid-checksums


Line 166: Line 167:


*Detect the presence of HDMI signal input at present via command:
*Detect the presence of HDMI signal input at present via command:
<pre>
<pre style="margin-left: 1em;">
     pi@raspberrypi:~ $ v4l2-ctl --query-dv-timings
     pi@raspberrypi:~ $ v4l2-ctl --query-dv-timings
     Active width: 1280
     Active width: 1280
Line 194: Line 195:


*Use the following command to select UYVY (however, your application may override this setting):
*Use the following command to select UYVY (however, your application may override this setting):
<pre>
<pre style="margin-left: 1em;">
v4l2-ctl -v pixelformat=UYVY
v4l2-ctl -v pixelformat=UYVY
</pre>
</pre>
Line 202: Line 203:


*Check if the audio driver/sound card is available for ALSA:
*Check if the audio driver/sound card is available for ALSA:
<pre>
<pre style="margin-left: 1em;">
     pi@raspberrypi:~ $ arecord -l.  
     pi@raspberrypi:~ $ arecord -l.  
     **** List of CAPTURE Hardware Devices ****.  
     **** List of CAPTURE Hardware Devices ****.  
Line 216: Line 217:


*Install the GStreamer tools:
*Install the GStreamer tools:
<pre>
<pre style="margin-left: 1em;">
sudo apt install gstreamer1.0-tools
sudo apt install gstreamer1.0-tools
</pre>
</pre>


*Check the GStreamer tool version:
*Check the GStreamer tool version:
<pre>
<pre style="margin-left: 1em;">
pi@raspberrypi:~ $ gst-launch-1.0 --version
pi@raspberrypi:~ $ gst-launch-1.0 --version
gst-launch-1.0 version 1.18.4
gst-launch-1.0 version 1.18.4
Line 233: Line 234:


<mark>'''[Application Example — Using GStreamer to Record Video and Audio]'''</mark>  
<mark>'''[Application Example — Using GStreamer to Record Video and Audio]'''</mark>  
<pre>
<pre style="margin-left: 1em;">
# GStreamer v1.14 Command
# GStreamer v1.14 Command
gst-launch-1.0 v4l2src io-mode=5 ! video/x-raw, format=UYVY, framerate=25/1 ! v4l2h264enc output-io-mode=4 ! video/x-h264,profile=high ! h264parse ! queue ! matroskamux name=mux ! filesink location=foo.mkv alsasrc device=hw:1 ! audio/x-raw,rate=48000,channels=2 ! audioconvert ! avenc_aac bitrate=48000 ! aacparse ! queue ! mux.
gst-launch-1.0 v4l2src io-mode=5 ! video/x-raw, format=UYVY, framerate=25/1 ! v4l2h264enc output-io-mode=4 ! video/x-h264,profile=high ! h264parse ! queue ! matroskamux name=mux ! filesink location=foo.mkv alsasrc device=hw:1 ! audio/x-raw,rate=48000,channels=2 ! audioconvert ! avenc_aac bitrate=48000 ! aacparse ! queue ! mux.
Line 240: Line 241:
<code>foo.mkv</code> is the output file.
<code>foo.mkv</code> is the output file.
If your GStreamer version is 1.8 or higher, you can try the following test command. Additionally, <code>alsasrc device=hw:1</code> refers to the sound card for TC358743; you can check this with the command <code>arecord -l</code>.
If your GStreamer version is 1.8 or higher, you can try the following test command. Additionally, <code>alsasrc device=hw:1</code> refers to the sound card for TC358743; you can check this with the command <code>arecord -l</code>.
<pre>
<pre style="margin-left: 1em;">
# Command to record video with audio(GStreamer 1.18.4)
# Command to record video with audio(GStreamer 1.18.4)
gst-launch-1.0 -vvv v4l2src ! "video/x-raw,framerate=30/1,format=UYVY" ! v4l2h264enc extra-controls="controls,h264_profile=4,h264_level=13,video_bitrate=256000;" ! "video/x-h264,profile=high, level=(string)4.2" ! h264parse ! queue ! matroskamux name=mux ! filesink location=foo.mkv alsasrc device=hw:1 ! audio/x-raw,rate=48000,channels=2 ! audioconvert ! avenc_aac bitrate=48000 ! aacparse ! queue ! mux.
gst-launch-1.0 -vvv v4l2src ! "video/x-raw,framerate=30/1,format=UYVY" ! v4l2h264enc extra-controls="controls,h264_profile=4,h264_level=13,video_bitrate=256000;" ! "video/x-h264,profile=high, level=(string)4.2" ! h264parse ! queue ! matroskamux name=mux ! filesink location=foo.mkv alsasrc device=hw:1 ! audio/x-raw,rate=48000,channels=2 ! audioconvert ! avenc_aac bitrate=48000 ! aacparse ! queue ! mux.
Line 256: Line 257:


*Record video only:
*Record video only:
<pre>
<pre style="margin-left: 1em;">
gst-launch-1.0 -vvv v4l2src ! "video/x-raw,framerate=60/1,format=UYVY" ! v4l2h264enc extra-controls="controls,h264_profile=4,h264_level=13,video_bitrate=256000;" ! "video/x-h264,profile=high, level=(string)4.2" ! h264parse ! queue ! matroskamux name=mux ! filesink location=foo.mkv
gst-launch-1.0 -vvv v4l2src ! "video/x-raw,framerate=60/1,format=UYVY" ! v4l2h264enc extra-controls="controls,h264_profile=4,h264_level=13,video_bitrate=256000;" ! "video/x-h264,profile=high, level=(string)4.2" ! h264parse ! queue ! matroskamux name=mux ! filesink location=foo.mkv
</pre>
</pre>


*Record video and audio (if your module supports audio):
*Record video and audio (if your module supports audio):
<pre>
<pre style="margin-left: 1em;">
gst-launch-1.0 -vvv v4l2src ! "video/x-raw,framerate=60/1,format=UYVY" ! v4l2h264enc extra-controls="controls,h264_profile=4,h264_level=13,video_bitrate=256000;" ! "video/x-h264,profile=high, level=(string)4.2" ! h264parse ! queue ! matroskamux name=mux ! filesink location=foo.mkv alsasrc device=hw:1 ! audio/x-raw,rate=48000,channels=2 ! audioconvert ! avenc_aac bitrate=48000 ! aacparse ! queue ! mux.
gst-launch-1.0 -vvv v4l2src ! "video/x-raw,framerate=60/1,format=UYVY" ! v4l2h264enc extra-controls="controls,h264_profile=4,h264_level=13,video_bitrate=256000;" ! "video/x-h264,profile=high, level=(string)4.2" ! h264parse ! queue ! matroskamux name=mux ! filesink location=foo.mkv alsasrc device=hw:1 ! audio/x-raw,rate=48000,channels=2 ! audioconvert ! avenc_aac bitrate=48000 ! aacparse ! queue ! mux.
</pre>
</pre>
Line 281: Line 282:


Add the following two lines to the <code>/boot/firmware/config.txt</code> file:
Add the following two lines to the <code>/boot/firmware/config.txt</code> file:
<pre>
<pre style="margin-left: 1em;">
dtoverlay=tc358743,4lane=1
dtoverlay=tc358743,4lane=1
dtoverlay=tc358743-audio
dtoverlay=tc358743-audio
Line 290: Line 291:


After adding the driver configuration, restart the Raspberry Pi for the changes to take effect. If the configuration is correct, execute the following command in the terminal: <code>ls /dev/video*</code>. The configuration is successful if video devices appear in the output:
After adding the driver configuration, restart the Raspberry Pi for the changes to take effect. If the configuration is correct, execute the following command in the terminal: <code>ls /dev/video*</code>. The configuration is successful if video devices appear in the output:
<pre>
<pre style="margin-left: 1em;">
    pi@raspberrypi:~/Desktop $ ls /dev/video*
pi@raspberrypi:~/Desktop $ ls /dev/video*
    /dev/video0  /dev/video19  /dev/video20  /dev/video22  /dev/video24  /dev/video26  /dev/video28  /dev/video3  /dev/video31  /dev/video33  /dev/video35  /dev/video5  /dev/video7
/dev/video0  /dev/video19  /dev/video20  /dev/video22  /dev/video24  /dev/video26  /dev/video28  /dev/video3  /dev/video31  /dev/video33  /dev/video35  /dev/video5  /dev/video7
    /dev/video1  /dev/video2  /dev/video21  /dev/video23  /dev/video25  /dev/video27  /dev/video29  /dev/video30  /dev/video32  /dev/video34  /dev/video4  /dev/video6
/dev/video1  /dev/video2  /dev/video21  /dev/video23  /dev/video25  /dev/video27  /dev/video29  /dev/video30  /dev/video32  /dev/video34  /dev/video4  /dev/video6
</pre>
</pre>


Line 300: Line 301:


First, execute the command <code>nano 1080p60edid</code> in the terminal to create an EDID file for 1080p60Hz. The content of this file is as follows:
First, execute the command <code>nano 1080p60edid</code> in the terminal to create an EDID file for 1080p60Hz. The content of this file is as follows:
<pre>
<pre style="margin-left: 1em;">
    00 ff ff ff ff ff ff 00 52 62 00 37 00 00 00 00
00 ff ff ff ff ff ff 00 52 62 00 37 00 00 00 00
    01 1b 01 03 80 46 28 78 0a cf 74 a3 57 4c b0 23
01 1b 01 03 80 46 28 78 0a cf 74 a3 57 4c b0 23
    09 48 4c 21 08 00 b3 00 95 00 a9 40 90 40 81 00
09 48 4c 21 08 00 b3 00 95 00 a9 40 90 40 81 00
    81 80 81 40 01 01 02 3a 80 18 71 38 2d 40 58 2c
81 80 81 40 01 01 02 3a 80 18 71 38 2d 40 58 2c
    45 00 00 d0 52 00 00 1e 02 3a 80 d0 72 38 2d 40
45 00 00 d0 52 00 00 1e 02 3a 80 d0 72 38 2d 40
    10 2c 45 80 00 d0 52 00 00 1e 00 00 00 fc 00 33
10 2c 45 80 00 d0 52 00 00 1e 00 00 00 fc 00 33
    32 46 48 44 5f 4c 43 44 5f 54 56 0a 00 00 00 fd
32 46 48 44 5f 4c 43 44 5f 54 56 0a 00 00 00 fd
    00 30 3e 0f 46 11 00 0a 20 20 20 20 20 20 01 38
00 30 3e 0f 46 11 00 0a 20 20 20 20 20 20 01 38
    02 03 30 f1 52 10 9f 04 13 05 14 03 02 11 12 20
02 03 30 f1 52 10 9f 04 13 05 14 03 02 11 12 20
    21 22 15 16 01 06 07 2c 09 07 07 15 07 50 57 06
21 22 15 16 01 06 07 2c 09 07 07 15 07 50 57 06
    00 3f 06 c0 83 01 00 00 67 03 0c 00 10 00 b0 2d
00 3f 06 c0 83 01 00 00 67 03 0c 00 10 00 b0 2d
    01 1d 80 3e 73 38 2d 40 7e 2c 45 80 00 d0 52 00
01 1d 80 3e 73 38 2d 40 7e 2c 45 80 00 d0 52 00
    00 1e 01 1d 80 d0 72 1c 2d 20 10 2c 25 80 00 d0
00 1e 01 1d 80 d0 72 1c 2d 20 10 2c 25 80 00 d0
    52 00 00 9e 01 1d 00 bc 52 d0 1e 20 b8 28 55 40
52 00 00 9e 01 1d 00 bc 52 d0 1e 20 b8 28 55 40
    00 d0 52 00 00 1e 01 1d 80 18 71 1c 16 20 58 2c
00 d0 52 00 00 1e 01 1d 80 18 71 1c 16 20 58 2c
    25 00 00 d0 52 00 00 9e 00 00 00 00 00 00 00 8f
25 00 00 d0 52 00 00 9e 00 00 00 00 00 00 00 8f
</pre>
</pre>


Line 323: Line 324:


Execute <code>nano testC7xx.sh</code> in the same directory to create a test script. The content of this file is as follows:
Execute <code>nano testC7xx.sh</code> in the same directory to create a test script. The content of this file is as follows:
<pre>
<pre style="margin-left: 1em;">
#!/bin/bash
#!/bin/bash
MEDIADEVICE=-1
MEDIADEVICE=-1
Line 373: Line 374:


Execute <code>bash testC7xx.sh</code> directly in the terminal; the output is as follows:
Execute <code>bash testC7xx.sh</code> directly in the terminal; the output is as follows:
<pre>
<pre style="margin-left: 1em;">
pi@raspberrypi:~/Desktop $ bash testC7xx.sh  
pi@raspberrypi:~/Desktop $ bash testC7xx.sh  
Active width: 1920
Active width: 1920
Line 395: Line 396:


:If you have installed the Raspberry Pi Desktop version, you can use ffplay to play YUV files directly.
:If you have installed the Raspberry Pi Desktop version, you can use ffplay to play YUV files directly.
<pre>
<pre style="margin-left: 1em;">
ffplay -f rawvideo -video_size 1920x1080 -pixel_format bgr24 test.yuv  
ffplay -f rawvideo -video_size 1920x1080 -pixel_format bgr24 test.yuv  
</pre>
</pre>