Changes

Jump to: navigation, search

Orange Pi Zero 2W

52,818 bytes added, 20:33, 27 September 2023
Download orangepi-build from github
<div class="figure">
[[File:zero2w-img3.png|800px]]
</div>
<div class="figure">
[[File:zero2w-img4.png|800px]]
</div>
<div class="figure">
[[File:zero2w-img5.png|800px]]
</div>
<span id="orange-pi-zero-2w-24pin-expansion-board-interface-details"></span>
 
== Orange Pi Zero 2w 24pin expansion board interface details ==
<div class="figure">
[[File:zero2w-img6.png|800px]]
</div>
[[File:zero2w-img7.png|800px]]
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
<div class="figure">
::[[File:zero2w-img72.png]]
</div></ol>
== Instructions for using the 5v pin in the 40pin interface of the development board for power supply ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''The power supply method we recommend for the development board is to use a 5V/2A or 5V/3A Type C interface power cord and plug it into the development board's Type C power interface. If you need to use the 5V pin in the 40-pin interface to power the development board, please ensure that the power cable used can meet the power supply requirements of the development board. If the use is unstable, please switch to Type C power supply.'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note: The pin header on the 40pin interface is not soldered by default, and you need to solder it yourself before it can be used.'''</big>|}
<ol style="list-style-type: decimal;">
</div>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''The power cord shown in the picture above can be purchased on Taobao, please search and buy it yourself.'''</p></big>|}</li>
<li><p>Use the 5V pin in the 40pin interface to power the development board. The power cord connection is as follows:</p>
<p>a. The USB-A port of the power cord shown in the picture above needs to be plugged into the 5V/2A or 5V/3A power adapter connector.</p>
<p>b. The red DuPont wire needs to be plugged into the 5V pin of the 40pin interface of the development board</p>
<p>c. The black DuPont wire needs to be plugged into the GND pin of the 40pin interface</p>
<p>d. The positions of the 5V pin and GND pin of the 40pin interface in the development board are as shown in the figure below. '''<span style="color:#FF0000">Remember not to connect them reversely.</span>'''</p>
<p>[[File:zero2w-img23.png]]</p></li></ol>
<span id="debianubuntu-server-and-xfce-desktop-system-usage-instructions"></span>
 
= '''Debian/Ubuntu Server and Xfce desktop system usage instructions''' =
== Supported linux image types and kernel versions ==
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''Linux image type'''
The naming rules for Linux images are:
{| class="wikitable" style="width:800px;"
|-
|
'''Development board model_version number_Linux distribution type_distribution code_server or desktop_kernel version'''
|}
a. '''Development board models''': all are '''orangepizero2w'''. The model names of different development boards are generally different. Before burning the image, please make sure that the model name of the selected image matches the development board.
<span id="linux-kernel-driver-adaptation-situation"></span>
 
== Linux kernel driver adaptation situation ==
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''Board functions'''
|-
| '''Mali GPU'''
| '''<span style="color:#FF0000">NO</span>'''| '''<span style="color:#FF0000">NO</span>'''
|-
| '''Video codec'''
| '''<span style="color:#FF0000">NO</span>'''| '''<span style="color:#FF0000">NO</span>'''
|}
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''24pin expansion board function'''
|-
| '''TV-OUT'''
| '''<span style="color:#FF0000">NO</span>'''| '''<span style="color:#FF0000">NO</span>'''
|}
<span id="linux-command-format-description-in-this-manual"></span>
 
== Linux command format description in this manual ==
<ol style="list-style-type: decimal;">
<li><p>All commands that need to be entered in the Linux system in this manual will be enclosed in the following boxes</p>
{| class="wikitable" style="width:800px;height:40px;" |-|  |}<p>As shown below, the content in the yellow box indicates content that requires special attention, except for the commands inside.</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;height:40px;" |-|  |}</li>
<li><p>Description of the prompt type before the command</p>
<ol style="list-style-type: lower-alpha;">
<li><p>The prompt in front of the command refers to the red part in the &gt; box below. This part is not part of the Linux command. &gt; Therefore, when entering commands in the Linux system, please &gt; do not also enter the content in the red font.</p>{| class="wikitable" style="width:800px;" |-| <p>'''<span style="color:#FF0000">orangepi@orangepi:~$ </span> sudo apt update'''</p><p>'''<span style="color:#FF0000">root@orangepi:~#</span>''' '''vim /boot/boot.cmd'''</p><p>'''<span style="color:#FF0000">test@test:~$ </span> ssh [mailto:root@192.168.1.36 root@192.168.1.]xxx'''</p><p>'''<span style="color:#FF0000">root@test:~# </span> ls'''</p>|}</li><li><p>'''<span style="color:#FF0000">root@orangepi:~$</span>''' prompt indicates that this command is &gt; entered in the '''Linux system of the development board'''. The &gt; '''<span style="color:#FF0000">$</span>''' at the end of the prompt indicates that the current &gt; user of the system is an ordinary user. When executing a &gt; privileged command, '''sudo''' needs to be added.</p></li><li><p>'''<span style="color:#FF0000">root@orangepi:~#</span>''' The prompt indicates that this command is &gt; entered in the '''Linux system of the development board'''. The &gt; '''<span style="color:#FF0000">#</span>''' at the end of the prompt indicates that the current &gt; user of the system is the root user and can execute any &gt; command you want to execute.</p></li><li><p>'''<span style="color:#FF0000">test@test:~$</span>''' prompt indicates that this command was &gt; entered in the Ubuntu PC or Ubuntu virtual machine, not the &gt; Linux system of the development board. The '''<span style="color:#FF0000">$</span>''' at the end &gt; of the prompt indicates that the current user of the system is &gt; an ordinary user. When executing privileged commands, sudo &gt; needs to be added.</p></li><li><p>'''<span style="color:#FF0000">root@test:~#</span>''' prompt indicates that this command is entered &gt; in the Ubuntu PC or Ubuntu virtual machine, not the Linux &gt; system of the development board. The '''<span style="color:#FF0000">#</span>''' at the end of the &gt; prompt indicates that the current user of the system is the &gt; root user and can execute any command you want to execute.</p></li></ol>
</li>
<li><p>What are the commands that need to be entered?</p>
<ol style="list-style-type: lower-alpha;">
<li><p>As shown below, the '''bold black part''' is the command that &gt; needs to be input. The content below the command is the output &gt; content (some commands have output, and some may not output). &gt; This part of the content does not need to be input.</p>{| class="wikitable" style="width:800px;" |-|
<p>root@orangepi:~# '''cat /boot/orangepiEnv.txt'''</p>
<p>'''<span style="color:#FF0000">verbosity=7</span>'''</p>
<p>bootlogo=false</p>
<p>'''<span style="color:#FF0000">console=serial</span>'''</p></li><li>|}</li><li><p>As shown below, some commands that cannot be written in one line &gt; will be placed on the next line. As long as the black and bold &gt; parts are the commands that need to be entered. When these &gt; commands are entered into one line, the &quot;\&quot; at the end of &gt; each line needs to be removed. This is not part of the &gt; command. In addition, different parts of the command have &gt; spaces, please don't miss them.</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''echo \'''</p>
<p>'''&quot;deb [arch=$(dpkg --print-architecture) \'''</p>
<p>'''signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \'''</p>
<p>'''https://download.docker.com/linux/debian \'''</p>
<p>'''$(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null'''</p>|}</li></ol>
</li></ol>
<span id="linux-system-login-instructions"></span>
 
== Linux system login instructions ==
=== Linux system default login account and password ===
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''Account'''
|}
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note that when entering a password, <span style="color:#FF0000">the specific content of the entered password will not be displayed on the screen</span>. Please do not think that there is any malfunction. Just press Enter after entering the password.'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''When you are prompted for an incorrect password or there is a problem with the ssh connection, please note that as long as you are using the Linux image provided by Orange Pi, <span style="color:#FF0000">please do not suspect that the above password is incorrect</span>, but look for other reasons.'''</big>|}
'''When you are prompted for an incorrect password or there is a problem with the ssh connection, please note that as long as you are using the Linux image provided by Orange Pi, please do not suspect that the above password is incorrect, but look for other reasons.'''<span id="how-to-set-up-automatic-login-of-linux-system-terminal"></span>
<span id="how-to-set-up-automatic-login-of-linux-system-terminal"></span>
=== How to set up automatic login of Linux system terminal ===
<ol style="list-style-type: decimal;">
<li><p>The Linux system automatically logs in to the terminal by default. The default login user name is '''<span style="color:#FF0000">orangepi</span>'''</p>
<p>[[File:zero2w-img76.png]]</p></li>
<li><p>Use the following command to set the root user to automatically log in to the terminal</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh root'''</p>|}</li>
<li><p>Use the following command to disable automatic login to the terminal</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh -d'''</p>|}</li>
<li><p>Use the following command to set the orangepi user to automatically log in to the terminal again</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh orangepi'''</p>|}</li></ol>
<span id="instructions-for-automatic-login-of-linux-desktop-version-system"></span>
 
=== Instructions for automatic login of Linux desktop version system ===
</div></li>
<li><p>Run the following command to prevent the desktop system from automatically logging into the desktop.</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo disable_desktop_autologin.sh'''</p>|}</li><li><p>Then restart the system and a login dialog box will appear. At this time, you need to enter a password to enter the system.</p></li></ol>
<div class="figure">
[[File:zero2w-img78.png]]
</div></ol>
<span id="setting-method-for-automatic-login-of-root-user-in-linux-desktop-system"></span>
 
=== Setting method for automatic login of root user in Linux desktop system ===
<ol style="list-style-type: decimal;">
<li><p>Execute the following command to set the desktop version of the system to automatically log in using the root user</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo desktop_login.sh root'''</p>|}</li>
<li><p>Then restart the system and you will automatically log in to the desktop as the root user.</p>
<p>[[File:zero2w-img79.png]]</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that if you use the root user to log in to the desktop system, you cannot use pulseaudio in the upper right corner to manage audio devices.'''</p><p>'''Also please note that this is not a bug, because pulseaudio is not allowed to run under the root user.'''</p></big>|}</li>
<li><p>Execute the following command to set up the desktop version of the system again to use the orangepi user to automatically log in</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo desktop_login.sh orangepi'''</p>|}</li></ol>
<span id="how-to-disable-the-desktop-in-linux-desktop-system"></span>
 
=== How to disable the desktop in Linux desktop system ===
<ol style="list-style-type: decimal;">
<li><p>First enter the following command on the command line, '''<span style="color:#FF0000">please remember to add sudo permissions</span>'''</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo systemctl disable lightdm.service'''</p>|}</li>
<li><p>Then restart the Linux system and you will find that the desktop will not be displayed.</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo reboot'''</p>|}</li><li><p>'''The command to reopen the desktop is as follows, <span style="color:#FF0000">please remember to add sudo permissions</span>'''</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo systemctl start lightdm.service'''</p>
<p>orangepi@orangepi:~$ '''sudo systemctl enable lightdm.service'''</p>|}</li></ol>
<span id="onboard-led-light-test-instructions"></span>
 
== Onboard LED light test instructions ==
# There are two LED lights on the development board, one green light and one red light. The default display of the LED lights when the system is started is as follows:
::{| class="wikitable" style="width:800px;text-align: center;"
|-
|
| '''Bright'''
|}
::{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''The green light on the development board can be controlled through software. The red light will be on continuously after power is turned on and cannot be controlled through software.'''
'''When you get the development board, you may find that even if the TF card with the system burned is not inserted into the development board, the green light will flash after connecting the power supply to the development board. This is because the 16MB SPI Flash on the development board is factory default. A miniature Linux system will be burned. This system will set the green light to flash after entering the kernel.'''
'''If the Linux system in the SPI Flash is cleared, then without inserting the TF card with the system programmed in it, you will only see a steady red light on the development board after turning on the power.'''</big>|}
<ol start="2" style="list-style-type: decimal;">
<li><p>The method of setting the green light to turn on and off and flash is as follows:</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that the following operations should be performed under the root user.'''</p></big>|}
<ol style="list-style-type: lower-alpha;">
<li><p>First enter the setting directory of the green light</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''cd /sys/class/leds/green_led'''</p>|}</li><li><p>The command to set the green light to stop flashing is as &gt; follows:</p>{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:/sys/class/leds/green_led# '''echo none &gt; trigger'''</p>|}</li>
<li><p>The command to set the green light to be always on is as &gt; follows:</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:/sys/class/leds/green_led# '''echo default-on &gt; trigger'''</p>|}</li>
<li><p>The command to set the green light flashing is as follows:</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:/sys/class/leds/green_led# '''echo heartbeat &gt; trigger'''</p>|}</li></ol>
</li>
<li><p>If you do not need the LED light to flash after powering on, you can use the following method to turn off the green light flashing</p>
<ol style="list-style-type: lower-alpha;">
<li><p>First run '''orangepi-config'''. Ordinary users remember to add &gt; '''sudo''' permissions.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>Then select '''System'''</p>
<p>[[File:zero2w-img80.png]]</p></li>
<li><p>Then select '''Hardware'''</p>
<p>[[File:zero2w-img81.png]]</p></li>
<li><p>Then use the keyboard's arrow keys to locate the position shown &gt; in the picture below, and then use the space to select &gt; '''disable-leds'''</p>
<p>[[File:zero2w-img82.png]]</p></li>
<li><p>Then select '''&lt;Save&gt;'''to save</p>
<p>[[File:zero2w-img83.png]]</p></li>
<li><p>Then select '''&lt;Back&gt;'''</p>
<p>[[File:zero2w-img84.png]]</p></li>
<li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the &gt; configuration take effect.</p>
<p>[[File:zero2w-img85.png]]</p></li>
<li><p>After restarting and entering the system, you can see that the &gt; green LED light on the development board will no longer light &gt; up.</p></li></ol>
</li></ol>
<span id="operation-instructions-for-rootfs-partition-capacity-of-linux-system-in-tf-card"></span>
 
== Operation instructions for rootfs partition capacity of Linux system in TF card ==
<ol style="list-style-type: decimal;">
<li><p>After burning the Linux image of the development board into the TF card, you can check the usage of the TF card capacity on the '''<span style="color:#FF0000">Ubuntu computer</span>'''. The steps are as follows:</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that failure to perform this step will not affect the automatic expansion of the Linux system of the development board. Here I just want to explain how to check the capacity of the TF card after burning the Linux image on the TF card.'''</p></big>|}
<ol style="list-style-type: lower-alpha;">
<li><p>First install the gparted software on your Ubuntu computer</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo apt install -y gparted'''</p>|}</li>
<li><p>Then open gparted</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo gparted'''</p>|}</li><li><p>After opening gparted, you can select the TF card in the upper &gt; right corner, and then you can see the usage of the TF card &gt; capacity.</p>
<p>[[File:zero2w-img86.png]]</p></li>
<li><p>The picture above shows the situation of the TF card after &gt; burning the Linux desktop system. It can be seen that although &gt; the total capacity of the TF card is 16GB (displayed as &gt; 14.84GiB in GParted), the rootfs partition (/dev/ sdc1) Only &gt; 4.05GiB is actually allocated, leaving 10.79GiB unallocated</p></li></ol>
</li>
<li><p>Then you can insert the TF card with the Linux system burned into the development board to start. When the TF card starts the Linux system for the first time, it will automatically call the '''orangepi-resize-filesystem''' script through the '''orangepi-resize-filesystem.service''' systemd service. Expansion of rootfs partition, '''<span style="color:#FF0000">so there is no need to manually expand it</span>'''</p></li><li><p>After logging in to the system, you can use the '''df -h''' command to check the size of rootfs. If it is consistent with the actual capacity of the TF card, it means that the automatic expansion is running correctly.</p></li>{| class="wikitable" style="width:800px;"|-|<p>orangepi@orangepi:~$ '''df -h'''</p><span style="margin-right: 80px;">Filesystem </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 30px;">Used </span><span style="margin-right: 30px;">Avail</span><span style="margin-right: 50px;">Use% Mounted on</span><br><span style="margin-right: 110px;">udev</span><span style="margin-right: 60px;">430M</span><span style="margin-right: 50px;">0</span><span style="margin-right: 70px;">430M </span><span style="margin-right: 90px;">0% /dev</span><br><span style="margin-right: 100px;">tmpfs </span><span style="margin-right: 50px;">100M </span><span style="margin-right: 30px;">5.6M </span><span style="margin-right: 70px;">95M </span><span style="margin-right: 90px;">6% /run</span><br><span style="margin-right: 25px;color:#FF0000">'''/dev/mmcblk0p1'''</span><span style="margin-right: 50px;color:#FF0000">'''15G'''</span><span style="margin-right: 35px;color:#FF0000">'''915M'''</span><span style="margin-right: 80px;color:#FF0000">'''14G'''</span><span style="margin-right: 90px;color:#FF0000">'''7% /'''</span><br><span style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">500M </span><span style="margin-right: 50px;">0</span><span style="margin-right: 50px;">500M </span><span style="margin-right: 90px;">0% /dev/shm</span><br>|}</ol><ol start="4" style="list-style-type: decimal;"><li><p>After starting the Linux system for the first time, we can also remove the TF card from the development board and reinsert it into the '''<span style="color:#FF0000">Ubuntu computer</span>''', and then use gparted again to check the status of the TF card, as shown in the figure below, rootfs partition (/dev/ The capacity of sdc1) has been expanded to 14.69GiB</p>
orangepi@orangepi<p>[[File:~$ '''df zero2w-h'''img87.png]]</p>
Filesystem Size Used Avail Use% Mounted on{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''It should be noted that the Linux system has only one ext4 format partition and does not use a separate BOOT partition to store files such as kernel images, so there is no problem of BOOT partition expansion.'''</big>|}</li></ol><span id="method-to-prohibit-automatic-expansion-of-rootfs-partition-capacity-in-tf-card"></span>
udev 430M 0 430M 0% /dev
 
tmpfs 100M 5.6M 95M 6% /run
 
'''/dev/mmcblk0p1 15G 915M 14G 7% /'''
 
tmpfs 500M 0 500M 0% /dev/shm
 
<ol start="4" style="list-style-type: decimal;">
<li><p>After starting the Linux system for the first time, we can also remove the TF card from the development board and reinsert it into the '''Ubuntu computer''', and then use gparted again to check the status of the TF card, as shown in the figure below, rootfs partition (/dev/ The capacity of sdc1) has been expanded to 14.69GiB</p>
<p>[[File:zero2w-img87.png]]</p></li></ol>
 
'''It should be noted that the Linux system has only one ext4 format partition and does not use a separate BOOT partition to store files such as kernel images, so there is no problem of BOOT partition expansion.'''
 
<span id="method-to-prohibit-automatic-expansion-of-rootfs-partition-capacity-in-tf-card"></span>
=== Method to prohibit automatic expansion of rootfs partition capacity in TF card ===
<ol style="list-style-type: decimal;">
<li><p>First, burn the Linux image of the development board into the TF card on the '''<span style="color:#FF0000">Ubuntu computer</span>''' (Windows is not available), and '''<span style="color:#FF0000">then unplug and insert the TF card again</span>'''.</p></li>
<li><p>Then the Ubuntu computer will usually automatically mount the partition of the TF card. If the automatic mounting is normal, use the ls command to see the following output.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''ls /media/test/opi_root/'''</p>
<p>bin &nbsp;&nbsp; boot &nbsp;&nbsp; dev &nbsp;&nbsp; etc &nbsp;&nbsp; home &nbsp;&nbsp; lib &nbsp;&nbsp; lost+found &nbsp;&nbsp; media &nbsp;&nbsp; mnt &nbsp;&nbsp; opt &nbsp;&nbsp; proc &nbsp;&nbsp; root &nbsp;&nbsp; run <br> sbin &nbsp;&nbsp; selinux &nbsp;&nbsp; srv &nbsp;&nbsp; sys &nbsp;&nbsp; tmp &nbsp;&nbsp; usr &nbsp;&nbsp; var</p>|}</li>
<li><p>Then switch the current user to the root user on the Ubuntu computer</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''sudo -i'''</p>
<p>[sudo] test 的密码: 的密码:</p><p>root@test:~'''<span style="color:#FF0000">#</span>'''</p>|}</li>
<li><p>Then enter the root directory of the Linux system in the TF card and create a new file named '''.no_rootfs_resize'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@test:~# '''cd /media/test/opi_root/'''</p>
<p>root@test:/media/test/opi_root/# '''cd root'''</p>
<p>root@test:/media/test/opi_root/root# '''touch .no_rootfs_resize'''</p>
<p>root@test:/media/test/opi_root/root# '''ls .no_rootfs*'''</p>
<p>'''.no_rootfs_resize'''</p>|}</li>
<li><p>Then you can uninstall the TF card, then pull out the TF card and insert it into the development board to start. When the Linux system starts, when the '''.no_rootfs_resize''' file is detected in the '''/root''' directory, rootfs will not be automatically expanded.</p></li>
<li><p>After disabling the automatic expansion of rootfs, you can enter the Linux system and you can see that the total capacity of the rootfs partition is only 4GB (the image tested here is the desktop version), which is much smaller than the actual capacity of the TF card, indicating that the automatic expansion of rootfs has been successfully disabled.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''df -h'''</p>
<pspan style="margin-right: 80px;">Filesystem </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 30px;">Used </span><span style="margin-right: 30px;">Avail </span><span style="margin-right: 50px;">Use% Mounted on</pspan><br><pspan style="margin-right: 110px;">udev </span><span style="margin-right: 60px;">925M </span><span style="margin-right: 50px;">0 </span><span style="margin-right: 70px;">925M </span><span style="margin-right: 90px;">0% /dev</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 50px;">199M </span><span style="margin-right: 30px;">3.2M </span><span style="margin-right: 70px;">196M </span><span style="margin-right: 90px;">2% /run</pspan><br><pspan style="margin-right: 25px;color:#FF0000">'''/dev/mmcblk0p1 '''</span><span style="margin-right: 50px;color:#FF0000">'''4.0G '''</span><span style="margin-right: 35px;color:#FF0000">'''3.2G '''</span><span style="margin-right: 80px;color:#FF0000">'''686M '''</span><span style="margin-right: 90px;color:#FF0000">'''83% /'''</pspan><br>|}</li><li><p>If you need to re-expand the capacity of the rootfs partition in the TF card, just execute the following command and then restart the Linux system of the development board.</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </li></olbig> '''Note, please execute the following command under the root user.'''</big>|}{| class="wikitable" style="width:800px;" |-|
root@orangepi:~# '''rm /root/.no_rootfs_resize'''
root@orangepi:~# '''sudo reboot'''
|}
After restarting, enter the Linux system of the development board again and you will see that the rootfs partition has been expanded to the actual capacity of the TF card.
{| class="wikitable" style="width:800px;"|-|<p>root@orangepi:~# $ '''df -h'''</p> <span style="margin-right: 80px;">Filesystem </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 30px;">Used </span><span style="margin-right: 30px;">Avail </span><span style="margin-right: 50px;">Use% Mounted on</span><br> <span style="margin-right: 110px;">udev </span><span style="margin-right: 60px;">925M </span><span style="margin-right: 50px;">0 </span><span style="margin-right: 70px;">925M </span><span style="margin-right: 90px;">0% /dev</span><br> <span style="margin-right: 100px;">tmpfs </span><span style="margin-right: 50px;">199M </span><span style="margin-right: 30px;">3.2M </span><span style="margin-right: 70px;">196M </span><span style="margin-right: 90px;">2% /run</span><br> <span style="margin-right: 25px;color:#FF0000">'''/dev/mmcblk0p1 '''</span><span style="margin-right: 50px;color:#FF0000">'''15G '''</span><span style="margin-right: 35px;color:#FF0000">'''3.2G '''</span><span style="margin-right: 80px;color:#FF0000">'''12G '''</span><span style="margin-right: 90px;color:#FF0000">'''23% /'''</span><br>|}</li></ol><span id="method-to-manually-expand-the-capacity-of-rootfs-partition-in-tf-card"></span>
<span id="method-to-manually-expand-the-capacity-of-rootfs-partition-in-tf-card"></span>
=== Method to manually expand the capacity of rootfs partition in TF card ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''If the total capacity of the TF card is large, such as 128GB, and you do not want the rootfs partition of the Linux system to use all the capacity of the TF card, you only want to allocate a part of the capacity, such as 16GB, to the Linux system, and then the remaining capacity of the TF card can be used for other purposes. use. Then you can use the content introduced in this section to manually expand the capacity of the rootfs partition in TF.'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>First, burn the Linux image of the development board into the TF card on the '''<span style="color:#FF0000">Ubuntu computer</span>''' (Windows is not available), and '''<span style="color:#FF0000">then unplug and insert the TF card again</span>'''.</p></li>
<li><p>Then the Ubuntu computer will usually automatically mount the partition of the TF card. If the automatic mounting is normal, use the ls command to see the following output.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''ls /media/test/opi_root/'''</p>
<p>bin &nbsp;&nbsp; boot &nbsp;&nbsp; dev &nbsp;&nbsp; etc &nbsp;&nbsp; home &nbsp;&nbsp; lib &nbsp;&nbsp; lost+found &nbsp;&nbsp; media &nbsp;&nbsp; mnt &nbsp;&nbsp; opt &nbsp;&nbsp; proc &nbsp;&nbsp; root &nbsp;&nbsp; run <br> sbin &nbsp;&nbsp; selinux &nbsp;&nbsp; srv &nbsp;&nbsp; sys &nbsp;&nbsp; tmp &nbsp;&nbsp; usr &nbsp;&nbsp; var</p>|}</li>
<li><p>Then switch the current user to the root user on the Ubuntu computer</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''sudo -i'''</p>
<p>[sudo] test 的密码: 的密码:</p><p>root@test:~'''<span style="color:#FF0000">#</span>'''</p>|}</li>
<li><p>Then enter the root directory of the Linux system in the TF card and create a new file named '''.no_rootfs_resize'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@test:~# '''cd /media/test/opi_root/'''</p>
<p>root@test:/media/test/opi_root/# '''cd root'''</p>
<p>root@test:/media/test/opi_root/root# '''touch .no_rootfs_resize'''</p>
<p>root@test:/media/test/opi_root/root# '''ls .no_rootfs*'''</p>
<p>'''.no_rootfs_resize'''</p>|}</li></ol>
<!-- -->
<ol start="5" style="list-style-type: decimal;">
<li><p>Then install the gparted software on your Ubuntu computer</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo apt install -y gparted'''</p>|}</li>
<li><p>Then open gparted</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo gparted'''</p>|}</li>
<li><p>After opening gparted, you can select the TF card in the upper right corner, and then you can see the usage of the TF card capacity. The picture below shows the situation of the TF card after burning the Linux desktop system. It can be seen that although the total capacity of the TF card is 16GB (displayed as 14.84GiB in GParted), the rootfs partition (/dev/sdc1) Only 4.05GiB is actually allocated, leaving 10.79GiB unallocated</p>
<p>[[File:zero2w-img86.png]]</p></li>
<li><p>After setting the capacity, click '''Resize/Move''' in the lower right corner.</p>
<p>[[File:zero2w-img93.png]]</p></li>
<li><p>After final confirmation, click the green '''<span style="color:green"></span>''' shown in the picture below.</p>
<p>[[File:zero2w-img94.png]]</p></li>
<li><p>Then select '''Apply''', and the capacity expansion of the rootfs partition will officially begin.</p>
<p>[[File:zero2w-img96.png]]</p></li>
<li><p>Then you can unplug the TF card and insert it into the development board to start. After entering the Linux system of the development board, if you use the '''df -h''' command to see that the size of the rootfs partition is consistent with the size set previously, it means manual Expansion successful</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~# '''df -h'''</p>
<pspan style="margin-right: 80px;">Filesystem </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 30px;">Used </span><span style="margin-right: 30px;">Avail </span><span style="margin-right: 50px;">Use% Mounted on</pspan><br><pspan style="margin-right: 110px;">udev </span><span style="margin-right: 60px;">925M </span><span style="margin-right: 50px;">0 </span><span style="margin-right: 70px;">925M </span><span style="margin-right: 90px;">0% /dev</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 50px;">199M </span><span style="margin-right: 30px;">3.2M </span><span style="margin-right: 70px;">196M </span><span style="margin-right: 90px;">2% /run</pspan><br><pspan style="margin-right: 25px;color:#FF0000">'''/dev/mmcblk0p1 '''</span><span style="margin-right: 50px;color:#FF0000">'''7.7G '''</span><span style="margin-right: 35px;color:#FF0000">'''3.2G '''</span><span style="margin-right: 80px;color:#FF0000">'''4.4G '''</span><span style="margin-right: 90px;color:#FF0000">'''42% /'''</pspan><br>|}</li></ol>
<span id="method-to-reduce-the-capacity-of-rootfs-partition-in-tf-card"></span>
 
=== Method to reduce the capacity of rootfs partition in TF card ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''After configuring the application or other development environment in the Linux system of the TF card, if you want to back up the Linux system in the TF card, you can use the method in this section to reduce the size of the rootfs partition first, and then start the backup.'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>First, insert the TF card you want to operate on your '''<span style="color:#FF0000">Ubuntu computer</span>''' (not Windows)</p></li>
<li><p>Then install the gparted software on your Ubuntu computer</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo apt install -y gparted'''</p>|}</li>
<li><p>Then open gparted</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo gparted'''</p>|}</li>
<li><p>After opening gparted, you can select the TF card in the upper right corner, and then you can see the usage of the TF card capacity.</p>
<p>[[File:zero2w-img97.png]]</p></li>
<li><p>After setting the capacity, click '''Resize/Move''' in the lower right corner.</p>
<p>[[File:zero2w-img93.png]]</p></li>
<li><p>After final confirmation, click the green '''<span style="color:green"></span>''' as shown in the picture below.</p>
<p>[[File:zero2w-img94.png]]</p></li>
<li><p>Then select '''Apply''', and the capacity expansion of the rootfs partition will officially begin.</p>
<p>[[File:zero2w-img96.png]]</p></li>
<li><p>Then you can unplug the TF card and insert it into the development board to start. After entering the Linux system of the development board, if you use the '''df -h''' command, you can see that the size of the rootfs partition is consistent with the size set previously, which means it has been reduced capacity success</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~# '''df -h'''</p>
<pspan style="margin-right: 80px;">Filesystem </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 30px;">Used </span><span style="margin-right: 30px;">Avail </span><span style="margin-right: 50px;">Use% Mounted on</pspan><br><pspan style="margin-right: 110px;">udev </span><span style="margin-right: 60px;">925M </span><span style="margin-right: 50px;">0 </span><span style="margin-right: 70px;">925M </span><span style="margin-right: 90px;">0% /dev</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 50px;">199M </span><span style="margin-right: 30px;">3.2M </span><span style="margin-right: 70px;">196M </span><span style="margin-right: 90px;">2% /run</pspan><br><pspan style="margin-right: 25px;color:#FF0000">'''/dev/mmcblk0p1 '''</span><span style="margin-right: 50px;color:#FF0000">'''7.7G '''</span><span style="margin-right: 35px;color:#FF0000">'''3.2G '''</span><span style="margin-right: 80px;color:#FF0000">'''4.4G '''</span><span style="margin-right: 90px;color:#FF0000">'''42% /'''</pspan><br>|}</li></ol>
<span id="pin-expansion-board-interface-pin-description"></span>
 
== 24Pin expansion board interface pin description ==
[[File:zero2w-img105.png]]
</div></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
| style="width:50px;" | 1| style="width:200px;" | 100M network port
| Used to connect to a wired network to access the Internet
|-
| The default settings of the Linux system are KEY_1 (Number 1 key) and KEY_ENTER (Enter key), which can be customized as other function keys by modifying the dts configuration.
|}
</ol>
<ol start="5" style="list-style-type: decimal;">
<li>The adaptation of Linux5.4 and Linux6.1 systems to expansion boards is shown in the following table</li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''24pin expansion board function'''
|-
| '''TV-OUT'''
| '''<span style="color:#FF0000">NO</span>'''| '''<span style="color:#FF0000">NO</span>'''
|}
</ol>
<span id="how-to-use-the-two-lradc-buttons-on-the-24pin-expansion-board"></span>
<span id="how-to-use-the-two-lradc-buttons-on-the-24pin-expansion-board"></span>
== How to use the two LRADC buttons on the 24pin expansion board ==
<li><p>There are two LRADC buttons on the 24pin expansion board, and their locations are as shown in the figure below:</p>
<p>[[File:zero2w-img106.png]]</p></li>
<li><p>In the Linux system, the default key values of KEY1 and KEY2 are</p></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''Linux kernel'''
| '''KEY_ENTER, the enter key'''
|}
</ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>Through the '''evtest''' command, we can check the key values reported after KEY1 and KEY2 are pressed.</p>
<ol style="list-style-type: lower-alpha;">
<li><p>linux5.4</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepizero2w:~$ '''evtest'''</p>
<p>No device specified, trying to scan all of /dev/input/event*</p>
<p>Not running as root, no devices may be available.</p>
<p>Available devices:</p>
<p>'''/dev/input/event0event<span style="color: #FF0000">0</span>: <span style="color:#FF0000">sunxi-keyboard</span>'''</p>
<p>/dev/input/event1: sunxi-ir</p>
<p>/dev/input/event2: axp2101-pek</p>
<p>/dev/input/event6: PixArt USB Optical Mouse</p>
<p>/dev/input/event7: BRLTTY 6.3 Linux Screen Driver Keyboard</p>
<p>Select the device event number [0-7]: '''<span style="color:#FF0000">0 </span> #You need to enter the serial number corresponding to sunxi-keyboard'''</p>
<p>Input driver version is 1.0.1</p>
<p>Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100</p>
<p>Input device name: &quot;sunxi-keyboard&quot;</p>
<p>Supported events:</p>
:<p>Event type 0 (EV_SYN)</p>:<p>Event type 1 (EV_KEY)</p>::<p>Event code 2 (KEY_1)</p>::<p>Event code 28 (KEY_ENTER)</p>
<p>Properties:</p>
<p>Testing ... (interrupt to exit)</p>
 
 
<p>'''#The following are the key values reported after pressing KEY1 and KEY2'''</p>
 
 
<p>Event: time 1693555298.132314, type 1 (EV_KEY), code 2 (KEY_1), value 1</p>
<p>Event: time 1693555298.132314, -------------- SYN_REPORT ------------</p>
<p>Event: time 1693555298.601042, -------------- SYN_REPORT ------------</p>
<p>Event: time 1693555298.710415, type 1 (EV_KEY), code 28 (KEY_ENTER), value 0</p>
<p>Event: time 1693555298.710415, -------------- SYN_REPORT ------------</p>|}</li>
<li><p>linux6.1</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepizero2w:~$ evtest</p>
<p>No device specified, trying to scan all of /dev/input/event*</p>
<p>Available devices:</p>
<p>/dev/input/event0: axp20x-pek</p>
<p>'''/dev/input/event1event<span style="color: #FF0000">1</span>: <span style="color:#FF0000">5070800.lradc</span>'''</p>
<p>/dev/input/event2: SONiX USB Keyboard</p>
<p>/dev/input/event3: SONiX USB Keyboard Consumer Control</p>
<p>/dev/input/event5: PixArt USB Optical Mouse</p>
<p>/dev/input/event6: sunxi-ir</p>
<p>Select the device event number [0-6]: '''<span style="color:#FF0000">1 </span> #You need to enter the serial number corresponding to 5070800.lradc'''</p>
<p>Input driver version is 1.0.1</p>
<p>Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100</p>
<p>Input device name: &quot;5070800.lradc&quot;</p>
<p>Supported events:</p>
:<p>Event type 0 (EV_SYN)</p>:<p>Event type 1 (EV_KEY)</p>::<p>Event code 2 (KEY_1)</p>::<p>Event code 28 (KEY_ENTER)</p>
<p>Properties:</p>
<p>Testing ... (interrupt to exit)</p>
 
 
<p>'''#The following are the key values reported after pressing KEY1 and KEY2'''</p>
 
 
<p>Event: time 1694075818.810877, type 1 (EV_KEY), code 2 (KEY_1), value 1</p>
<p>Event: time 1694075818.810877, -------------- SYN_REPORT ------------</p>
<p>Event: time 1694075819.536128, -------------- SYN_REPORT ------------</p>
<p>Event: time 1694075819.705009, type 1 (EV_KEY), code 28 (KEY_ENTER), value 0</p>
<p>Event: time 1694075819.705009, -------------- SYN_REPORT ------------</p>|}</li></ol>
</li>
<li><p>If you need to modify the key values reported after KEY1 and KEY2 are pressed, you can use the following method:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>There is a '''sun50i-h618-lradc-keys.dts''' file under the &gt; '''/usr/src/''' path, through which we can define KEY1 and KEY2 &gt; as the desired key values.</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepizero2w:~$ '''cd /usr/src/'''</p>
<p>orangepi@orangepizero2w:/usr/src$ '''ls *.dts'''</p>
<p>sun50i-h618-lradc-keys.dts</p>|}</li><li><p>The contents of the '''sun50i-h618-lradc-keys.dts''' file in the &gt; linux5.4 system are as follows:</p><ol style="list-style-type: lower-alphanone;"><li><p>a) KEY1 correspondence: modify '''key0 = &lt;600 2&gt;;''' where 2 is &gt; the number corresponding to the desired key value</p></li><li><p>b) KEY2 correspondence: modify '''key1 = &lt;800 28&gt;;''' where 28 &gt; is the number corresponding to the desired key value</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepizero2w:/usr/src$ '''sudo vim sun50i-h618-lradc-keys.dts'''</p>
<p>/dts-v1/;</p>
<p>/plugin/;</p>
 
 
<p>/ {</p>
:<p>fragment@0 {</p>::<p>target = &lt;&amp;keyboard&gt;;</p>  ::<p>__overlay__ {</p>:::<p>status = &quot;okay&quot;;</p>  :::<p>'''key0 = &lt;600 <span style="color:#FF0000">2</span>&gt;;'''</p>:::<p>'''key1 = &lt;800 <span style="color:#FF0000">28</span>&gt;;'''</p>::<p>};</p>:<p>};</p>
<p>};</p>
<p>|};</p><p>};</p></li></ol>
</li>
<li><p>The contents of the c.linux6.1 system &gt; '''sun50i-h618-lradc-keys.dts''' file are as follows:</p><ol style="list-style-type: lower-alphanone;"><li><p>a) KEY1 corresponding: modify '''linux,code = &lt;2&gt;;''' the 2 in &gt; it is the number corresponding to the desired key value</p></li><li><p>b) KEY2 correspondence: modify '''linux,code = &lt;28&gt;;''' the 28 &gt; in it is the number corresponding to the desired key value</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepizero2w:/usr/src$ '''sudo ''' '''vim ''' '''sun50i-h618-lradc-keys.dts'''</p>
<p>/dts-v1/;</p>
<p>/plugin/;</p>
 
 
<p>/ {</p>
:<p>fragment@0 {</p>::<p>target = &lt;&amp;r_lradc&gt;;</p>  ::<p>__overlay__ {</p>:::<p>status = &quot;okay&quot;;</p>  :::<p>button-500 {</p>::::<p>label = &quot;KEY_1&quot;;</p>::::<p>'''linux,code = &lt;<span style="color:#FF0000">2</span>&gt;;'''</p>:::<p>};</p>  :::<p>button-800 {</p>::::<p>label = &quot;KEY_ENTER&quot;;</p>::::<p>'''linux,code = &lt;<span style="color:#FF0000">28</span>&gt;;'''</p>:::<p>};</p>::<p>};</p>:<p>};</p>
<p>};</p>
<p>button-800 {</p><p>label = &quot;KEY_ENTER&quot;;</p><p>'''linux,code = &lt;28&gt;;'''</p><p>};</p><p>};</p><p>|};</p><p>};</p></li></ol>
</li>
<li><p>For the key values that can be set, please refer to the macro &gt; definition in the '''input-event-codes.h''' header file. Its &gt; path in the kernel source code is:</p>{| class="wikitable" style="width:800px;" |-|
<p>orange-pi-5.4-sun50iw9/include/uapi/linux/input-event-codes.h</p>
<p>orange-pi-6.1-sun50iw9/include/uapi/linux/input-event-codes.h</p>|}</li><li><p>After modification, use the '''orangepi-add-overlay''' command to &gt; add the sun50i-h618-lradc-keys.dts configuration to the &gt; system.</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepizero2w:/usr/src$ '''sudo orangepi-add-overlay sun50i-h618-lradc-keys.dts'''</p>
<p>Compiling the overlay</p>
<p>Copying the compiled overlay file to /boot/overlay-user/</p>
<p>Reboot is required to apply the changes</p>|}</li><li><p>Then restart the system and the customized key values will take &gt; effect.</p></li></ol>
</li></ol>
<span id="network-connection-test"></span>
 
== Network connection test ==
<p>[[File:zero2w-img107.png]]</p></li>
<li><p>Then plug one end of the network cable into the Ethernet interface of the expansion board, and the other end of the network cable into the router, and make sure the network is smooth.</p></li>
<li><p>After the system starts, it will automatically assign an IP address to the Ethernet card through '''DHCP''', '''<span style="color:#FF0000">and no other configuration is required.</span>'''</p></li>
<li><p>The command to view the IP address in the Linux system of the development board is as follows:</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Please do not copy the following commands. For example, the network node name in debian12 is end0, and the following command needs to be modified to ip a s end0.'''</p></big>|}{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''ip a s eth0'''</p>
<p>3: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 5e:ac:14:a5:93:b3 brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.16</span>'''/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0</p>::<p>valid_lft 259174sec preferred_lft 259174sec</p>:<p>inet6 240e:3b7:3240:c3a0:e269:8305:dc08:135e/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259176sec preferred_lft 172776sec</p>:<p>inet6 fe80::957d:bbbd:4928:3604/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''There are three ways to check the IP address after the development board is started:'''</p>
<p>'''1. Connect the HDMI display, then log in to the system and use the ip a s eth0 command to check the IP address.'''</p>
<p>'''2. Enter the ip a s eth0 command in the debugging serial terminal to view the IP address.'''</p>
<p>'''3. If there is no debugging serial port or HDMI display, you can also check the IP address of the development board's network port through the router's management interface. However, with this method, people often fail to see the IP address of the development board. If you can't see it, here's how to debug it:'''</p>
:<p>'''A) First check whether the Linux system has started normally. If the green light of the development board flashes, it usually means that it has started normally. If only the red light is on, or the red and green lights are not on, it means that the system has not started normally;'''</p>:<p>'''B) Check whether the network cable is plugged in tightly, or try another network cable;'''</p>:<p>'''C) Try another router (I have encountered many problems with routers, such as the router being unable to assign an IP address normally, or the IP address being assigned normally but not being visible in the router);'''</p>:<p>'''D) If there is no router to replace, you can only connect an HDMI display or use the debugging serial port to check the IP address.'''</p>  <p>'''In addition, it should be noted that the development board's DHCP automatic allocation of IP addresses does not require any settings.'''</p></big>|}</li>
<li><p>The command to test network connectivity is as follows. The '''ping''' command can be interrupted by pressing the '''Ctrl+C''' shortcut key.</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Please do not copy the following commands. For example, the network node name in debian12 is end0. The following command needs to be modified to ping www.baidu.com -I end0.'''</p></big>|}{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''ping www.baidu.com -I eth0'''</p>
<p>PING www.a.shifen.com (14.215.177.38) from 192.168.1.12 eth0: 56(84) bytes of data.</p>
<p>--- www.a.shifen.com ping statistics ---</p>
<p>4 packets transmitted, 4 received, 0% packet loss, time 3002ms</p>
<p>rtt min/avg/max/mdev = 6.260/6.770/7.275/0.373 ms</p>|}</li></ol>
<span id="wifi-connection-test"></span>
 
=== WIFI connection test ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Please do not connect to WIFI by modifying the /etc/network/interfaces configuration file. There will be problems in connecting to the WIFI network in this way.'''</big>|}
<span id="server-version-image-connects-to-wifi-through-commands"></span>
==== Server version image connects to WIFI through commands ====
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''When the development board is not connected to Ethernet or HDMI display, but only to the serial port, it is recommended to use the commands demonstrated in this section to connect to the WIFI network. Because nmtui can only display characters in some serial port software (such as minicom) and cannot display the graphical interface normally. Of course, if the development board is connected to an Ethernet or HDMI display, you can also use the commands demonstrated in this section to connect to the WIFI network.'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>First log in to the Linux system, there are three ways:</p>
<p>a. If the development board is connected to a network cable, you can remotely log in to '''[[\lOrange Pi Zero 2W#SSH remote login development board|the Linux system through ssh]].'''</p>
<p>b. If the development board is connected to the debugging serial port, you can use the serial port terminal to log in to the Linux system.</p>
<p>c. If the development board is connected to an HDMI display, you can log in to the Linux system through the HDMI display terminal.</p></li></ol>
<!-- --><ol start="2" style="list-style-type: decimal;">
<li><p>First use the '''nmcli dev wifi''' command to scan the surrounding WIFI hotspots</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''nmcli dev wifi'''</p>
|}
<div class="figure">
<li><p>Then use the '''nmcli''' command to connect to the scanned WIFI hotspot, where:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''wifi_name''' needs to be replaced with the name of the WIFI &gt; hotspot you want to connect to</p></li><li><p>'''wifi_passwd''' needs to be replaced with the password of the &gt; WIFI hotspot you want to connect to.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo nmcli dev wifi connect <span style="color:#FF0000">wifi_name </span> password <span style="color:#FF0000">wifi_passwd</span>'''</p><p>Device 'wlan0' successfully activated with 'cf937f88-ca1e-4411-bb50-61f402eef293'.</p>|}</li></ol>
</li>
<li><p>You can check the IP address of the wifi through the '''ip addr show wlan0''' command</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ip a s wlan0'''</p>
<p>11: wlan0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 23:8c:d6:ae:76:bb brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.11</span>'''/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0</p>::<p>valid_lft 259192sec preferred_lft 259192sec</p>:<p>inet6 240e:3b7:3240:c3a0:c401:a445:5002:ccdd/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259192sec preferred_lft 172792sec</p>:<p>inet6 fe80::42f1:6019:a80e:4c31/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}</li>
<li><p>Use the '''ping''' command to test the connectivity of the wifi network. The '''ping''' command can be interrupted by pressing the '''Ctrl+C''' shortcut key.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ping www.orangepi.org -I wlan0'''</p>
<p>PING www.orangepi.org (182.92.236.130) from 192.168.1.49 wlan0: 56(84) bytes of data.</p>
<p>--- www.orangepi.org ping statistics ---</p>
<p>5 packets transmitted, 5 received, 0% packet loss, time 4006ms</p>
<p>rtt min/avg/max/mdev = 41.321/44.864/48.834/2.484 ms</p>|}</li></ol>
<span id="server-version-image-connects-to-wifi-graphically"></span>
 
==== Server version image connects to WIFI graphically ====
<ol style="list-style-type: decimal;">
<li><p>First log in to the Linux system, there are three ways:</p>
<p>a. If the development board is connected to a network cable, you can remotely log in to '''[[\lOrange Pi Zero 2W#SSH remote login development board|the Linux system through ssh]].'''</p>
<p>b. If the development board is connected to the debugging serial port, you can use the serial port terminal to log in to the Linux system (please use MobaXterm for the serial port software, the graphical interface cannot be displayed using minicom)</p>
<p>c. If the development board is connected to an HDMI display, you can log in to the Linux system through the HDMI display terminal.</p></li>
<li><p>Then enter the nmtui command in the command line to open the wifi connection interface</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo nmtui'''</p>|}</li>
<li><p>Enter the nmtui command to open the interface as shown below</p>
<p>[[File:zero2w-img109.png]]</p></li>
</div></li>
<li><p>You can check the IP address of the wifi through the '''ip a s wlan0''' command</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ip a s wlan0'''</p>
<p>11: wlan0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 24:8c:d3:aa:76:bb brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.11</span>'''/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0</p>::<p>valid_lft 259069sec preferred_lft 259069sec</p>:<p>inet6 240e:3b7:3240:c4a0:c401:a445:5002:ccdd/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259071sec preferred_lft 172671sec</p>:<p>inet6 fe80::42f1:6019:a80e:4c31/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}</li>
<li><p>Use the '''ping''' command to test the connectivity of the wifi network. The '''ping''' command can be interrupted by pressing the '''Ctrl+C''' shortcut key.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ping www.orangepi.org -I wlan0'''</p>
<p>PING www.orangepi.org (182.92.236.130) from 192.168.1.49 wlan0: 56(84) bytes of data.</p>
<p>--- www.orangepi.org ping statistics ---</p>
<p>5 packets transmitted, 5 received, 0% packet loss, time 4006ms</p>
<p>rtt min/avg/max/mdev = 41.321/44.864/48.834/2.484 ms</p>|}</li></ol>
<span id="test-method-for-desktop-image"></span>
 
==== Test method for desktop image ====
<span id="method-to-create-wifi-hotspot-through-create_ap"></span>
 
=== Method to create WIFI hotspot through create_ap ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''create_ap is a script that helps quickly create WIFI hotspots on Linux, and supports bridge and NAT modes. It can automatically combine hostapd, dnsmasq and iptables to complete the setting of WIFI hotspots, avoiding users from complicated configurations. The github address is as follows: '''
[https://github.com/oblique/create_ap '''https://github.com/oblique/create_ap''']</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''The Linux image released by OPi has been pre-installed with the create_ap script. You can use the create_ap command to create a WIFI hotspot. The basic command format of create_ap is as follows: '''
'''The Linux image released by OPi has been pre-installed with the create_ap script. You can use the create_ap command to create a WIFI hotspot. The basic command format of create_ap is as follows: '''
'''create_ap [options] &lt;wifi-interface&gt; [&lt;interface-with-internet&gt;] [&lt;access-point-name&gt; [&lt;passphrase&gt;]]'''
 
'''* options: You can use this parameter to specify the encryption method, frequency band of WIFI hotspot, bandwidth mode, network sharing method, etc. You can get the options through create_ap -h.'''
'''* access-point-name: Hotspot name'''
'''* passphrase: hotspot password'''</big>|}
<span id="create_ap-method-to-create-wifi-hotspot-in-nat-mode"></span>
<ol style="list-style-type: decimal;">
<li><p>Enter the following command to create a WIFI hotspot with the name '''orangepi''' and password '''orangepi''' in NAT mode</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0'''</p></li></olbig>|}{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 eth0 orangepi orangepi --no-virt'''
|}
</li></ol>
<ol start="2" style="list-style-type: decimal;">
<li><p>If the following information is output, it means that the WIFI hotspot is successfully created.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 eth0 orangepi orangepi --no-virt'''</p>
<p>Config dir: /tmp/create_ap.wlan0.conf.TQkJtsz1</p>
<p>wlan0: STA ce:bd:9a:dd:a5:86 RADIUS: starting accounting session D4FBF7E5C604F169</p>
<p>wlan0: STA ce:bd:9a:dd:a5:86 WPA: pairwise key handshake completed (RSN)</p>
<p>wlan0: EAPOL-4WAY-HS-COMPLETED ce:bd:9a:dd:a5:86</p>|}</li>
<li><p>At this time, take out your mobile phone and find the WIFI hotspot named '''orangepi''' created by the development board in the searched WIFI list. Then you can click '''orangepi''' to connect to the hotspot. The password is '''orangepi''' set above.</p>
<div class="figure">
</div></li>
<li><p>In NAT mode, the wireless device connected to the development board's hotspot requests an IP address from the development board's DHCP service, so there will be two different network segments. For example, the development board's IP here is 192.168.1.X</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0.'''</p></big>|}{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo ifconfig eth0'''</p>
<p>eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500</p>
::<p>inet '''<span style="color:#FF0000">192.168.1.150</span>''' netmask 255.255.255.0 broadcast 192.168.1.255</p>::<p>inet6 fe80::938f:8776:5783:afa2 prefixlen 64 scopeid 0x20&lt;link&gt;</p>::<p>ether 4a:a0:c8:25:42:82 txqueuelen 1000 (Ethernet)</p>::<p>RX packets 25370 bytes 2709590 (2.7 MB)</p>::<p>RX errors 0 dropped 50 overruns 0 frame 0</p>::<p>TX packets 3798 bytes 1519493 (1.5 MB)</p>::<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p>::<p>device interrupt 83</p>|}
<p>The DHCP service of the development board will assign the IP address of '''192.168.12.0/24''' to the device connected to the hotspot by default. At this time, click on the connected WIFI hotspot '''orangepi''', and then you can see that the IP address of the mobile phone is '''192.168.12.X'''.</p>
<div class="figure">
</div></li>
<li><p>If you want to specify a different network segment for the connected device, you can specify it through the -g parameter. For example, use the -g parameter to specify the network segment of the access point AP as 192.168.2.1.</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </li></olbig> '''Note that in the following command, Debian12 needs to modify eth0 to end0.'''</big>|}{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 eth0 orangepi orangepi -g 192.168.2.1 --no-virt'''
|}
At this time, after connecting to the hotspot through the mobile phone, click on the connected WIFI hotspot '''orangepi''', and then you can see that the IP address of the mobile phone is '''192.168.2.X'''
</div>
</li></ol>
<ol start="7" style="list-style-type: decimal;">
<li><p>Without specifying the '''--freq-band''' parameter, the hotspot created by default is in the 2.4G frequency band. If you want to create a hotspot in the 5G frequency band, you can specify it through the '''--freq-band 5''' parameter. The specific command is as follows</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0'''</p></li></olbig>|}{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 eth0 orangepi orangepi --freq-band 5 --no-virt'''
|}
</li></ol>
<ol start="8" style="list-style-type: decimal;">
<li><p>If you need to hide the SSID, you can specify the '''--hidden''' parameter. The specific command is as follows</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0.'''</p></li></olbig>|}{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 eth0 orangepi orangepi --hidden --no-virt'''
|}
At this time, the mobile phone cannot search for WIFI hotspots. You need to manually specify the WIFI hotspot name and enter the password to connect to the WIFI hotspot.
</div>
</li></ol>
<span id="create_ap-method-to-create-wifi-hotspot-in-bridge-mode"></span>
 
==== create_ap method to create WIFI hotspot in bridge mode ====
<ol style="list-style-type: decimal;">
<li><p>Enter the following command to create a WIFI hotspot with the name '''orangepi''' and password '''orangepi''' in bridge mode</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0.'''</p></li></olbig>|}{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo create_ap -m bridge wlan0 eth0 orangepi orangepi --no-virt'''
|}
</li></ol>
<ol start="2" style="list-style-type: decimal;">
<li><p>If the following information is output, it means that the WIFI hotspot is successfully created.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo create_ap -m bridge wlan0 eth0 orangepi orangepi --no-virt'''</p>
<p>Config dir: /tmp/create_ap.wlan0.conf.zAcFlYTx</p>
<p>wlan0: STA ce:bd:9a:dd:a5:86 RADIUS: starting accounting session 937BF40E51897A7B</p>
<p>wlan0: STA ce:bd:9a:dd:a5:86 WPA: pairwise key handshake completed (RSN)</p>
<p>wlan0: EAPOL-4WAY-HS-COMPLETED ce:bd:9a:dd:a5:86</p>|}</li>
<li><p>At this time, take out your mobile phone and find the WIFI hotspot named '''orangepi''' created by the development board in the searched WIFI list. Then you can click '''orangepi''' to connect to the hotspot. The password is '''orangepi''' set above.</p>
<div class="figure">
</div></li>
<li><p>In bridge mode, the wireless device connected to the hotspot of the development board also requests an IP address from the DHCP service of the main router (the router to which the development board is connected). For example, the IP of the development board here is '''192.168.1.X'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo ifconfig eth0'''</p>
<p>eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500</p>
::<p>inet '''<span style="color:#FF0000">192.168.1.150</span>''' netmask 255.255.255.0 broadcast 192.168.1.255</p>::<p>inet6 fe80::938f:8776:5783:afa2 prefixlen 64 scopeid 0x20&lt;link&gt;</p>::<p>ether 4a:a0:c8:25:42:82 txqueuelen 1000 (Ethernet)</p>::<p>RX packets 25370 bytes 2709590 (2.7 MB)</p>::<p>RX errors 0 dropped 50 overruns 0 frame 0</p>::<p>TX packets 3798 bytes 1519493 (1.5 MB)</p>::<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p>::<p>device interrupt 83</p>|}
<p>The IP of the device connected to the WIFI hotspot is also assigned by the main router, so the mobile phone connected to the WIFI hotspot and the development board are in the same network segment. At this time, click on the connected WIFI hotspot '''orangepi''', and then you can see the IP address of the mobile phone. Also '''192.168.1.X'''.</p>
<div class="figure">
</div></li>
<li><p>Without specifying the '''--freq-band''' parameter, the hotspot created by default is in the 2.4G frequency band. If you want to create a hotspot in the 5G frequency band, you can specify it through the '''--freq-band''' parameter. The specific command is as follows</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0.'''</p></li></olbig>|}{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo create_ap -m bridge wlan0 eth0 orangepi orangepi --freq-band 5 --no-virt'''
|}
</li></ol>
<ol start="7" style="list-style-type: decimal;">
<li><p>If you need to hide the SSID, you can specify the '''--hidden''' parameter. The specific command is as follows</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0.'''</p></li></olbig>|}{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo create_ap -m bridge wlan0 eth0 orangepi orangepi --hidden --no-virt'''
|}
At this time, the mobile phone cannot search for WIFI hotspots. You need to manually specify the WIFI hotspot name and enter the password to connect to the WIFI hotspot.
</div>
</li></ol>
<span id="how-to-set-a-static-ip-address"></span>
 
=== How to set a static IP address ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Please do not set a static IP address by modifying the /etc/network/interfaces configuration file.'''</big>|}
<span id="use-the-nmtui-command-to-set-a-static-ip-address"></span>
<ol style="list-style-type: decimal;">
<li><p>First run the '''nmtui''' command</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo nmtui'''</p>|}</li>
<li><p>Then select '''Edit a connection''' and press the Enter key</p>
<p>[[File:zero2w-img124.png]]</p></li>
<li><p>Then press Enter. After pressing Enter, the following setting interface will pop up.</p>
<p>[[File:zero2w-img131.png]]</p></li>
<li><p>Then you can set the IP address (Addresses), gateway (Gateway) and DNS server address as shown in the figure below (there are many other setting options, please explore by yourself), <span style="color:#FF0000">please set according to your specific needs. The values set in the image below are just an example</span></p>
<p>[[File:zero2w-img132.png]]</p></li>
<li><p>After setting, move the cursor to '''&lt;OK&gt;''' in the lower right corner, and then press Enter to confirm.</p>
<p>[[File:zero2w-img138.png]] [[File:zero2w-img139.png]]</p></li>
<li><p>Then through '''ip a s eth0''' you can see that the IP address of the network port has become the static IP address set previously.</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0.'''</p></big>|}{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''ip a s eth0'''</p>
<p>3: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 5e:ac:14:a5:92:b3 brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.177</span>'''/24 brd 192.168.1.255 scope global noprefixroute eth0</p>::<p>valid_lft forever preferred_lft forever</p>:<p>inet6 241e:3b8:3240:c3a0:e269:8305:dc08:135e/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259149sec preferred_lft 172749sec</p>:<p>inet6 fe80::957d:bbbe:4928:3604/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}</li>
<li><p>Then you can test the network connectivity to check whether the IP address is configured OK. The '''ping''' command can be interrupted by using the '''Ctrl+C''' shortcut key.</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that in the following command, Debian12 needs to modify eth0 to end0.'''</p></big>|}{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''ping 192.168.1.177 -I eth0'''</p>
<p>PING 192.168.1.47 (192.168.1.47) from 192.168.1.188 eth0: 56(84) bytes of data.</p>
<p>--- 192.168.1.47 ping statistics ---</p>
<p>5 packets transmitted, 5 received, 0% packet loss, time 4042ms</p>
<p>rtt min/avg/max/mdev = 0.233/0.262/0.275/0.015 ms</p>|}</li></ol>
<span id="use-nmcli-command-to-set-static-ip-address"></span>
 
==== Use nmcli command to set static IP address ====
<li><p>Then you can view the name of the network device through the '''nmcli con show''' command, as shown below</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''orangepi''' is the name of the WIFI network interface (the &gt; names are not necessarily the same)</p></li>
<li><p>'''Wired connection 1''' is the name of the Ethernet interface</p>
<p>{| class="wikitable" style="width:800px;"|-|orangepi@orangepi:~$ '''nmcli con show'''</pbr><pspan style="margin-right: 180px;">NAME </span><span style="margin-right: 260px;">UUID </span><span style="margin-right: 45px;">TYPE </span><span style="margin-right: 50px;">DEVICE</pspan><br><pspan style="margin-right: 125px;">'''orangepi''' </span><span style="margin-right: 70px;">cfc4f922-ae48-46f1-84e1-2f19e9ec5e2a </span><span style="margin-right: 50px;">wifi </span><span style="margin-right: 50px;">wlan0</pspan><br><pspan style="margin-right: 50px;">'''Wired connection 1''' </span><span style="margin-right: 50px;">9db058b7-7701-37b8-9411-efc2ae8bfa30 </span><span style="margin-right: 30px;">ethernet </span><span style="margin-right: 50px;">eth0</pspan><br>|}</li></ol>
</li>
<li><p>中Then enter the following command, where</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''&quot;Wired connection 1&quot;''' means setting the static IP address &gt; of the Ethernet port. If you need to set the static IP address &gt; of WIFI, please change it to the name corresponding to the &gt; WIFI network interface (can be obtained through the '''nmcli &gt; con show''' command)</p></li><li><p>'''ipv4.addresses''' is followed by the static IP address to be &gt; set, which can be modified to the value you want to set.</p></li>
<li><p>'''ipv4.gateway''' represents the address of the gateway</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo nmcli con mod &quot;Wired connection 1&quot; \<br />
ipv4.addresses &quot;192.168.1.110&quot; \'''</p>
<p>'''ipv4.gateway &quot;192.168.1.1&quot; \'''</p>
<p>'''ipv4.dns &quot;8.8.8.8&quot; \'''</p>
<p>'''ipv4.method &quot;manual&quot;'''</p>|}</li></ol>
</li>
<li><p>Then restart the linux system</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo reboot'''</p>|}</li>
<li><p>Then re-enter the Linux system and use the '''ip addr show eth0''' command to see that the IP address has been set to the desired value.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ip addr show eth0'''</p>
<p>3: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 5e:ae:14:a5:91:b3 brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.110</span>'''/32 brd 192.168.1.110 scope global noprefixroute eth0</p>::<p>valid_lft forever preferred_lft forever</p>:<p>inet6 240e:3b7:3240:c3a0:97de:1d01:b290:fe3a/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259183sec preferred_lft 172783sec</p>:<p>inet6 fe80::3312:861a:a589:d3c/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}</li></ol>
<span id="how-to-set-up-the-linux-system-to-automatically-connect-to-the-network-for-the-first-time"></span>
 
=== How to set up the Linux system to automatically connect to the network for the first time ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''The development board has an Ethernet port. If you want to remotely log in to the Linux system of the development board through the Ethernet port, you only need to plug in a network cable that can access the Internet normally. After starting the Linux system, it will automatically connect to the Ethernet port through DHCP. Assign an IP address, and then we can obtain the IP address of the Ethernet port through the HDMI screen, serial port, or view the router's background, and then log in to the Linux system remotely.'''
'''The development board also has wireless WIFI. If you want to remotely log in to the Linux system of the development board through WIFI, you need to remotely log in to the Linux system through ssh through the IP address of the Ethernet port and then use commands to connect to WIFI, or use commands on the HDMI screen or serial port. Connect to WIFI.'''
'''But if there is no HDMI screen and serial port module, although there is a network cable, the IP address of the development board cannot be viewed through the router background. Or if there is no HDMI screen, serial port module and network cable, and only WIFI can be connected, you can use the method introduced in this section to automatically connect to WIFI and set the static IP address of WIFI or automatically set the static IP address of the Ethernet port.'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''To use the method in this section, you first need to prepare a Linux system machine. For example, a computer or virtual machine with Ubuntu system installed.'''
'''To use the method in this section, Why do you first need to prepare a Linux system machine? Because the root file system of the Linux system of the development board burned in the TF card is in ext4 format. For example, The Linux system machine can mount it normally and then modify the configuration file in it.'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''If you want to modify it in a computer or virtual machine with Ubuntu Windows system installed, you can use the software Paragon ExtFS for Windows. Since this software requires payment, and there is currently no similar free software that is easy to use, I will not demonstrate it in detail here.'''
'''Why do you need a Linux system machine? Because the root file system of the Linux system of the development board burned in the TF card is in ext4 format. The Linux system machine can mount it normally and then modify the configuration file in it.''' '''If you want to modify it in a Windows system, you can use the software Paragon ExtFS for Windows. Since this software requires payment, and there is currently no similar free software that is easy to use, I will not demonstrate it in detail here.''' '''In addition, if you have any problems when trying to use Paragon ExtFS for Windows, please solve it yourself. We will not answer questions.'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>First burn the Linux image of the development board you want to use into a TF card, and then use a card reader to insert the TF card with the Linux image of the development board into a machine with a Linux system (such as a machine with Ubuntu system Computer, the following uses Ubuntu computer as an example for demonstration)</p></li>
<li><p>When the TF card is inserted into the Ubuntu computer, the Ubuntu computer will generally automatically mount the Linux root file system partition in the TF card. From the following command, we can know that '''/media/test/opi_root''' is the Linux root file in the TF card. System mounting path</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''df -h | grep &quot;media&quot;'''</p>
<p>/dev/sdd1 &nbsp;&nbsp; 1.4G &nbsp;&nbsp; 1.2G &nbsp;&nbsp; 167M &nbsp;&nbsp; 88% '''<span style="color:#FF0000">/media/test/opi_root</span>'''</p>
<p>test@test:~$ '''ls /media/test/opi_root'''</p>
<p>bin &nbsp;&nbsp; boot &nbsp;&nbsp; dev &nbsp;&nbsp; etc &nbsp;&nbsp; home &nbsp;&nbsp; lib &nbsp;&nbsp; lost+found &nbsp;&nbsp; media &nbsp;&nbsp; mnt &nbsp;&nbsp; opt &nbsp;&nbsp; proc &nbsp;&nbsp; root &nbsp;&nbsp; run <br> sbin &nbsp;&nbsp; selinux &nbsp;&nbsp; srv &nbsp;&nbsp; sys &nbsp;&nbsp; tmp &nbsp;&nbsp; usr &nbsp;&nbsp; var</p>|}</li>
<li><p>Then enter the '''/boot''' directory of the Linux system burned in the TF card</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''cd /media/test/opi_root/boot/'''</p>|}</li>
<li><p>Then copy the '''orangepi_first_run.txt.template''' to '''orangepi_first_run.txt'''. Through the orangepi_first_run.txt configuration file, you can set the development board to automatically connect to a WIFI hotspot when the Linux system starts for the first time. You can also set the WIFI or Ethernet port Static IP address.</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:/media/test/opi_root/boot$ '''sudo cp orangepi_first_run.txt.template orangepi_first_run.txt'''</p>|}</li>
<li><p>You can open the orangepi_first_run.txt file through the following command, and then you can view and modify the contents.</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:/media/test/opi_root/boot$ '''sudo vim orangepi_first_run.txt'''</p>|}</li><li><p>Variable usage instructions in the orangepi_first_run.txt file</p><ol style="list-style-type: lower-alpha;"><li><p>'''FR_general_delete_this_file_after_completion''' The variable is &gt; used to set whether to delete the orangepi_first_run.txt file &gt; after the first startup. The default is 1, which means &gt; deletion. If set to 0, orangepi_first_run.txt will be renamed &gt; after the first startup.orangepi_first_run.txt.old, Generally, &gt; just keep the default value</p></li><li><p>'''FR_net_change_defaults''' The variable is used to set whether &gt; to change the default network settings. This must be set to 1, &gt; otherwise all network settings will not take effect.</p></li><li><p>'''FR_net_ethernet_enabled''' The variable is used to control &gt; whether to enable the configuration of the Ethernet port. If &gt; you need to set the static IP address of the Ethernet port, &gt; please set it to 1</p></li><li><p>'''FR_net_wifi_enabled''' The variable is used to control whether &gt; to enable WIFI configuration. If you need to set the &gt; development board to automatically connect to WIFI hotspots, &gt; you must set it to 1. Also please note that if this variable &gt; is set to 1, the Ethernet port settings will be invalid. That &gt; is to say, the WIFI and Ethernet ports cannot be set at the &gt; same time (why, because it is not necessary...)</p></li><li><p>'''FR_net_wifi_ssid''' Variable is used to set the name of the &gt; WIFI hotspot you want to connect to</p></li><li><p>'''FR_net_wifi_key''' Variable is used to set the password of the &gt; WIFI hotspot you want to connect to</p></li><li><p>'''FR_net_use_static''' Variables are used to set whether the &gt; static IP address of the WIFI or Ethernet port needs to be &gt; set.</p></li><li><p>'''FR_net_static_ip''' The variable is used to set the static IP &gt; address. Please set it according to your actual situation.</p></li><li><p>'''FR_net_static_gateway''' Variables are used to set the gateway. &gt; Please set according to your actual situation.</p></li></ol>
</li>
<li><p>Here are some specific setting examples:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>For example, if you want the Linux system of the development &gt; board to automatically connect to the WIFI hotspot after it is &gt; started for the first time, you can set it like this: </p><ol style="list-style-type: lower-alphanone;"><li><p>a) Set '''FR_net_change_defaults''' to 1</p></li><li><p>b) Set '''FR_net_wifi_enabled''' to '''1'''</p></li><li><p>c) Set '''FR_net_wifi_ssid''' to the name of the WIFI hotspot you &gt; want to connect to</p></li><li><p>d) Set '''FR_net_wifi_key''' to the password of the WIFI hotspot &gt; you want to connect to</p></li></ol>
</li>
<li><p>For example, you want the Linux system of the development board &gt; to automatically connect to the WIFI hotspot after the first &gt; startup, and set the WIFI IP address to a specific static IP &gt; address (so that when the Linux system starts, you can &gt; directly use the set static IP address to ssh remotely Log in &gt; to the development board, there is no need to check the IP &gt; address of the development board through the router &gt; background), you can set it like this:</p><ol style="list-style-type: lower-alphanone;"><li><p>a) Set '''FR_net_change_defaults''' to '''1'''</p></li><li><p>b) Set '''FR_net_wifi_enabled''' to '''1'''</p></li><li><p>c) Set '''FR_net_wifi_ssid''' to the name of the WIFI hotspot you &gt; want to connect to</p></li><li><p>d) Set '''FR_net_wifi_key''' to the password of the WIFI hotspot &gt; you want to connect to</p></li><li><p>e) Set '''FR_net_use_static''' to '''1'''</p></li><li><p>f) Set '''FR_net_static_ip''' to the desired IP address</p></li><li><p>g) Set '''R_net_static_gateway''' to the corresponding gateway &gt; address</p></li></ol>
</li>
<li><p>For example, if you want the development board's Linux system &gt; to automatically set the IP address of the Ethernet port to &gt; the desired static IP address after it is started for the &gt; first time, you can set it like this</p><ol style="list-style-type: lower-alphanone;"><li><p>a) Set '''FR_net_change_default''' to '''1'''</p></li><li><p>b) Set '''FR_net_ethernet_enabled''' to '''1'''</p></li><li><p>c) Set '''FR_net_use_static''' to '''1'''</p></li><li><p>d) Set '''FR_net_static_ip''' to the desired IP address</p></li><li><p>e) Set '''FR_net_static_gateway''' to the corresponding gateway &gt; address</p></li></ol>
</li></ol>
</li>
<li><p>After modifying the orangepi_first_run.txt file, you can exit the /boot directory of the development board Linux system in the TF card, uninstall the TF card, and then insert the TF card into the development board to start.</p></li>
<li><p>If a static IP address is not set, you still need to check the IP address through the router background. If a static IP address is set, you can ping the set static IP address on the computer. If you can ping, it means that the system has started normally, and The network has been set up correctly, and then you can use the set IP address to ssh to remotely log in to the Linux system of the development board.</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </libig></ol> '''After the development board's Linux system is started for the first time, orangepi_first_run.txt will be deleted or renamed to orangepi_first_run.txt.old. At this time, even if the orangepi_first_run.txt configuration file is reset, and then the development board's Linux system is restarted, orangepi_first_run. The configuration in txt will not take effect again, because this configuration will only take effect when the Linux system is started for the first time after burning it. Please pay special attention to this point.'''</big>|}</li></ol><span id="ssh-remote-login-development-board"></span>
<span id="ssh-remote-login-development-board"></span>
== SSH remote login development board ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Linux systems enable ssh remote login by default and allow root users to log in to the system. Before ssh login, you first need to ensure that the Ethernet or wifi network is connected, and then use the ip addr command or obtain the IP address of the development board by checking the router'''</big>|}
<span id="ssh-remote-login-development-board-under-ubuntu"></span>
# Then you can remotely log in to the Linux system through the ssh command
::{| class="wikitable" style="width:800px;" |-| test@test:~$ '''ssh [mailto:root@192.168.1.36 orangepi@192.168.1.]xxx''' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Need to be replaced with the IP address of the development board)
orangepi@192.168.1.xx's password: (iEnter &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Enter your password here, the default password is orangepi)|}::{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note that when entering a password, <span style="color:#FF0000">the specific content of the entered password will not be displayed on the screen</span>. Please do not think that there is something wrong. Just press Enter after entering it.'''
'''Note that when entering a password, the specific content of the entered password will not be displayed on the screen. Please do not think that there is something wrong. Just press Enter after entering it.''' '''f If you are prompted to refuse the connection, as long as you are using the image provided by Orange Pi, <span style="color:#FF0000">please do not doubt whether the orangepi password is incorrect</span>, but look for other reasons.'''</big>|}
<ol start="3" style="list-style-type: decimal;">
<li><p>After successfully logging into the system, the display is as shown below</p>
<p>[[File:zero2w-img140.png]]</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''If ssh cannot log in to the Linux system normally, first check whether the IP address of the development board can be pinged. If there is no problem with pinging, you can log in to the Linux system through the serial port or HDMI display and enter the following command on the development board before trying again. Can it be connected?: '''</p></li></ol> 
root@orangepi:~# '''reset_ssh.sh'''
'''If it still doesn't work, please try restarting the system.'''
'''If it still doesn't work, please try restarting the system.'''</big>
|}
</li></ol>
<span id="ssh-remote-login-development-board-under-windows"></span>
 
=== SSH remote login development board under Windows ===
<li><p>Open '''Session'''</p></li>
<li><p>Then select '''SSH''' in '''Session Setting'''</p></li>
<li><p>Then enter the IP address of the development board in '''Remote &gt; host'''</p></li><li><p>Then enter the username '''root''' or '''orangepi''' of the linux &gt; system in '''Specify username'''.</p></li>
<li><p>Finally click '''OK'''</p>
<div class="figure">
</li>
<li><p>You will then be prompted to enter a password. The default passwords for both root and orangepi users are orangepi.</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that when entering a password, <span style="color:#FF0000">the specific content of the entered password will not be displayed on the screen</span>. Please do not think that there is any malfunction. Just press Enter after entering the password.'''</p></big>|}
<div class="figure">
<span id="hdmi-test"></span>
 
== HDMI test ==
</div></li>
<li><p>After starting the Linux system, if there is image output on the HDMI display, it means that the HDMI interface is working normally.</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </li></olbig>'''Note that although many laptops have HDMI interfaces, the HDMI interface of the laptop generally only has the output function and does not have the HDMI in function, which means that the HDMI output of other devices cannot be displayed on the laptop screen'''
'''Note that although many laptops have HDMI interfaces, the HDMI interface of the laptop generally only has the output function and does not have the HDMI in function, which means that the HDMI output of other devices cannot be displayed on the laptop screen''' '''When you want to connect the HDMI of the development board to the HDMI interface of your laptop, please first confirm that your laptop supports the HDMI in function'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''When HDMI does not display, please first check whether the HDMI cable is plugged in tightly. After confirming that the wiring is OK, you can try a different screen to see if there is any display.'''</big>|}</li></ol><span id="hdmi-to-vga-display-test"></span>
<span id="hdmi-to-vga-display-test"></span>
=== HDMI to VGA display test ===
<li><p>HDMI to VGA display test is as follows</p>
<p>[[File:zero2w-img147.png]]</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''When using HDMI to VGA display, the development board and the Linux system of the development board do not need to make any settings. You only need the Mini HDMI interface of the development board to display normally. So if there is a problem with the test, please check whether there is a problem with the HDMI to VGA converter, VGA cable and monitor.'''</p></big>|}</li></ol>
<span id="how-to-set-hdmi-resolution-in-linux5.4-system"></span>
 
=== How to set HDMI resolution in Linux5.4 system ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note: This method is only applicable to systems with Linux 5.4 kernel.'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>There is a disp_mode variable in '''/boot/orangepiEnv.txt''' of the Linux system, which can be used to set the resolution of HDMI output. The default resolution of the Linux system is 1080p60</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo vim /boot/orangepiEnv.txt'''</p>
<p>verbosity=1</p>
<p>console=both</p>
<p>disp_mode='''<span style="color:#FF0000">1080p60</span>'''</p>
<p>fb0_width=1920</p>
<p>fb0_height=1080</p>|}</li><li><p>The disp_mode variable supports setting values as shown in the table below</p></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''disp_mode supported values'''
| '''60'''
|}
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note: Linux systems currently do not support 4K resolution.'''</big>|}</ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>Change the value of the disp_mode variable to the resolution you want to output, then restart the system, and HDMI will output the set resolution.</p></li>
<li><p>The method of checking the HDMI output resolution is as follows. If the displayed resolution is the same as the set resolution, it means that the settings on the development board are correct.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo cat /sys/class/disp/disp/attr/sys'''</p>
|}
<p>[[File:zero2w-img148.png]]</p></li></ol>
<span id="how-to-modify-the-width-and-height-of-framebuffer-in-linux5.4-system"></span>
 
=== How to modify the width and height of Framebuffer in Linux5.4 system ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note: This method is only applicable to systems with Linux 5.4 kernel.'''</big>|}
There are two variables, fb0_width and fb0_height, in '''/boot/orangepiEnv.txt''' of the Linux system. You can use them to set the width and height of the Framebuffer. The Linux system defaults to fb0_width=1920 and fb0_height=1080.
{| class="wikitable" style="width:800px;"
|-
|
orangepi@orangepi:~$ '''sudo vim /boot/orangepiEnv.txt'''
disp_mode=1080p60
'''<span style="color:#FF0000">fb0_width=1920</span>'''
'''<span style="color:#FF0000">fb0_height=1080</span>'''|}
The reference values corresponding to different resolutions of fb0_width and fb0_height are as follows::
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''HDMI resolution'''
<span id="framebuffer-cursor-setting"></span>
 
=== Framebuffer cursor setting ===
<ol style="list-style-type: decimal;">
<li><p>The softcursor used by Framebuffer, the method to set the cursor to blink or not to blink is as follows</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''echo <span style="color:#FF0000">1 </span> &gt; /sys/class/graphics/fbcon/cursor_blink #Cursor flashes'''</p><p>root@orangepi:~# '''echo <span style="color:#FF0000">0 </span> &gt; /sys/class/graphics/fbcon/cursor_blink #Cursor does not flash'''</p>|}</li>
<li><p>If you need to hide the cursor, you can add vt.global_cursor_default=0 to the '''extraargs''' variable in '''/boot/orangepiEnv.txt''' (the value of extraargs will be assigned to the '''bootargs''' environment variable and eventually passed to the kernel) (if '''<span class="mark">vt.global_cursor_default=1</span>''', it will be displayed cursor), then restart the system and you will see that the cursor has disappeared.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo vim /boot/orangepiEnv.txt'''</p>
<p>verbosity=1</p>
<p>fb0_width=1920</p>
<p>fb0_height=1080</p>
<p>'''<span style="color:#FF0000">extraargs=vt.global_cursor_default=0</span>'''</p>|}</li></ol>
<span id="how-to-use-bluetooth"></span>
 
== How to use Bluetooth ==
<ol style="list-style-type: decimal;">
<li><p>After entering the system, you can first check whether there is a Bluetooth device node through the '''hciconfig''' command. If it exists, it means that the Bluetooth initialization is normal.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo apt update &amp;&amp; sudo apt install -y bluez'''</p>
<p>orangepi@orangepi:~$ '''hciconfig -a'''</p>
<p>hci0: Type: Primary Bus: UART</p>
:<p>BD Address: 3E:61:3D:19:0E:52 ACL MTU: 1021:8 SCO MTU: 240:3</p>:<p>UP RUNNING</p>:<p>RX bytes:925 acl:0 sco:0 events:72 errors:0</p>:<p>TX bytes:5498 acl:0 sco:0 commands:72 errors:0</p>:<p>Features: 0xbf 0xff 0x8d 0xfe 0xdb 0x3d 0x7b 0xc7</p>:<p>Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3</p>:<p>Link policy: RSWITCH SNIFF</p>:<p>Link mode: SLAVE ACCEPT</p>:<p>Name: 'orangepi'</p>:<p>Class: 0x3c0000</p>:<p>Service Classes: Rendering, Capturing, Object Transfer, Audio</p>:<p>Device Class: Miscellaneous,</p>:<p>HCI Version: 5.0 (0x9) Revision: 0x400</p>:<p>LMP Version: 5.0 (0x9) Subversion: 0x400</p>:<p>Manufacturer: Spreadtrum Communications Shanghai Ltd (492)</p>|}</li>
<li><p>Use '''bluetoothctl''' to scan for Bluetooth devices</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo bluetoothctl'''</p>
<p>[NEW] Controller 10:11:12:13:14:15 orangepizero2w [default]</p>
<p>Discovery stopped</p>
<p>[CHG] Controller 10:11:12:13:14:15 Discovering: no</p>
<p>[CHG] Device DC:72:9B:4C:F4:CF RSSI is nil</p>|}</li>
<li><p>After scanning the device you want to pair, you can pair it. For pairing, you need to use the MAC address of the device.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>[bluetooth]# '''pair DC:72:9B:4C:F4:CF''' '''#Pair using the MAC address of the scanned Bluetooth device'''</p>
<p>Attempting to pair with DC:72:9B:4C:F4:CF</p>
<p>'''Pairing successful #Prompt pairing successful'''</p>
<p>[CHG] Device DC:72:9B:4C:F4:CF ServicesResolved: no</p>
<p>[CHG] Device DC:72:9B:4C:F4:CF Connected: no</p>|}</li>
<li><p>After successful pairing, the Bluetooth interface of the mobile phone will appear as follows:</p>
<div class="figure">
</div></li>
<li><p>To connect to a Bluetooth device, you need to install the '''pulseaudio-module-bluetooth''' software package, and then start the '''pulseaudio''' service</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo apt update'''</p>
<p>orangepi@orangepi:~$ '''sudo''' '''apt -y install pulseaudio-module-bluetooth'''</p>
<p>orangepi@orangepi:~$ '''pulseaudio --start'''</p>|}</li>
<li><p>How to connect Bluetooth devices</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo bluetoothctl'''</p>
<p>Agent registered</p>
<p>[CHG] Device DC:72:9B:4C:F4:CF ServicesResolved: yes</p>
<p>[CHG] Controller 10:11:12:13:14:15 Discoverable: no</p>
<p>'''[orangepi]# #If this prompt appears, the connection is successful.'''</p>|}</li>
<li><p>After connecting the Bluetooth device, you can see the prompt that the audio for calls and media has been '''connected in the Bluetooth configuration interface of the Android phone'''.</p>
<div class="figure">
<span id="usb-interface-test"></span>
 
== USB interface test ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''The USB interface can be connected to a USB hub to expand the number of USB interfaces.'''</big>|}
<span id="usb-interface-extension-description"></span>
<ol style="list-style-type: lower-alpha;">
<li><p>First run '''orangepi-config'''. Ordinary users remember to add &gt; '''sudo''' permissions.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>Then select '''System'''</p>
<p>[[File:zero2w-img80.png]]</p></li>
<li><p>Then select '''Hardware'''</p>
<p>[[File:zero2w-img81.png]]</p></li>
<li><p>Then use the keyboard's arrow keys to locate the location shown in &gt; the picture below, and then use the space to select '''usb0-host'''</p>
<p>[[File:zero2w-img161.png]]</p></li>
<li><p>Then select '''&lt;Save&gt;'''to save</p>
<li><p>Then select '''&lt;Back&gt;'''</p>
<p>[[File:zero2w-img84.png]]</p></li>
<li><p>Then select '''&lt;Reboot&gt;'''to restart the system to make the &gt; configuration take effect.</p>
<p>[[File:zero2w-img85.png]]</p></li>
<li><p>After restarting, USB0 can use USB devices such as mouse and &gt; keyboard normally.</p></li></ol>
<span id="connect-usb-mouse-or-keyboard-to-test"></span>
 
=== Connect USB mouse or keyboard to test ===
# Execute the following command. If you can see the output of sdX, it means the USB disk is successfully recognized.
::{| class="wikitable" style="width:800px;"|-|orangepi@orangepi:~$ '''cat /proc/partitions | grep &quot;sd*&quot;'''<br> <span style="margin-right: 30px;">major </span><span style="margin-right: 40px;">minor </span><span style="margin-right: 30px;">#blocks </span><span style="margin-right: 50px;">name</span><br> <span style="margin-right: 70px;">8 </span><span style="margin-right: 60px;">0 </span><span style="margin-right: 50px;">30044160 </span><span style="margin-right: 50px;color:#FF0000">'''sda'''</span><br> <span style="margin-right: 70px;">8 </span><span style="margin-right: 60px;">1 </span><span style="margin-right: 50px;">30043119 </span><span style="margin-right: 50px;color:#FF0000">'''sda1'''</span><br>|}
<ol start="3" style="list-style-type: decimal;">
<li>Use the mount command to mount the U disk to '''/mnt''', and then you can view the files in the U disk</li></ol>{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo mount /dev/sda1 /mnt/'''
test.txt
|}</ol>
<ol start="4" style="list-style-type: decimal;">
<li>After mounting, you can check the capacity usage and mount point of the U disk through the '''df -h''' command.</li></ol>{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''df -h | grep &quot;sd&quot;'''
/dev/sda1 &nbsp;&nbsp;&nbsp; 29G &nbsp;&nbsp; 208K &nbsp;&nbsp; 29G &nbsp;&nbsp; 1% /mnt|}</ol><span id="usb-ethernet-card-test"></span>
<span id="usb-ethernet-card-test"></span>
=== USB Ethernet card test ===
# The '''currently tested''' and usable USB Ethernet cards are as follows. Among them, the RTL8153 USB Gigabit network card can be used normally when inserted into the USB 2.0 Host interface of the development board for testing, but the speed cannot reach Gigabit. Please note this.
::{| class="wikitable" style="width:800px;text-align: center;"
|-
| serial number
<ol start="2" style="list-style-type: decimal;">
<li><p>First insert the USB network card into the USB interface of the development board, and then insert the network cable into the USB network card to ensure that the network cable can access the Internet normally. If you can see the following log information through the '''dmesg''' command, it means that the USB network card is recognized normally.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''dmesg | tail'''</p>
<p>[ 121.985016] usb 3-1: USB disconnect, device number 2</p>
<p>[ 127.763031] IPv6: ADDRCONF(NETDEV_UP): enx00e04c362017: link is not ready</p>
<p>[ 129.892465] r8152 3-1:1.0 enx00e04c362017: carrier on</p>
<p>[ 129.892583] IPv6: ADDRCONF(NETDEV_CHANGE): enx00e04c362017: link becomes ready</p>|}</li>
<li><p>Then you can see the device node of the USB network card and the automatically assigned IP address through the ifconfig command</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo ifconfig'''</p>
<p>'''enx00e04c362017''': flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500</p>
::<p>inet '''192.168.1.177''' netmask 255.255.255.0 broadcast 192.168.1.255</p>::<p>inet6 fe80::681f:d293:4bc5:e9fd prefixlen 64 scopeid 0x20&lt;link&gt;</p>::<p>ether 00:e0:4c:36:20:17 txqueuelen 1000 (Ethernet)</p>::<p>RX packets 1849 bytes 134590 (134.5 KB)</p>::<p>RX errors 0 dropped 125 overruns 0 frame 0</p>::<p>TX packets 33 bytes 2834 (2.8 KB)</p>::<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p>|}</li>
<li><p>The command to test network connectivity is as follows</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ping www.baidu.com -I enx00e04c362017'''</p>
<p>PING www.a.shifen.com (14.215.177.38) from 192.168.1.12 eth0: 56(84) bytes of data.</p>
<p>--- www.a.shifen.com ping statistics ---</p>
<p>4 packets transmitted, 4 received, 0% packet loss, time 3002ms</p>
<p>rtt min/avg/max/mdev = 6.260/6.770/7.275/0.373 ms</p>|}</li></ol>
<span id="usb-camera-test"></span>
 
=== USB camera test ===
<li><p>First insert the USB camera into the USB interface of the Orange Pi development board</p></li>
<li><p>Then you can see through the lsmod command that the kernel automatically loads the following modules</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''lsmod'''</p>
<pspan style="margin-right: 100px;">Module </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 45px;">Used by</pspan><br><pspan style="margin-right: 100px;">'''uvcvideo </span><span style="margin-right: 50px;">106496 </span><span style="margin-right: 50px;">0'''</pspan><br>|}</li>
<li><p>Through the v4l2-ctl command, you can see that the device node information of the USB camera is/dev/video0</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt update'''</p>
<p>orangepi@orangepi:~$ '''sudo''' '''apt install -y v4l-utils'''</p>
<p>orangepi@orangepi:~$ '''v4l2-ctl --list-devices'''</p>
<p>USB 2.0 Camera (usb-sunxi-ehci-1):</p>
::<p>/dev/video0</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that the l in v4l2 is the lowercase letter l, not the number 1.'''</p><p>'''In addition, the serial number of the video may not always be video0, please refer to what you actually see.'''</p></big>|}</li>
<li><p>Use fswebcam to test the USB camera</p>
<ol style="list-style-type: lower-alpha;">
<li><p>Install fswebcam</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo''' '''apt update'''</p>
<p>orangepi@orangepi:~$ '''sudo apt-get install -y fswebcam'''</p>|}</li><li><p>After installing fswebcam, you can use the following command to &gt; take pictures</p><ol style="list-style-type: lower-alphanone;"><li><p>a) -d Option to specify the device node of the USB camera</p></li><li><p>b) --no-banner Used to remove watermarks from photos</p></li><li><p>c) -r option is used to specify the resolution of the photo</p></li><li><p>d) -S Option to skip previous frames</p></li><li><p>e) ./image.jpg Used to set the name and path of the generated &gt; photo</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo''' '''fswebcam -d /dev/video0 \'''</p>
<p>'''--no-banner -r 1280x720 -S 5 ./image.jpg'''</p>|}</li></ol>
</li>
<li><p>In the server version of Linux system, after taking the picture, &gt; you can use the scp command to transfer the taken picture to &gt; the Ubuntu PC for mirror viewing.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''scp image.jpg [mailto:test@192.168.1.55:/home/test test@192.168.1.55:/home/test] (Modify the IP address and path according to the actual situation)'''</p>|}</li><li><p>In the desktop version of Linux system, you can directly view &gt; the captured pictures through the HDMI display</p></li></ol>
</li>
<li><p>Use mjpg-streamer to test the USB camera</p>
<ol style="list-style-type: lower-alpha;">
<li><p>Download mjpg-streamer</p>
<ol style="list-style-type: lower-alphanone;"><li><p>a) Github download address:</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''git clone https://github.com/jacksonliam/mjpg-streamer'''</p>|}</li><li><p>b) The image download address of Gitee is:</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''git clone https://gitee.com/leeboby/mjpg-streamer'''</p>|}</li></ol>
</li>
<li><p>Install dependent software packages</p>
<ol style="list-style-type: lower-alphanone;"><li><p>a) Ubuntu system</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt-get install -y cmake libjpeg8-dev'''</p>|}</li><li><p>b) Debian system</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt-get install -y cmake libjpeg62-turbo-dev'''</p>|}</li></ol>
</li>
<li><p>Compile and install mjpg-streamer</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''cd mjpg-streamer/mjpg-streamer-experimental'''</p>
<p>orangepi@orangepi:~/mjpg-streamer/mjpg-streamer-experimental$ '''make -j4'''</p>
<p>orangepi@orangepi:~/mjpg-streamer/mjpg-streamer-experimental$ '''sudo make install'''</p>|}</li>
<li><p>Then enter the following command to start mjpg_streamer</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that the serial number of the video is not always video0, please refer to what you actually see.'''</p></big>|}{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~/mjpg-streamer/mjpg-streamer-experimental$ '''export LD_LIBRARY_PATH=.'''</p>
<p>orangepi@orangepi:~/mjpg-streamer/mjpg-streamer-experimental$ '''sudo ./mjpg_streamer -i &quot;./input_uvc.so -d \'''</p>
<p>'''/dev/video0 -u -f 30&quot; -o &quot;./output_http.so -w ./www&quot;'''</p>|}</li><li><p>Then enter ['''the IP address of the development board: 8080'''] &gt; in the Ubuntu PC or Windows PC or mobile phone browser on the &gt; same LAN as the development board to see the video output by &gt; the camera.</p>
<div class="figure">
<span id="audio-test"></span>
 
== Audio test ==
<li><p>Use the '''aplay -l''' command to view the sound card devices supported by the Linux system</p>
<ol style="list-style-type: lower-alpha;">
<li><p>The output of the linux5.4 system is as follows, where '''card 0: &gt; audiocodec''' is the sound card device required for headphone &gt; playback</p>{| class="wikitable" style="width:800px;" |-|
<p>root@orangepi:~# '''aplay -l'''</p>
<p>**** List of PLAYBACK Hardware Devices ****</p>
<p>'''card 0: audiocodec [audiocodec], device 0: soc@3000000:codec_plat-5096000.codec 5096000.codec-0 []'''</p>
:<p>'''Subdevices: 1/1'''</p>:<p>'''Subdevice #0: subdevice #0'''</p>|}</li><li><p>The output of the b.linux6.1 system is as follows, where &gt; '''audiocodec''' is the sound card device required for headphone &gt; playback.</p>{| class="wikitable" style="width:800px;" |-|
<p>root@orangepi:~# '''aplay -l'''</p>
<p>**** List of PLAYBACK Hardware Devices ****</p>
<p>'''card 0: audiocodec [audiocodec], device 0: CDC PCM Codec-0 [CDC PCM Codec-0]'''</p>
:<p>'''Subdevices: 1/1'''</p>:<p>'''Subdevice #0: subdevice #0'''</p>|}</li></ol>
</li>
<li><p>Then use the '''aplay''' command to play the audio, and the sound can be heard through the headphones</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~# '''aplay -D hw:0,0 /usr/share/sounds/alsa/audio.wav'''</p>
<p>Playing WAVE 'audio.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </libig></ol> '''If there is noise during the headphone test, please pull out some of the headphones and do not plug them all the way in.'''</big>|}</li></ol><span id="hdmi-audio-playback-test"></span>
<span id="hdmi-audio-playback-test"></span>
==== HDMI audio playback test ====
<li><p>First use the Mini HDMI to HDMI cable to connect the Orange Pi development board to the TV (other HDMI displays need to ensure that they can play audio)</p></li>
<li><p>HDMI audio playback does not require other settings, just use the '''aplay''' command to play directly</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''aplay -D hw:2,0 /usr/share/sounds/alsa/audio.wav'''</p>|}</li></ol>
<span id="test-audio-methods-on-desktop-systems"></span>
 
=== Test audio methods on desktop systems ===
<li><p>First open the volume control interface</p>
<p>[[File:zero2w-img166.png]]</p></li>
<li><p>When playing audio, the audio device options that can be used by &gt; the '''Playback''' software will be displayed in '''Playback''', &gt; as shown in the figure below. Here you can set which audio &gt; device needs to be played.</p>
<div class="figure">
<span id="infrared-reception-test"></span>
 
== Infrared reception test ==
<li><p>There is no infrared receiver on the main board of the development board. We can expand it through a 24pin expansion board.</p>
<p>[[File:zero2w-img107.png]]</p></li>
<li><p>Install ir-keytable infrared test software</p></li></ol>{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo''' '''apt update'''
orangepi@orangepi:~$ '''sudo''' '''apt-get install -y ir-keytable'''
|}</ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>Then execute ir-keytable to view the information of the infrared device</p>
<ol style="list-style-type: lower-alpha;">
<li>linux5.4 system output is as follows</li></ol></li></ol>{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''ir-keytable'''
Found /sys/class/rc/rc0/ with:
::Name: sunxi-ir
::Driver: sunxi-rc-recv
::Default keymap: rc_map_sunxi
::Input device: /dev/input/event1
::LIRC device: /dev/lirc0
::Attached BPF protocols: Operation not permitted
::Supported kernel protocols: lirc nec
::Enabled kernel protocols: lirc nec
::bus: 25, vendor/product: 0001:0001, version: 0x0100 Repeat delay = 500 ms, repeat period = 125 ms
::Repeat delay = 500 ms, repeat period = 125 ms
|}
</ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>The output of the linux6.1 system is as follows</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ir-keytable'''</p>
<p>Found /sys/class/rc/rc0/ with:</p>
::<p>Name: sunxi-ir</p>::<p>Driver: sunxi-ir</p>::<p>Default keymap: rc-empty</p>::<p>Input device: /dev/input/event5</p>::<p>LIRC device: /dev/lirc0</p>::<p>Attached BPF protocols: Operation not permitted</p>::<p>Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm</p>::<p>Enabled kernel protocols: lirc</p>::<p>bus: 25, vendor/product: 0001:0001, version: 0x0100</p>::<p>Repeat delay = 500 ms, repeat period = 125 ms</p>|}</li></ol> <!-- --/li></ol>
<ol start="4" style="list-style-type: decimal;">
<li><p>Before testing the infrared reception function, you need to prepare an Orange Pi-specific infrared remote control. '''<span classstyle="markcolor:#FF0000">Other remote controls do not support it</span>'''.</p>
<div class="figure">
<li><p>Then enter the '''ir-keytable -t''' command in the terminal, and then use the infrared remote control to press the button against the infrared receiver of the Orange Pi development board to see the received key code in the terminal.</p>
<ol style="list-style-type: lower-alpha;">
<li>linux5.4 system output is as follows</li></ol></li></ol>{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo ir-keytable -t'''
1598339152.914715: event type EV_MSC(0x04): scancode = 0xfb0410
|}</ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>linux6.1 system output is as follows</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo ir-keytable -c -p NEC -t'''</p>
<p>Old keytable cleared</p>
<p>202.063219: lirc protocol(nec): scancode = 0x45c</p>
<p>202.063249: event type EV_MSC(0x04): scancode = 0x45c</p>
<p>202.063249: event type EV_SYN(0x00).</p>|}</li></ol></li></ol><span id="temperature-sensor"></span>
<span id="temperature-sensor"></span>
== Temperature sensor ==
H618 has a total of 4 temperature sensors. The command to view the temperature is as follows:
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''The displayed temperature value needs to be divided by 1000, and the unit is Celsius.'''</big>|}
<ol style="list-style-type: lower-alpha;">
<li>sensor0: CPU temperature sensor, the first command is used to view &gt; the type of temperature sensor, the second command is used to view &gt; the value of the temperature sensor</li></ol>{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''cat /sys/class/thermal/thermal_zone0/type'''
'''57734'''
|}</ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>sensor1: DDR temperature sensor, the first command is used to view &gt; the type of temperature sensor, the second command is used to view &gt; the value of the temperature sensor</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''cat /sys/class/thermal/thermal_zone1/type'''</p>
<p>'''ddr'''_thermal_zone</p>
<p>orangepi@orangepi:~$ '''cat /sys/class/thermal/thermal_zone1/temp'''</p>
<p>'''57410'''</p>|}</li><li><p>sensor2: GPU temperature sensor, the first command is used to view &gt; the type of temperature sensor, the second command is used to view &gt; the value of the temperature sensor</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''cat /sys/class/thermal/thermal_zone2/type'''</p>
<p>'''gpu'''_thermal_zone</p>
<p>orangepi@orangepi:~$ '''cat /sys/class/thermal/thermal_zone2/temp'''</p>
<p>'''59273'''</p>|}</li><li><p>sensor3: VE's temperature sensor. The first command is used to view &gt; the type of temperature sensor, and the second command is used to &gt; view the value of the temperature sensor.</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''cat /sys/class/thermal/thermal_zone3/type'''</p>
<p>'''ve'''_thermal_zone</p>
<p>orangepi@orangepi:~$ '''cat /sys/class/thermal/thermal_zone3/temp'''</p>
<p>'''58949'''</p>|}</li></ol>
<span id="how-to-check-the-temperature-in-linux6.1-system"></span>
 
=== How to check the temperature in linux6.1 system ===
{| class="wikitable" style="width:800px;"
|-
|
orangepi@orangepi:~$ '''sensors'''
Adapter: Virtual device
temp1: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'''<span style="color:#FF0000">47.4°C</span>''' (crit = +110.0°C) 
gpu_thermal-virtual-0
Adapter: Virtual device
temp1: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'''<span style="color:#FF0000">48.7°C</span>''' (crit = +110.0°C) 
ddr_thermal-virtual-0
Adapter: Virtual device
temp1: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'''<span style="color:#FF0000">47.8°C</span>''' (crit = +110.0°C) 
ve_thermal-virtual-0
Adapter: Virtual device
temp1: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'''<span style="color:#FF0000">47.2°C</span>''' (crit = +110.0°C)|}
<span id="pin-interface-pin-description"></span>
 
== 40 Pin Interface pin description ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note: The pin header on the 40pin interface is not soldered by default, and you need to solder it yourself before it can be used.'''</big>|}
<ol style="list-style-type: decimal;">
</div></li>
<li><p>The functions of the 40 Pin interface pins on the development board are as shown in the table below</p></li></ol>
<div style="display: flex;">{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"
|-
| '''GPIO序号GPIO NO.'''
| '''GPIO'''
| '''Function'''
| '''pin'''
|
| '''pin'''
| '''Function'''
| '''GPIO'''
| '''GPIO NO'''
|-
| style="text-align: left;"|
| '''3.3V'''
| '''1'''
|
| '''2'''
| '''5V'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''264'''
| '''TWI1-SDA'''
| '''3'''
|| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''263'''
| '''PI7'''
| '''TWI1-SCL'''
| '''5'''
|
| '''6'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''269'''
| '''PWM3/UART4_TX'''
| '''7'''
|
| '''8'''
| '''UART0_TX'''
| '''PH0'''
| '''224'''
|-
| style="text-align: left;"|
| '''GND'''
| '''9'''
|
| '''10'''
| '''UART0_RX'''
| '''PH1'''
| '''225'''
|-
| '''226'''
| '''UART5_TX'''
| '''11'''
|
| '''12'''
| style="text-align: left;"|
| '''PI1'''
| '''257'''
|-
| '''227'''
| '''UART5_RX'''
| '''13'''
|
| '''14'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''261'''
| '''TWI0_SCL/UART2_TX'''
| '''15'''
|
| '''16'''
| '''PWM4/UART4_RX'''
| '''PI14'''
| '''270'''
|-
| style="text-align: left;"|
| '''3.3V'''
| '''17'''
|
| '''18'''
| style="text-align: left;"|
| '''PH4'''
| '''228'''
|-
| '''231'''
| '''SPI1_MOSI'''
| '''19'''
|
| '''20'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''232'''
| '''SPI1_MISO'''
| '''21'''
|
| '''22'''
| '''TWI0_SDA/UART2_RX'''
| '''PI6'''
| '''262'''
|-
| '''230'''
| '''SPI1_CLK'''
| '''23'''
|
| '''24'''
| '''SPI1_CS0'''
| '''PH5'''
| '''229'''
|-
| style="text-align: left;"|
| '''GND'''
| '''25'''
|
| '''26'''
| '''SPI1_CS1'''
| '''PH9'''
| '''233'''
|-
| '''266'''
| '''TWI2-SDA/UART3_RX'''
| '''27'''
|| '''28'''| '''TWI2-SCL/UART3_TX'''| '''PI9'''| '''265'''|-
| '''256'''
| '''PI0'''
| style="text-align: left;"|
| '''29'''
|
| '''30'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''271'''
| style="text-align: left;"|
| '''31'''
|
| '''32'''
| '''PWM1'''
| '''PI11'''
| '''267'''
|-
| '''268'''
| '''PWM2'''
| '''33'''
|
| '''34'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''258'''
| style="text-align: left;"|
| '''35'''
|
| '''36'''
| style="text-align: left;"|
| '''PC12'''
| '''76'''
|-
| '''272'''
| style="text-align: left;"|
| '''37'''
|
| '''38'''
| style="text-align: left;"|
| '''PI4'''
| '''260'''
|-
| style="text-align: left;"|
| '''GND'''
| '''39'''
|}{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''pin'40''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''4'''| '''5V'''| style="text-align: left;"|
| style="text-align: left;"|
| '''PI3'''
| '''259'''
|}
 
<ol start="3" style="list-style-type: decimal;">
<li>There are a total of 28 GPIO ports in the 40pin interface. The high-level voltage of all GPIO ports is '''3.3v'''</li></ol>
 
<span id="how-to-install-wiringop"></span>
== How to install wiringOP ==
 
'''Note that wiringOP is already pre-installed in the linux image released by Orange Pi. Unless the wiringOP code is updated, there is no need to re-download, compile and install, you can just use it directly.'''
 
'''The storage path of the compiled wiringOP deb package in orangepi-build is: '''
 
'''orangepi-build/external/cache/debs/arm64/wiringpi_x.xx.deb'''
 
'''After entering the system, you can run the gpio readall command. If you can see the following output, it means that wiringOP has been pre-installed and can be used normally.'''
 
[[File:zero2w-img170.png]]
 
'''WiringOP currently mainly adapts to the functions of setting GPIO port input and output, setting GPIO port output high and low levels, and setting pull-up and pull-down resistors. Functions such as hardware PWM cannot be used.'''
 
<ol style="list-style-type: decimal;">
<li><p>Download the code of wiringOP</p>
<p>orangepi@orangepi:~$ '''sudo apt update'''</p>
<p>orangepi@orangepi:~$ '''sudo apt install -y git'''</p>
<p>orangepi@orangepi:~$ '''git clone https://github.com/orangepi-xunlong/wiringOP.git -b next'''</p>
<p>'''Note that the source code needs to download the code of wiringOP next branch. Please don't miss the -b next parameter.'''</p>
<p>'''If there is a problem downloading the code from GitHub, you can directly use the wiringOP source code that comes with the Linux image. The storage location is: /usr/src/wiringOP.'''</p></li>
<li><p>Compile and install wiringOP</p>
<p>orangepi@orangepi:~$ '''cd wiringOP'''</p>
<p>orangepi@orangepi:~/wiringOP$ '''sudo ./build clean'''</p>
<p>orangepi@orangepi:~/wiringOP$ '''sudo ./build'''</p></li>
<li><p>The output of the test gpio readall command is as follows</p>
<p>[[File:zero2w-img170.png]]</p></li></ol>
 
<span id="pin-interface-gpio-i2c-uart-spi-and-pwm-testing"></span>
== 40pin interface GPIO, I2C, UART, SPI and PWM testing ==
 
'''Note: The pin header on the 40pin interface is not soldered by default, and you need to solder it yourself before it can be used.'''
 
<span id="pin-gpio-port-test"></span>
=== 40pin GPIO port test ===
 
<ol style="list-style-type: decimal;">
<li><p>The following uses pin No. 7 - corresponding to GPIO PI13 - corresponding to wPi serial number 2 - as an example to demonstrate how to set the high and low levels of the GPIO port.</p>
<p>[[File:zero2w-img171.png]]</p></li>
<li><p>First set the GPIO port to output mode, and the third parameter needs to be the serial number of the wPi corresponding to the input pin.</p>
<p>root@orangepi:~/wiringOP# '''gpio mode 2 out'''</p></li>
<li><p>Then set the GPIO port to output a low level. After setting, you can use a multimeter to measure the voltage value of the pin. If it is 0v, it means the low level is set successfully.</p>
<p>root@orangepi:~/wiringOP# '''gpio write 2 0'''</p></li>
<li><p>Then set the GPIO port to output a high level. After setting, you can use a multimeter to measure the voltage value of the pin. If it is 3.3v, it means the setting of the high level is successful.</p>
<p>root@orangepi:~/wiringOP# '''gpio write 2 1'''</p></li>
<li><p>The setting method for other pins is similar. You only need to modify the serial number of wPi to the serial number corresponding to the pin.</p></li></ol>
 
<span id="how-to-set-the-pull-down-resistor-of-40-pin-gpio-port"></span>
=== How to set the pull-down resistor of 40 Pin GPIO port ===
 
<ol style="list-style-type: decimal;">
<li><p>The following uses pin No. 7—corresponding to GPIO PI13—corresponding to wPi serial number 2—as an example to demonstrate how to set the pull-up and pull-down resistors of the GPIO port.</p>
<p>[[File:zero2w-img171.png]]</p></li>
<li><p>First, you need to set the GPIO port to input mode, and the third parameter needs to be the serial number of the wPi corresponding to the input pin.</p>
<p>root@orangepi:~/wiringOP# '''gpio mode 2 in'''</p></li>
<li><p>After setting to input mode, execute the following command to set the GPIO port to pull-up mode.</p>
<p>root@orangepi:~/wiringOP# '''gpio mode 2 up'''</p></li>
<li><p>Then enter the following command to read the level of the GPIO port. If the level is 1, it means that the pull-up mode is set successfully.</p>
<p>root@orangepi:~/wiringOP# '''gpio read 2'''</p>
<p>'''1'''</p></li>
<li><p>Then execute the following command to set the GPIO port to pull-down mode</p>
<p>root@orangepi:~/wiringOP# '''gpio mode 2 down'''</p></li>
<li><p>Then enter the following command to read the level of the GPIO port. If the level is 0, it means that the pull-down mode is set successfully.</p>
<p>root@orangepi:~/wiringOP# '''gpio read 2'''</p>
<p>'''0'''</p></li></ol>
 
<span id="pin-spi-test"></span>
=== 40pin SPI test ===
 
# As can be seen from the table below, the spi available for the 40pin interface is spi1, and there are two chip select pins cs0 and cs1
 
{| class="wikitable"
|-
| '''GPIO序号'''
| '''GPIO'''
| '''Function'''
| '''pin'''
|
| '''pin'''
| '''Function'''
| '''GPIO'''
| '''GPIO序号'''
|-
| '''6'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''| '''1'''|| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''264'''| '''PI8'''| '''TWI1-SDA'''| '''3'''|| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''263'''| '''PI7'''| '''TWI1-SCL'''| '''5'''|| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''269'''| '''PI13'''| '''PWM3/UART4_TX'''| '''7'''|| '''8'''| '''UART0_TX'''
| '''PH0'''
| '''224'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''9'''
|
| '''10'''
| '''UART0_RX'''
| '''225'''
|-
| '''226'''
| '''PH2'''
| '''UART5_TX'''
| '''11'''
|
| '''12'''
| style="text-align: left;"|
| '''257'''
|-
| '''227'''
| '''PH3'''
| '''UART5_RX'''
| '''13'''
|
| '''14'''
| '''GND'''
| style="text-align: left;"|
|-
| '''261'''
| '''PI5'''
| '''TWI0_SCL/UART2_TX'''
| '''15'''
|
| '''16'''
| '''PWM4/UART4_RX'''
| '''270'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''
| '''17'''
|
| '''18'''
| style="text-align: left;"|
| '''228'''
|-
| '''231'''| '''PH7'''| '''SPI1_MOSI'''| '''19'''|| '''20'''| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''232'''
| '''PH8'''
| '''SPI1_MISO'''
| '''21'''
|
| '''22'''
| '''TWI0_SDA/UART2_RX'''
| '''262'''
|-
| '''230'''
| '''PH6'''
| '''SPI1_CLK'''
| '''23'''
|
| '''24'''
| '''SPI1_CS0'''
| '''229'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''25'''
|
| '''26'''
| '''SPI1_CS1'''
| '''233'''
|-
| '''266'''
| '''PI10'''
| '''TWI2-SDA/UART3_RX'''
| '''27'''
|
| '''28'''
| '''TWI2-SCL/UART3_TX'''
| '''265'''
|-
| '''256'''
| '''PI0'''
| style="text-align: left;"|
| '''29'''
|
| '''30'''
| '''GND'''
| style="text-align: left;"|
|-
| '''271'''
| '''PI15'''
| style="text-align: left;"|
| '''31'''
|
| '''32'''
| '''PWM1'''
| '''267'''
|-
| '''268'''
| '''PI12'''
| '''PWM2'''
| '''33'''
|
| '''34'''
| '''GND'''
| style="text-align: left;"|
|-
| '''258'''
| '''PI2'''
| style="text-align: left;"|
| '''35'''
|
| '''36'''
| style="text-align: left;"|
| '''76'''
|-
| '''272'''
| '''PI16'''
| style="text-align: left;"|
| '''37'''
|
| '''38'''
| style="text-align: left;"|
| '''260'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''39'''
|
| '''40'''
| style="text-align: left;"|
| '''259'''
|}
</div>
</ol>
<ol start="3" style="list-style-type: decimal;">
<li>There are a total of 28 GPIO ports in the 40pin interface. The high-level voltage of all GPIO ports is '''<span style="color:#FF0000">3.3v</span>'''</li></ol>
<ol stylespan id="listhow-style-type: decimal;"><li><p>In Linux systems, spi1 is turned off by default and needs to be turned on manually before it can be used. The opening steps are as follows:</p><ol style="list-style-type: lowerinstall-alpha;wiringop"><li><p>First run '''orangepi-config'''. Ordinary users remember to add &gt; '''sudo''' permissions.</pspan><p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li><li><p>Then select '''System'''</p><p>[[File:zero2w-img80.png]]</p></li><li><p>Then select '''Hardware'''</p><p>[[File:zero2w-img81.png]]</p></li><li><p>Then use the keyboard's arrow keys == How to locate the position shown &gt; in the figure below, and then use the '''space''' to select the &gt; dtbo configuration of the SPI you want to open.</p></li></ol></li></ol>install wiringOP ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
| '''dtbo configuration'''| '''illustrate<big>'''|Note that wiringOP is already pre-| '''spi1-cs0installed in the linux image released by Orange Pi. Unless the wiringOP code is updated, there is no need to re-cs1-spidev'''| '''Open cs0 download, compile and cs1 of spi1 at the same timeinstall, you can just use it directly.'''|-| '''spi1-cs0-spidev'''| '''Only open cs0 The storage path of spi1'''|-| '''spi1the compiled wiringOP deb package in orangepi-cs1-spidev'''| 'build is: ''Only open cs1 of spi1'''|}
[[File'''<span style="color:zero2wblue">orangepi-img172build/external/cache/debs/arm64/wiringpi_x.png]]xx.deb</span>'''
<ol start="5" style="list-style-type: lower-alpha;">
<li><p>Then select '''&lt;Save&gt;''' to save</p>
<p>[[File:zero2w-img83.png]]</p></li>
<li><p>Then select '''&lt;Back&gt;'''</p>
<p>[[File:zero2w-img84.png]]</p></li>
<li><p>Then select '''&lt;Reboot&gt;'''to restart the system to make the &gt; configuration take effect.</p>
<p>[[File:zero2w-img85.png]]</p></li></ol>
<!-- --><ol start="2" style="list-style-type: decimal;"><li><p>Then check whether there is a '''spidev1.x''' device node in After entering the Linux system. If it exists, it means that you can run the SPI1 configuration has taken effectgpio readall command.</p><p>orangepi@orangepi:~$ '''ls /dev/spidev1*'''</p><p>/dev/spidev1.0 /dev/spidev1.1</p><p>'''Note that only when If you open spi1-cs0-cs1-spidev, you will can see the device nodes of the two spi.'''</p></li><li><p>Nextfollowing output, start the spi loopback test. Do not short-circuit the mosi and miso pins of SPI1 first. The output result of running spidev_test is as follows. You can see it means that the data of TX and RX are inconsistent.</p><p>orangepi@orangepi:~$ '''sudo spidev_test -v wiringOP has been pre-D /dev/spidev1.0'''</p><p>spi mode: 0x0</p><p>bits per word: 8</p><p>max speed: 500000 Hz (500 KHz)</p><p>TX | FF FF FF FF FF FF '''40 00 00 00 00 95''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒.</p><p>RX | FF FF FF FF FF FF '''FF FF FF FF FF FF''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | ............................….</p></li><li><p>Then short-circuit the two pins of SPI1 mosi (pin 19 in the 40pin interface) and miso (pin 21 in the 40pin interface) installed and then run spidev_test. The output is as follows. You can see the sending and receiving The data is the same, indicating that the loopback test passed.</p><p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev1.0'''</p><p>spi mode: 0x0</p><p>bits per word: 8</p><p>max speed: 500000 Hz (500 KHz)</p><p>TX | FF FF FF FF FF FF '''40 00 00 00 00 95''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒be used normally.</p><p>RX | FF FF FF FF FF FF '''40 00 00 00 00 95''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒.</p></li></olbig>
<span id="pin[[File:zero2w-i2c-test"></span>=== 40pin I2C test ===img170.png|center]]
# As can be seen from <big>'''WiringOP currently mainly adapts to the table belowfunctions of setting GPIO port input and output, the i2c available for the 40pin interface are i2c0setting GPIO port output high and low levels, i2c1 and i2c2setting pull-up and pull-down resistors. Functions such as hardware PWM cannot be used.'''</big>|}
<ol style="list-style-type: decimal;"><li><p>Download the code of wiringOP</p>{| class="wikitable" style="width:800px;"
|-
| '''GPIO序号'''| <p>orangepi@orangepi:~$ '''GPIOsudo apt update'''</p>| <p>orangepi@orangepi:~$ '''Functionsudo apt install -y git'''</p>| <p>orangepi@orangepi:~$ '''pin'''|| '''pingit clone https://github.com/orangepi-xunlong/wiringOP.git -b next'''</p>| '''Function'''}{| '''GPIO'''| '''GPIO NO.'''class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
| style="text-align: left;"|| style="text-align: left;"|| <big><p>'''Note that the source code needs to download the code of wiringOP next branch. Please don'3t miss the -b next parameter.3V'''</p>| <p>'''1If there is a problem downloading the code from GitHub, you can directly use the wiringOP source code that comes with the Linux image. The storage location is: /usr/src/wiringOP.'''</p></big>|}| '''2'''</li>| '''5V'''<li><p>Compile and install wiringOP</p>{| styleclass="text-align: left;wikitable"|| style="text-alignwidth: left800px;"|
|-
| <p>orangepi@orangepi:~$ '''264cd wiringOP'''</p>| <p>orangepi@orangepi:~/wiringOP$ '''PI8sudo ./build clean'''</p>| <p>orangepi@orangepi:~/wiringOP$ '''TWI1-SDAsudo ./build'''</p>| '''3'''}</li>|<li><p>The output of the test gpio readall command is as follows</p>| '''4'''<p>[[File:zero2w-img170.png]]</p></li></ol>| '''5V'''| style<span id="textpin-interface-gpio-i2c-uart-spi-align: left;and-pwm-testing"|></span> == 40pin interface GPIO, I2C, UART, SPI and PWM testing == {| class="wikitable" style="textbackground-aligncolor: left#ffffdc;width:800px;"|
|-
| '''263'''| <big>'''PI7Note: The pin header on the 40pin interface is not soldered by default, and you need to solder it yourself before it can be used.'''</big>| '''TWI1-SCL'''}| '''5'''|<span id="pin-gpio-port-test"></span>| '''6'''=== 40pin GPIO port test ===| '''GND'''| <ol style="textlist-alignstyle-type: leftdecimal;"|><li><p>The following uses pin No. 7 - corresponding to GPIO PI13 - corresponding to wPi serial number 2 - as an example to demonstrate how to set the high and low levels of the GPIO port.</p><p>[[File:zero2w-img171.png]]</p></li><li><p>First set the GPIO port to output mode, and the third parameter needs to be the serial number of the wPi corresponding to the input pin.</p>{| class="wikitable" style="text-alignwidth: left800px;"|
|-
| '''269'''| <p>root@orangepi:~/wiringOP# '''PI13'''| gpio mode <span style="color:#FF0000">2</span> out'''PWM3</UART4_TX'''p>| '''7'''}|</li>| '''8'''| '''UART0_TX'''<li><p>Then set the GPIO port to output a low level. After setting, you can use a multimeter to measure the voltage value of the pin. If it is 0v, it means the low level is set successfully.</p>{| '''PH0'''| '''224'''class="wikitable" style="width:800px;"
|-
| style="text-align<p>root@orangepi: left;"|| ~/wiringOP# '''gpio write 2 <span style="text-aligncolor: left;#FF0000"|| '''GND'''| '''9>0</span>'''</p>|}| '''10'''| '''UART0_RX'''</li>| '''PH1'''<li><p>Then set the GPIO port to output a high level. After setting, you can use a multimeter to measure the voltage value of the pin. If it is 3.3v, it means the setting of the high level is successful.</p>{| '''225'''class="wikitable" style="width:800px;"
|-
| <p>root@orangepi:~/wiringOP# '''226gpio write 2 <span style="color:#FF0000">1</span>'''</p>| '''PH2'''}</li><li><p>The setting method for other pins is similar. You only need to modify the serial number of wPi to the serial number corresponding to the pin.</p></li></ol> | '''UART5_TX'''<span id="how-to-set-the-pull-down-resistor-of-40-pin-gpio-port"></span>| '''11'''|=== How to set the pull-down resistor of 40 Pin GPIO port ===| '''12'''| <ol style="textlist-style-aligntype: leftdecimal;"|><li><p>The following uses pin No. 7—corresponding to GPIO PI13—corresponding to wPi serial number 2—as an example to demonstrate how to set the pull-up and pull-down resistors of the GPIO port.</p><p>[[File:zero2w-img171.png]]</p></li>| '''PI1'''<li><p>First, you need to set the GPIO port to input mode, and the third parameter needs to be the serial number of the wPi corresponding to the input pin.</p>{| '''257'''class="wikitable" style="width:800px;"
|-
| <p>root@orangepi:~/wiringOP# '''227gpio mode <span style="color:#FF0000">2</span> in'''</p>| }</li><li><p>After setting to input mode, execute the following command to set the GPIO port to pull-up mode.</p>{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''PH3gpio mode <span style="color:#FF0000">2</span> up'''</p>|}</li><li><p>Then enter the following command to read the level of the GPIO port. If the level is 1, it means that the pull-up mode is set successfully.</p>{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio read <span style="color:#FF0000">2</span>'''</p><p>'''UART5_RX<span style="color:#FF0000">1</span>'''</p>|}</li><li><p>Then execute the following command to set the GPIO port to pull-down mode</p>{| class="wikitable" style="width:800px;" | -| <p>root@orangepi:~/wiringOP# '''13gpio mode <span style="color:#FF0000">2</span> down'''</p>|}</li><li><p>Then enter the following command to read the level of the GPIO port. If the level is 0, it means that the pull-down mode is set successfully.</p>{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''14gpio read <span style="color:#FF0000">2</span>'''</p>| <p>'''GND<span style="color:#FF0000">0</span>'''</p>| }</li></ol> <span id="pin-spi-test"></span> === 40pin SPI test === # As can be seen from the table below, the spi available for the 40pin interface is spi1, and there are two chip select pins cs0 and cs1 <div style="text-aligndisplay: leftflex;"|>::{| class="wikitable" style="width:390px;margin-right: 20px;text-align: leftcenter;"|
|-
| '''261GPIO NO.'''| '''PI5GPIO'''| '''TWI0_SCL/UART2_TXFunction'''| '''15'''|| '''16'''| '''PWM4/UART4_RX'''| '''PI14'''| '''270pin'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''
| '''17'''|| '''18'''| style="text-align: left;"|| '''PH4'''| '''2281'''
|-
| '''231264'''| '''PH7PI8'''| '''SPI1_MOSITWI1-SDA'''| '''193'''|-| '''20263'''| '''PI7'''| '''TWI1-SCL'''| '''5'''|-| '''269'''| '''PI13'''| '''PWM3/UART4_TX'''| '''7'''|-| style="text-align: left;"|| style="text-align: left;"|
| '''GND'''
| '''9'''
|-
| '''226'''
| '''PH2'''
| '''UART5_TX'''
| '''11'''
|-
| '''227'''
| '''PH3'''
| '''UART5_RX'''
| '''13'''
|-
| '''261'''
| '''PI5'''
| '''TWI0_SCL/UART2_TX'''
| '''15'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''
| '''17'''
|-
| '''<span style="color:#FF0000">231</span>'''
| '''<span style="color:#FF0000">PH7</span>'''
| '''<span style="color:#FF0000">SPI1_MOSI</span>'''
| '''<span style="color:#FF0000">19</span>'''
|-
| '''<span style="color:#FF0000">232</span>'''| '''<span style="color:#FF0000">PH8</span>'''| '''<span style="color:#FF0000">SPI1_MISO</span>'''| '''<span style="color:#FF0000">21'''|| '''22'''| '''TWI0_SDA</UART2_RX'''| '''PI6'''| '''262span>'''
|-
| '''<span style="color:#FF0000">230</span>'''| '''<span style="color:#FF0000">PH6</span>'''| '''<span style="color:#FF0000">SPI1_CLK</span>'''| '''<span style="color:#FF0000">23'''|| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229</span>'''
|-
| style="text-align: left;"|
| '''GND'''
| '''25'''
|
| '''26'''
| '''SPI1_CS1'''
| '''PH9'''
| '''233'''
|-
| '''266'''
| '''TWI2-SDA/UART3_RX'''
| '''27'''
|
| '''28'''
| '''TWI2-SCL/UART3_TX'''
| '''PI9'''
| '''265'''
|-
| '''256'''
| style="text-align: left;"|
| '''29'''
|
| '''30'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''271'''
| style="text-align: left;"|
| '''31'''
|
| '''32'''
| '''PWM1'''
| '''PI11'''
| '''267'''
|-
| '''268'''
| '''PWM2'''
| '''33'''
|
| '''34'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''258'''
| style="text-align: left;"|
| '''35'''
|
| '''36'''
| style="text-align: left;"|
| '''PC12'''
| '''76'''
|-
| '''272'''
| style="text-align: left;"|
| '''37'''
|
| '''38'''
| style="text-align: left;"|
| '''PI4'''
| '''260'''
|-
| style="text-align: left;"|
| '''GND'''
| '''39'''
|
| '''40'''
| style="text-align: left;"|
| '''PI3'''
| '''259'''
|}
 <ol start{| class="2wikitable" style="list-style-typewidth: decimal390px;"><li><p>i2c is turned off by default in Linux systems and needs to be turned on manually to use it. The opening steps are as follows: </p><ol style="listmargin-style-typeright: lower-alpha20px;"><li><p>First run '''orangepi-config'''. Ordinary users remember to add &gt; '''sudo''' permissions.</p><p>orangepi@orangepi:~$ '''sudo orangepitext-config'''</p></li><li><p>Then select '''System'''</p><p>[[Filealign:zero2w-img80.png]]</p></li><li><p>Then select '''Hardware'''</p><p>[[File:zero2w-img81.png]]</p></li><li><p>Then use the keyboard's arrow keys to locate the position shown &gt; in the picture below, and then use the '''space''' to select the &gtcenter; corresponding i2c configuration in the picture below.</p></li></ol></li></ol> {| class="wikitable"
|-
| '''Multiplexing function in 40pinpin'''| '''Corresponding dtbo configurationFunction'''| '''GPIO'''| '''GPIO NO.'''
|-
| '''40pin - i2c02'''| '''pi-i2c05V'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''40pin - i2c14'''| '''pi-i2c15V'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''40pin - i2c26'''| '''pi-i2c2GND'''|} [[File:zero2w-img173.png]] <ol start="5" style="listtext-style-typealign: lower-alphaleft;"><li><p>Then select <span class="mark">&lt;Save&gt;</span> to save</p><p>[[File:zero2w-img83.png]]</p></li><li><p>Then select '''&lt;Back&gt;'''</p><p>[[File:zero2w-img84.png]]</p></li><li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the &gt; configuration take effect.</p><p>[[File:zero2w-img85.png]]</p></li></ol> <!-- --><ol start="3" style="list-style-type: decimal;"><li><p>After starting the Linux system, first confirm that there is an open i2c device node under /dev</p><p>orangepi@orangepi:~$ '''ls /dev/i2c-*'''</p>|<p>'''/dev/i2c-*'''</p><p>'''Sometimes the i2c device node and the i2c bus serial number do not correspond one to one. For example, the i2c device node of the i2c1 bus may be /dev/i2c-3.'''</p><p>'''The method to accurately confirm the device node under /dev corresponding to the i2c bus is: '''</p></li></ol> <!-- --><ol style="list-style-type: lower-alpha;"><li><p>'''First run the following command to check the corresponding relationship of i2c'''</p><p>orangepi@orangepizero2w:~$ '''ls /sys/devices/platform/soc*/*/i2c-* | grep &quot;i2c-[0-9]&quot;'''</p><p>/sys/devices/platform/soc/5002000.i2c/i2c-0:</p><p>/sys/devices/platform/soc/5002400.i2c/i2c-3:</p><p>/sys/devices/platform/soc/5002800.i2c/i2c-4:</p><p>/sys/devices/platform/soc/5002c00.i2c/i2c-5:</p><p>/sys/devices/platform/soc/6000000.hdmi/i2c-2:</p><p>/sys/devices/platform/soc/7081400.i2c/i2c-1:</p></li><li><p>'''In the above output'''</p></li></ol> <!-- --><ol style="list-styletext-typealign: lower-alphaleft;"><li><p>5002000 is the register base address of the i2c0 bus, and i2c-0 shown behind it is its corresponding i2c device node</p></li><li><p>5002400 is the register base address of the i2c1 bus, and i2c-3 shown behind it is its corresponding i2c device node</p></li><li><p>5002800 is the register base address of the i2c2 bus, and i2c-4 shown behind it is its corresponding i2c device node</p></li></ol> <!-- --><ol start="4" style="list-style-type: decimal;"><li><p>Then start testing i2c, first install i2c-tools</p><p>orangepi@orangepi:~$ '''sudo apt-get update'''</p><p>orangepi@orangepi:~$ '''sudo apt-get install -y i2c-tools'''</p></li><li><p>Then connect an i2c device to the i2c pin of the 40pin connector</p></li><li><p>Then use the '''i2cdetect -y x''' x command. If the address of the connected i2c device can be detected, it means that i2c can be used normally.</p><p>'''Note that x in the i2cdetect -y x command needs to be replaced with the serial number of the device node corresponding to the i2c bus.'''</p><p>'''Different i2c device addresses are different. The 0x50 address in the picture below is just an example. Please refer to what you actually see.'''</p><div class="figure"> [[File:zero2w-img174.png]] </div></li></ol> <span id="pin-uart-test"></span>=== 40pin UART test === # As can be seen from the table below, the available uarts are uart2, uart3, uart4 and uart5. Please note that uart0 is set as a debugging serial port by default. Please do not use uart0 as a normal serial port. {| class="wikitable"
|-
| '''GPIO NO.'''| '''GPIO'''| '''Function'''| '''pin'''|| '''pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''1'''|| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''264'''| '''PI8'''| '''TWI1-SDA'''| '''3'''|| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''263'''| '''PI7'''| '''TWI1-SCL'''| '''5'''|| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''269'''| '''PI13'''| '''PWM3/UART4_TX'''| '''7'''|| '''8'''| '''UART0_TX'''| '''PH0'''
| '''224'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''9'''
|
| '''10'''
| '''UART0_RX'''
| '''225'''
|-
| '''226'''
| '''PH2'''
| '''UART5_TX'''
| '''11'''
|
| '''12'''
| style="text-align: left;"|
| '''257'''
|-
| '''227'''
| '''PH3'''
| '''UART5_RX'''
| '''13'''
|
| '''14'''
| '''GND'''
| style="text-align: left;"|
|-
| '''261'''
| '''PI5'''
| '''TWI0_SCL/UART2_TX'''
| '''15'''
|
| '''16'''
| '''PWM4/UART4_RX'''
| '''270'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''
| '''17'''
|
| '''18'''
| style="text-align: left;"|
| '''228'''
|-
| '''231'''
| '''PH7'''
| '''SPI1_MOSI'''
| '''19'''
|
| '''20'''
| '''GND'''
| style="text-align: left;"|
|-
| '''232'''
| '''PH8'''
| '''SPI1_MISO'''
| '''21'''
|
| '''22'''
| '''TWI0_SDA/UART2_RX'''
| '''262'''
|-
| '''230'''| '''PH6'''| '''SPI1_CLK'''| '''23'''|| '''<span style="color:#FF0000">24</span>'''| '''<span style="color:#FF0000">SPI1_CS0</span>'''| '''<span style="color:#FF0000">PH5</span>'''| '''<span style="color:#FF0000">229</span>'''
|-
| '''<span style="text-aligncolor: left;#FF0000"|| style="text-align: left;"|| '''GND'''| '''25'''|| '''>26</span>'''| '''<span style="color:#FF0000">SPI1_CS1</span>'''| '''<span style="color:#FF0000">PH9</span>'''| '''<span style="color:#FF0000">233</span>'''
|-
| '''266'''
| '''PI10'''
| '''TWI2-SDA/UART3_RX'''
| '''27'''
|
| '''28'''
| '''TWI2-SCL/UART3_TX'''
| '''265'''
|-
| '''256'''
| '''PI0'''
| style="text-align: left;"|
| '''29'''
|
| '''30'''
| '''GND'''
| style="text-align: left;"|
|-
| '''271'''
| '''PI15'''
| style="text-align: left;"|
| '''31'''
|
| '''32'''
| '''PWM1'''
| '''267'''
|-
| '''268'''
| '''PI12'''
| '''PWM2'''
| '''33'''
|
| '''34'''
| '''GND'''
| style="text-align: left;"|
|-
| '''258'''| '''PI2'''| style="text-align: left;"|| '''35'''|| '''36'''
| style="text-align: left;"|
| '''PC12'''
| '''76'''
|-
| '''272'''
| '''PI16'''
| style="text-align: left;"|
| '''37'''
|
| '''38'''
| style="text-align: left;"|
| '''260'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''39'''
|
| '''40'''
| style="text-align: left;"|
| '''259'''
|}
</div>
<ol start="2" style="list-style-type: decimal;"><li><p>In Linux systems, uart spi1 is turned off by default and needs to be turned on manually before it can be used. The opening steps are as follows:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>First run '''orangepi-config'''. Ordinary users remember to add &gt; '''sudo''' permissions.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>Then select '''System'''</p>
<p>[[File:zero2w-img80.png]]</p></li>
<li><p>Then select '''Hardware'''</p>
<p>[[File:zero2w-img81.png]]</p></li>
<li><p>Then use the keyboard's arrow keys to locate the position shown &gt; in the picture figure below, and then use the '''space''' to select the &gt; serial port dtbo configuration of the SPI you want to open.</p></li></ol></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''Multiplexing function in 40pindtbo configuration'''| '''Corresponding dtbo configurationillustrate'''
|-
| '''40pin spi1- uart2cs0-cs1-spidev'''| '''pi-uart2Open cs0 and cs1 of spi1 at the same time'''
|-
| '''40pin spi1- uart3cs0-spidev'''| '''pi-uart3Only open cs0 of spi1'''
|-
| '''40pin spi1- uart4'''| '''pics1-uart4spidev'''|-| '''40pin - uart5'''| '''ph-uart5Only open cs1 of spi1'''
|}
[[File:zero2w-img175img172.png]]</ol>
<ol start="5" style="list-style-type: lower-alpha;">
<li><p>Then select '''&lt;Save&gt;''' to save</p>
<li><p>Then select '''&lt;Back&gt;'''</p>
<p>[[File:zero2w-img84.png]]</p></li>
<li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the &gt; configuration take effect.</p>
<p>[[File:zero2w-img85.png]]</p></li></ol>
</li></ol>
<ol start="2" style="list-style-type: decimal;">
<li><p>Then check whether there is a '''spidev1.x''' device node in the Linux system. If it exists, it means that the SPI1 configuration has taken effect.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ls /dev/spidev1*'''</p>
<p>/dev/spidev1.0 /dev/spidev1.1</p>
|}
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
|
<big><p>'''Note that only when you open spi1-cs0-cs1-spidev, you will see the device nodes of the two spi.'''</p></big>
|}
</li>
<li><p>Next, start the spi loopback test. Do not short-circuit the mosi and miso pins of SPI1 first. The output result of running spidev_test is as follows. You can see that the data of TX and RX are inconsistent.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev1.0'''</p>
<p>spi mode: 0x0</p>
<p>bits per word: 8</p>
<p>max speed: 500000 Hz (500 KHz)</p>
<p>TX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒.</p>
<p>RX | FF FF FF FF FF FF '''<span style="color:#FF0000">FF FF FF FF FF FF</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | ............................….</p>
|}
</li>
<li><p>Then short-circuit the two pins of SPI1 mosi (pin 19 in the 40pin interface) and miso (pin 21 in the 40pin interface) and then run spidev_test. The output is as follows. You can see the sending and receiving The data is the same, indicating that the loopback test passed.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev1.0'''</p>
<p>spi mode: 0x0</p>
<p>bits per word: 8</p>
<p>max speed: 500000 Hz (500 KHz)</p>
<p>TX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒.</p>
<p>RX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒.</p>
|}
</li></ol>
 
<span id="pin-i2c-test"></span>
<!-- --><ol start="3" style="list-style-type: decimal;"><li><p>After entering the Linux system, first confirm whether there is a uart5 device node under '''/dev'''</p><p>'''Note that the linux5.4 system is /dev/ttyASx.'''</p><p>orangepi@orangepi:~$ '''ls /dev/ttyS*'''</p><p>/dev/ttySx</p></li><li><p>Then start testing the uart interface. First use Dupont wire to short-circuit the rx and tx pins of the uart interface to be tested.</p></li><li><p>Use the '''gpio''' command in wiringOP to test the loopback function of the serial port as shown below. If you can see the following print, it means the serial port communication is normal.</p><p>'''Note that the last x in the gpio serial /dev/ttySx command needs to be replaced with the serial number of the corresponding uart device node.'''</p><p>orangepi@orangepi:~$ '''gpio serial /dev/ttySx # linux-6.1 test command'''</p><p>orangepi@orangepi:~$ '''gpio serial /dev/ttyASx # linux-5.4 test command'''</p><p>Out: 0: -&gt; 0</p><p>Out: 1: -&gt; 1</p><p>Out: 2: -&gt; 2</p><p>Out: 3: -&gt; 3^C</p></li></ol> <span id="pwm-test-method"></span>=== PWM 40pin I2C test method ===
# As can be seen from the following tablebelow, the i2c available pwm for the 40pin interface are pwm1, pwm2i2c0, pwm3 i2c1 and pwm4.i2c2
<div style="display: flex;">::{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"
|-
| '''GPIO NO.'''
| '''GPIO'''
| '''Function'''
| '''Pin'''|| '''Pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.pin'''
|-
| style="text-align: left;"|
| '''3.3V'''
| '''1'''
|-| '''2<span style="color:#FF0000">264</span>'''| '''5V<span style="color:#FF0000">PI8</span>'''| '''<span style="color:#FF0000">TWI1-SDA</span>'''| '''<span style="color:#FF0000">3</span>'''|-| '''<span style="color:#FF0000">263</span>'''| '''<span style="color:#FF0000">v</span>'''| '''<span style="color:#FF0000">TWI1-SCL</span>'''| '''<span style="color:#FF0000">5</span>'''|-| '''269'''| '''PI13'''| '''PWM3/UART4_TX'''| '''7'''|-
| style="text-align: left;"|
| style="text-align: left;"|
|-| '''264'''| '''PI8'''| '''TWI1-SDA'''| '''3'''|| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''263'''| '''PI7'''| '''TWI1-SCL'''| '''5'''|| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''269'''| '''PI13'''| '''PWM3/UART4_TX'''| '''7'''|| '''8'''| '''UART0_TX'''| '''PH0'''| '''224'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''
| '''9'''
|
| '''10'''
| '''UART0_RX'''
| '''PH1'''
| '''225'''
|-
| '''226'''
| '''UART5_TX'''
| '''11'''
|
| '''12'''
| style="text-align: left;"|
| '''PI1'''
| '''257'''
|-
| '''227'''
| '''UART5_RX'''
| '''13'''
|
| '''14'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''<span style="color:#FF0000">261</span>'''| '''<span style="color:#FF0000">PI5</span>'''| '''<span style="color:#FF0000">TWI0_SCL</span>/UART2_TX'''| '''<span style="color:#FF0000">15'''|| '''16'''| '''PWM4</UART4_RX'''| '''PI14'''| '''270span>'''
|-
| style="text-align: left;"|
| '''3.3V'''
| '''17'''
|| '''18'''| style="text-align: left;"|| '''PH4'''| '''228'''|-| '''231'''
| '''PH7'''
| '''SPI1_MOSI'''
| '''19'''
|
| '''20'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''232'''
| '''SPI1_MISO'''
| '''21'''
|
| '''22'''
| '''TWI0_SDA/UART2_RX'''
| '''PI6'''
| '''262'''
|-
| '''230'''
| '''SPI1_CLK'''
| '''23'''
|
| '''24'''
| '''SPI1_CS0'''
| '''PH5'''
| '''229'''
|-
| style="text-align: left;"|
| '''GND'''
| '''25'''
|
| '''26'''
| '''SPI1_CS1'''
| '''PH9'''
| '''233'''
|-
| '''<span style="color:#FF0000">266</span>'''| '''<span style="color:#FF0000">PI10</span>'''| '''<span style="color:#FF0000">TWI2-SDA</span>/UART3_RX'''| '''<span style="color:#FF0000">27'''|| '''28'''| '''TWI2-SCL</UART3_TX'''| '''PI9'''| '''265span>'''
|-
| '''256'''
| style="text-align: left;"|
| '''29'''
|
| '''30'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''271'''
| style="text-align: left;"|
| '''31'''
|
| '''32'''
| '''PWM1'''
| '''PI11'''
| '''267'''
|-
| '''268'''
| '''PWM2'''
| '''33'''
|
| '''34'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''258'''
| style="text-align: left;"|
| '''35'''
|
| '''36'''
| style="text-align: left;"|
| '''PC12'''
| '''76'''
|-
| '''272'''
| style="text-align: left;"|
| '''37'''
|
| '''38'''
| style="text-align: left;"|
| '''PI4'''
| '''260'''
|-
| style="text-align: left;"|
| '''GND'''
| '''39'''
|}{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''8'''| '''UART0_TX'''| '''PH0'''| '''224'''|-| '''10'''| '''UART0_RX'''| '''PH1'''| '''225'''|-| '''4012'''
| style="text-align: left;"|
| '''PI3PI1'''| '''259257'''|}-| '''14'''| '''GND'''<ol start="2" | style="list-styletext-typealign: decimalleft;">|<li><p>pwm is turned off by default in Linux systems and needs to be turned on manually to use it. The opening steps are as follows:</p><ol | style="listtext-style-typealign: lower-alphaleft;">||-<li><p>First run | '''orangepi-config16'''. Ordinary users remember to add &gt; | '''sudoPWM4/UART4_RX''' permissions.</p><p>orangepi@orangepi:~$ | '''sudo orangepi-configPI14'''</p></li><li><p>Then select | '''System270'''</p><p>[[File:zero2w|-img80.png]]</p></li><li><p>Then select | '''Hardware18'''</p><p>[[File| style="text-align:zero2w-img81.png]]</p></li>left;"|<li><p>Then use the keyboard| '''PH4'''s arrow keys to locate the position shown &gt; in the figure below, and then use the | '''space228''' to select the &gt; configuration corresponding to the pwm you want to open.</p><p>[[File:zero2w|-img176.png]]</p></li><li><p>Then select | '''&lt;Save&gt;20''' to save</p><p>[[File:zero2w-img83.png]]</p></li><li><p>Then select | '''GND'''&lt| style="text-align: left;Back&gt"|| style="text-align: left;"||-| '''</p><p>[[Filespan style="color:zero2w-img84.png]]</p#FF0000">22</li><li><pspan>Then select '''&lt;Reboot&gt;| ''' to restart the system to make the &gt; configuration take effect.</p><p>[[Filespan style="color:zero2w-img85.png]]</p#FF0000">TWI0_SDA</lispan></ol>UART2_RX'''| '''</lispan style="color:#FF0000"><li><p>After restarting, you can start the PWM testPI6</p><pspan>'''Please execute the following commands under the root user.| '''</p><ol span style="list-style-typecolor: lower-alpha;#FF0000"><li><p>Enter the following command on the command line to make pwm1 &gt; output a 50Hz square wave262</pspan>'''|-| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229'''<p>root@orangepi:~# |-| '''echo 1 &gt; /sys/class/pwm/pwmchip0/export26'''</p><p>root@orangepi:~# | '''echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm1/periodSPI1_CS1'''</p><p>root@orangepi:~# | '''echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm1/duty_cyclePH9'''</p><p>root@orangepi:~# | '''233'''echo 1 &gt; /sys/class/pwm/pwmchip0/pwm1/enable|-| '''</pspan style="color:#FF0000">28</lispan>'''| '''<lispan style="color:#FF0000"><p>Enter the following command on the command line to make pwm2 &gt; output a 50Hz square waveTWI2-SCL</pspan></li></ol>UART3_TX'''| '''</lispan style="color:#FF0000">PI9</olspanroot@orangepi:~# '''echo 2 &gt; /sys/class/pwm/pwmchip0/export| ''' root@orangepi<span style="color:~# '''echo 20000000 &gt; FF0000">265</sys/class/pwm/pwmchip0/pwm2/periodspan>'''|-root@orangepi:~# | '''echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm2/duty_cycle30''' root@orangepi:~# | '''echo 1 &gt; /sys/class/pwm/pwmchip0/pwm2/enableGND''' <ol start| style="3text-align: left;" || style="listtext-style-typealign: lower-alphaleft;">|<li>Enter the following command on the command line to make pwm3 output &gt; a 50Hz square wave</li></ol>|-| '''32'''root@orangepi:~# | '''echo 3 &gt; /sys/class/pwm/pwmchip0/exportPWM1'''| '''PI11'''root@orangepi:~# | '''echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm3/period267'''|-root@orangepi:~# | '''echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm3/duty_cycle34''' root@orangepi:~# | '''echo 1 &gt; /sys/class/pwm/pwmchip0/pwm3/enableGND''' <ol start| style="4text-align: left;" || style="listtext-align: left;"||-| '''36'''| style="text-typealign: lower-alphaleft;">|| '''PC12'''<li>Enter the following command on the command line to make pwm4 output &gt; a 50Hz square wave</li></ol>| '''76'''|-root@orangepi:~# | '''echo 4 &gt; /sys/class/pwm/pwmchip0/export38'''| style="text-align: left;"|root@orangepi:~# | '''echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm4/periodPI4''' root@orangepi:~# | '''echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm4/duty_cycle260'''|-root@orangepi:~# | '''echo 1 &gt; /sys/class/pwm/pwmchip0/pwm4/enable40''' <div class| style="figuretext-align: left;">|| '''PI3'''[[File:zero2w-img177.png]]| '''259'''|}
</div>
<span id="how-to-install-and-use-wiringop-python"></span>
== How to install and use wiringOP-Python ==
'''Note<ol start="2" style="list-style-type: The pin header on the 40pin interface decimal;"><li><p>i2c is not soldered turned off by default, in Linux systems and you need needs to be turned on manually to solder use it yourself before it can be used.The opening steps are as follows: </p><ol style="list-style-type: lower-alpha;"><li><p>First run '''orangepi-config'''. Ordinary users remember to add '''sudo''' permissions.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li><li><p>Then select '''System'''</p><p>[[File:zero2w-img80.png]]</p></li><li><p>Then select '''Hardware'''</p><p>[[File:zero2w-img81.png]]</p></li><li><p>Then use the keyboard's arrow keys to locate the position shown in the picture below, and then use the '''space''' to select the corresponding i2c configuration in the picture below.</p></li>
'''wiringOP-Python is the Python language version of wiringOP library, used to operate the development board's GPIO, I2C, SPI, UART and other hardware resources in the Python program''' '''Also please note that all the following commands are operated under the root user.''' <span id{| class="how-to-install-wiringop-pythonwikitable"></span>=== How to install wiringOP-Python === <ol style="list-stylewidth:800px;text-typealign: decimalcenter;"><li><p>First install dependency packages</p>|-<p>root@orangepi:~# | '''sudo apt-get updateMultiplexing function in 40pin'''</p><p>root@orangepi:~# | '''sudo apt-get -y install git swig python3-dev python3-setuptoolsCorresponding dtbo configuration'''</p></li><li><p>Then use the following command to download the source code of wiringOP|-Python</p></li></ol>| '''40pin - i2c0'''| '''Note that the following git clone--recursive command will automatically download the source code of wiringOP, because wiringOPpi-Python depends on wiringOP. Please make sure there are no errors during the download process due to network problems.i2c0'''|-If there is a problem downloading the code from GitHub, you can directly use the wiringOP-Python source code that comes with the Linux image. The storage location is: | '''/usr/src/wiringOP40pin -Pythoni2c1''' root@orangepi:~# | '''git clone --recursive https://github.com/orangepi-xunlong/wiringOP-Python pi-b nexti2c1'''|-root@orangepi:~# | '''cd wiringOP40pin -Pythoni2c2''' root@orangepi:~/wiringOP-Python# | '''git submodule update pi--init --remotei2c2'''|}
[[File:zero2w-img173.png]]
</ol>
<ol start="5" style="list-style-type: lower-alpha;">
<li><p>Then select <span class="mark">&lt;Save&gt;</span> to save</p>
<p>[[File:zero2w-img83.png]]</p></li>
<li><p>Then select '''&lt;Back&gt;'''</p>
<p>[[File:zero2w-img84.png]]</p></li>
<li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the configuration take effect.</p>
<p>[[File:zero2w-img85.png]]</p></li></ol>
</li></ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>Then use the following command to compile wiringOP-Python and install it into After starting the Linux system of the development board, first confirm that there is an open i2c device node under /dev</p>{| class="wikitable" style="width:800px;" |-| <p>rootorangepi@orangepi:~# $ '''cd wiringOPls /dev/i2c-Python*'''</p><p>root@orangepi:~/wiringOP-Python# '''python3 generate/dev/i2c-bindings.py &gt; bindings.i*'''</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>root@orangepi:~/wiringOP-Python# '''sudo python3 setupSometimes the i2c device node and the i2c bus serial number do not correspond one to one. For example, the i2c device node of the i2c1 bus may be /dev/i2c-3.py install'''</p></li><li><p>Then enter the following command. If helpful information is output, it means wiringOP-Python is successfully installed. Press the '''qThe method to accurately confirm the device node under /dev corresponding to the i2c bus is: ''' key to exit the help information interface.</p></li></olbig>
root@orangepi:~/wiringOP-Python# '''python3 -c &quot;import wiringpi; help(wiringpi)&quot;'''
Help on module wiringpi<ol style="list-style-type:lower-alpha;"><li><p>'''First run the following command to check the corresponding relationship of i2c'''</p><p>orangepi@orangepizero2w:~$ '''ls /sys/devices/platform/soc*/*/i2c-* | grep &quot;i2c-[0-9]&quot;'''</p><p>/sys/devices/platform/soc/5002000.i2c/i2c-0:</p><p>/sys/devices/platform/soc/5002400.i2c/i2c-3:</p><p>/sys/devices/platform/soc/5002800.i2c/i2c-4:</p><p>/sys/devices/platform/soc/5002c00.i2c/i2c-5:</p><p>/sys/devices/platform/soc/6000000.hdmi/i2c-2:</p><p>/sys/devices/platform/soc/7081400.i2c/i2c-1:</p></li>
NAME
wiringpi<li><p>'''In the above output'''</p><ol style="list-style-type: none;"><li><p>a) 5002000 is the register base address of the i2c0 bus, and i2c-0 shown behind it is its corresponding i2c device node</p></li><li><p>b) 5002400 is the register base address of the i2c1 bus, and i2c-3 shown behind it is its corresponding i2c device node</p></li><li><p>c) 5002800 is the register base address of the i2c2 bus, and i2c-4 shown behind it is its corresponding i2c device node</p></li></ol></li></ol>|}</li></ol><ol start="4" style="list-style-type: decimal;"><li><p>Then start testing i2c, first install i2c-tools</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt-get update'''</p><p>orangepi@orangepi:~$ '''sudo apt-get install -y i2c-tools'''</p>|}DESCRIPTION</li><li><p>Then connect an i2c device to the i2c pin of the 40pin connector</p></li><li><p>Then use the '''i2cdetect -y x''' x command. If the address of the connected i2c device can be detected, it means that i2c can be used normally.</p>{| class="wikitable" style="background-color:# This file was automatically generated by SWIG (httpffffdc;width:800px;" |-| <big><p>'''Note that x in the i2cdetect -y x command needs to be replaced with the serial number of the device node corresponding to the i2c bus.'''<//wwwp><p>'''Different i2c device addresses are different.swigThe 0x50 address in the picture below is just an example.org)Please refer to what you actually see.'''</p></big>|}<div class="figure">
# Version 4[[File:zero2w-img174.0.2png]]
#</div></li></ol>
# Do not make changes to this file unless you know what you are doing<span id="pin-uart-modifytest"></span>
# the SWIG interface file instead.=== 40pin UART test ===
<ol start="5" style="list-style-type: decimal;"><li><p>The steps to test whether wiringOP-Python is installed successfully under # As can be seen from the table below, the python command line available uarts are uart2, uart3, uart4 and uart5. Please note that uart0 is set as follows:</p><ol style="list-style-type: lower-alpha;"><li>First a debugging serial port by default. Please do not use the python3 command to enter the command line mode of &gt; python3</li></ol></li></ol>uart0 as a normal serial port.
root@orangepi:~# '''python3''' <ol start="2" div style="list-style-typedisplay: lower-alphaflex;"><li>Then import the python module of wiringpi</li></ol> &gt;&gt;&gt; '''import wiringpi;''' <ol start="3" style="list-style-type: lower-alpha;"><li>Finally, enter the following command to view the help information of &gt; wiringOP-Python. Press the q key to exit the help information &gt; interface.</li></ol> &gt;&gt;&gt; '''help(wiringpi)''' Help on module wiringpiNAME wiringpi DESCRIPTION # This file was automatically generated by SWIG (http://www.swig.org). # Version 4.0.2 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. CLASSES builtins.object GPIO I2C Serial nes {| class GPIO(builtins.object) | GPIO(pinmode=0) | &gt;&gt;&gt; <span id="pin-gpio-port-test-1wikitable"></span>=== 40pin GPIO port test === '''Like wiringOP, wiringOP-Python can also determine which GPIO pin to operate by specifying the wPi number. Because there is no command to view the wPi number in wiringOP-Python, you can only view the board's wPi number and physics through the gpio command in wiringOP Correspondence of pins.''' [[File:zero2w-img170.png]] <ol style="list-style-typewidth: decimal390px;"><li><p>The following uses pin No. 7 margin- corresponding to GPIO PI13 - corresponding to wPi serial number 2 - as an example to demonstrate how to set the high and low levels of the GPIO port.</p><p>[[Fileright:zero2w20px;text-img171.png]]</p></li><li><p>The steps for testing directly with commands are as followsalign:</p><ol style="list-style-type: lower-alphacenter;"><li><p>First set the GPIO port to output mode, where the first &gt; parameter of the '''pinMode''' function is the serial number of &gt; the wPi corresponding to the pin, and the second parameter is &gt; the GPIO mode.</p><p>root@orangepi:~/wiringOP-Python# '''python3 |-c &quot;import wiringpi; \'''</p><p>| '''from wiringpi import GPIO; wiringpiNO.wiringPiSetup() ; \'''</p><p>| '''wiringpi.pinMode(2, GPIO.OUTPUT) ; &quot;'''</p></li><li><p>Then set the GPIO port to output a low level. After setting, you &gt; can use a multimeter to measure the voltage value of the pin. &gt; If it is 0v, it means the low level is set successfully.</p><p>root@orangepi:~/wiringOP-Python# | '''python3 -c &quot;import wiringpi; \Function'''</p><p>| '''from wiringpi import GPIO; wiringpi.wiringPiSetup() ;\pin'''</p><p>'''wiringpi.digitalWrite(2, GPIO.LOW)&quot;'''</p></li>|-<li><p>Then set the GPIO port to output a high level. After setting, &gt; you can use a multimeter to measure the voltage value of the &gt; pin. If it is 3.3v, it means the setting of the high level is &gt; successful.</p><p>root@orangepi| style="text-align:~/wiringOP-Python# '''python3 -c &quotleft;import wiringpi; \'''</p>"|<p>'''from wiringpi import GPIO; wiringpi.wiringPiSetup() ;\'''</p><p>'''wiringpi.digitalWrite(2, GPIO.HIGH)&quot;'''</p></li></ol></li><li><p>The steps for testing in the command line of python3 are as follows:</p><ol | style="listtext-style-typealign: lower-alphaleft;">|<li><p>First use the python3 command to enter the command line mode of &gt; python3</p><p>root@orangepi:~# | '''python33.3V'''</p></li><li><p>Then import the python module of wiringpi</p><p>&gt;&gt;&gt; | '''import wiringpi1'''</p><p>&gt;&gt;&gt; |-| '''from wiringpi import GPIO264'''</p></li><li><p>Then set the GPIO port to output mode, where the first parameter &gt; of the | '''pinModePI8'''function is the serial number of the wPi &gt; corresponding to the pin, and the second parameter is the GPIO &gt; mode.</p><p>&gt;&gt;&gt; | '''wiringpi.wiringPiSetup()TWI1-SDA'''</p><p>0</p><p>&gt;&gt;&gt; | '''wiringpi.pinMode(2, GPIO.OUTPUT)3'''</p></li><li><p>Then set the GPIO port to output a low level. After setting, you &gt; can use a multimeter to measure the voltage value of the pin. &gt; If it is 0v, it means the low level is set successfully.</p>|-<p>&gt;&gt;&gt; | '''wiringpi.digitalWrite(2, GPIO.LOW)263'''</p></li><li><p>Then set the GPIO port to output a high level. After setting, &gt; you can use a multimeter to measure the voltage value of the &gt; pin. If it is 3.3v, it means the setting of the high level is &gt; successful.</p><p>&gt;&gt;&gt; | '''wiringpi.digitalWrite(2, GPIO.HIGH)PI7'''</p></li></ol></li><li><p>For wiringOP-Python to set the GPIO high and low levels in the python code, you can refer to the | '''blink.pyTWI1-SCL''' test program in the examples. The | '''blink.py5''' test program will set the voltage of all GPIO ports in the 40 Pin of the development board to continuously change high and low.</p><p>root@orangepi:~/wiringOP|-Python# | '''cd examples269'''</p><p>root@orangepi:~/wiringOP-Python/examples# | '''ls blink.pyPI13'''</p><p>| '''blink.pyPWM3/UART4_TX'''</p><p>root@orangepi:~/wiringOP-Python/examples| '''# python3 blink.py7'''</p></li></ol> <span id="pin-spi-test-1"></span>=== 40pin SPI test === # As can be seen from the table below, the spi available for the 40pin interface is spi1, and there are two chip select pins cs0 and cs1 {| class="wikitable"
|-
| '''GPIO NO.'''| '''GPIO'''| '''Function'''| '''Pin'''|| '''Pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''1'''|| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''264'''| '''PI8'''| '''TWI1-SDA'''| '''3'''|| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''263'''| '''PI7'''| '''TWI1-SCL'''| '''5'''|| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''269'''| '''PI13'''| '''PWM3/UART4_TX'''| '''7'''|| '''8'''| '''UART0_TX'''| '''PH0'''| '''224'''|-| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''9'''
|
| '''10'''
| '''UART0_RX'''
| '''PH1'''
| '''225'''
|-
| '''226'''
| '''UART5_TX'''
| '''11'''
|
| '''12'''
| style="text-align: left;"|
| '''PI1'''
| '''257'''
|-
| '''227'''
| '''UART5_RX'''
| '''13'''
|
| '''14'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''261'''
| '''TWI0_SCL/UART2_TX'''
| '''15'''
|
| '''16'''
| '''PWM4/UART4_RX'''
| '''PI14'''
| '''270'''
|-
| style="text-align: left;"|
| '''3.3V'''
| '''17'''
|
| '''18'''
| style="text-align: left;"|
| '''PH4'''
| '''228'''
|-
| '''231'''
| '''SPI1_MOSI'''
| '''19'''
|
| '''20'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''232'''
| '''SPI1_MISO'''
| '''21'''
|
| '''22'''
| '''TWI0_SDA/UART2_RX'''
| '''PI6'''
| '''262'''
|-
| '''230'''
| '''SPI1_CLK'''
| '''23'''
|
| '''24'''
| '''SPI1_CS0'''
| '''PH5'''
| '''229'''
|-
| style="text-align: left;"|
| '''GND'''
| '''25'''
|
| '''26'''
| '''SPI1_CS1'''
| '''PH9'''
| '''233'''
|-
| '''266'''
| '''TWI2-SDA/UART3_RX'''
| '''27'''
|
| '''28'''
| '''TWI2-SCL/UART3_TX'''
| '''PI9'''
| '''265'''
|-
| '''256'''
| style="text-align: left;"|
| '''29'''
|
| '''30'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''271'''
| style="text-align: left;"|
| '''31'''
|
| '''32'''
| '''PWM1'''
| '''PI11'''
| '''267'''
|-
| '''268'''
| '''PWM2'''
| '''33'''
|
| '''34'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''258'''
| style="text-align: left;"|
| '''35'''
|
| '''36'''
| style="text-align: left;"|
| '''PC12'''
| '''76'''
|-
| '''272'''
| style="text-align: left;"|
| '''37'''
|
| '''38'''
| style="text-align: left;"|
| '''PI4'''
| '''260'''
|-
| style="text-align: left;"|
| '''GND'''
| '''39'''
|}{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''40pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''6'''| '''GND'''| style="text-align: left;"|
| style="text-align: left;"|
| '''PI3'''
| '''259'''
|}
 
<ol start="2" style="list-style-type: decimal;">
<li><p>In Linux systems, spi1 is turned off by default and needs to be turned on manually before it can be used. The opening steps are as follows:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>First run '''orangepi-config'''. Ordinary users remember to add &gt; '''sudo''' permissions.</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>Then select '''System'''</p>
<p>[[File:zero2w-img80.png]]</p></li>
<li><p>Then select '''Hardware'''</p>
<p>[[File:zero2w-img81.png]]</p></li>
<li><p>Then use the keyboard's arrow keys to locate the position shown &gt; in the figure below, and then use the '''space''' to select the &gt; dtbo configuration of the SPI you want to open.</p></li></ol>
</li></ol>
 
{| class="wikitable"
|-
| '''dtbo configuration8'''| '''illustrateUART0_TX'''| '''PH0'''| '''224'''
|-
| '''spi1-cs0-cs1-spidev10'''| '''Open cs0 and cs1 of spi1 at the same timeUART0_RX'''| '''PH1'''| '''225'''
|-
| '''spi1-cs0-spidev'''| '''Only open cs0 of spi1'''|-| '''spi1-cs1-spidev'''| '''Only open cs1 of spi112'''|} <ol start="5" style="list-style-type: lower-alpha;"><li><p>Then select '''&lt;Save&gt;''' to save</p><p>[[File:zero2w-img83.png]]</p></li><li><p>Then select '''&lt;Back&gt;'''</p><p>[[File:zero2w-img84.png]]</p></li><li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the &gt; configuration take effect.</p><p>[[File:zero2w-img85.png]]</p></li></ol> <!-- --><ol start="3" style="list-styletext-typealign: decimalleft;"><li><p>Then check whether there is a '''spidev1.x''' device node in the Linux system. If it exists, it means that the SPI1 configuration has taken effect.</p><p>orangepi@orangepi:~$ '''ls /dev/spidev1*'''</p><p>/dev/spidev1.0 /dev/spidev1.1</p><p>'''Note that only when you open spi1-cs0-cs1-spidev, you will see the device nodes of the two spi.'''</p></li><li><p>Then you can use the '''spidev_test.py''' program in examples to test the SPI loopback function. The '''spidev_test.py''' program needs to specify the following two parameters:</p><ol style="list-style-type: lower-alpha;"><li><p>'''--channel''': Specify the channel number of SPI</p></li><li><p>'''--port''': Specify the port number of the SPI</p></li></ol></li><li><p>Without shorting the mosi and miso pins of SPI1, the output result of running spidev_test.py is as follows. You can see that the data of TX and RX are inconsistent.</p><p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p></li></ol> root@orangepi:~/wiringOP-Python/examples# '''python3 spidev_test.py \''' '''--channel 1 --port 0''' spi mode: 0x0 max speed: 500000 Hz (500 KHz) Opening device /dev/spidev1.1 TX | FF FF FF FF FF FF '''40 00 00 00 00 95''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…| RX | FF FF FF FF FF FF '''FF FF FF FF FF FF''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |.............….| <ol start="6" style="list-style-type: decimal;"><li><p>Then use Dupont wire to short-circuit the txd (pin 19 in the 40pin interface) and rxd (pin 21 in the 40pin interface) of SPI1 and then run spidev_test.py. The output is as follows, you can see If the data sent and received are the same, it means that the SPI1 loopback test is normal.</p><p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p></li></ol> root@orangepi:~/wiringOP-Python/examples# '''python3 spidev_test.py \''' '''--channel 1 --port 0''' spi mode: 0x0 max speed: 500000 Hz (500 KHz) Opening device /dev/spidev1.1 TX | FF FF FF FF FF FF '''40 00 00 00 00 95''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…| RX | FF FF FF FF FF FF '''40 00 00 00 00 95''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…| <span id="pin-i2c-test-1"></span>=== 40pin I2C test === # As can be seen from the table below, the i2c available for the 40pin interface are i2c0, i2c1 and i2c2 {| class="wikitable"|-| '''GPIO NO.'''| '''GPIO'''| '''Function'''| '''Pin'''|| '''Pin'''| '''Function'''| '''GPIOPI1'''| '''GPIO NO.257'''
|-
| '''14'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-| '''16'''| '''PWM4/UART4_RX'''| '''PI14'''| '''270'''|-| '''18'''| style="text-align: left;"|| '''3.3VPH4'''| '''1228'''|-| '''220'''| '''5VGND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''26422'''| '''PI8TWI0_SDA/UART2_RX'''| '''TWI1PI6'''| '''262'''|-| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229'''|-| '''26'''| '''SPI1_CS1'''| '''PH9'''| '''233'''|-| '''28'''| '''TWI2-SDASCL/UART3_TX'''| '''3PI9'''|'''265'''|-| '''430'''| '''5VGND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''26332'''| '''PI7PWM1'''| '''TWI1-SCLPI11'''| '''5267'''|-| '''634'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''26936'''| '''PI13'''| '''PWM3/UART4_TX'''| '''7'''|| '''8'''| '''UART0_TX'''| '''PH0'''| '''224'''|-
| style="text-align: left;"|
| style="text-align: left;"|| '''GND'''| '''9'''|| '''10'''| '''UART0_RX'''| '''PH1PC12'''| '''22576'''
|-
| '''226'''| '''PH2'''| '''UART5_TX'''| '''11'''|| '''1238'''
| style="text-align: left;"|
| '''PI1PI4'''| '''257260'''
|-
| '''22740'''| '''PH3'''| '''UART5_RX'''| '''13'''|| '''14'''| '''GND'''| style="text-align: left;"|
| style="text-align: left;"|
| '''PI3'''
| '''259'''
|}
</div>
 
<ol start="2" style="list-style-type: decimal;">
<li><p>In Linux systems, uart is turned off by default and needs to be turned on manually before it can be used. The opening steps are as follows:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>First run '''orangepi-config'''. Ordinary users remember to add '''sudo''' permissions.</p>
{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''261sudo orangepi-config'''</p>| }</li><li><p>Then select '''PI5System'''</p>| '''TWI0_SCL<p>[[File:zero2w-img80.png]]</p></UART2_TX'''li>| <li><p>Then select '''15Hardware'''</p>|<p>[[File:zero2w-img81.png]]</p></li>| <li><p>Then use the keyboard's arrow keys to locate the position shown in the picture below, and then use the ''16'space''| '''PWM4to select the serial port you want to open.</p></UART4_RX'''li>| '''PI14'''{| '''270'''class="wikitable" style="width:800px;text-align: center;"
|-
| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''17'''|| '''18'''| style="text-align: left;"|| '''PH4Multiplexing function in 40pin'''| '''228Corresponding dtbo configuration'''
|-
| '''23140pin - uart2'''| '''PH7'''| '''SPI1_MOSI'''| '''19'''|| '''20'''| '''GNDpi-uart2'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''23240pin - uart3'''| '''PH8'''| '''SPI1_MISO'''| '''21'''|| '''22'''| '''TWI0_SDA/UART2_RX'''| '''PI6'''| '''262pi-uart3'''
|-
| '''23040pin - uart4'''| '''PH6'''| '''SPI1_CLK'''| '''23'''|| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229pi-uart4'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GND40pin - uart5'''| '''25ph-uart5'''|}| [[File:zero2w-img175.png]]</ol><ol start="5" style="list-style-type: lower-alpha;"><li><p>Then select '''26&lt;Save&gt;'''to save</p>| <p>[[File:zero2w-img83.png]]</p></li><li><p>Then select '''SPI1_CS1&lt;Back&gt;'''</p><p>[[File:zero2w-img84.png]]</p></li>| <li><p>Then select '''PH9&lt;Reboot&gt;'''to restart the system to make the configuration take effect.</p><p>[[File:zero2w-img85.png]]</p></li></ol></li></ol><!-- --><ol start="3" style="list-style-type: decimal;">| <li><p>After entering the Linux system, first confirm whether there is a uart5 device node under '''233/dev'''</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
| '''266'''| <big><p>'''PI10'''| Note that the linux5.4 system is /dev/ttyASx.'''TWI2-SDA</UART3_RX'''| '''27'''|| '''28'''| '''TWI2-SCLp></UART3_TX'''big>| '''PI9'''}{| '''265'''class="wikitable" style="width:800px;"
|-
| '''256'''| <p>orangepi@orangepi:~$ '''PI0ls /dev/ttyS*'''</p>| style="text-align: left;"|<p>/dev/ttySx</p>| '''29'''}|</li>| '''30'''<li><p>Then start testing the uart interface. First use Dupont wire to short-circuit the rx and tx pins of the uart interface to be tested.</p></li>| <li><p>Use the '''GNDgpio'''command in wiringOP to test the loopback function of the serial port as shown below. If you can see the following print, it means the serial port communication is normal.</p>{| styleclass="text-align: left;wikitable"|| style="textbackground-aligncolor: left#ffffdc;width:800px;"|
|-
| <big><p>'''271Note that the last x in the gpio serial /dev/ttySx command needs to be replaced with the serial number of the corresponding uart device node.'''</p></big>|}{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''gpio serial /dev/ttySx # linux-6.1 test command'''</p><p>orangepi@orangepi:~$ '''PI15gpio serial /dev/ttyASx # linux-5.4 test command'''</p>  <p>Out: 0: -&gt; 0</p><p>Out: 1: -&gt; 1</p><p>Out: 2: -&gt; 2</p><p>Out: 3: -&gt; 3^C</p>| }</li></ol> <span id="pwm-test-method"></span> === PWM test method === # As can be seen from the following table, the available pwm are pwm1, pwm2, pwm3 and pwm4. <div style="display: flex;">::{| class="wikitable" style="width:390px;margin-right: 20px;text-align: leftcenter;"|| '''31'''|-| '''32GPIO NO.'''| '''PWM1GPIO'''| '''PI11Function'''| '''267Pin'''
|-
| '''268'''
| '''PI12'''
| '''PWM2'''
| '''33'''
|
| '''34'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''
| '''1'''
|-
| '''258264'''| '''PI2PI8'''| style="text'''TWI1-align: left;"|SDA'''| '''353'''|-| '''36263'''| style="text-align: left;"|'''PI7'''| '''PC12TWI1-SCL'''| '''765'''
|-
| '''272<span style="color:#FF0000">269</span>'''| '''PI16'''| <span style="text-aligncolor: left;#FF0000"|| '''37>PI13</span>'''|| '''38'''| <span style="text-aligncolor: left;#FF0000"|| '''PI4>PWM3</span>/UART4_TX'''| '''260<span style="color:#FF0000">7</span>'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''399'''|-| '''40226'''| style="text-align: left;"|'''PH2'''| '''PI3UART5_TX'''| '''25911'''|} <ol start="2" style="list-style-type: decimal;"><li><p>i2c is turned off by default in Linux systems and needs to be turned on manually to use it. The opening steps are as follows:</p><ol style="list-style-type: lower-alpha;"><li><p>First run | '''orangepi-config227'''. Ordinary users remember to add &gt; | '''sudoPH3''' permissions.</p><p>orangepi@orangepi:~$ | '''sudo orangepi-configUART5_RX'''</p></li><li><p>Then select | '''System13'''</p><p>[[File:zero2w|-img80.png]]</p></li><li><p>Then select | '''261'''| '''HardwarePI5'''</p><p>[[File:zero2w-img81.png]]<| '''TWI0_SCL/p></li>UART2_TX'''<li><p>Then use the keyboard| 's arrow keys to locate the position shown &gt; in the picture below, and then use the ''15'space''' to select the &gt; corresponding i2c configuration in the picture below.</p></li></ol></li></ol>|-| style="text-align: left;"|{| classstyle="wikitabletext-align: left;"|| '''3.3V'''| '''17'''
|-
| '''Multiplexing function in 40pin231'''| '''Corresponding dtbo configurationPH7'''| '''SPI1_MOSI'''| '''19'''
|-
| '''40pin - i2c0232'''| '''pi-i2c0PH8'''| '''SPI1_MISO'''| '''21'''
|-
| '''40pin - i2c1230'''| '''pi-i2c1'''|-| '''40pin - i2c2'''| '''pi-i2c2'''|} [[File:zero2w-img173.png]] <ol start="5" style="list-style-type: lower-alpha;"><li><p>Then select <span class="mark">&lt;Save&gt;</span> to save</p><p>[[File:zero2w-img83.png]]</p></li><li><p>Then select <span class="mark">&lt;Back&gt;</span></p><p>[[File:zero2w-img84.png]]</p></li><li><p>Then select <span class="mark">&lt;Reboot&gt;</span> to restart the system to make the &gt; configuration take effect.</p><p>[[File:zero2w-img85.png]]</p></li></ol> <!-- --><ol start="3" style="list-style-type: decimal;"><li><p>After starting the Linux system, first confirm that there is an open i2c device node under <span class="mark">/dev</span></p><p>orangepi@orangepi:~$ '''ls /dev/i2c-*'''</p><p>'''/dev/i2c-*'''</p><p>'''Sometimes the i2c device node and the i2c bus serial number do not correspond one to one. For example, the i2c device node of the i2c1 bus may be /dev/i2c-3.'''</p><p>'''The method to accurately confirm the device node under /dev corresponding to the i2c bus is:'''</p></li></ol> <!-- --><ol start="3" style="list-style-type: lower-alpha;"><li><p>'''First run the following command to check the corresponding relationship of i2c'''</p><p>orangepi@orangepizero2w:~$ '''ls /sys/devices/platform/soc*/*/i2c-* | grep &quot;i2c-[0-9]&quot;'''</p><p>/sys/devices/platform/soc/5002000.i2c/i2c-0:</p><p>/sys/devices/platform/soc/5002400.i2c/i2c-3:</p><p>/sys/devices/platform/soc/5002800.i2c/i2c-4:</p><p>/sys/devices/platform/soc/5002c00.i2c/i2c-5:</p><p>/sys/devices/platform/soc/6000000.hdmi/i2c-2:</p><p>/sys/devices/platform/soc/7081400.i2c/i2c-1:</p></li><li><p>'''In the above output'''</p></li></ol> <!-- --><ol start="4" style="list-style-type: lower-alpha;"><li><p>002000 is the register base address of the i2c0 bus, and i2c-0 shown behind it is its corresponding i2c device node</p></li><li><p>5002400 is the register base address of the i2c1 bus, and i2c-3 shown behind it is its corresponding i2c device node</p></li><li><p>5002800 is the register base address of the i2c2 bus, and i2c-4 shown behind it is its corresponding i2c device node</p></li></ol> <!-- --><ol start="4" style="list-style-type: decimal;"><li><p>Then start testing i2c, first install i2c-tools</p><p>orangepi@orangepi:~$ '''sudo apt-get update'''</p><p>orangepi@orangepi:~$ '''sudo''' '''apt-get install -y i2c-tools'''</p></li><li><p>Then connect an i2c device to the i2c pin of the 40pin connector. Here we take the DS1307 RTC module as an example.</p><p>[[File:zero2w-img178.png]]</p></li><li><p>Then use the '''i2cdetect -y x'''command. If the address of the connected i2c device can be detected, it means that the i2c device is connected correctly.</p><p>'''Note that x in the i2cdetect -y x command needs to be replaced with the serial number of the device node corresponding to the i2c bus.'''</p></li></ol> [[File:zero2w-img179.png]] <ol start="7" style="list-style-type: decimal;"><li><p>Then you can run the '''ds1307.py''' test program in '''examples''' to read the RTC time</p><p>'''Note that the x in i2c-x in the following command needs to be replaced with the serial number of the device node corresponding to the i2c bus.'''</p><p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p><p>root@orangepi:~/wiringOP-Python/examples# '''python3 ds1307.py --device \'''</p><p>'''&quot;/dev/i2c-x&quot;'''</p><p>Thu 2022-06-16 04:35:46</p><p>Thu 2022-06-16 04:35:47</p><p>Thu 2022-06-16 04:35:48</p><p>^C</p><p>exit</p></li></ol> <span id="pin-uart-test-1"></span>=== 40pin UART test === # As can be seen from the table below, the available uarts are uart2, uart3, uart4 and uart5. Please note that uart0 is set as a debugging serial port by default. Please do not use uart0 as a normal serial port. {| class="wikitable"|-| '''GPIO NO.'''| '''GPIO'''| '''Function'''| '''Pin'''|| '''Pin'''| '''FunctionPH6'''| '''GPIOSPI1_CLK'''| '''GPIO NO.23'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3VGND'''| '''25'''|-| '''266'''| '''PI10'''| '''TWI2-SDA/UART3_RX'''| '''27'''|-| '''256'''| '''PI0'''| style="text-align: left;"|| '''29'''|-| '''271'''| '''PI15'''| style="text-align: left;"|| '''31'''|-| '''<span style="color:#FF0000">268</span>'''| '''<span style="color:#FF0000">PI12</span>'''| '''<span style="color:#FF0000">PWM2</span>'''| '''<span style="color:#FF0000">33</span>'''|-| '''258'''| '''PI2'''| style="text-align: left;"|| '''35'''|-| '''272'''| '''PI16'''| style="text-align: left;"|| '''37'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''39'''|}{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''Pin'''| '''Function'''| '''GPIO'''| '''1GPIO NO.'''|-
| '''2'''
| '''5V'''
| style="text-align: left;"|
|-
| '''264'''
| '''PI8'''
| '''TWI1-SDA'''
| '''3'''
|
| '''4'''
| '''5V'''
| style="text-align: left;"|
|-
| '''263'''
| '''PI7'''
| '''TWI1-SCL'''
| '''5'''
|
| '''6'''
| '''GND'''
| style="text-align: left;"|
|-
| '''269'''
| '''PI13'''
| '''PWM3/UART4_TX'''
| '''7'''
|
| '''8'''
| '''UART0_TX'''
| '''224'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''9'''
|
| '''10'''
| '''UART0_RX'''
| '''225'''
|-
| '''226'''| '''PH2'''| '''UART5_TX'''| '''11'''|| '''12'''| style="text-align: left;"|
| '''PI1'''
| '''257'''
|-
| '''227'''
| '''PH3'''
| '''UART5_RX'''
| '''13'''
|
| '''14'''
| '''GND'''
| style="text-align: left;"|
|-
| '''261'''| '''PI5'''| '''TWI0_SCL<span style="color:#FF0000">16</UART2_TX'''| '''15'''|| '''16span>'''| '''<span style="color:#FF0000">PWM4</span>/UART4_RX'''| '''<span style="color:#FF0000">PI14</span>'''| '''<span style="color:#FF0000">270</span>'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''
| '''17'''
|
| '''18'''
| style="text-align: left;"|
| '''228'''
|-
| '''231'''
| '''PH7'''
| '''SPI1_MOSI'''
| '''19'''
|
| '''20'''
| '''GND'''
| style="text-align: left;"|
|-
| '''232'''
| '''PH8'''
| '''SPI1_MISO'''
| '''21'''
|
| '''22'''
| '''TWI0_SDA/UART2_RX'''
| '''262'''
|-
| '''230'''
| '''PH6'''
| '''SPI1_CLK'''
| '''23'''
|
| '''24'''
| '''SPI1_CS0'''
| '''229'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''25'''
|
| '''26'''
| '''SPI1_CS1'''
| '''233'''
|-
| '''266'''
| '''PI10'''
| '''TWI2-SDA/UART3_RX'''
| '''27'''
|
| '''28'''
| '''TWI2-SCL/UART3_TX'''
| '''265'''
|-
| '''256'''
| '''PI0'''
| style="text-align: left;"|
| '''29'''
|
| '''30'''
| '''GND'''
| style="text-align: left;"|
|-
| '''271'''| '''PI15'''| <span style="text-aligncolor: left;#FF0000"|| '''31'''|| '''>32</span>'''| '''<span style="color:#FF0000">PWM1</span>'''| '''<span style="color:#FF0000">PI11</span>'''| '''<span style="color:#FF0000">267</span>'''|-| '''268'''| '''PI12'''| '''PWM2'''| '''33'''|| '''34'''| '''GND'''| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''258'''
| '''PI2'''
| style="text-align: left;"|
| '''35'''
|
| '''36'''
| style="text-align: left;"|
| '''76'''
|-
| '''272'''
| '''PI16'''
| style="text-align: left;"|
| '''37'''
|
| '''38'''
| style="text-align: left;"|
| '''260'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''39'''
|
| '''40'''
| style="text-align: left;"|
| '''259'''
|}
</div>
<ol start="2" style="list-style-type: decimal;">
<li><p>In Linux systems, uart pwm is turned off by default in Linux systems and needs to be turned on manually before to use it can be used. The opening steps are as follows:: </p>
<ol style="list-style-type: lower-alpha;">
<li><p>First run '''orangepi-config'''. Ordinary users remember to add &gt; '''sudo''' permissions.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>Then select '''System'''</p>
<p>[[File:zero2w-img80.png]]</p></li>
<li><p>Then select '''Hardware'''</p>
<p>[[File:zero2w-img81.png]]</p></li>
<li><p>Then use the keyboard's arrow keys to locate the position shown &gt; in the picture figure below, and then use the '''space''' to select the configuration corresponding to the pwm you want to open.</p><p>[[File:zero2w-img176.png]]</p></li><li><p>Then select '''&lt;Save&gt; serial port you want ''' to opensave</p><p>[[File:zero2w-img83.png]]</p></li><li><p>Then select '''&lt;Back&gt;'''</p><p>[[File:zero2w-img84.png]]</p></li><li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the configuration take effect.</olp><p>[[File:zero2w-img85.png]]</p></li></ol></li><li><p>After restarting, you can start the PWM test</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
| <big><p>'''Multiplexing function in 40pinPlease execute the following commands under the root user.'''</p></big>|}<ol style="list-style-type: lower-alpha;"><li><p>Enter the following command on the command line to make pwm1 output a 50Hz square wave</p>{| '''Corresponding dtbo configuration'''class="wikitable" style="width:800px;"
|-
| <p>root@orangepi:~# '''echo 1 &gt; /sys/class/pwm/pwmchip0/export'''</p><p>root@orangepi:~# '''echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm1/period'''</p><p>root@orangepi:~# '''40pin - uart2echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm1/duty_cycle'''</p>| <p>root@orangepi:~# '''pi-uart2echo 1 &gt; /sys/class/pwm/pwmchip0/pwm1/enable'''</p>|}</li><li><p>Enter the following command on the command line to make pwm2 output a 50Hz square wave</p></li>{| class="wikitable" style="width:800px;"
|-
| root@orangepi:~# '''echo 2 &gt; /sys/class/pwm/pwmchip0/export''' root@orangepi:~# '''echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm2/period''root@orangepi:~# ''40pin - uart3'echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm2/duty_cycle'''| root@orangepi:~# '''pi-uart3echo 1 &gt; /sys/class/pwm/pwmchip0/pwm2/enable'''|}</ol><ol start="3" style="list-style-type: lower-alpha;"><li>Enter the following command on the command line to make pwm3 output a 50Hz square wave</li>{| class="wikitable" style="width:800px;"
|-
| root@orangepi:~# '''echo 3 &gt; /sys/class/pwm/pwmchip0/export''' root@orangepi:~# '''echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm3/period''root@orangepi:~# ''40pin - uart4'echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm3/duty_cycle'''| root@orangepi:~# '''pi-uart4echo 1 &gt; /sys/class/pwm/pwmchip0/pwm3/enable'''|}</ol><ol start="4" style="list-style-type: lower-alpha;"><li>Enter the following command on the command line to make pwm4 output a 50Hz square wave</li>{| class="wikitable" style="width:800px;"
|-
| root@orangepi:~# '''echo 4 &gt; /sys/class/pwm/pwmchip0/export''' root@orangepi:~# '''40pin - uart5echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm4/period'''| root@orangepi:~# '''echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm4/duty_cycle''' root@orangepi:~# '''ph-uart5echo 1 &gt; /sys/class/pwm/pwmchip0/pwm4/enable'''
|}
[[File:zero2w-img175.png]]<div class="figure">
<ol start="5" style="list-style-type: lower-alpha;"><li><p>Then select '''&lt;Save&gt;''' to save</p><p>[[File:zero2w-img83.png]]</p></li><li><p>Then select '''&lt;Back&gt;'''</p><p>[[File:zero2w-img84.png]]</p></li><li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the &gt; configuration take effect.</p><p>[[File:zero2w-img85img177.png]]</p></li></ol>
<!-- --><ol start="3" style="list-style-type: decimal;"><li><p>After entering the Linux system, first confirm whether there is a uart5 device node under '''<span class="mark">/dev</spandiv>'''</p><p>'''注意, linux5.4系统为/dev/ttyASx.'''</p><p>orangepi@orangepi:~$ '''ls /dev/ttyS*'''</pol><p>/dev/ttySx</p></li><li><p>Then start testing the uart interface. First use Dupont wire to short-circuit the rx and tx pins of the uart interface to be tested.</p></liol><li><p>Use the '''gpio''' command in wiringOP to test the loopback function of the serial port as shown below. If you can see the following print, it means the serial port communication is normal.</p><p>'''Note that the last x in the gpio serial /dev/ttySx command needs to be replaced with the serial number of the corresponding uart device node.'''</p><p>orangepi@orangepi:~$ '''gpio serial /dev/ttySx # linux-6.1 test command'''</p><p>orangepi@orangepi:~$ '''gpio serial /dev/ttyASx # linux-5.4 test command'''</p><p>Out: 0: -&gt; 0</p><p>Out: 1: -&gt; 1</p><p>Out: 2: -&gt; 2</p><p>Out: 3: span id="how-&gt; 3^C</p></li><li><p>Finally, you can run the '''serialTest.py''' program in examples to test the loopback function of the serial port. If you can see the following print, it means that the serial port loopback test is normal.</p><p>'''Note that the x in /dev/ttySx or /dev/ttyASx in the command needs to be replaced with the serial number of the corresponding uart device node.'''</p><p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p><p>root@orangepi:~/wiringOP-Python/examples# '''python3 serialTest.py install-and-device &quot;/dev/ttySx&quot; # linux6.1 use'''</p><p>root@orangepi:~/wiringOP-Python/examples# '''python3 serialTest.py -wiringop-device &quot;/dev/ttyASx&quot; # linux5.4 use'''</p><ppython">Out: 0: -&gt; 0</p><p>Out: 1: -&gt; 1</p><p>Out: 2: -&gt; 2</p><p>Out: 3: -&gt; 3</p><p>Out: 4:^C</p><p>exit</p></li></olspan>
<span id="hardware-watchdog= How to install and use wiringOP-test"></span>== Hardware watchdog test Python ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note: The watchdog_test program pin header on the 40pin interface is pre-installed in the Linux system released not soldered by Orange Pi default, and you need to solder it yourself before it can be tested directlyused.'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''wiringOP-Python is the Python language version of wiringOP library, used to operate the development board's GPIO, I2C, SPI, UART and other hardware resources in the Python program'''
The method to run '''Also please note that all the watchdog_test program is as follows:following commands are operated under the root user.'''</big>|}
<ol stylespan id="listhow-styleto-install-type: lowerwiringop-alpha;python"><li><p>The second parameter 10 represents the counting time of the watchdog. If the dog is not fed within this time, the system will restart.</p></lispan><li><p>We can feed the dog by pressing any key on the keyboard (except ESC). After feeding the dog, the program will print a line &quot;keep alive&quot; === How to indicate that the dog feeding is successful.</p><p>orangepi@orangepi:~$ '''sudo watchdog_test 10'''</p><p>open success</p><p>options is 33152,identity is sunxiinstall wiringOP-wdt</p><p>put_usr return,if 0,success:0</p><p>The old reset time is: 16</p><p>return ENOTTY,if -1,success:0</p><p>return ENOTTY,if -1,success:0</p><p>put_user return,if 0,success:0</p><p>put_usr return,if 0,success:0</p><p>keep alive</p><p>keep alive</p><p>keep alive</p></li></ol>Python ===
<span idol style="checklist-thestyle-type: decimal;"><li><p>First install dependency packages</p>{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''sudo apt-get update'''</p><p>root@orangepi:~# '''sudo apt-get -y install git swig python3-chipiddev python3-setuptools'''</p>|}</li><li><p>Then use the following command to download the source code ofwiringOP-h618-chip"Python</p></spanli>{| class="wikitable" style= Check "background-color:#ffffdc;width:800px;" |-| <big>'''Note that the following git clone--recursive command will automatically download the chipid source code of H618 chip ==wiringOP, because wiringOP-Python depends on wiringOP. Please make sure there are no errors during the download process due to network problems.'''
The command to view '''If there is a problem downloading the H618 chip chipid is as follows. The chipid of each chip is differentcode from GitHub, so you can directly use chipid to distinguish multiple development boardsthe wiringOP-Python source code that comes with the Linux image.The storage location is: /usr/src/wiringOP-Python'''</big>|}{| class="wikitable" style="width:800px;" |-orangepi| root@orangepi:~$ # '''cat git clone --recursive https:/sys/classgithub.com/sunxi_infoorangepi-xunlong/sys_info | grep &quot;chipid&quot;wiringOP-Python -b next'''
sunxi_chipid root@orangepi: 338020004c0048080147478824681ed1~# '''cd wiringOP-Python'''
root@orangepi:~/wiringOP-Python# '''git submodule update --init --remote'''|}</ol><span idol start="3" style="pythonlist-relatedstyle-instructionstype: decimal;"><li><p>Then use the following command to compile wiringOP-Python and install it into the Linux system of the development board</spanp>{| class="wikitable" style= "width:800px;" |-| <p>root@orangepi:~# '''cd wiringOP-Python related instructions '''</p><p>root@orangepi:~/wiringOP-Python# '''python3 generate-bindings.py &gt; bindings.i'''</p><p>root@orangepi:~/wiringOP-Python# '''sudo python3 setup.py install'''</p>|}</li><li><p>Then enter the following command. If helpful information is output, it means wiringOP-Python is successfully installed. Press the '''q''' key to exit the help information interface.</p></li>{| class="wikitable" style="width:800px;" |-| root@orangepi:~/wiringOP-Python# '''python3 -c &quot;import wiringpi; help(wiringpi)&quot;'''
<span id="how-to-compile-and-install-python-source-code"></span>=== How to compile and install Python source code ===Help on module wiringpi:
'''If the Python version in the Ubuntu or Debian system software repository you are using does not meet the development requirements and you want to use the latest version of Python, you can use the following method to download the Python source code package to compile and install the latest version of Python.'''
'''The following demonstration is to compile and install the latest version of Python 3.9. If you want to compile and install other versions of Python, the method is the same (you need to download the source code corresponding to the Python you want to install).'''NAME
<ol style="list-style-type: decimal;"><li><p>First install the dependency packages needed to compile Python</p><p>orangepi@orangepi:~$ '''sudo apt-get update'''</p><p>orangepi@orangepi:~$ '''sudo apt-get install -y build-essential zlib1g-dev \'''</p><p>'''libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev \'''</p><p>'''libreadline-dev libffi-dev curl libbz2-dev'''</p></li><li><p>Then download the latest version of Python3.9 source code and unzip it</p><p>orangepi@orangepi:~$ '''wget \'''</p><p>[https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tgz '''https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tgz''']</p><p>orangepi@orangepi:~$ '''tar xvf Python-3.9.10.tgz'''</p></li><li><p>Then run the configuration command</p><p>orangepi@orangepi:~$ '''cd Python-3.9.10'''</p><p>orangepi@orangepi:~$ '''./configure --enable-optimizations'''</p></li><li><p>Then compile and install Python3.9. The compilation time takes about half an hour.</p><p>orangepi@orangepi:~$ '''make -j4'''</p><p>orangepi@orangepi:~$ '''sudo make altinstall'''</p></li><li><p>After installation, you can use the following command to check the version number of the Python you just installed.</p><p>orangepi@orangepi:~$ '''python3.9 --version'''</p><p>'''Python 3.9.10'''</p></li><li><p>Then update pip</p><p>orangepi@orangepi:~$ '''/usr/local/bin/python3.9 -m pip install --upgrade pip'''</p></li></ol>wiringpi
<span id="how-to-replace-pip-source-in-python"></span>
=== How to replace pip source in Python ===
'''The default source used by Linux system pip is the official source of Python. However, accessing the official source of Python in China is very slow, and the installation of Python software packages often fails due to network reasons. So when using pip to install the Python library, please remember to change the pip source.'''DESCRIPTION
<ol style="list-style-type: decimal;"><li><p>First install '''python3-pip'''</p><p>orangepi@orangepi:~$ '''sudo apt-get update'''</p><p>orangepi@orangepi:~$ '''sudo apt-get install -y python3-pip'''</p></li><li><p>How to permanently change the pip source under Linux</p><ol style="list-style-type: lower-alpha;"><li><p>First create a new '''~/.pip''' directory, then add the &gt; '''pip.conf''' configuration # This file, and set the pip source in it &gt; to Tsinghua source.</p><p>orangepi@orangepiwas automatically generated by SWIG (http:~$ '''mkdir -p ~/.pip'''</p><p>orangepi@orangepi:~$ '''cat &lt;&lt;EOF &gt; ~/.pip/pip.conf'''</p><p>'''[global]'''</p><p>'''timeout = 6000'''</p><p>'''index-url = https://pypiwww.tunaswig.tsinghuaorg).edu.cn/simple'''</p><p>'''trusted-host = pypi.tuna.tsinghua.edu.cn'''</p><p>'''EOF'''</p></li><li><p>Then use pip3 to install the Python library very quickly</p></li></ol></li><li><p>How to temporarily change the pip source under Linux, where '''&lt;packagename&gt;''' needs to be replaced with a specific package name</p><p>orangepi@orangepi:~$ '''pip3 install &lt;packagename&gt; -i \'''</p><p>'''https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn'''</p></li></ol>
<span id="how-to-install-docker"></span>== How to install Docker ==: # Version 4.0.2
: # : # Do not make changes to this file unless you know what you are doing--modify : # the SWIG interface file instead.|}</ol><ol start="5" style="list-style-type: decimal;"><li><p>The Linux image provided by Orange Pi has Docker presteps to test whether wiringOP-Python is installed, but successfully under the python command line are as follows:</p><ol style="list-style-type: lower-alpha;"><li>First use the Docker service is not turned on by default. Use python3 command to enter the command line mode of &gt; python3</li>{| class="wikitable" style="width:800px;" |-| root@orangepi:~# '''enable_docker.shpython3''' script to enable |}</ol><ol start="2" style="list-style-type: lower-alpha;"><li>Then import the docker servicepython module of wiringpi</li>{| class="wikitable" style="width:800px;" |-| &gt;&gt;&gt; '''import wiringpi;'''|}</ol><ol start="3" style="list-style-type: lower-alpha;"><li>Finally, and then you can start using enter the docker following command, and to view the docker service will be automatically started help information of &gt; wiringOP-Python. Press the next time you start q key to exit the systemhelp information &gt; interface.</li>{| class="wikitable" style="width:800px;" |-| &gt;&gt;&gt; '''help(wiringpi)''' Help on module wiringpi:  NAME :wiringpi  DESCRIPTION
orangepi@orangepi:~$ '''enable_docker# This file was automatically generated by SWIG (http://www.swig.org).sh'''
You can use the following command to test docker: # Version 4. If '''hello-world''' can be run, docker can be used normally0.2
orangepi@orangepi:~$ '''docker run hello-world'''#
Unable : # Do not make changes to find image 'hellothis file unless you know what you are doing-world:latest' locally-modify
latest: Pulling from library/hello-world# the SWIG interface file instead.
256ab8fe8778: Pull complete
Digest: sha256:7f0a9f93b4aa3022c3a4c147a449ef11e0941a1fd0bf4a8e6c9408b2600777c5CLASSES
Status: Downloaded newer image for hello-world:latestbuiltins.object
'''Hello from Docker!'''::GPIO
'''This message shows that your installation appears to be working correctly.'''::I2C
'''.….'''::Serial
When using the docker command, if you are prompted for '''permission denied''', please add the current user to the docker user group so that you can run the docker command without sudo.::nes
orangepi@orangepi:~$ '''sudo usermod -aG docker $USER'''
'''Note: You need to log out and log in again to the system to take effectclass GPIO(builtins. You can also restart the system.'''object)
<span id="how-to-install-home-assistant"></span>== How to install Home Assistant =:| GPIO(pinmode=0)
'''Note that this article will only provide methods for installing Home Assistant in Ubuntu or Debian systems. For detailed usage of Home Assistant, please refer to the official documentation or corresponding books.''':|
<span id="installation-via-docker"></span>
=== Installation via docker ===
<ol style="list-style-type: decimal&gt;&gt;&gt;"><li><p>First, please install docker and ensure that docker can run normally. For the installation steps of docker, please refer to the instructions in the [[\l|'''How to Install Docker''']] section.</p></li>}<li><p>Then you can search for the docker image of Home Assistant</pol><p>orangepi@orangepi:~$ '''docker search homeassistant'''</p></li><li><p>Then use the following command to download the Docker image of Home Assistant to your local computer. The image size is about 1GB, and the download time will be relatively long. Please be patient and wait for the download to complete.</pol><p>orangepi@orangepi:~$ '''docker pull homeassistant/home-assistant'''</p><p>Using default tag: latest</p><p>latest: Pulling from homeassistant/home-assistant</p><p>be307f383ecc: Downloading</p><p>5fbc4c07ac88: Download complete</p><p>'''...... (Omit some output)'''</p><p>3cc6a1510c9f: Pull complete</p><p>7a4e4d5b979f: Pull complete</p><p>Digest: sha256:81d381f5008c082a37da97d8b08dd8b358dae7ecf49e62ce3ef1eeaefc4381bb</p><p>Status: Downloaded newer image for homeassistant/homespan id="pin-assistant:latest</p><p>docker.io/homeassistant/homegpio-assistant:latest</p></li><li><p>Then you can use the following command to view the docker image of Home Assistant you just downloaded</p><p>orangepi@orangepi:~$ '''docker images homeassistant/homeport-assistant'''</p><p>REPOSITORY TAG IMAGE ID CREATED SIZE</p><p>homeassistant/hometest-assistant latest bfa0ab9e1cf5 2 months ago '''1.17GB'''</p></li><li><p>At this point you can run the Home Assistant docker container</p><p>orangepi@orangepi:~$ '''docker run -d \'''</p><p>'''--name homeassistant \'''</p><p>'''--privileged \'''</p><p>'''--restart=unless-stopped \'''</p><p>'''-e TZ=Asia/Shanghai \'''</p><p>'''-v /home/orangepi/home-assistant:/config \'''</p><p">'''--network=host \'''</p><p>'''homeassistant/home-assistant:latest'''</p></li><li><p>Then enter【the IP address of the development board: 8123】in the browser to see the Home Assistant interface</p><p>'''It takes a while for the Home Assistant container to start. If the interface below does not display normally, please wait a few seconds before refreshing it. If the following interface is not displayed normally after waiting for more than a minute, it means there is a problem with the Home Assistant installation. At this time, you need to check whether there is a problem with the previous installation and setting process.'''</p><div class="figure"span>
[[File:zero2w-img180.png]]=== 40pin GPIO port test ===
</div></li>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <libig><p>Then enter your '''nameLike wiringOP, wiringOP-Python can also determine which GPIO pin to operate by specifying the wPi number. Because there is no command to view the wPi number in wiringOP-Python, username''you can only view the board' s wPi number and '''password''' and click '''Create Accountphysics through the gpio command in wiringOP Correspondence of pins.'''</p><div class="figure"big>
[[File:zero2w-img181img170.png|center]]|}
</div></li><li><p>Then follow the interface prompts to set according to your own preferences, and then click Next</p><div classol style="figure"> [[File:zero2wlist-style-img182.png]] </div></li><li><p>Then click Next</p><div class="figure"> [[Filetype:zero2w-img183.png]] </div></li><li><p>Then click Finish</p><div class="figuredecimal;"> [[File:zero2w-img184.png]] </div></li><li><p>The main interface finally displayed by Home Assistant is following uses pin No. 7 - corresponding to GPIO PI13 - corresponding to wPi serial number 2 - as shown belowan example to demonstrate how to set the high and low levels of the GPIO port.</p><p>[[File:zero2w-img185img171.png]]</p></li><li><p>Method to stop Home Assistant containerThe steps for testing directly with commands are as follows:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>The command First set the GPIO port to view output mode, where the first parameter of the docker container is as follows</p><p>orangepi@orangepi:~$ '''docker ps -apinMode'''</p></li><li><p>The command function is the serial number of the wPi corresponding to stop the Home Assistant container pin, and the second parameter is as follows</p><p>orangepi@orangepi:~$ '''docker stop homeassistant'''</p></li><li><p>The command to delete the Home Assistant container is as followsGPIO mode.</p><p>orangepi@orangepi:~$ '''docker rm homeassistant'''</p></li></ol></li></ol> <span id{| class="installation-via-pythonwikitable"></span>=== Installation via python === '''Before installation, please change the source of pip to a domestic source to speed up the installation of Python packages. For the configuration method, see the instructions in the section &quot;[[\l|How to Change the Pip Source of Python]]&quot;''' <ol style="list-style-typewidth: decimal800px;"><li><p>First install dependency packages</p>|-| <p>orangepiroot@orangepi:~$ '''sudo apt/wiringOP-get updatePython# '''</p><p>orangepi@orangepi:~$ '''sudo apt-get install -y python3 python3-dev python3-venv c &quot;import wiringpi; \'''</p><p>'''python3-pip libffi-dev libssl-dev libjpeg-dev zlib1g-dev autoconf build-essential from wiringpi import GPIO; wiringpi.wiringPiSetup() ; \'''</p><p>'''libopenjp2-7 libtiff5 libturbojpeg0-dev tzdata'''wiringpi.pinMode(</p><pspan style="color:#FF0000">'''If it is debian122, please use the following command:'''GPIO.OUTPUT</pspan><p>orangepi@orangepi:~$ '''sudo apt-get update) ; &quot;'''</p><p>orangepi@orangepi:~$ '''sudo apt-get install -y python3 python3-dev python3-venv \'''</p>|}<p>'''python3-pip libffi-dev libssl-dev libjpeg-dev zlib1g-dev autoconf build-essential \'''</p><p>'''libopenjp2-7 libturbojpeg0-dev tzdata'''</p></li><li><p>Then you need set the GPIO port to compile and install Python3.9output a low level. For the methodAfter setting, please refer you can use a multimeter to measure the [[\l|'''Python source code compilation and installation method''']] section.</p><p>'''The default Python version voltage value of Debian Bullseye is Python3the pin.9, so there is no need to compile and install If it.'''</p><p>'''The default Python version of Ubuntu Jammy is Python3.100v, so there is no need to compile and install it.'''</p><p>'''The default Python version of Debian Bookworm means the low level is Python3set successfully.11, so there is no need to compile and install it.'''</p></li><li><p>Then create a Python virtual environment</p>{| class="wikitable" style="width:800px;" <p>'''Debian Bookworm is python3.11, please remember to replace the corresponding command.'''</p>|-<p>orangepi@orangepi:~$ '''sudo mkdir /srv/homeassistant'''</p>| <p>orangepiroot@orangepi:~$ '''sudo chown orangepi:orangepi /srv/homeassistantwiringOP-Python# '''</p><p>orangepi@orangepi:~$ '''cd /srv/homeassistantpython3 -c &quot;import wiringpi; \'''</p><p>orangepi@orangepi:~$ '''python3.9 -m venv from wiringpi import GPIO; wiringpi.wiringPiSetup() ;\'''</p><p>orangepi@orangepi:~$ '''source bin/activate'''wiringpi.digitalWrite(2, </p><p>(homeassistant) orangepi@orangepispan style="color:/srv/homeassistant$</p#FF0000">GPIO.LOW</lispan><li><p>Then install the required Python packages</p><p>(homeassistant) orangepi@orangepi:/srv/homeassistant$ '''python3 -m pip install wheel&quot;'''</p>|}</li><li><p>Then set the GPIO port to output a high level. After setting, you can install Home Assistant Coreuse a multimeter to measure the voltage value of the pin. If it is 3.3v, it means the setting of the high level is successful.</p><p>(homeassistant) orangepi@orangepi{| class="wikitable" style="width:/srv/homeassistant$ '''pip3 install homeassistant'''</p></li>800px;" |-<li><p>Then enter the following command to run Home Assistant Core</p>| <p>(homeassistant) orangepiroot@orangepi:~/srv/homeassistant$ wiringOP-Python# '''hasspython3 -c &quot;import wiringpi; \'''</p></li><li><p>Then enter【'''development board IP address: 8123from wiringpi import GPIO; wiringpi.wiringPiSetup() ;\'''】 in the browser to see the Home Assistant interface</p><p>'''When you run the hass command for the first time, some libraries and dependency packages necessary for operation will be downloadedwiringpi.digitalWrite(2, installed and cached. This process may take several minutes. Note that you cannot see the Home Assistant interface in the browser at this time. Please wait for a while and then refresh it.'''</p><div classspan style="figurecolor:#FF0000"> [[File:zero2w-img180GPIO.png]] </div></li></ol> <span id="opencv-installation-method">HIGH</span>== OpenCV installation method == <span id="use-apt-to-install-opencv"></span>=== Use apt to install OpenCV === <ol style="list-style-type: decimal)&quot;"><li><p>The installation command is as follows</p><p>orangepi@orangepi:~$ '''sudo apt-get update'''</p>|}<p/li>orangepi@orangepi:~$ '''sudo apt-get install -y libopencv-dev python3-opencv'''</pol></li><li><p>Then use The steps for testing in the following command to print the version number line of OpenCV. The output is normal, indicating that the OpenCV installation is successful.python3 are as follows:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>The version First use the python3 command to enter the command line mode of OpenCV in Ubuntu22.04 is as follows:python3</p>{| class="wikitable" style="width:800px;" |-| <p>orangepiroot@orangepi:~$ # '''python3 '''</p>|}</li><li><p>Then import the python module of wiringpi</p>{| class="wikitable" style="width:800px;" |-c | <p>&quotgt;import cv2&gt; print(cv2.__version__)&quotgt;'''import wiringpi'''</p><p>&gt;&gt;&gt; '''4.5.4from wiringpi import GPIO'''</p>|}</li><li><p>The version Then set the GPIO port to output mode, where the first parameter of the '''pinMode'''function is the serial number of OpenCV in Ubuntu20the wPi corresponding to the pin, and the second parameter is the GPIO mode.04 is as follows:</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ &gt;&gt;&gt; '''python3 -c &quot;import cv2; printwiringpi.wiringPiSetup(cv2.__version__)&quot;'''</p><p>0</p><p>&gt;&gt;&gt; '''4wiringpi.pinMode(<span style="color:#FF0000">2, GPIO.0OUTPUT</span>)'''</p>|}</li><li><p>The version Then set the GPIO port to output a low level. After setting, you can use a multimeter to measure the voltage value of OpenCV in Debian11 the pin. If it is 0v, it means the low level is as follows:set successfully.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ &gt;&gt;&gt; '''python3 -c &quot;import cv2; printwiringpi.digitalWrite(cv22, <span style="color:#FF0000">GPIO.__version__LOW</span>)&quot;'''</p>|}</li><li><p>Then set the GPIO port to output a high level. After setting, you can use a multimeter to measure the voltage value of the pin. If it is 3.3v, it means the setting of the high level is successful.</p>{| class="wikitable" style="width:800px;" |-| <p>&gt;&gt;&gt; '''4wiringpi.5digitalWrite(2, <span style="color:#FF0000">GPIO.1HIGH</span>)'''</p>|}</li></ol></li><li><p>For wiringOP-Python to set the GPIO high and low levels in the python code, you can refer to the '''blink.py''' test program in the examples. The version '''blink.py''' test program will set the voltage of OpenCV all GPIO ports in Debian12 is as followsthe 40 Pin of the development board to continuously change high and low.</p>{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p><p>orangepiroot@orangepi:~$ /wiringOP-Python/examples# '''python3 -c &quot;import cv2; print(cv2ls blink.__version__)&quot;py'''</p><p>'''4.6blink.0py'''</p><p>root@orangepi:~/wiringOP-Python/li>examples'''# python3 blink.py'''</olp>|}
</li></ol>
<span id="setpin-upspi-thetest-chinese-environment-and-install-the-chinese-input-method1"></span>== Set up the Chinese environment and install the Chinese input method ==
'''Note, before installing the Chinese input method, please make sure that the Linux system used by the development board is a desktop version.'''=== 40pin SPI test ===
<span id="debian-system-installation-method"></span>=== Debian system installation method === <ol style="list-style-type: decimal;"><li><p>First set the default '''locale''' to Chinese</p><ol style="list-style-type: lower-alpha;"><li><p>Enter the following command to start configuring '''locale'''</p><p>orangepi@orangepi:~$ '''sudo dpkg-reconfigure locales'''</p></li><li><p>Then select '''zh_CN.UTF-8 UTF-8''' in the pop-up interface (use &gt; the up and down keys on the keyboard to move up and down, use &gt; the space bar to select, and finally use the Tab key to move &gt; the cursor to '''&lt;OK&gt;''', and then return Car can be used)</p><p>[[File:zero2w-img186.png]]</p></li><li><p>Then set the default '''locale''' to '''zh_CN.UTF-8'''</p><p>[[File:zero2w-img187.png]]</p></li><li><p>After exiting the interface, the '''locale''' setting will begin. &gt; The output displayed on the command line is as follows:</p><p>orangepi@orangepi:~$ '''sudo dpkg-reconfigure locales'''</p><p>Generating locales (this might take a while)...</p><p>en_US.UTF-8... done</p><p>zh_CN.UTF-8... done</p><p>Generation complete.</p></li></ol></li><li><p>Then open '''Input Method'''</p><p>[[File:zero2w-img188.png]]</p></li><li><p>Then select '''OK'''</p><p>[[File:zero2w-img189.png]]</p></li><li><p>Then select '''Yes'''</p><p>[[File:zero2w-img190.png]]</p></li><li><p>Then select '''fcitx'''</p><p>[[File:zero2w-img191.png]]</p></li><li><p>Then select '''OK'''</p><p>[[File:zero2w-img192.png]]</p></li><li><p>'''Then restart the Linux system to make the configuration take effect.'''</p></li><li><p>Then open '''Fcitx configuration'''</p><p>[[File:zero2w-img193.png]]</p></li><li><p>Then click the + sign as shown in the picture below</p><p>[[File:zero2w-img194.png]]</p></li><li><p>Then search '''Google Pinyin''' and click '''OK'''</p><div class="figure"> [[File:zero2w-img195.png]] </div></li><li><p>Then put '''Google Pinyin''' on top</p><p>[[File:zero2w-img196.png]]</p><p>[[File:zero2w-img197.png]]</p></li><li><p>Then open the '''Geany''' editor to test the Chinese input method</p><p>[[File:zero2w-img198.png]]</p></li><li><p>The Chinese input method test is as follows</p><p>[[File:zero2w-img199.png]]</p></li><li><p>You can switch between Chinese and English input methods through the '''Ctrl+Space''' shortcut key</p></li><li><p>If you need the entire system to be displayed in Chinese, you can set all variables in '''/etc/default/locale''' to '''zh_CN.UTF-8'''</p><p>orangepi@orangepi:~$ '''sudo vim /etc/default/locale'''</p><p># File generated by update-locale</p><p>LC_MESSAGES='''zh_CN.UTF-8'''</p><p>LANG='''zh_CN.UTF-8'''</p><p>LANGUAGE='''zh_CN.UTF-8'''</p></li><li><p>Then '''restart the system''' and you will see that the system is displayed in Chinese.</p><p>[[File:zero2w-img200.png]]</p></li></ol> <span id="installation-method-of-ubuntu-20.04-system"></span>=== Installation method of Ubuntu 20.04 system === <ol style="list-style-type: decimal;"><li><p>First open '''Language Support'''</p><p>[[File:zero2w-img201.png]]</p></li><li><p>Then find the '''Chinese (China)''' option</p><p>[[File:zero2w-img202.png]]</p></li><li><p>Then please use the left button of the mouse to select '''Chinese (China)''' and hold it down, then drag it up to the starting position. After dragging, the display will be as shown below:</p><p>[[File:zero2w-img203.png]]</p></li></ol> '''Note that this step is not easy to drag, please be patient and try it a few times.''' <ol start="4" style="list-style-type: decimal;"><li><p>Then select '''Apply System-Wide''' to apply the Chinese settings to the entire system</p><p>[[File:zero2w-img204.png]]</p></li><li><p>Then set the '''Keyboard input method system''' system to '''fcitx'''</p><p>[[File:zero2w-img205.png]]</p></li><li><p>'''Then restart the Linux system to make the configuration take effect'''</p></li><li><p>After re-entering the system, please select '''Do not ask me again''' in the following interface, and then please decide according to your own preferences whether the standard folder should also be updated to Chinese</p><p>[[File:zero2w-img206.png]]</p></li><li><p>Then you can see that the desktop is displayed in Chinese</p><p>[[File:zero2w-img207.png]]</p></li><li><p>Then we can open '''Geany''' to test the Chinese input method. The opening method is as shown in the figure below</p><p>[[File:zero2w-img208.png]]</p></li><li><p>After opening '''Geany''', the English input method is still the default. We As can switch to the Chinese input method through the '''Ctrl+Space''' shortcut key, and then we can input Chinese.</p><p>[[File:zero2w-img209.png]]</p></li></ol> <span id="installation-method-of-ubuntu-22.04-system"></span>=== Installation method of Ubuntu 22.04 system === <ol style="list-style-type: decimal;"><li><p>First open '''Language Support'''</p><p>[[File:zero2w-img201.png]]</p></li><li><p>Then find the '''Chinese (China)''' option</p><p>[[File:zero2w-img210.png]]</p></li><li><p>Then please use the left button of the mouse to select '''Chinese (China)''' and hold it down, then drag it up to the starting position. After dragging, the display will be as shown below:</p><p>[[File:zero2w-img211.png]]</p></li></ol> '''Note that this step is not easy to drag, please be patient and try it a few times.''' <ol start="4" style="list-style-type: decimal;"><li><p>Then select '''Apply System-Wide''' to apply the Chinese settings to the entire system</p><p>[[File:zero2w-img212.png]]</p></li><li><p>'''Then restart the Linux system to make the configuration take effect'''</p></li><li><p>After re-entering the system, please select '''Do not ask me again''' in the following interface, and then please decide whether the standard folder should also be updated to Chinese according to your own preferences.</p><p>[[File:zero2w-img206.png]]</p></li><li><p>Then you can see that the desktop is displayed in Chinese</p><p>[[File:zero2w-img207.png]]</p></li><li><p>Then open the Fcitx5 configuration program</p><p>[[File:zero2w-img213.png]]</p></li><li><p>Then choose to use Pinyin input method</p><div class="figure"> [[File:zero2w-img214.png]] </div></li><li><p>The interface after selection is as shown below, then click OK</p><p>[[File:zero2w-img215.png]]</p></li><li><p>Then we can open '''Geany''' to test the Chinese input method. The opening method is as shown in seen from the figure table below</p><p>[[File:zero2w-img208.png]]</p></li><li><p>After opening '''Geany''', the English input method is still the default. We can switch to the Chinese input method through the '''Ctrl+Space''' shortcut key, and then we can enter Chinese.</p><p>[[File:zero2w-img216.png]]</p></li></ol> <span id="how-to-remotely-log-in-to-the-linux-system-desktop"></span>== How to remotely log in to the Linux system desktop == <span id="remote-login-using-nomachine"></span>=== Remote login using NoMachine === '''Please ensure that the Ubuntu or Debian system installed on the development board is a desktop version of the system. In addition, NoMachine also provides detailed usage documentation. It is strongly recommended to read this document thoroughly to become familiar with the use of NoMachine. The document link is as follows:''' '''https://knowledgebase.nomachine.com/DT10R00166''' '''NoMachine supports Windows, Mac, Linux, iOS and Android platforms, so we can remotely log in and control the Orange Pi development board through NoMachine on a variety of devices. The following demonstrates how to remotely log in to the Linux system desktop of the Orange Pi development board through NoMachine in Windows. For installation methods on other platforms, please refer to NoMachine's official documentation.''' '''Before operating, please make sure that the Windwos computer and the development board are in the same LAN, and that you can log in to the Ubuntu or Debian system of the development board through ssh normally.''' <ol style="list-style-type: decimal;"><li><p>First download the installation package of the NoMachine software Linux '''arm64''' deb version, and then install it into the Linux system of the development board</p><ol style="list-style-type: lower-alpha;"><li>Since H618 is an ARMv8 architecture SOC and the system we use is &gt; Ubuntu or Debian, we need to download the '''NoMachine spi available for ARM &gt; ARMv8 DEB''' installation package. The download link is as &gt; follows:</li></ol></li></ol> '''Note that this download link may change, please look for the Armv8/Arm64 version of the deb package.''' [https://www.nomachine.com/download/download&id=112&s=ARM '''https://downloads.nomachine.com/download/?id=118&amp;distro=ARM'''] [[File:zero2w-img217.png]] <ol start="2" style="list-style-type: lower-alpha;"><li><p>In addition, you can also download the '''NoMachine''' installation &gt; package from the official tool.</p><p>[[File:zero2w-img218.png]]</p><p>First enter the '''remote login software-NoMachine''' folder</p><p>[[File:zero2w-img219.png]]</p><p>Then download the arm64 version of the deb installation package</p><p>[[File:zero2w-img220.png]]</p></li><li><p>Then upload the downloaded '''nomachine_x.x.x_x_arm64.deb''' to the &gt; Linux system of the development board</p></li><li><p>Then use the following command to install '''NoMachine''' in the Linux &gt; system of the development board</p><p>orangepi@orangepi:~$ '''sudo dpkg -i nomachine_x.x.x_x_arm64_arm64.deb'''</p></li></ol> <!-- --><ol start="2" style="list-style-type: decimal;"><li>Then download the installation package of the Windows version of the NoMachine software. The download address is as follows</li></ol> '''Note that this download link may change.''' '''https://downloads.nomachine.com/download/?id=9''' [[File:zero2w-img221.png]] <ol start="3" style="list-style-type: decimal;"><li><p>Then install NoMachine in Windows. '''Please restart your computer after installation.'''</p></li><li><p>Then open '''NoMachine''' in Window</p><p>[[File:zero2w-img222.png]]</p></li><li><p>After NoMachine is started, it will automatically scan other devices with NoMachine installed on the LAN. After entering the main 40pin interface of NoMachine, you can see that the development board is already in the list of connectable devices, and then click on the location shown in the red box in the picture below You can now log in to the Linux system desktop of the development board.</p><p>[[File:zero2w-img223.png]]</p></li><li><p>Then click '''OK'''</p><p>[[File:zero2w-img224.png]]</p></li><li><p>Then enter the username and password of the development board Linux system in the corresponding positions in the figure below, and then click OK to start logging in.</p><p>[[File:zero2w-img225.png]]</p></li><li><p>Then click OK in the next interface.</p></li><li><p>Finally you can see the desktop of the development board Linux system</p><p>[[File:zero2w-img226.png]]</p></li></ol> <span id="remote-login-using-vnc"></span>=== Remote login using VNC === '''Before operatingspi1, please make sure that the Windwos computer and the development board are in the same LAN, and that you can log in to the Ubuntu or Debian system of the development board through ssh normally.''' '''There are many problems with VNC testing in Ubuntu20.04, please do not use this method.''' <ol style="list-style-type: decimal;"><li><p>First run the '''set_vnc.sh''' script to set up vnc, '''remember to add sudo permission'''s</p><p>orangepi@orangepi:~$ '''sudo set_vnc.sh'''</p><p>You will require a password to access your desktops.</p><p>Password: '''#Set the vnc password here, 8 characters'''</p><p>Verify: '''#Set the vnc password here, 8 characters'''</p><p>Would you like to enter a view-only password (y/n)? '''n'''</p><p>xauth: file /root/.Xauthority does not exist</p><p>New 'X' desktop is orangepi:1</p><p>Creating default startup script /root/.vnc/xstartup</p><p>Starting applications specified in /root/.vnc/xstartup</p><p>Log file is /root/.vnc/orangepi:1.log</p><p>Killing Xtightvnc process ID 3047</p><p>New 'X' desktop is orangepi:1</p><p>Starting applications specified in /root/.vnc/xstartup</p><p>Log file is /root/.vnc/orangepi:1.log</p></li><li><p>The steps to use MobaXterm software to connect to the development board Linux system desktop there are as follows:</p><ol style="list-style-type: lower-alpha;"><li>First click Session, then two chip select VNC, then fill in the IP &gt; address and port of the development board, pins cs0 and finally click &gt; OK to confirm.</li></ol></li></ol> <div class="figure"> [[File:zero2w-img227.png]]cs1
<div style="display: flex;">
::{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"
|-
| '''GPIO NO.'''
| '''GPIO'''
| '''Function'''
| '''Pin'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''
| '''1'''
|-
| '''264'''
| '''PI8'''
| '''TWI1-SDA'''
| '''3'''
|-
| '''263'''
| '''PI7'''
| '''TWI1-SCL'''
| '''5'''
|-
| '''269'''
| '''PI13'''
| '''PWM3/UART4_TX'''
| '''7'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''9'''
|-
| '''226'''
| '''PH2'''
| '''UART5_TX'''
| '''11'''
|-
| '''227'''
| '''PH3'''
| '''UART5_RX'''
| '''13'''
|-
| '''261'''
| '''PI5'''
| '''TWI0_SCL/UART2_TX'''
| '''15'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''3.3V'''
| '''17'''
|-
| '''<span style="color:#FF0000">231</span>'''
| '''<span style="color:#FF0000">PH7</span>'''
| '''<span style="color:#FF0000">SPI1_MOSI</span>'''
| '''<span style="color:#FF0000">19</span>'''
|-
| '''<span style="color:#FF0000">232</span>'''
| '''<span style="color:#FF0000">PH8</span>'''
| '''<span style="color:#FF0000">SPI1_MISO</span>'''
| '''<span style="color:#FF0000">21</span>'''
|-
| '''<span style="color:#FF0000">230</span>'''
| '''<span style="color:#FF0000">PH6</span>'''
| '''<span style="color:#FF0000">SPI1_CLK</span>'''
| '''<span style="color:#FF0000">23</span>'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''25'''
|-
| '''266'''
| '''PI10'''
| '''TWI2-SDA/UART3_RX'''
| '''27'''
|-
| '''256'''
| '''PI0'''
| style="text-align: left;"|
| '''29'''
|-
| '''271'''
| '''PI15'''
| style="text-align: left;"|
| '''31'''
|-
| '''268'''
| '''PI12'''
| '''PWM2'''
| '''33'''
|-
| '''258'''
| '''PI2'''
| style="text-align: left;"|
| '''35'''
|-
| '''272'''
| '''PI16'''
| style="text-align: left;"|
| '''37'''
|-
| style="text-align: left;"|
| style="text-align: left;"|
| '''GND'''
| '''39'''
|}
{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"
|-
| '''Pin'''
| '''Function'''
| '''GPIO'''
| '''GPIO NO.'''
|-
| '''2'''
| '''5V'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''4'''
| '''5V'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''6'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''8'''
| '''UART0_TX'''
| '''PH0'''
| '''224'''
|-
| '''10'''
| '''UART0_RX'''
| '''PH1'''
| '''225'''
|-
| '''12'''
| style="text-align: left;"|
| '''PI1'''
| '''257'''
|-
| '''14'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''16'''
| '''PWM4/UART4_RX'''
| '''PI14'''
| '''270'''
|-
| '''18'''
| style="text-align: left;"|
| '''PH4'''
| '''228'''
|-
| '''20'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''22'''
| '''TWI0_SDA/UART2_RX'''
| '''PI6'''
| '''262'''
|-
| '''<span style="color:#FF0000">24</span>'''
| '''<span style="color:#FF0000">SPI1_CS0</span>'''
| '''<span style="color:#FF0000">PH5</span>'''
| '''<span style="color:#FF0000">229</span>'''
|-
| '''<span style="color:#FF0000">26</span>'''
| '''<span style="color:#FF0000">SPI1_CS1</span>'''
| '''<span style="color:#FF0000">PH9</span>'''
| '''<span style="color:#FF0000">233</span>'''
|-
| '''28'''
| '''TWI2-SCL/UART3_TX'''
| '''PI9'''
| '''265'''
|-
| '''30'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''32'''
| '''PWM1'''
| '''PI11'''
| '''267'''
|-
| '''34'''
| '''GND'''
| style="text-align: left;"|
| style="text-align: left;"|
|-
| '''36'''
| style="text-align: left;"|
| '''PC12'''
| '''76'''
|-
| '''38'''
| style="text-align: left;"|
| '''PI4'''
| '''260'''
|-
| '''40'''
| style="text-align: left;"|
| '''PI3'''
| '''259'''
|}
</div>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>Then enter the VNC password set earlier</p>
<p>[[File:zero2w-img228.png]]</p></li>
<li><p>After successful login, the interface is displayed as shown below, &gt; and then you can remotely operate the desktop of the development &gt; board Linux system.</p></li></ol>
<ol start="2" style="list-style-type: decimal;"><li><p>In Linux systems, spi1 is turned off by default and needs to be turned on manually before it can be used. The opening steps are as follows:</p><ol style="list-style-type: lower-alpha;"><li><p>First run '''orangepi-config'''. Ordinary users remember to add '''sudo''' permissions.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li><li><p>Then select '''System'''</p><p>[[File:zero2w-img229img80.png]]</p></li><li><p>Then select '''Hardware'''</p><span id="qtp>[[File:zero2w-installation-method"img81.png]]</p></spanli>== QT installation method ==<li><p>Then use the keyboard's arrow keys to locate the position shown in the figure below, and then use the '''space''' to select the dtbo configuration of the SPI you want to open.</p></li>
{| class="wikitable" style="width:800px;text-align: center;"|-| '''dtbo configuration'''| '''illustrate'''|-| '''spi1-cs0-cs1-spidev'''| '''Open cs0 and cs1 of spi1 at the same time'''|-| '''spi1-cs0-spidev'''| '''Only open cs0 of spi1'''|-| '''spi1-cs1-spidev'''| '''Only open cs1 of spi1'''|}</ol><ol start="5" style="list-style-type: lower-alpha;"><li><p>Then select '''&lt;Save&gt;''' to save</p><p>[[File:zero2w-img83.png]]</p></li><li><p>Then select '''&lt;Back&gt;'''</p><p>[[File:zero2w-img84.png]]</p></li><li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the configuration take effect.</p><p>[[File:zero2w-img85.png]]</p></li></ol></li></ol><!-- --><ol start="3" style="list-style-type: decimal;"><li><p>Use Then check whether there is a '''spidev1.x''' device node in the following script to install QT5 and QT CreatorLinux system. If it exists, it means that the SPI1 configuration has taken effect.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''install_qtls /dev/spidev1*'''</p><p>/dev/spidev1.0 /dev/spidev1.1</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that only when you open spi1-cs0-cs1-spidev, you will see the device nodes of the two spi.sh'''</p></big>|}</li><li><p>After installation, Then you can use the '''spidev_test.py''' program in examples to test the QT version number will be automatically printedSPI loopback function. The '''spidev_test.py''' program needs to specify the following two parameters:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>The qt version that comes with Ubuntu20.04 is '''5.12.8'''</p><p>orangepi@orangepi:~$ '''install_qt.sh'''</p><p>......</p><p>QMake version 3.1</p><p>Using Qt version '''5.12.8''' in /usr/lib/aarch64-linux-gnu</p></li><li><p>The QT version that comes with Ubuntu22.04 is '''5.15.3channel'''</p><p>orangepi@orangepi:~$ '''install_qt.sh'''</p><p>......</p><p>QMake version 3.1</p><p>Using Qt version '''5.15.3''' in /usr/lib/aarch64-linux-gnuSpecify the channel number of SPI</p></li><li><p>The QT version that comes with Debian11 is '''5.15.2'''</p><p>orangepi@orangepi:~$ '''install_qt.sh'''</p><p>......</p><p>QMake version 3.1</p><p>Using Qt version '''5.15.2''' in /usr/lib/aarch64-linux-gnu</p></li><li><p>The QT version that comes with Debian12 is 'port''5.15.8'''</p><p>orangepi@orangepi:~$ '''install_qt.sh'''</p><p>......</p><p>QMake version 3.1</p><p>Using Qt version '''5.15.8''' in /usr/lib/aarch64-linux-gnuSpecify the port number of the SPI</p></li></ol></li><li><p>Then you can see Without shorting the mosi and miso pins of SPI1, the QT Creator startup icon in '''Applications'''</p><p>[[File:zero2w-img230output result of running spidev_test.png]]</p><p>You can also use the following command to open QT Creator</p><p>orangepi@orangepi:~$ '''qtcreator'''</p></li><li><p>The interface after QT Creator is opened py is as follows</p><p>[[File:zero2w-img231.png]]</p></li><li><p>The version You can see that the data of QT Creator is as followsTX and RX are inconsistent.</p><ol style{| class="list-style-type: lower-alpha;wikitable"><li><p>The default version of QT Creator in '''Ubuntu20.04''' is as &gt; follows</p><p>[[File:zero2w-img232.png]]</p></li><li><p>The default version of QT Creator in '''Ubuntu22.04''' is as &gt; follows</p><p>[[File:zero2w-img233.png]]</p></li><li><p>The default version of QT Creator in '''Debian11''' is as follows</p><p>[[File:zero2w-img234.png]]</p></li><li><p>The default version of QT Creator in '''Debian12''' is as follows</p><p>[[File:zero2w-img235.png]]</p></li></ol></li><li><p>Then set up QT</p><ol style="list-style-typewidth: lower-alpha800px;"><li><p>First open '''Help'''-&gt;'''About Plugins...'''.</p><p>[[File:zero2w-img236.png]]</p></li><li><p>Then remove the check mark of '''ClangCodeModel'''</p><p>[[File:zero2w|-img237.png]]</p></li><li><p>'''After setting up, you need to restart QT Creator'''</p></li>| <li><p>Then make sure the GCC compiler used by QT Creator. If the &gt; default is Clang, please change it to GCC.</p><p>'''Debian12 please skip this step.'''</p><p>[[Fileroot@orangepi:zero2w-img238.png]]<~/p><p>[[File:zero2wwiringOP-img239.png]]</p></li></ol></li><li><p>Then you can open a sample code</p><p>[[File:zero2w-img240.png]]</p></li><li><p>After clicking on the sample code, the corresponding instruction document will automatically open. You can read the instructions carefully.</p><p>[[File:zero2w-img241.png]]</p></li><li><p>Then click Python# '''Configure Projectcd examples'''</p><p>[[File:zero2w-img242.png]]</p></li><li><p>Then click the green triangle in the lower left corner to compile and run the sample code</p><p>[[File:zero2w-img243.png]]</p></li><li><p>After waiting for a period of time, the interface shown in the figure below will pop up, which means that QT can compile and run normally.</p><p>[[File:zero2w-img244.png]]</p></li><li><p>References</p><p>[https://wiki.qt.io/Install_Qt_5_on_Ubuntu '''https://wiki.qt.io/Install_Qt_5_on_Ubuntu''']</p><p>[https://download.qt.io/archive/qtcreator '''https://download.qt.io/archive/qtcreator''']</p><p>[https://download.qt.io/archive/qt '''https://download.qt.io/archive/qt''']</p></li></ol>
<span id="ros-installationroot@orangepi:~/wiringOP-method"><Python/span>== ROS installation method ==examples# '''python3 spidev_test.py \'''
<span id="how'''-to-install-ros-channel 1-noetic-on-ubuntu20.04"></span>=== How to install ROS 1 Noetic on Ubuntu20.04 ===port 0'''
# The currently active version of ROS 1 is as follows, the recommended version is '''Noetic Ninjemys'''spi mode: 0x0
[[Filemax speed:zero2w-img245.png]]500000 Hz (500 KHz)
[[File:zero2w-img246Opening device /dev/spidev1.png]]1
[http://docs.ros.org/ TX | FF FF FF FF FF FF '''http<span style="color:#FF0000">40 00 00 00 00 95<//docs.ros.orgspan>''']FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…|
RX | FF FF FF FF FF FF '''https<span style="color:#FF0000">FF FF FF FF FF FF</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |.............….||}</wikili></ol><ol start="6" style="list-style-type: decimal;"><li><p>Then use Dupont wire to short-circuit the txd (pin 19 in the 40pin interface) and rxd (pin 21 in the 40pin interface) of SPI1 and then run spidev_test.rospy.orgThe output is as follows, you can see If the data sent and received are the same, it means that the SPI1 loopback test is normal.</Distributionsp>{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p>
<ol start="2" style="list-style-typeroot@orangepi: decimal;"><li><p>The link to the official installation documentation of ROS 1 '''Noetic Ninjemys''' is as follows:<~/p><p>[http://wiki.ros.org/noetic/Installation/Ubuntu '''http://wiki.ros.org/noetic/Installation/Ubuntu''']</p></li><li><p>In the official installation documentation of ROS '''Noetic Ninjemys''', Ubuntu recommends using Ubuntu20.04, so please ensure that the system used by the development board is '''Ubuntu20.04 desktop system'''.</p><p>[http://wiki.ros.org/noetic/Installation '''http://wiki.ros.org/noetic/Installation''']</p><p>[[File:zero2wwiringOP-img247.png]]<Python/p></li><li><p>Then use the script below to install ros1</p><p>orangepi@orangepi:~$ examples# '''install_rospython3 spidev_test.sh ros1py \'''</p></li><li><p>Before using the ROS tool, you first need to initialize rosdep. Then when compiling the source code, you can quickly install some system dependencies and some core components in ROS.</p></li></ol>
'''Note that when running the following command, you need to ensure that the development board can access github normally, otherwise an error will be reported due to network problems.--channel 1 --port 0'''
'''The install_ros.sh script will try to modify /etc/hosts and automatically run the following commands. However, this method cannot guarantee that github can be accessed normally every time. If install_ros.sh prompts the following error after installing ros1, please find other ways to allow the linux system of the development board to access github normally, and then manually run the following Order.'''spi mode: 0x0
'''httpsmax speed://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml'''500000 Hz (500 KHz)
'''Hit https:Opening device /dev/rawspidev1.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml'''1
TX | FF FF FF FF FF FF '''ERROR: error loading sources list<span style="color:#FF0000">40 00 00 00 00 95</span>'''FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…|
RX | FF FF FF FF FF FF '''The read operation timed out<span style="color:#FF0000">40 00 00 00 00 95</span>'''FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…||}</li></ol><span id="pin-i2c-test-1"></span>
orangepi@orangepi:~$ '''source /opt/ros/noetic/setup.bash'''=== 40pin I2C test ===
orangepi@orangepi:~$ '''sudo rosdep init'''# As can be seen from the table below, the i2c available for the 40pin interface are i2c0, i2c1 and i2c2
Wrote /etc/ros/rosdep/sources.list.d/20-default.list<div style="display: flex;">Recommended: please run rosdep update orangepi@orangepi:~$ '''rosdep update{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''GPIO NO.'''| '''GPIO'''reading in sources list data from /etc/ros/rosdep/sources.list.d| '''Function'''| '''Pin'''|-Hit https| style="text-align://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osxleft;"|| style="text-homebrewalign: left;"|| '''3.yaml3V'''Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml| '''1'''|-Hit https| '''<span style="color:#FF0000">264<//raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yamlspan>''' Hit https| '''<span style="color:#FF0000">PI8<//raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yamlspan>''' Hit https| '''<span style="color:#FF0000">TWI1-SDA<//raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yamlspan>''' Query rosdistro index https| '''<span style="color:#FF0000">3<//raw.githubusercontent.com/ros/rosdistro/master/indexspan>'''|-v4.yaml| '''<span style="color:#FF0000">263</span>'''Skip end-of-life distro &quot;ardent&quot; Skip end-of-life distro &quot;bouncy&quot;| '''<span style="color:#FF0000">v</span>''' Skip end| '''<span style="color:#FF0000">TWI1-of-life distro &quot;crystal&quot;SCL</span>'''| '''<span style="color:#FF0000">5</span>'''Skip end|-of-life distro &quot;dashing&quot;| '''269'''| '''PI13'''Skip end-of-life distro &quot;eloquent&quot;| '''PWM3/UART4_TX'''| '''7'''Add distro &quot;foxy&quot;|-Add distro &quot;galactic&quot| style="text-align: left;"| Skip end| style="text-of-life distro &quot;groovy&quotalign: left;"|| '''GND'''Add distro &quot;humble&quot;| '''9'''Skip end-of|-life distro &quot;hydro&quot;| '''226'''Skip end-of-life distro &quot;indigo&quot;| '''PH2'''| '''UART5_TX'''Skip end-of-life distro &quot;jade&quot;| '''11''' Skip end-of|-life distro &quot;kinetic&quot;| '''227'''Skip end-of-life distro &quot;lunar&quot;| '''PH3'''| '''UART5_RX'''Add distro &quot;melodic&quot; Add distro &quot;noetic&quot; Add distro &quot;rolling&quot; updated cache in /home/orangepi/.ros/rosdep/sources.cache| '''13'''|-| '''<ol start="6" span style="list-style-typecolor: decimal;#FF0000">261<li/span><p>Then open a command line terminal window on the '''desktop| ''', and then use the <span style="color:#FF0000">PI5</span>'''test_ros.sh| ''' script to start a small turtle routine to test whether ROS can be used normally.</pspan style="color:#FF0000">TWI0_SCL<p/span>orangepi@orangepi:~$ /UART2_TX'''test_ros.sh| '''</pspan style="color:#FF0000">15</lispan>'''<li><p>After running the |-| style="text-align: left;"|| style="text-align: left;"|| '''test_ros3.sh3V'''| '''17''' script, a small turtle as shown in the picture below will pop up.</p><p>[[File:zero2w|-img248.png]]</p></li><li><p>Then please keep the terminal window you just opened at the top</p></li></ol>| '''231'''| '''PH7'''<div class="figure">| '''SPI1_MOSI'''| '''19'''[[File:zero2w|-img249.png]]| '''232'''</div>| '''PH8'''<ol start="9" style="list-style-type: decimal;">| '''SPI1_MISO'''<li><p>At this time, press the direction keys on the keyboard to control the little turtle to move up, down, left, and right.</p>| '''21'''<p>[[File:zero2w|-img250.png]]</p></li></ol>| '''230'''| '''PH6'''<span id="how-to| '''SPI1_CLK'''| '''23'''|-install| style="text-ros-2-galactic-on-ubuntu20.04align: left;"></span>|=== How to install ROS 2 Galactic on Ubuntu20.04 === <ol style| style="listtext-style-typealign: decimalleft;">|<li><p>The currently active version of ROS 2 is as follows, the recommended version is | '''GND'''| '''Galactic Geochelone25'''</p>|-| '''<pspan style="color:#FF0000">[[File:zero2w-img251.png]]266</pspan>'''| '''<pspan style="color:#FF0000">[[File:zero2w-img252.png]]PI10</p><pspan>[http://docs.ros.org/ '''http://docs.ros.org| ''']</pspan style="color:#FF0000">TWI2-SDA<p/span>/UART3_RX'''http://docs.ros.org/en/galactic/Releases.html| '''</pspan style="color:#FF0000">27</lispan>'''|-<li><p>The link to the official installation documentation of ROS 2 | '''256''Galactic Geochelone'| '' is as follows'PI0'''| style="text-align:</p>left;"|<p>| '''docs.ros.org/en/galactic/Installation.html29'''</p><p>|-| '''http://docs.ros.org/en/galactic/Installation/Ubuntu-Install-Debians.html271'''</p></li><li><p>In the official installation documentation of ROS 2 | '''PI15'''| style="text-align: left;"|| '''Galactic Geochelone31''', Ubuntu Linux recommends using Ubuntu20.04, so please ensure that the system used by the development board is the |-| '''Ubuntu20.04 desktop system268'''. There are several ways to install ROS 2. The following demonstrates how to install ROS 2 | '''Galactic GeochelonePI12''' through | '''Debian packagesPWM2'''.</p></li><li><p>Use the | '''install_ros.sh33''' script to install ros2</p><p>orangepi@orangepi:~$ |-| '''install_ros.sh ros2258'''</p></li><li><p>The | '''install_ros.shPI2''' script will automatically run the '''ros2 | style="text-halign: left;"|| '''35''' command after installing ros2. If you can see the following print, it means that the ros2 installation is complete.</p><p>usage: ros2 [-h] Call `ros2 &lt;command&gt; |-h` for more detailed usage. ...</p><p>ros2 is an extensible command-line tool for ROS 2.</p>| '''272'''<p>optional arguments:</p>| '''PI16'''<p>-h, | style="text-align: left;"|| '''37'''|-help show this help message and exit</p><p>Commands| style="text-align:</p>left;"|<p>action Various action related sub| style="text-commands</p>align: left;"|<p>bag Various rosbag related sub-commands</p>| '''GND'''| '''39'''<p>component Various component related sub-commands</p>|}<p>daemon Various daemon related sub-commands</p>{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"<p>doctor Check ROS setup and other potential issues</p>|-<p>interface Show information about ROS interfaces</p>| '''Pin'''<p>launch Run a launch file</p>| '''Function'''<p>lifecycle Various lifecycle related sub-commands</p>| '''GPIO'''<p>multicast Various multicast related sub-commands</p>| '''GPIO NO.'''<p>node Various node related sub|-commands</p><p>param Various param related sub-commands</p>| '''2'''| '''5V'''<p>pkg Various package related sub| style="text-commands</p>align: left;"|<p>run Run a package specific executable</p>| style="text-align: left;"|<p>security Various security related sub|-commands</p><p>service Various service related sub-commands</p>| '''4'''| '''5V'''<p>topic Various topic related sub| style="text-commands</p>align: left;"|<p>wtf Use `wtf` as alias to `doctor`</p>| style="text-align: left;"|<p>Call `ros2 &lt;command&gt; |-h` for more detailed usage.</p></li><li><p>Then you can use the | '''6'''| '''test_ros.shGND''' script to test whether ROS 2 is installed successfully. If you can see the following print, it means ROS 2 can run normally.</p><p>orangepi@orangepi| style="text-align: left;"|| style="text-align:~$ left;"||-| '''test_ros.sh8'''| '''UART0_TX'''</p><p>[INFO] [1671174101.200091527] [talker]: Publishing: | '''PH0''Hello World: 1'</p><p>[INFO] [1671174101.235661048] [listener]: I heard: [Hello World: 1]</p>| '''224'''|-<p>[INFO] [1671174102.199572327] [talker]: Publishing: | '''10''Hello World: 2'</p><p>[INFO] [1671174102.204196299] [listener]: I heard: [Hello World: 2]</p><p>[INFO] [1671174103.199580322] [talker]: Publishing: | '''UART0_RX''Hello World: 3'</p><p>[INFO] [1671174103.204019965] [listener]: I heard: [Hello World: 3]</p></li><li><p>Run the following command to open rviz2</p><p>orangepi@orangepi:~$ | '''source /opt/ros/galactic/setup.bashPH1'''</p><p>orangepi@orangepi:~$ | '''ros2 run rviz2 rviz2225'''</p><p>[[File:zero2w|-img253.png]]</p></li><li><p>For how to use ROS, please refer to the documentation of ROS 2.</p><p>[http://docs.ros.org/en/galactic/Tutorials.html | '''12'''http://docs.ros.org/en/galactic/Tutorials.html''']</p></li></ol> <span id| style="howtext-to-install-ros-2-humble-on-ubuntu22.04align: left;"></span>|=== How to install ROS 2 Humble on Ubuntu22.04 ===| '''PI1''' <ol style="list-style| '''257'''|-type: decimal;"><li><p>Use the install_ros.sh script to | '''install_ros.sh14'''</p><p>orangepi@orangepi:~$ | '''install_ros.sh ros2GND'''</p></li><li><p>The | style="text-align: left;"|| style="text-align: left;"||-| '''install_ros.sh16''' script will automatically run the | '''ros2 -hPWM4/UART4_RX''' command after installing ros2. If you can see the following print, it means that the ros2 installation is complete.</p><p>usage: ros2 [-h] Call `ros2 &lt;command&gt; | '''PI14'''| '''270'''|-h` for more detailed usage. ...</p><p>ros2 is an extensible command| '''18'''| style="text-line tool for ROS 2.</p><p>optional argumentsalign:</p>left;"|<p>-h, -| '''PH4'''| '''228'''|-help show this help message and exit</p><p>Commands:</p>| '''20'''<p>action Various action related sub-commands</p>| '''GND'''<p>bag Various rosbag related sub| style="text-commands</p>align: left;"|<p>component Various component related sub| style="text-commands</p>align: left;"|<p>daemon Various daemon related sub|-commands| '''</pspan style="color:#FF0000"><p>doctor Check ROS setup and other potential issues22</pspan>'''| '''<pspan style="color:#FF0000">interface Show information about ROS interfacesTWI0_SDA</p><p>launch Run a launch file</pspan>/UART2_RX'''| '''<pspan style="color:#FF0000">lifecycle Various lifecycle related sub-commandsPI6</pspan>'''| '''<pspan style="color:#FF0000">multicast Various multicast related sub-commands262</pspan>'''<p>node Various node related sub|-commands</p><p>param Various param related sub-commands</p>| '''24'''<p>pkg Various package related sub-commands</p>| '''SPI1_CS0'''<p>run Run a package specific executable</p>| '''PH5'''<p>security Various security related sub-commands</p>| '''229'''<p>service Various service related sub|-commands</p><p>topic Various topic related sub-commands</p>| '''26'''<p>wtf Use `wtf` as alias to `doctor`</p>| '''SPI1_CS1'''<p>Call `ros2 &lt;command&gt; -h` for more detailed usage.</p></li>| '''PH9'''<li><p>Then you can use the | '''test_ros.sh233''' script to test whether ROS 2 is successfully installed. If you can see the following print, it means ROS 2 can run normally.</p><p>orangepi@orangepi:~$ |-| '''test_ros.sh<span style="color:#FF0000">28</span>'''</p><p>[INFO] [1671174101.200091527] [talker]: Publishing: | ''Hello World: 1'<span style="color:#FF0000">TWI2-SCL</pspan>/UART3_TX'''| '''<pspan style="color:#FF0000">[INFO] [1671174101.235661048] [listener]: I heard: [Hello World: 1]PI9</pspan>'''| '''<pspan style="color:#FF0000">[INFO] [1671174102.199572327] [talker]: Publishing: 'Hello World: 2'265</pspan>'''<p>[INFO] [1671174102.204196299] [listener]: I heard: [Hello World: 2]</p>|-<p>[INFO] [1671174103.199580322] [talker]: Publishing: | '''30''Hello World: 3'</p><p>[INFO] [1671174103.204019965] [listener]: I heard: [Hello World: 3]</p></li><li><p>Run the following command to open rviz2</p><p>orangepi@orangepi:~$ | '''GND'''source /opt/ros/humble/setup.bash| style="text-align: left;"|| style="text-align: left;"||-| '''32'''| '''PWM1'''| '''PI11'''</p><p>orangepi@orangepi:~$ | '''ros2 run rviz2 rviz2267'''</p><p>[[File:zero2w|-img254.png]]</p></li><li><p>Reference documentation</p><p>| '''http://docs.ros.org/en/humble/index.html34'''</p><p>[http://docs.ros.org/en/galactic/Tutorials.html | '''http://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.htmlGND''']</p></li></ol> <span id| style="howtext-to-install-kernel-header-filesalign: left;"></span>|| style== How to install kernel header files =="text-align: left;"||-| '''Debian11 system with Linux6.1 kernel will report GCC error when compiling kernel module. So if you want to compile the kernel module, please use Debian12 or Ubuntu22.04.36''' <ol | style="list-styletext-typealign: decimalleft;">|<li><p>The Linux image released by OPi comes with the deb package of the kernel header file by default, and the storage location is | '''/opt/PC12'''</p><p>orangepi@orangepi:~$ | '''ls /opt/linux-headers*76'''</p><p>/opt/linux|-| '''38'''| style="text-headers-xxx-sun50iw9_x.x.x_arm64.deb</p></li>align: left;"|| '''PI4'''<li><p>Use the following command to install the deb package of the kernel header file</p><p>orangepi@orangepi:~$ | '''sudo dpkg -i /opt/linux-headers*.deb260'''</p></li><li><p>After installation, you can see the folder where the kernel header file is located under |-| '''/usr/src40'''.</p><p>orangepi@orangepi| style="text-align:~$ left;"|| '''PI3''ls /usr/src'| '''259'''|}</pdiv> <p>linux-headers-x.x.x</p></liol start="2" style="list-style-type: decimal;"><li><p>Then you can compile the source code of the hello kernel module that comes with the i2c is turned off by default in Linux imagesystems and needs to be turned on manually to use it. The source code of the hello module is in '''/usr/src/hello'''. After entering this directory, then use the make command to compile.</p><p>orangepi@orangepiopening steps are as follows:~$ '''cd /usr/src/hello/'''</p><p>orangepi@orangepi:/usr/src/hello$ '''sudo make'''</p><p>make -C /lib/modules/5.4.125/build M=/usr/src/hello modules</p><p>make[1]: Entering directory '/usr/src/linux-headers-5.4.125'</p><p>CC [M] /usr/src/hello/hello.o</p><p>Building modules, stage 2.</p><p>MODPOST 1 modules</p><p>CC [M] /usr/src/hello/hello.mod.o</p><p>LD [M] /usr/src/hello/hello.ko</p><p>make[1]: Leaving directory '/usr/src/linux-headers-5.4.125'</p></li><li><p>After compilation, the '''hello.ko''' kernel module will be generated</p><p>orangepi@orangepi:/usr/src/hello$ '''ls *.ko'''</p><p>hello.ko</p></li><li><p>Use the '''insmod''' command to insert the '''hello.ko''' kernel module into the kernel</p><p>orangepi@orangepi:/usr/src/hello$ '''sudo insmod hello.ko'''</p></li><li><p>Then use the '''demsg''' command to view the output of the '''hello.ko''' kernel module. If you can see the following output, it means that the '''hello.ko''' kernel module is loaded correctly.</p><p>orangepi@orangepi:/usr/src/hello$ '''dmesg | grep &quot;Hello&quot;'''</p><p>[ 2871.893988] '''Hello Orange Pi -- init'''</p></li><li><p>Use the '''rmmod''' command to uninstall the '''hello.ko''' kernel module</p><p>orangepi@orangepi:/usr/src/hello$ '''sudo rmmod hello'''</p><p>orangepi@orangepi:/usr/src/hello$ '''dmesg | grep &quot;Hello&quot;'''</p><p>[ 2871.893988] Hello Orange Pi -- init</p><p>[ 3173.800892] '''Hello Orange Pi -- exit'''</p></li></ol> <span id="testing-of-some-programming-languages-supported-by-linux-system"></span>== Testing of some programming languages supported by Linux system == <span id="debian-bullseye-system"></span>=== Debian Bullseye system === <ol style="list-style-type: decimal;"><li><p>Debian Bullseye is installed with the gcc compilation tool chain by default, which can directly compile C language programs in the Linux system of the development board.</p><ol style="list-style-type: lower-alpha;"><li><p>The version of a.gcc is as follows</p><p>orangepi@orangepi:~$ '''gcc --version'''</p><p>gcc (Debian 10.2.1-6) 10.2.1 20210110</p><p>Copyright (C) 2020 Free Software Foundation, Inc.</p><p>This is free software; see the source for copying conditions. There is NO</p><p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p></li><li><p>Write the '''hello_world.c''' program in C language</p><p>orangepi@orangepi:~$ '''vim hello_world.c'''</p><p>#include &lt;stdio.h&gt;</p><p>int main(void)</p><p>{</p><p>printf(&quot;Hello World!\n&quot;);</p><p>return 0;</p><p>}</p></li><li><p>Then compile and run '''hello_world.c'''</p><p>orangepi@orangepi:~$ '''gcc -o hello_world hello_world.c'''</p><p>orangepi@orangepi:~$ '''./hello_world'''</p><p>Hello World!</p></li></ol></li><li><p>Debian Bullseye has Python3 installed by default</p>
<ol style="list-style-type: lower-alpha;">
<li><p>The specific version of Python is as follows</p><p>orangepi@orangepi:~$ First run '''python3orangepi-config'''</p><p>'''Python 3.9.2''' (default, Feb 28 2021, 17:03:44)</p><p>[GCC 10.2.1 20210110] on linux</p><p>Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.</p><p>&gt;&gt;&gt;</p><p>'''Use the Ctrl+D shortcut key Ordinary users remember to exit pythonadd 's interactive mode.''sudo'</p></li><li><p>Write the '''hello_worldpermissions.py''' program in Python language</p><p>orangepi@orangepi{| class="wikitable" style="width:~$ '''vim hello_world.py'''</p>800px;" <p>print('Hello World!')</p></li>|-<li><p>The result of running '''hello_world.py''' is as follows</p>| <p>orangepi@orangepi:~$ '''python3 hello_world.pysudo orangepi-config'''</p><p>Hello World!</p></li></ol>|}
</li>
<li><p>Debian Bullseye does not install Java compilation tools and operating environment by default.Then select '''System'''</p><ol style="list-style-typep>[[File: lowerzero2w-alpha;"img80.png]]</p></li><li><p>You can use the following command to install openjdk. The latest &gt; version in Debian Bullseye is openjdk-17Then select '''Hardware'''</p><p>orangepi@orangepi[[File:~$ '''sudo apt install zero2w-y openjdk-17-jdk'''img81.png]]</p></li><li><p>After installationThen use the keyboard's arrow keys to locate the position shown in the picture below, you can check and then use the '''space''' to select the corresponding i2c configuration in the Java versionpicture below.</p><p/li>orangepi@orangepi {| class="wikitable" style="width:800px;text-align:~$ center;"|-| '''Multiplexing function in 40pin'''| '''Corresponding dtbo configuration'''|-| '''40pin - i2c0'''| '''pi-i2c0'''|-| '''40pin - i2c1'''| '''pi-i2c1'''|-| '''java 40pin -i2c2'''| '''pi-versioni2c2'''|} [[File:zero2w-img173.png]]</pol></liol start="5" style="list-style-type: lower-alpha;"><li><p>Write the Java version of '''hello_world.java'''Then select <span class="mark">&lt;Save&gt;</span> to save</p><p>orangepi@orangepi[[File:~$ '''vim hello_worldzero2w-img83.java'''png]]</p></li><li><p>public Then select <span class hello_world="mark">&lt;Back&gt;</p><pspan>{</p><p>public static void main(String[[File:zero2w-img84.png]] args)</p></li><pli>{</p>Then select <pspan class="mark">System.out.println(&quotlt;Hello World!Reboot&quot;)gt;</span> to restart the system to make the configuration take effect.</p><p>}[[File:zero2w-img85.png]]</p><p/li>}</pol></li></ol><!-- --><ol start="3" style="list-style-type: decimal;"><li><p>Then compile and run '''hello_world.java'''After starting the Linux system, first confirm that there is an open i2c device node under <span class="mark">/dev</span></p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''javac hello_world.javals /dev/i2c-*'''</p><p>orangepi@orangepi:~$ '''java hello_world/dev/i2c-*'''</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <pbig>Hello World!'''注意,这里说的Linux镜像具体指的是从Orange Pi资料下载页面下载的Debian或者Ubuntu这样的Linux发行版镜像。'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Sometimes the i2c device node and the i2c bus serial number do not correspond one to one. For example, the i2c device node of the i2c1 bus may be /dev/i2c-3.'''</lip><p>'''The method to accurately confirm the device node under /ol>dev corresponding to the i2c bus is: '''</lip></olbig>
<span id="debian-bookworm-system"></span>
=== Debian Bookworm system ===
<ol style="list-style-type: decimal;">
<li><p>Debian Bookworm is installed with the gcc compilation tool chain by default, which can directly compile C language programs in the Linux system of the development board.</p>
<ol style="list-style-type: lower-alpha;">
<li><p>The version of a.gcc is as follows</p><p>orangepi@orangepi:~$ '''gcc --version'''</p><p>gcc (Debian 12.2.0-14) 12.2.0</p><p>Copyright (C) 2022 Free Software Foundation, Inc.</p><p>This is free software; see First run the source for copying conditions. There is NO</p><p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p></li><li><p>Write following command to check the corresponding relationship of i2c'''hello_world.c''' program in C language</p><p>orangepi@orangepiorangepizero2w:~$ '''vim hello_world.c'''<ls /sys/devices/p><p>#include &lt;stdio.h&gt;<platform/p><p>int main(void)<soc*/p><p>{<*/p><p>printf(i2c-* | grep &quot;Hello World!\ni2c-[0-9]&quot;);</p><p>return 0;</p><p>}</p></li><li><p>Then compile and run '''hello_world.c'''</p><p>orangepi@orangepi:~$ '''gcc -o hello_world hello_world.c'''</p><p>orangepi@orangepi:~$ '''./hello_world'''<sys/p><p>Hello World!<devices/p><platform/li><soc/ol></li><li><p>Debian Bookworm has Python3 installed by default<5002000.i2c/p><ol style="listi2c-style-type: lower-alpha;"><li><p>The specific version of Python is as follows</p><p>orangepi@orangepi0:~$ '''python3'''</p><p>Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux</p><p>Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.<sys/p><p>&gt;&gt;&gt;<devices/p><p>'''Use the Ctrl+D shortcut key to exit python's interactive mode.'''<platform/p><soc/li><li><p>Write the '''hello_world5002400.py''' program in Python language<i2c/p><p>orangepi@orangepii2c-3:~$ '''vim hello_world.py'''</p><p>print('Hello World!')</p><sys/devices/platform/soc/li><li><p>The result of running '''hello_world5002800.py''' is as follows<i2c/p><p>orangepi@orangepii2c-4:~$ '''python3 hello_world.py'''</p><p>Hello World!</p><sys/devices/li><platform/ol><soc/li><li><p>Debian Bookworm does not install Java compilation tools and operating environment by default5002c00.<i2c/p><ol style="listi2c-style-type5: lower-alpha;"><li><p>You can use the following command to install openjdk. The latest &gt; version in Debian Bookworm is openjdk-17</p><p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdk'''</p><sys/li><li><p>After installation, you can check the Java version.<devices/p><p>orangepi@orangepi:~$ '''java --version'''<platform/p><soc/li><li><p>Write the Java version of '''hello_world6000000.java'''<hdmi/p><p>orangepi@orangepii2c-2:~$ '''vim hello_world.java'''</p><p>public class hello_world</p><p>{<sys/p><p>public static void main(String[] args)<devices/p><p>{<platform/p><p>System.out.println(&quot;Hello World!&quot;);<soc/p><p>}</p><p>}</p></li><li><p>Then compile and run '''hello_world7081400.java'''<i2c/p><p>orangepi@orangepi:~$ '''javac hello_world.java'''</p><p>orangepi@orangepii2c-1:~$ '''java hello_world'''</p><p>Hello World!</p></li></ol></li></ol>
<span id="ubuntu-focal-system"></span>
=== Ubuntu Focal system ===
<ol style="list-style-type: decimal;"><li><p>Ubuntu Focal is installed with '''In the gcc compilation tool chain by default, which can directly compile C language programs in the Linux system of the development board.above output'''</p><ol style="list-style-type: lower-alphanone;"><li><p>The version a) 5002000 is the register base address of a.gcc the i2c0 bus, and i2c-0 shown behind it is as followsits corresponding i2c device node</p><p>orangepi@orangepi:~$ '''gcc --version'''</pli><pli>gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0</p><p>Copyright (Cb) 2019 Free Software Foundation, Inc.</p><p>This 5002400 is free software; see the source for copying conditions. There register base address of the i2c1 bus, and i2c-3 shown behind it is NO</p><p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.its corresponding i2c device node</p></li><li><p>Write c) 5002800 is the register base address of the '''hello_world.c''' program in C languagei2c2 bus, and i2c-4 shown behind it is its corresponding i2c device node</p><p/li>orangepi@orangepi:~$ '''vim hello_world.c'''</pol><p/li>#include &lt;stdio.h&gt;</pol><p>int main(void)</p>|}<p>{</pli><p>printf(&quot;Hello World!\n&quot;);</pol><p>return 0ol start="4" style="list-style-type: decimal;</p><p>}</p></li"><li><p>Then compile and run '''hello_world.c'''start testing i2c, first install i2c-tools</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''gcc sudo apt-o hello_world hello_world.cget update'''</p><p>orangepi@orangepi:~$ '''./hello_worldsudo''' '''apt-get install -y i2c-tools'''</p><p>Hello World!</p></li></ol>|}
</li>
<li><p>Ubuntu Focal has Python3 installed by default</p><ol style="list-style-type: lower-alpha;"><li><p>The specific version Then connect an i2c device to the i2c pin of Python3 is the 40pin connector. Here we take the DS1307 RTC module as follows</p><p>orangepi@orangepi:~$ '''python3'''</p><p>Python 3.8an example.10 (default, Nov 14 2022, 12:59:47)</p><p>[GCC 9[File:zero2w-img178.4.0png]] on linux</p><p>Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.</p><p>&gt;&gt;&gt;</p><p>'''Use the Ctrl+D shortcut key to exit python's interactive mode.'''</p></li><li><p>Write Then use the '''hello_world.pyi2cdetect -y x''' program in Python languagecommand. If the address of the connected i2c device can be detected, it means that the i2c device is connected correctly.</p><p>orangepi@orangepi{| class="wikitable" style="background-color:#ffffdc;width:~$ '''vim hello_world.py'''</p>800px;" |-| <pbig>print('Hello World!')</p></li><li>'<p>The result of running '''hello_worldNote that x in the i2cdetect -y x command needs to be replaced with the serial number of the device node corresponding to the i2c bus.py''' is as follows</p><p>orangepi@orangepi:~$ '''python3 hello_world.py'''</pbig><p>Hello World!</p>|} [[File:zero2w-img179.png]]</li></ol></li><li><p>Ubuntu Focal does not have Java compilation tools and running environment installed by default.</p><ol start="7" style="list-style-type: lower-alphadecimal;"><li><p>You Then you can use run the following command to install openjdk-17</p><p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdkds1307.py'''</p></li><li><p>After installation, you can check the Java version.</p><p>orangepi@orangepi:~$ test program in '''java --versionexamples'''to read the RTC time</p><p>openjdk 17.0.2 2022{| class="wikitable" style="background-01color:#ffffdc;width:800px;" |-18</p>| <p>OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)</pbig><p>OpenJDK 64'''Note that the x in i2c-Bit Server VM (build 17x in the following command needs to be replaced with the serial number of the device node corresponding to the i2c bus.0.2+8-Ubuntu-120.04, mixed mode, sharing)'''</p></libig><li>|}{| class="wikitable" style="width:800px;" |-| <p>Write the Java version of root@orangepi:~/wiringOP-Python# '''hello_world.javacd examples'''</p><p>orangepiroot@orangepi:~$ /wiringOP-Python/examples# '''vim hello_worldpython3 ds1307.javapy --device \'''</p><p>public class hello_world</p><p>{</p><p>public static void main(String[] args)</p><p>{</p><p>System.out.println('''&quot;Hello World!/dev/i2c-x&quot;);'''</p><p>}Thu 2022-06-16 04:35:46</p><p>}Thu 2022-06-16 04:35:47</p></li><li><p>Then compile and run '''hello_world.java'''Thu 2022-06-16 04:35:48</p><p>orangepi@orangepi:~$ '''javac hello_world.java'''^C</p><p>orangepi@orangepi:~$ '''java hello_world'''exit</p><p>Hello World!</p></li></ol>|}
</li></ol>
<span id="ubuntupin-jammyuart-systemtest-1"></span> === Ubuntu Jammy system 40pin UART test ===
<ol style="list-style-type: decimal;"><li><p>Ubuntu Jammy is installed with the gcc compilation tool chain by default, which # As can directly compile C language programs in be seen from the Linux system of the development board.</p><ol style="list-style-type: lower-alpha;"><li><p>The version of a.gcc is as follows</p><p>orangepi@orangepi:~$ '''gcc --version'''</p><p>gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) '''11.3.0'''</p><p>Copyright (C) 2021 Free Software Foundationtable below, Inc.</p><p>This is free software; see the source for copying conditions. There is NO</p><p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p></li><li><p>Write the '''hello_world.c''' program in C language</p><p>orangepi@orangepi:~$ '''vim hello_world.c'''</p><p>#include &lt;stdio.h&gt;</p><p>int main(void)</p><p>{</p><p>printf(&quot;Hello World!\n&quot;);</p><p>return 0;</p><p>}</p></li><li><p>Then compile and run '''hello_world.c'''</p><p>orangepi@orangepi:~$ '''gcc -o hello_world hello_world.c'''</p><p>orangepi@orangepi:~$ '''./hello_world'''</p><p>Hello World!</p></li></ol></li><li><p>Ubuntu Jammy has Python3 installed by default</p><ol style="list-style-type: lower-alpha;"><li><p>The specific version of Python3 is as follows</p><p>orangepi@orangepi:~$ '''python3'''</p><p>Python 3.10.6 (mainavailable uarts are uart2, May 29 2023uart3, 11:10:38) [GCC 11.3.0] on linux</p><p>Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.</p><p>&gt;&gt;&gt;</p><p>'''Use the Ctrl+D shortcut key to exit python's interactive mode.'''</p></li><li><p>Write the '''hello_world.py''' program in Python language</p><p>orangepi@orangepi:~$ '''vim hello_world.py'''</p><p>print('Hello World!')</p></li><li><p>The result of running '''hello_worlduart4 and uart5.py''' Please note that uart0 is set as follows</p><p>orangepi@orangepi:~$ '''python3 hello_world.py'''</p><p>Hello World!</p></li></ol></li><li><p>Ubuntu Jammy does not install Java compilation tools and operating environment a debugging serial port by default.</p><ol style="list-style-type: lower-alpha;"><li><p>You can Please do not use the following command to install openjdk-18</p><p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-18-jdk'''</p></li><li><p>After installation, you can check the Java version.</p><p>orangepi@orangepi:~$ '''java --version'''</p><p>openjdk 18.0.2-ea 2022-07-19</p><p>OpenJDK Runtime Environment (build 18.0.2-ea+9-Ubuntu-222.04)</p><p>OpenJDK 64-Bit Server VM (build 18.0.2-ea+9-Ubuntu-222.04, mixed mode, sharing)</p></li><li><p>Write the Java version of '''hello_world.java'''</p><p>orangepi@orangepi:~$ '''vim hello_world.java'''</p><p>public class hello_world</p><p>{</p><p>public static void main(String[] args)</p><p>{</p><p>System.out.println(&quot;Hello World!&quot;);</p><p>}</p><p>}</p></li><li><p>Then compile and run '''hello_world.java'''</p><p>orangepi@orangepi:~$ '''javac hello_worlduart0 as a normal serial port.java'''</p><p>orangepi@orangepi:~$ '''java hello_world'''</p><p>Hello World!</p></li></ol></li></ol>
<span iddiv style="method-of-uploading-files-to-the-development-board-linux-systemdisplay: flex;"></span>::{| class="wikitable" style= Method of uploading files to the development board Linux system == <span id="method"width:390px;margin-toright: 20px;text-upload-files-to-the-development-board-linux-system-in-ubuntu-pcalign: center;"></span>=== Method to upload files to the development board Linux system in Ubuntu PC ===|-| '''GPIO NO.'''| '''GPIO'''<span id="how-to-upload-files| '''Function'''| '''Pin'''|-using| style="text-scp-commandalign: left;"></span>|| style==== How to upload files using scp command ==== <ol style="list"text-style-typealign: decimalleft;">|<li><p>Use the scp command to upload files to the Linux system of the development board in Ubuntu PC| '''3. The specific command is as follows</p>3V'''<ol style="list-style-type: lower| '''1'''|-alpha;"><li><p>| '''264'''| ''file_path: 'PI8'''Needs to be replaced with the path of the file to &gt; be uploaded</p></li><li><p>| '''TWI1-SDA'''| 'orangepi: ''3'This is the user name of the development board's &gt; Linux system. It can also be replaced with something else, &gt; such as root.</p></li>'|-<li><p>| '''263'192.168.xx.xx:''| '''PI7''' This is the IP address of the development &gt; board. Please modify it according to the actual situation.</p></li><li><p>| '''/home/orangepi:TWI1-SCL''' The path in the development board Linux &gt; system can also be modified to other paths.</p><p>test@test:~$ | '''scp file_path orangepi@192.168.xx.xx:/home/orangepi/5'''</p></li></ol></li>|-<li><p>If you want to upload a folder, you need to add the -r parameter</p>| '''269'''<p>test@test:~$ | '''scp -r dir_path orangepi@192.168.xx.xx:/home/orangepi/PI13'''<| '''PWM3/p></li>UART4_TX'''| '''7'''<li><p>There are more usages of scp, please use the following command to view the man manual</p></li></ol>|- test@test:~$ '''man scp''' <span id| style="howtext-to-upload-files-using-filezillaalign: left;"></span>|==== How to upload files using filezilla ==== <ol | style="listtext-style-typealign: decimalleft;">|<li><p>First install filezilla in Ubuntu PC</p>| '''GND'''<p>test@test:~$ | '''sudo apt install -y filezilla9'''</p></li><li><p>Then use the following command to open filezilla</p>|-<p>test@test:~$ | '''filezilla226'''| '''PH2'''| '''UART5_TX'''</p></li><li><p>The interface after opening filezilla is as shown below. At this time, the remote site on the right is empty.</p><div class="figure">| '''11''' [[File:zero2w|-img255.png]]| '''227'''</div></li>| '''PH3'''<li><p>The method of connecting the development board is as shown in the figure below</p></li></ol>| '''UART5_RX'''| '''13'''|-<div class="figure">| '''261'''| '''PI5'''[[File:zero2w-img256.png]] <| '''TWI0_SCL/div>UART2_TX'''<ol start| '''15'''|-| style="5text-align: left;" || style="list-styletext-typealign: decimalleft;">|<li><p>Then choose to | '''3.3V'''| '''save the password17''' and click |-| '''OK231'''</p><p>[[File:zero2w-img257.png]]</p></li>| '''PH7'''<li><p>Then select | '''SPI1_MOSI''Always trust this host'| '' and click '19''OK'|-| '''232'''</p></li></ol>| '''PH8'''<div class="figure">| '''SPI1_MISO'''| '''21'''[[File:zero2w|-img258.png]]| '''230'''</div>| '''PH6'''<ol start| '''SPI1_CLK'''| '''23'''|-| style="7text-align: left;" || style="list-styletext-typealign: decimalleft;">|<li>After the connection is successful, you can see the directory structure of the development board| '''GND'''s Linux file system on the right side of the filezilla software.</li></ol> <div class="figure">| '''25'''[[File:zero2w|-img259.png]]| '''266'''</div>| '''PI10'''<ol start="8" style="list| '''TWI2-style-type: decimal;">SDA/UART3_RX'''<li>Then select the path to be uploaded to the development board on the right side of the filezilla software, select the file to be uploaded in Ubuntu PC on the left side of the filezilla software, right| '''27'''|-click the mouse, and then click the upload option to start uploading the file to the development board.</li></ol>| '''256'''| '''PI0'''<div class| style="figuretext-align: left;">| [[File:zero2w| '''29'''|-img260.png]]| '''271'''</div>| '''PI15'''<ol start="9" | style="list-styletext-typealign: decimalleft;">|| '''31'''|-<li><p>After the upload is completed, you can go to the corresponding path in the development board Linux system to view the uploaded file.</p></li>| '''268'''<li><p>The method of uploading a folder is the same as the method of uploading a file, so I won| '''PI12'''| '''PWM2'''t go into details here.</p></li></ol>| '''33'''<span id="method|-to-upload-files-from-windows-pc-to-development-board-linux-system"></span>=== Method to upload files from Windows PC to development board Linux system ===| '''258'''| '''PI2''' <span id| style="howtext-to-upload-files-using-filezilla-1align: left;"></span>|==== How to upload files using filezilla ====| '''35'''|-# First download the installation file of the Windows version of the filezilla software. The download link is as follows| '''272''' [https://filezilla-project.org/download.php?type=client | '''https://filezilla-project.org/download.php?type=clientPI16'''] [[File| style="text-align:zero2w-img261.png]]left;"|| '''37'''<div class="figure"> [[File:zero2w|-img262.png]] </div><ol start="2" | style="listtext-align: left;"|| style="text-typealign: decimalleft;">|| '''GND'''<li><p>The downloaded installation package is as shown below, then double-click to install it directly</p><p>| '''39'''FileZilla_Server_1.5.1_win64|}{| class="wikitable" style="width:390px;margin-setup.exe'''</p></li></ol>right: 20px;text-align: center;"|-During the installation process, please select | '''DeclinePin''' on the following installation interface, and then select | '''Next&gt;Function'''| '''GPIO'''<div class="figure">| '''GPIO NO.''' [[File:zero2w|-img263.png]]| '''2'''</div>| '''5V'''<ol start| style="3text-align: left;" || style="list-styletext-typealign: decimalleft;">||-<li>The interface after opening filezilla is as shown below. At this time, the remote site on the right is empty.</li></ol>| '''4''' <div class| '''5V'''| style="figuretext-align: left;">|| style="text-align: left;"|[[File:zero2w|-img264.png]]| '''6'''| '''GND'''</div><ol start| style="4text-align: left;" || style="listtext-style-typealign: decimalleft;">|<li>The method of connecting the development board is as shown in the figure below:</li></ol>|-| '''8'''<div class="figure">| '''UART0_TX'''| '''PH0'''| '''224'''[[File:zero2w|-img256.png]] </div><ol start="5" style="list-style-type: decimal;"><li>Then choose to | '''10''save the password'| '''UART0_RX''' and click | '''OKPH1'''</li></ol>| '''225'''<div class="figure">|-| '''12'''[[File:zero2w-img265.png]] </div><ol start="6" | style="list-styletext-typealign: decimalleft;">|<li>Then select | '''Always trust this hostPI1''' and click | '''OK257'''</li></ol> <div class="figure"> [[File:zero2w|-img266.png]]| '''14'''</div>| '''GND'''<ol start| style="7text-align: left;" || style="list-styletext-typealign: decimalleft;">||-| '''16'''<li>After the connection is successful, you can see the directory structure of the development board| '''s Linux file system on the right side of the filezilla software.<PWM4/li></ol>UART4_RX'''| '''PI14'''<div class="figure">| '''270'''[[File:zero2w|-img267.png]]| '''18'''</div><ol start="8" | style="listtext-style-typealign: decimalleft;">|<li>Then select the path to be uploaded to the development board on the right side of the filezilla software, select the file to be uploaded on the Windows PC on the left side of the filezilla software, right| '''PH4'''| '''228'''|-click the mouse, and then click the upload option to start uploading the file to the development board.</li></ol>| '''20'''| '''GND'''<div class| style="figuretext-align: left;">| [[File:zero2w-img268.png]] </div><ol start="9" | style="listtext-style-typealign: decimalleft;">||-<li><p>After the upload is completed, you can go to the corresponding path in the development board Linux system to view the uploaded file.<| '''22'''| '''TWI0_SDA/p></li>UART2_RX'''| '''PI6'''<li><p>The method of uploading a folder is the same as the method of uploading a file, so I won| '''262'''t go into details here.</p></li></ol> <span id="instructions|-for-using-the-logo-on-and-off-the-machine"></span>== Instructions for using the logo on and off the machine ==| '''24'''| '''SPI1_CS0'''<ol style="list-style| '''PH5'''| '''229'''|-type: decimal;"><li><p>The power on/off logo will only be displayed on the desktop version of the system by default.</p></li>| '''26'''<li><p>Set the | '''bootlogoSPI1_CS1''' variable to | '''falsePH9''' in | '''/boot/orangepiEnv.txt233''' to turn off the switch logo.</p><p>orangepi@orangepi:~$ |-| '''sudo vim /boot/orangepiEnv.txt28'''</p><p>verbosity=1<| '''TWI2-SCL/p>UART3_TX'''<p>| '''bootlogo=falsePI9'''</p></li><li><p>Set the | '''265'''bootlogo|-| ''' variable to 30'''true| ''' in GND'''/boot/orangepiEnv.txt''' to enable the power on/off logo.</p><p>orangepi@orangepi| style="text-align: left;"|| style="text-align:~$ left;"||-| '''32'sudo vim /boot/orangepiEnv.txt''| '''PWM1'''</p><p>verbosity=1</p>| '''PI11'''<p>| '''bootlogo=true267'''</p></li><li><p>The location of the boot logo picture in the Linux system is</p><p>|-| '''34''/usr/share/plymouth/themes/orangepi/watermark.png'| '''GND'''</p></li><li><p>After replacing the boot logo image, you need to run the following command to take effect</p>| style="text-align: left;"|<p>orangepi@orangepi| style="text-align:~$ ''left;"||-| '''sudo update-initramfs -u36'''</p></li></ol> <span id| style="howtext-to-turn-on-the-power-button-in-linux5.4align: left;"></span>|== How to turn on the power button in Linux5.4 == There is no power on/off button on the main board of the development board. We can expand it through a 24pin expansion board. The location of the power on/off button on the expansion board is as follows:| '''PC12'''| '''76'''[[File:zero2w|-img269.png]] The power on/off button of the Linux 6.1 image is turned on by default, but the power on/off button of the Linux 5.4 kernel image is turned off by default and needs to be turned on manually for normal use. The steps are as follows:| '''38'''| style="text-align: left;"|| '''PI4'''| '''260'''|-| '''40'''<ol | style="list-styletext-typealign: decimalleft;">|<li><p>First run | '''PI3'orangepi-config''| '. Ordinary users remember to add ''259'sudo''|}</div> <ol start="2" style="list-style-type: decimal;"><li><p>In Linux systems, uart is turned off by default and needs to be turned on manually before it can be used. The opening steps are as follows:: </p><ol style="list-style-type: lower-alpha;"><li><p>First run ''' permissions.</p>orangepi-config'''. Ordinary users remember to add '''sudo''' permissions.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>Then select '''System'''</p>
<p>[[File:zero2w-img80.png]]</p></li>
<li><p>Then select '''Hardware'''</p>
<p>[[File:zero2w-img81.png]]</p></li>
<li><p>Then use the keyboard's arrow keys to locate the position shown in the picture below, and then use the '''space''' to select the dtbo configuration of the SPI serial port you want to open.</p><p/li{| class="wikitable" style="width:800px;text-align: center;"|-| '''Multiplexing function in 40pin'''| '''Corresponding dtbo configuration'''|-| '''40pin - uart2'''| '''pi-uart2'''|-| '''40pin - uart3'''| '''pi-uart3'''|-| '''40pin - uart4'''| '''pi-uart4'''|-| '''40pin - uart5'''| '''ph-uart5'''|} [[File:zero2w-img270img175.png]]</pol></liol start="5" style="list-style-type: lower-alpha;">
<li><p>Then select '''&lt;Save&gt;''' to save</p>
<p>[[File:zero2w-img83.png]]</p></li>
<li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the configuration take effect.</p>
<p>[[File:zero2w-img85.png]]</p></li></ol>
</li></ol>
<!-- -->
<ol start="3" style="list-style-type: decimal;">
<li><p>After entering the Linux system, first confirm whether there is a uart5 device node under '''<span class="mark">/dev</span>'''</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
|
<big><p>'''注意, linux5.4系统为/dev/ttyASx.'''</p></big>
|}
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ls /dev/ttyS*'''</p>
<p>/dev/ttySx</p>
|}
</li>
<li><p>Then start testing the uart interface. First use Dupont wire to short-circuit the rx and tx pins of the uart interface to be tested.</p></li>
<li><p>Use the '''gpio''' command in wiringOP to test the loopback function of the serial port as shown below. If you can see the following print, it means the serial port communication is normal.</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
|
<big><p>'''Note that the last x in the gpio serial /dev/ttySx command needs to be replaced with the serial number of the corresponding uart device node.'''</p></big>
|}
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''gpio serial /dev/ttySx &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # linux-6.1 test command'''</p>
<p>orangepi@orangepi:~$ '''gpio serial /dev/ttyASx &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # linux-5.4 test command'''</p>
<span id="how-to-shut-down-and-restart-the-development-board"></span>
== How to shut down and restart the development board ==
<ol style="listp>Out: 0: -style-type: decimal&gt;"0</p><li><p>During the running of the Linux system, if you directly unplug the power supply, it may cause the file system to lose some data. It is recommended to use the '''poweroff''' command to shut down the Linux system of the development board before powering off, and then unplug the power supply.Out: 1: -&gt; 1</p><p>orangepi@orangepiOut: 2:~$ '''sudo poweroff'''-&gt; 2</p><p>'''Note that after turning off the development board, you need to unplug and replug the power supply before it can be turned on.'''Out: 3: -&gt; 3^C</p>|}</li><li><p>In addition Finally, you can run the '''serialTest.py''' program in examples to using test the loopback function of the poweroff command to shut down, serial port. If you can also use see the power on/off button on following print, it means that the expansion board to shut downserial port loopback test is normal.</p><p>[[File{| class="wikitable" style="background-color:#ffffdc;width:zero2w800px;" |-img269.png]]| </pbig><p>'''Note that Linux 5.4 requires manual configuration of the power onx in /dev/off button before it can be used. For ttySx or /dev/ttyASx in the opening method, please refer command needs to be replaced with the method serial number of opening the power button in Linux5.4corresponding uart device node.'''</p></libig><li>|}{| class="wikitable" style="width:800px;" |-| <p>Use the root@orangepi:~/wiringOP-Python# '''rebootcd examples''' command to restart the Linux system in the development board</p><p>orangepiroot@orangepi:~$ /wiringOP-Python/examples# '''sudopython3 serialTest.py --device &quot;/dev/ttySx&quot; # linux6.1 use''' </p><p>root@orangepi:~/wiringOP-Python/examples# '''rebootpython3 serialTest.py --device &quot;/dev/ttyASx&quot; # linux5.4 use'''</p></li></ol>
<span id="linux-sdkorangepi-build-usage-instructions"></span>
= '''Linux SDK——orangepi<p>Out: 0: -build usage instructions''' =&gt; 0</p><p>Out: 1: -&gt; 1</p><p>Out: 2: -&gt; 2</p><p>Out: 3: -&gt; 3</p><p>Out: 4:^C</p><p>exit</p>|}</li></ol>
<span id="compilationhardware-systemwatchdog-requirementstest"></span>== Compilation system requirements ==
The Linux SDK, '''orangepi-build''', only supports running on X64 computers with '''Ubuntu 22.04''' installed. Therefore, before downloading orangepi-build, please first ensure that the Ubuntu version installed on your computer is Ubuntu 22.04. The command to check the Ubuntu version installed on the computer is as follows. If the Release field does not display '''22.04''', it means that the Ubuntu version currently used does not meet the requirements. Please change the system before performing the following operations.== Hardware watchdog test ==
test@test:~$ '''lsb_release The watchdog_test program is pre-a'''installed in the Linux system released by Orange Pi and can be tested directly.
No LSB modules are available.The method to run the watchdog_test program is as follows:
Distributor ID<ol style="list-style-type: Ubuntulower-alpha;"><li><p>The second parameter 10 represents the counting time of the watchdog. If the dog is not fed within this time, the system will restart.</p></li><li><p>We can feed the dog by pressing any key on the keyboard (except ESC). After feeding the dog, the program will print a line &quot;keep alive&quot; to indicate that the dog feeding is successful.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo watchdog_test 10'''</p><p>open success</p><p>options is 33152,identity is sunxi-wdt</p><p>put_usr return,if 0,success:0</p><p>The old reset time is: 16</p><p>return ENOTTY,if -1,success:0</p><p>return ENOTTY,if -1,success:0</p><p>put_user return,if 0,success:0</p><p>put_usr return,if 0,success:0</p><p>keep alive</p><p>keep alive</p><p>keep alive</p>|}</li></ol>
Description: Ubuntu 22.04 LTS<span id="check-the-chipid-of-h618-chip"></span>
Release: '''22.04'''== Check the chipid of H618 chip ==
Codename: '''jammy'''The command to view the H618 chip chipid is as follows. The chipid of each chip is different, so you can use chipid to distinguish multiple development boards.
If the computer is installed with a Windows system and does not have Ubuntu 22.04 installed on it, you can consider using'''VirtualBox''' or {| class="wikitable" style="width:800px;" |-| orangepi@orangepi:~$ '''VMwarecat /sys/class/sunxi_info/sys_info | grep &quot;chipid&quot;''' to install an Ubuntu 22.04 virtual machine in the Windows system. But please note, do not compile orangepi-build on the WSL virtual machine, because orangepi-build has not been tested in the WSL virtual machine, so there is no guarantee that orangepi-build can be used normally in WSL. In addition, please do not compile the Linux system on the development board. Use orangepi-build. The installation image download address of Ubuntu 22.04 amd64 version is:
[httpssunxi_chipid ://repo.huaweicloud.com/ubuntu-releases/21.04/ubuntu-21.04-desktop-amd64.iso '''https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ubuntu-22.04-desktop-amd64.iso''']338020004c0048080147478824681ed1|}
After installing Ubuntu 22.04 on your computer or virtual machine, please first set the software source of Ubuntu 22.04 to Tsinghua source (or other domestic sources that you think is fast), otherwise it is easy to make errors due to network reasons when installing the software later. The steps to replace Tsinghua Source are as follows:<span id="python-related-instructions"></span>
<ol style="list-style-type: lower-alpha;"><li>For the method of replacing Tsinghua Source, please refer to the = Python related instructions on this page.</li></ol>==
[https:<span id="how-to-compile-and-install-python-source-code"><//mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ '''https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/''']span>=== How to compile and install Python source code ===
<ol start{| class="2wikitable" style="listbackground-style-typecolor:#ffffdc;width: lower-alpha800px;">|-| <libig>Note that '''If the Python version in the Ubuntu or Debian system software repository you are using does not meet the development requirements and you want to use the latest version needs of Python, you can use the following method to be switched download the Python source code package to 22compile and install the latest version of Python.04.</li></ol>'''
[[File:zero2w-img271'''The following demonstration is to compile and install the latest version of Python 3.png]]9. If you want to compile and install other versions of Python, the method is the same (you need to download the source code corresponding to the Python you want to install).'''</big>|}
<ol startstyle="list-style-type: decimal;"><li><p>First install the dependency packages needed to compile Python</p>{| class="3wikitable" style="listwidth:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt-get update'''</p><p>orangepi@orangepi:~$ '''sudo apt-get install -y build-essential zlib1g-dev \'''</p><p>'''libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev \'''</p><p>'''libreadline-dev libffi-dev curl libbz2-dev'''</p>|}</li><li><p>Then download the latest version of Python3.9 source code and unzip it</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''wget \'''</p><p>'''https://www.python.org/ftp/python/3.9.10/Python-type3.9.10.tgz'''</p><p>orangepi@orangepi: lower~$ '''tar xvf Python-alpha3.9.10.tgz'''</p>|}</li><li><p>Then run the configuration command</p>{| class="wikitable" style="width:800px;"|-| <p>orangepi@orangepi:~$ '''cd Python-3.9.10'''</p><p>orangepi@orangepi:~$ '''./configure --enable-optimizations'''</p>|}</li><li><p>Then compile and install Python3.9. The contents compilation time takes about half an hour.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''make -j4'''</p><p>orangepi@orangepi:~$ '''sudo make altinstall'''</p>|}</li><li><p>After installation, you can use the following command to check the version number of the Python you just installed.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''python3.9 --version'''</etcp><p>'''Python 3.9.10'''</aptp>|}</li><li><p>Then update pip</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''/usr/local/bin/sourcespython3.list9 -m pip install --upgrade pip''' file that need to be replaced are:</p>|}</li></ol>
test@test:~$ '''sudo mv <span id="how-to-replace-pip-source-in-python"></etc/apt/sources.list cat /etc/apt/sources.list.bak'''span>
test@test:~$ '''sudo vim /etc/apt/sources.list'''=== How to replace pip source in Python ===
{| class="wikitable" style="background-color:# ffffdc;width:800px;" |-| <big>'''The default source used by Linux system pip is the official source code image of Python. However, accessing the official source of Python in China is commented by default very slow, and the installation of Python software packages often fails due to improve apt update speednetwork reasons. You can uncomment it yourself if necessarySo when using pip to install the Python library, please remember to change the pip source.'''</big>|}
deb <ol style="list-style-type: decimal;"><li><p>First install '''python3-pip'''</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt-get update'''</p><p>orangepi@orangepi:~$ '''sudo apt-get install -y python3-pip'''</p>|}</li><li><p>How to permanently change the pip source under Linux</p><ol style="list-style-type: lower-alpha;"><li><p>First create a new '''~/.pip''' directory, then add the '''pip.conf''' configuration file, and set the pip source in it to Tsinghua source.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''mkdir -p ~/.pip'''</p><p>orangepi@orangepi:~$ '''cat &lt;&lt;EOF &gt; ~/.pip/pip.conf'''</p><p>'''[global]'''</p><p>'''timeout = 6000'''</p><p>'''index-url = https://mirrorspypi.tuna.tsinghua.edu.cn/ubuntusimple'''</p><p>'''trusted-host = pypi.tuna.tsinghua.edu.cn'''</p><p>'''EOF'''</p>|}</li><li><p>Then use pip3 to install the Python library very quickly</p></li></ol></li><li><p>How to temporarily change the pip source under Linux, where '''&lt;packagename&gt;''' needs to be replaced with a specific package name</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''pip3 install &lt;packagename&gt; -i \'''</p><p>'''https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn'''</p>|}</li></ jammy main restricted universe multiverseol>
# deb<span id="how-src https://mirrors.tuna.tsinghua.edu.cn/ubuntuto-install-docker"></ jammy main restricted universe multiversespan>
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse== How to install Docker ==
# debThe Linux image provided by Orange Pi has Docker pre-src https://mirrorsinstalled, but the Docker service is not turned on by default.tunaUse the '''enable_docker.tsinghuash''' script to enable the docker service, and then you can start using the docker command, and the docker service will be automatically started the next time you start the system.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https{| class="wikitable" style="width://mirrors.tuna.tsinghua800px;" |-| orangepi@orangepi:~$ '''enable_docker.edu.cn/ubuntu/ jammy-backports main restricted universe multiversesh'''|}
# debYou can use the following command to test docker. If '''hello-src https://mirrorsworld''' can be run, docker can be used normally.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https{| class="wikitable" style="width://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy800px;" |-security main restricted universe multiverse| orangepi@orangepi:~$ '''docker run hello-world'''
# debUnable to find image 'hello-src httpsworld://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverselatest' locally
# Prelatest: Pulling from library/hello-release software source, not recommended to be enabledworld
# deb https256ab8fe8778://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiversePull complete
# deb-src httpsDigest://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiversesha256:7f0a9f93b4aa3022c3a4c147a449ef11e0941a1fd0bf4a8e6c9408b2600777c5
<ol start="4" style="listStatus: Downloaded newer image for hello-style-typeworld: lower-alpha;"><li>After the replacement, you need to update the package information and ensure that no errors are reported.</li></ol>latest
test@test:~$ '''sudo apt-get update'''
'''<ol start="5" span style="list-style-typecolor: lower-alpha;#FF0000">Hello from Docker!<li/span>'''In addition, since the source code of the kernel and Uboot are stored on GitHub, it is very important to ensure that the computer can download the code from GitHub normally when compiling the image.'''</li></ol>
'''<span idstyle="obtain-the-source-code-of-linux-sdkcolor:#FF0000">This message shows that your installation appears to be working correctly.</span>== Obtain the source code of linux sdk =='''
<span id="download-orangepi-build-from-github"></span>'''.….'''=== Download orangepi-build from github ===|}
Linux sdk refers When using the docker command, if you are prompted for '''permission denied''', please add the current user to the orangepi-build set of codes. Orangepi-build is modified based on the armbian build compilation system. Multiple versions of Linux images docker user group so that you can be compiled using orangepi-build. Use run the following docker command to download the orangepi-build code:without sudo.
test{| class="wikitable" style="width:800px;" |-| orangepi@testorangepi:~$ '''sudo aptusermod -get updateaG docker $USER'''|}
test@test{| class="wikitable" style="background-color:~$ #ffffdc;width:800px;" |-| <big>'''sudo apt-get install -y gitNote: You need to log out and log in again to the system to take effect. You can also restart the system.'''</big>|}
test@test:~$ '''git clone https://github.com/orangepi<span id="how-to-xunlong/orangepiinstall-build.git home-b next'''assistant"></span>
'''Note that when using the H618 Soc development board, you need == How to download the source code of the next branch of orangepi-build. The above git clone command needs to specify the branch of the orangepi-build source code as next.'''install Home Assistant ==
<div {| class="figurewikitable" style="background-color:#ffffdc;width:800px;"|-| <big>'''Note that this article will only provide methods for installing Home Assistant in Ubuntu or Debian systems. For detailed usage of Home Assistant, please refer to the official documentation or corresponding books.'''</big>|}
[[File:zero2w<span id="installation-img272.png]]via-docker"></span>=== Installation via docker ===
</divol style="list-style-type: decimal;">'''When downloading the orangepi-build code through the git clone command<li><p>First, you do not need to enter the user name please install docker and password of the github account (the same is true for downloading other codes in this manual)ensure that docker can run normally. If after entering For the git clone commandinstallation steps of docker, Ubuntu PC prompts you please refer to enter the user name of the github account. The name and password are usually entered incorrectly instructions in the address of the orangepi-build warehouse behind git clone. Please carefully check whether there are any errors in the spelling of the command, rather than thinking that we have forgotten [[Orange Pi Zero 2W#How to install Docker|'''How to provide the username and password of the github account.Install Docker''']] section.</p></li> The u-boot and linux kernel versions currently used by <li><p>Then you can search for the H618 series development boards are as follows:docker image of Home Assistant</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''branchdocker search homeassistant'''</p>| '''u-boot Version'''}</li><li><p>Then use the following command to download the Docker image of Home Assistant to your local computer. The image size is about 1GB, and the download time will be relatively long. Please be patient and wait for the download to complete.</p>{| '''linux Kernel version'''class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''currentdocker pull homeassistant/home-assistant'''</p>| <p>Using default tag: latest</p><p>latest: Pulling from homeassistant/home-assistant</p><p>be307f383ecc: Downloading</p><p>5fbc4c07ac88: Download complete</p><p>'''u-boot v2018.05..... (Omit some output)'''</p><p>3cc6a1510c9f: Pull complete</p><p>7a4e4d5b979f: Pull complete</p><p>Digest: sha256:81d381f5008c082a37da97d8b08dd8b358dae7ecf49e62ce3ef1eeaefc4381bb</p><p>Status: Downloaded newer image for homeassistant/home-assistant:latest</p><p>docker.io/homeassistant/home-assistant:latest</p>|}</li><li><p>Then you can use the following command to view the docker image of Home Assistant you just downloaded</p>{| '''linux5.4'''class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''docker images homeassistant/home-assistant''next'</p><p>REPOSITORY &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TAG &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IMAGE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATED &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIZE</p><p>homeassistant/home-assistant &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; latest &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bfa0ab9e1cf5 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 months ago &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''<span style="color:#FF0000">1.17GB</span>'''</p>|}</li><li><p>At this point you can run the Home Assistant docker container</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''udocker run -boot v2021.07d \'''</p>:<p>'''--name homeassistant \'''</p>:<p>'''--privileged \'''</p>:<p>'''--restart=unless-stopped \'''</p>:<p>'''-e TZ=Asia/Shanghai \'''</p>:<p>'''-v /home/orangepi/home-assistant:/config \'''</p>:<p>'''--network=host \'''</p>:<p>'''homeassistant/home-assistant:latest'''</p>| }</li><li><p>Then enter【the IP address of the development board: 8123】in the browser to see the Home Assistant interface</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''linux6It takes a while for the Home Assistant container to start. If the interface below does not display normally, please wait a few seconds before refreshing it. If the following interface is not displayed normally after waiting for more than a minute, it means there is a problem with the Home Assistant installation. At this time, you need to check whether there is a problem with the previous installation and setting process.1'''</p></big>
|}
<div class="figure">
'''The branch mentioned here is not the same thing as the branch of orangepi[[File:zero2w-build source code, please don't get confusedimg180. This branch is mainly used to distinguish different kernel source code versions.'''png]]
</div></li><li><p>Then enter your '''We define the linux5.4 bsp kernel currently provided by Allwinner as the current branch. The latest linux6.1 LTS kernel is defined as the next branch.name, username'''and '''password''' and click '''Create Account'''</p><div class="figure">
After downloading, the following files and folders will be included[[File:zero2w-img181.png]]
<ol style="list-style-type: lower-alpha;"><li><p>'''build.sh''': Compile startup script</pdiv></li><li><p>'''external''': Contains configuration files needed Then follow the interface prompts to compile the image, specific scriptsset according to your own preferences, and source code of some programs, etc.then click Next</p></li><li><p>'''LICENSE''': GPL 2 license file</p></li><li><p>'''README.md''': orangepi-build documentation</p></li><li><p>'''scripts''': Common script for compiling linux images</p></li></oldiv class="figure">
test@test[[File:~/orangepizero2w-build$ '''ls'''img182.png]]
'''build.sh external LICENSE README.md scripts'''</div></li><li><p>Then click Next</p><div class="figure">
'''If you downloaded the orangepi[[File:zero2w-build code from github, after downloading, you may find that orangepi-build does not contain the source code of u-boot and linux kernel, and there is no cross-compilation tool required to compile u-boot and linux kernel. chain, this is normal, because these things are stored in other separate github repositories or some servers (their addresses will be detailed below). Orangepi-build will specify the addresses of u-boot, Linux kernel and cross-compilation tool chain in the script and configuration file. When running orangepi-build, when it finds that these things are not available locally, it will automatically download them from the corresponding places.''' <span id="download-the-cross-compilation-tool-chain"></span>=== Download the cross-compilation tool chain === When orangepi-build is run for the first time, it will automatically download the cross-compilation '''toolchain''' and put it in the '''toolchains''' folder. Every time you run orangepi-build's build.sh script, it will check whether the cross-compilation toolchain in toolchains exists. If If it does not exist, the download will be restarted. If it exists, it will be used directly without repeated downloadingimg183.png]]
</div></li>
<li><p>Then click Finish</p>
<div class="figure">
[[File:zero2w-img273img184.png]]
</div></li><li><p>The mirror URL of the cross-compilation tool chain in China main interface finally displayed by Home Assistant is the open source software mirror site of Tsinghua University:as shown below</p><p>[[httpsFile://mirrors.tuna.tsinghua.edu.cn/armbianzero2w-releases/_toolchain/ '''https://mirrorsimg185.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/'''png]After toolchains is downloaded, it will contain multiple versions of cross-compilation t'''toolchain''': test@test:~</orangepi-build$ '''ls toolchainsp></'''li> gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi gcc-linaro-aarch64-none-elf-4.8-2013.11_linux gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu gcc-linaro-arm-none-eabi-4.8-2014.04_linux The cross-compilation tool chain used <li><p>Method to compile the H618 Linux kernel source code is:stop Home Assistant container</p><ol style="list-style-type: lower-alpha;"><li>linux5.4</lip>The command to view the docker container is as follows</olp'''gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu''' <ol start{| class="2wikitable" style="list-style-typewidth: lower-alpha800px;">|-| <lip>linux6.1</li></ol> orangepi@orangepi:~$ '''gcc-arm-11.2-2022.02-x86_64-aarch64-none-linuxdocker ps -gnua'''</p> The cross-compilation tool chain used to compile the H618 u-boot source code is:|}<ol style="list-style-type: lower-alpha;"/li><li>v2018.05</lip>The command to stop the Home Assistant container is as follows</olp'''gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi''' <ol start{| class="2wikitable" style="list-style-typewidth: lower-alpha800px;">|-| <lip>v2021.07</li></ol> orangepi@orangepi:~$ '''gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnudocker stop homeassistant''' <span id="orangepi-build-complete-directory-structure-description"></spanp>=== orangepi-build complete directory structure description ===|}<ol style="list-style-type: decimal;"/li><li><p>After downloading, the orangepi-build warehouse does not contain the source code of the linux kernel, u-boot and cross-compilation tool chain. The source code of command to delete the linux kernel and u-boot Home Assistant container is stored in an independent git warehouse.as follows</p><ol {| class="wikitable" style="list-style-typewidth: lower-alpha800px;"><li>|-| <p>The git warehouse where the linux kernel source code is stored is as follows. Please note that the branch of the linux-orangepi warehouse is switched to@orangepi:~$ '''docker rm homeassistant'''</p><ol style="list-style-type: lower-alpha;"><li>Linux5.4</li></ol>|}
</li></ol>
</li></ol>
https://github.com/orangepi<span id="installation-xunlong/linuxvia-orangepi/treepython"></'''orange-pi-5.4-sun50iw9'''span>
<ol start="2" style="list-style-type: lower-alpha;"><li>Linux6.1</li></ol>= Installation via python ===
https{| class="wikitable" style="background-color:#ffffdc;width://github.com/orangepi-xunlong/linux800px;" |-orangepi/tree/| <big>'''orange-pi-6Before installation, please change the source of pip to a domestic source to speed up the installation of Python packages.1-sun50iw9For the configuration method, see the instructions in the section &quot;[[Orange Pi Zero 2W#How to replace pip source in Python|How to Change the Pip Source of Python]]&quot;'''</big>|}
<ol start="2" style="list-style-type: lower-alphadecimal;"><li><p>The git warehouse where the u-boot source code is stored is as follows. Please note that the branch of the u-boot-orangepi warehouse is switched toFirst install dependency packages</p><ol {| class="wikitable" style="list-style-typewidth: lower-alpha800px;">|-| <lip>v2018.05orangepi@orangepi:~$ '''sudo apt-get update'''</lip></olp>orangepi@orangepi:~$ '''sudo apt-get install -y python3 python3-dev python3-venv \'''</lip></olphttps://github.com/orangepi'''python3-pip libffi-dev libssl-dev libjpeg-xunlong/udev zlib1g-bootdev autoconf build-orangepi/treeessential \'''</p><p>'''v2018.05libopenjp2-7 libtiff5 libturbojpeg0-h618dev tzdata'''</p>|}<ol start{| class="2wikitable" style="listbackground-style-typecolor:#ffffdc;width: lower-alpha800px;"|-| <big><lip>v2021.07'''If it is debian12, please use the following command:'''</lip></olbighttps://github.com/<p>orangepi-xunlong/u-boot-@orangepi/tree/:~$ '''v2021.07sudo apt-sunxiget update''' <ol start="2" style="list-style-type: decimal;"/p><li><p>When orangepi@orangepi:~$ '''sudo apt-build is run for the first time, it will download the crossget install -compilation tool chain, uy python3 python3-boot and linux kernel source code. After successfully compiling a linux image, the files and folders that can be seen in orangepidev python3-build are:venv \'''</p><ol style="listp>'''python3-pip libffi-dev libssl-dev libjpeg-styledev zlib1g-type: lowerdev autoconf build-alpha;"essential \'''</p><li><p>'''build.shlibopenjp2-7 libturbojpeg0-dev tzdata''': Compile startup script</p>|}</li><li><p>'''external''': Contains the configuration files needed Then you need to compile and install Python3.9. For the imagemethod, scripts for specific functions, and please refer to the [[Orange Pi Zero 2W#Python related instructions|'''Python source code of some programs. The rootfs compressed package cached during the image compilation process is also stored in externaland installation method''']] section.</p></li>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <libig><p>'''kernelThe default Python version of Debian Bullseye is Python3.9, so there is no need to compile and install it.''': Store the source code of the linux kernel</p><p>'''The default Python version of Ubuntu Jammy is Python3.10, so there is no need to compile and install it.'''</lip><li><p>'''LICENSEThe default Python version of Debian Bookworm is Python3.11, so there is no need to compile and install it.''': GPL 2 license file</p></big>|}</li><li><p>Then create a Python virtual environment</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''READMEDebian Bookworm is python3.11, please remember to replace the corresponding command.md''': orangepi-build documentation</p></libig><li>|}{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''outputsudo mkdir /srv/homeassistant''': Store compiled u-boot, linux and other deb packages, compilation logs, and compiled images and other files</p><p>orangepi@orangepi:~$ '''sudo chown orangepi:orangepi /srv/homeassistant'''</lip><li><p>orangepi@orangepi:~$ '''scriptscd /srv/homeassistant''': Common script for compiling linux images</p><p>orangepi@orangepi:~$ '''python3.9 -m venv .'''</lip><li><p>orangepi@orangepi:~$ '''toolchainssource bin/activate'''</p><p>(homeassistant) orangepi@orangepi: Store cross-compilation tool chain/srv/homeassistant$</p>|}</li><li><p>Then install the required Python packages</p>{| class="wikitable" style="width:800px;" |-| <p>(homeassistant) orangepi@orangepi:/srv/homeassistant$ '''upython3 -bootm pip install wheel''': Store the source code of u-boot</p>|}</li><li><p>Then you can install Home Assistant Core</p>{| class="wikitable" style="width:800px;" |-| <p>(homeassistant) orangepi@orangepi:/srv/homeassistant$ '''userpatchespip3 install homeassistant''': Store the configuration files needed to compile the script</p>|}</li></olli></lip>Then enter the following command to run Home Assistant Core</olp>{| class="wikitable" style="width:800px;" |-| test<p>(homeassistant) orangepi@testorangepi:~/orangepi-buildsrv/homeassistant$ '''lshass'''</p>|}</li><li><p>Then enter【'''build.sh external kernel LICENSE output README.md scripts toolchains u-boot userpatchesdevelopment board IP address: 8123'''】 in the browser to see the Home Assistant interface</p> <span id{| class="wikitable" style="compilebackground-ucolor:#ffffdc;width:800px;" |-boot"| <big><p>'''When you run the hass command for the first time, some libraries and dependency packages necessary for operation will be downloaded, installed and cached. This process may take several minutes. Note that you cannot see the Home Assistant interface in the browser at this time. Please wait for a while and then refresh it.'''</p></spanbig>|}<div class== Compile u-boot == # Run the build.sh script, remember to add sudo permissions"figure">
test@test[[File:~/orangepizero2w-build$ '''sudo img180./build.sh'''png]]
<ol start="2" style="list-style-type: decimal;"/div><li>Select '''U-boot package''' and press Enter</li></ol>
<div classspan id="figureopencv-installation-method"></span>
[[File:zero2w-img274.png]]== OpenCV installation method ==
</div><ol startspan id="3" style="listuse-apt-to-styleinstall-type: decimal;opencv"><li>Then select the model of the development board</li></olspan>=== Use apt to install OpenCV ===
[[File:zero2w-img275.png]] <ol start="4" style="list-style-type: decimal;"><li><p>Then select the branch type of u-bootThe installation command is as follows</p><ol {| class="wikitable" style="list-style-typewidth: lower-alpha800px;"><li><p>The current branch will compile the u|-boot v2018.05 version code that needs to be used by the linux5.4 image.</p></li><li>| <p>The next branch will compile the uorangepi@orangepi:~$ '''sudo apt-boot v2021.07 version code that needs to be used by the linux6.1 image.get update'''</p><p>[[Fileorangepi@orangepi:zero2w~$ '''sudo apt-get install -y libopencv-img276.png]]dev python3-opencv'''</p></li></ol>|}
</li>
<li><p>If you select the next branch, you will also be prompted to select Then use the memory size, and you do not need following command to select the current branch.</p></li></ol> <blockquote>a. If print the development board you purchased has a memory size version number of 1OpenCV.5GBThe output is normal, please select indicating that the first optionOpenCV installation is successfulb. If the development board you purchased has 1GB or 2GB or 4GB memory size, please choose the second option.</blockquote>[[File:zero2w-img277.png]] <ol start="6" style="list-style-type: decimal;"><li><p>Then it will start to compile u-boot. Some of the information prompted when compiling the next branch is as follows:</p>
<ol style="list-style-type: lower-alpha;">
<li>Version <p>The version of uOpenCV in Ubuntu22.04 is as follows:</p>{| class="wikitable" style="width:800px;" |-boot source code| <p>orangepi@orangepi:~$ '''python3 -c &quot;import cv2; print(cv2.__version__)&quot;'''</p><p>'''4.5.4'''</p>|}</li><li><p>The version of OpenCV in Ubuntu20.04 is as follows:</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''python3 -c &quot;import cv2; print(cv2.__version__)&quot;'''</p><p>'''4.2.0'''</p>|}</li><li><p>The version of OpenCV in Debian11 is as follows:</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''python3 -c &quot;import cv2; print(cv2.__version__)&quot;'''</p><p>'''4.5.1'''</p>|}</li><li><p>The version of OpenCV in Debian12 is as follows:</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''python3 -c &quot;import cv2; print(cv2.__version__)&quot;'''</p><p>'''4.6.0'''</p>|}</li></ol>
</li></ol>
[ o.k. ] Compiling u<span id="set-boot [ '''v2021.07''' ]up-the-chinese-environment-and-install-the-chinese-input-method"></span>
<ol start="2" style="list-style-type: lower-alpha;"><li>Version of Set up the cross-compilation tool chain</li></ol>Chinese environment and install the Chinese input method ==
[ o.k. ] Compiler version [ {| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''aarch64-linux-gnu-gcc 11Note, before installing the Chinese input method, please make sure that the Linux system used by the development board is a desktop version.''' ]</big>|}
<ol startspan id="3" style="listdebian-stylesystem-type: lowerinstallation-alpha;method"><li>Path to the compiled u-boot deb package</li></olspan>=== Debian system installation method ===
[ o.k. ] Target directory [ <ol style="list-style-type: decimal;"><li><p>First set the default '''orangepi-build/output/debs/u-bootlocale''' ]to Chinese</p><ol start="4" style="list-style-type: lower-alpha;"><li>The package name of <p>Enter the compiled ufollowing command to start configuring '''locale'''</p>{| class="wikitable" style="width:800px;" |-boot deb package| <p>orangepi@orangepi:~$ '''sudo dpkg-reconfigure locales'''</lip>|}</olli[ o.k. ] File name [ <li><p>Then select '''linuxzh_CN.UTF-u8 UTF-boot8''' in the pop-nextup interface (use the up and down keys on the keyboard to move up and down, use the space bar to select, and finally use the Tab key to move the cursor to '''&lt;OK&gt;''', and then return Car can be used)</p><p>[[File:zero2w-orangepizero2w_ximg186.xpng]]</p></li><li><p>Then set the default '''locale''' to '''zh_CN.x_arm64.debUTF-8''' </p><p>[[File:zero2w-img187.png]]</p></li><li><p>After exiting the interface, the '''locale''' setting will begin. The output displayed on the command line is as follows:</p><ol start{| class="5wikitable" style="listwidth:800px;" |-| <p>orangepi@orangepi:~$ '''sudo dpkg-stylereconfigure locales'''</p><p>Generating locales (this might take a while)...</p>:<p>en_US.UTF-type8... done</p>: lower<p>zh_CN.UTF-alpha;"8... done</p><p>Generation complete.</p>|}</li></ol></li><li>Compilation time<p>Then open '''Input Method'''</p><p>[[File:zero2w-img188.png]]</p></li><li><p>Then select '''OK'''</olp><p>[[File:zero2w-img189.png]]</p></li><li><p>Then select '''Yes'''</p><p>[[ oFile:zero2w-img190.kpng]]</p></li><li><p>Then select '''fcitx'''</p><p>[[File:zero2w-img191. png]] Runtime </p></li><li><p>Then select '''OK'''</p><p>[[ File:zero2w-img192.png]]</p></li><li><p>'''1 min<span style="color:#FF0000">Then restart the Linux system to make the configuration take effect.</span>''' </p></li><li><p>Then open '''Fcitx configuration'''</p><p>[[File:zero2w-img193.png]]</p></li><li><p>Then click the + sign as shown in the picture below</p><p>[[File:zero2w-img194.png]]</p></li><li><p>Then search '''Google Pinyin''' and click '''OK'''</p><div class="figure">
<ol start="6" style="list-style-type[[File: lower-alpha;"><li>Repeat the command to compile u-boot. Use the following command without selecting through the graphical interface. You can start compiling uzero2w-boot directlyimg195.</li></ol>png]]
</div></li><li><p>Then put '''Google Pinyin''' on top</p><p>[[File:zero2w-img196.png]]</p><p>[[ oFile:zero2w-img197.kpng]]</p></li><li><p>Then open the '''Geany''' editor to test the Chinese input method</p><p>[[File:zero2w-img198. png]] Repeat Build Options </p></li><li><p>The Chinese input method test is as follows</p><p>[[ File:zero2w-img199.png]]</p></li><li><p>You can switch between Chinese and English input methods through the '''Ctrl+Space''' shortcut key</p></li><li><p>If you need the entire system to be displayed in Chinese, you can set all variables in '''/etc/default/locale''' to '''zh_CN.UTF-8'''</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo vim /etc/default/locale'''</p><p># File generated by update-locale</p><p>LC_MESSAGES='''<span style="color:#FF0000">zh_CN.UTF-8</span>'''</buildp><p>LANG='''<span style="color:#FF0000">zh_CN.sh BOARDUTF-8</span>'''</p><p>LANGUAGE=orangepizero2w BRANCH'''<span style=next BUILD_OPT"color:#FF0000">zh_CN.UTF-8</span>'''</p>|}</li><li><p>Then '''<span style=u-boot"color:#FF0000">restart the system</span>''' and you will see that the system is displayed in Chinese.</p><p>[[File:zero2w-img200.png]]</p></li></ol>
<ol startspan id="7" style="listinstallation-method-of-ubuntu-style20.04-type: decimal;system"><li>View the compiled u-boot deb package</li></olspan>
test@test:~/orangepi-build$ '''ls output/debs/u-boot/'''=== Installation method of Ubuntu 20.04 system ===
<ol style="list-style-type: decimal;"><li><p>First open '''Language Support'''linux</p><p>[[File:zero2w-uimg201.png]]</p></li><li><p>Then find the '''Chinese (China)''' option</p><p>[[File:zero2w-bootimg202.png]]</p></li><li><p>Then please use the left button of the mouse to select '''Chinese (China)''' and hold it down, then drag it up to the starting position. After dragging, the display will be as shown below:</p><p>[[File:zero2w-img203.png]]</p></li>{| class="wikitable" style="background-nextcolor:#ffffdc;width:800px;" |-orangepizero2w_x.x.x_arm64| <big>'''Note that this step is not easy to drag, please be patient and try it a few times.deb'''</big>|}</ol><ol start="84" style="list-style-type: decimal;"><li>When the orangepi<p>Then select '''Apply System-bulid compilation system compiles Wide''' to apply the u-boot source code, it will first synchronize Chinese settings to the uentire system</p><p>[[File:zero2w-boot source code with img204.png]]</p></li><li><p>Then set the u'''Keyboard input method system''' system to '''fcitx'''</p><p>[[File:zero2w-boot source code of img205.png]]</p></li><li><p>'''<span style="color:#FF0000">Then restart the github server. Therefore, if you want Linux system to modify make the uconfiguration take effect</span>'''</p></li><li><p>After re-boot source codeentering the system, you first need to turn off please select '''Do not ask me again''' in the download following interface, and update function of then please decide according to your own preferences whether the source code. ('''You need standard folder should also be updated to completely compile uChinese</p><p>[[File:zero2w-boot before img206.png]]</p></li><li><p>Then you can turn off this function, otherwise it will prompt see that the source code of udesktop is displayed in Chinese</p><p>[[File:zero2w-boot cannot be foundimg207.png]]</p></li><li><p>Then we can open '''Geany'''), otherwise to test the modifications will be restoredChinese input method. The opening method is as followsshown in the figure below</p><p>[[File:zero2w-img208.png]]</lip></olli> <blockquoteli><p>Set the IGNORE_UPDATES variable in uAfter opening '''Geany'''userpatches/config-, the English input method is still the default.confWe can switch to the Chinese input method through the '''Ctrl+Space' to &quot;yes&quot;'' shortcut key, and then we can input Chinese.</blockquotep>test@test<p>[[File:~zero2w-img209.png]]</orangepi-build$ '''vim userpatchesp></li></config-default.conf'''ol>
<span id="installation-method-of-ubuntu-22......04-system"></span>
IGNORE_UPDATES=&quot;'''yes'''&quot;== Installation method of Ubuntu 22.04 system ===
<ol style="list-style-type: decimal;"><li><p>First open '''Language Support'''</p><p>[[File:zero2w-img201.png]]</p></li><li><p>Then find the '''Chinese (China)''' option</p><p>[[File:zero2w-img210.png]]</p></li><li><p>Then please use the left button of the mouse to select '''Chinese (China)''' and hold it down, then drag it up to the starting position.After dragging, the display will be as shown below:</p><p>[[File:zero2w-img211.png]]</p></li>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note that this step is not easy to drag, please be patient and try it a few times.'''</big>|}</ol><ol start="4" style="list-style-type: decimal;"><li><p>Then select '''Apply System-Wide''' to apply the Chinese settings to the entire system</p><p>[[File:zero2w-img212.png]]</p></li><li><p>'''<span style="color:#FF0000">Then restart the Linux system to make the configuration take effect</span>'''</p></li><li><p>After re-entering the system, please select '''Do not ask me again''' in the following interface, and then please decide whether the standard folder should also be updated to Chinese according to your own preferences.</p><p>[[File:zero2w-img206.png]]</p></li><li><p>Then you can see that the desktop is displayed in Chinese</p><p>[[File:zero2w-img207.png]]</p></li><li><p>Then open the Fcitx5 configuration program</p><p>[[File:zero2w-img213.png]]</p></li><li><p>Then choose to use Pinyin input method</p><div class="figure">
<ol start="9" style="list-style-type: decimal;"><li><p>When debugging u-boot code, you can use the following method to update u-boot in the linux image for testing</p><ol style="list-style-type[[File: lower-alpha;"><li>First upload the compiled deb package of uzero2w-boot to the Linux system of the development boardimg214.</li></ol></li></ol>png]]
test@test</div></li><li><p>The interface after selection is as shown below, then click OK</p><p>[[File:~zero2w-img215.png]]</p></orangepi-build$ li><li><p>Then we can open '''Geany'''cd outputto test the Chinese input method. The opening method is as shown in the figure below</p><p>[[File:zero2w-img208.png]]</debsp></u-bootli><li><p>After opening '''Geany''', the English input method is still the default. We can switch to the Chinese input method through the '''Ctrl+Space'''shortcut key, and then we can enter Chinese.</p><p>[[File:zero2w-img216.png]]</p></li></ol>
test@test:~/orangepi_build/output<span id="how-to-remotely-log-in-to-the-linux-system-desktop"></debs/u-boot$ '''scp \'''span>
'''linux-u-boot-next-orangepizero2w_x.x.x_arm64.deb [mailto:root@192.168.1.xxx:/root root@192.168.1.xxx:/root]'''== How to remotely log in to the Linux system desktop ==
<ol startspan id="2" style="listremote-stylelogin-type: lowerusing-alpha;nomachine"><li>Install the new u-boot deb package just uploaded</li></olspan>=== Remote login using NoMachine ===
orangepi@orangepi{| class="wikitable" style="background-color:#ffffdc;width:~$ '''sudo dpkg 800px;" |-i| <big>''' '''linux-u-boot-next-orangepizero2w_xPlease ensure that the Ubuntu or Debian system installed on the development board is a <span style="color:#FF0000">desktop version</span> of the system.xIn addition, NoMachine also provides detailed usage documentation.x_arm64It is strongly recommended to read this document thoroughly to become familiar with the use of NoMachine.debThe document link is as follows:'''
'''https://knowledgebase.nomachine.com/DT10R00166'''<ol start/big>|}{| class="3wikitable" style="listbackground-style-typecolor:#ffffdc;width: lower-alpha800px;">|-| <libig>Then run '''NoMachine supports Windows, Mac, Linux, iOS and Android platforms, so we can remotely log in and control the nandOrange Pi development board through NoMachine on a variety of devices. The following demonstrates how to remotely log in to the Linux system desktop of the Orange Pi development board through NoMachine in Windows. For installation methods on other platforms, please refer to NoMachine's official documentation.'''</big>|}{| class="wikitable" style="background-satacolor:#ffffdc;width:800px;" |-install script| </libig>'''Before operating, please make sure that the Windwos computer and the development board are in the same LAN, and that you can log in to the Ubuntu or Debian system of the development board through ssh normally.'''</olbig>|}
orangepi@orangepi<ol style="list-style-type:~$ decimal;"><li><p>First download the installation package of the NoMachine software Linux '''<span style="color:#FF0000">arm64</span>''' deb version, and then install it into the Linux system of the development board</p><ol style="list-style-type: lower-alpha;"><li>Since H618 is an ARMv8 architecture SOC and the system we use is Ubuntu or Debian, we need to download the '''NoMachine for ARM ARMv8 DEB'''sudo nandinstallation package. The download link is as follows:</li>{| class="wikitable" style="background-satacolor:#ffffdc;width:800px;" |-install| <big>'''Note that this download link may change, please look for the Armv8/Arm64 version of the deb package.'''</big>|}{| class="wikitable" style="width:800px;" |-| [https://www.nomachine.com/download/download&id=112&s=ARM '''https://downloads.nomachine.com/download/?id=118&amp;distro=ARM''']|}
[[File:zero2w-img217.png]]</ol><ol start="42" style="list-style-type: lower-alpha;"><li><p>In addition, you can also download the '''NoMachine''' installation package from the official tool.</p><p>[[File:zero2w-img218.png]]</p><p>First enter the '''remote login software-NoMachine''' folder</p><p>[[File:zero2w-img219.png]]</p><p>Then select download the arm64 version of the deb installation package</p><p>[[File:zero2w-img220.png]]</p></li><li><p>Then upload the downloaded '''nomachine_x.x.x_x_arm64.deb'''5 Installto the Linux system of the development board</Update p></li><li><p>Then use the following command to install '''NoMachine''' in the bootloader on SDLinux system of the development board</eMMCp>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo dpkg -i nomachine_x.x.x_x_arm64_arm64.deb'''</p>|}</li></ol></li></ol><ol start="2" style="list-style-type: decimal;"><li>Then download the installation package of the Windows version of the NoMachine software. The download address is as follows</li>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note that this download link may change.'''</big>|}{| class="wikitable" style="width:800px;" |-| '''https://downloads.nomachine.com/download/?id=9'''|}
[[File:zero2w-img278img221.png]]</ol><ol start="53" style="list-style-type: lower-alphadecimal;"><li><p>Then install NoMachine in Windows. '''Please restart your computer after installation.'''</p></li><li><p>Then open '''NoMachine''' in Window</p><p>[[File:zero2w-img222.png]]</p></li><li><p>After NoMachine is started, it will automatically scan other devices with NoMachine installed on the LAN. After pressing entering the Enter keymain interface of NoMachine, you can see that the development board is already in the list of connectable devices, a Warning will pop up firstand then click on the location shown in the red box in the picture below You can now log in to the Linux system desktop of the development board.</p><p>[[File:zero2w-img223.png]]</p></li><li><p>Then click '''OK'''</p><p>[[File:zero2w-img224.png]]</p></li><li><p>Then enter the username and password of the development board Linux system in the corresponding positions in the figure below, and then click OK to start logging in.</p><p>[[File:zero2w-img225.png]]</p></li><li><p>Then click OK in the next interface.</p></li><li><p>Finally you can see the desktop of the development board Linux system</p><p>[[File:zero2w-img226.png]]</p></li></ol>
[[File:zero2w<span id="remote-img279.png]]login-using-vnc"></span>
<ol start="6" style="list-style-type: lower-alpha;"><li>Press the Enter key again to start updating u-boot. After the update is completed, the following information will be displayed.</li></ol>= Remote login using VNC ===
[[File{| class="wikitable" style="background-color:#ffffdc;width:zero2w800px;" |-img280| <big>'''Before operating, please make sure that the Windwos computer and the development board are in the same LAN, and that you can log in to the Ubuntu or Debian system of the development board through ssh normally.png]]'''
'''<ol start="7" span style="list-style-typecolor: lower-alpha;#FF0000"><li>Then you can restart the development board to test whether the u-boot modification has taken effectThere are many problems with VNC testing in Ubuntu20.04, please do not use this method.</lispan>'''</olbig>|}
<span idol style="compilelist-the-linuxstyle-kerneltype: decimal;"><li><p>First run the '''set_vnc.sh''' script to set up vnc, '''remember to add sudo permission'''s</spanp>{| class="wikitable" style= Compile the linux kernel =="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo set_vnc.sh'''</p><p>You will require a password to access your desktops.</p>
# Run the '''build.sh''' script, remember to add sudo permissions
test@test<p>Password:~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''<span style="color:#FF0000">#Set the vnc password here, 8 characters</span>'''</p><p>Verify: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''<span style="color:#FF0000">#Set the vnc password here, 8 characters</span>'''</orangepip><p>Would you like to enter a view-build$ only password (y/n)? '''sudo .<span style="color:#FF0000">n</build.shspan>'''</p><p>xauth: file /root/.Xauthority does not exist</p>
<ol start="2" style="list-style-type: decimal;">
<li>Select '''Kernel package''' and press Enter</li></ol>
<div class="figure"p>New 'X' desktop is orangepi:1</p>
[[File:zero2w-img281.png]]
<p>Creating default startup script /root/.vnc/divxstartup</p><ol start="3" style="list-style-type: decimal;"p>Starting applications specified in /root/.vnc/xstartup</p><lip>Then you will be prompted whether you need to display the kernel configuration interfaceLog file is /root/. If you do not need to modify the kernel configuration, select the first onevnc/orangepi:1. If you need to modify the kernel configuration, select the second one.</li>log</olp>
[[File:zero2w-img282.png]]
<ol start="4" style="list-style-type: decimal;"><li>Then select the model of the development board</lip>Killing Xtightvnc process ID 3047</olp>
[[File:zero2w-img275.png]]
<ol start="5" style="list-style-typep>New 'X' desktop is orangepi: decimal;"><li>Then select the branch type of the kernel source code</li>1</olp>
<blockquote>a. The current branch will compile the linux5.4 kernel source code
b<p>Starting applications specified in /root/. The next branch will compile the linux6vnc/xstartup</p><p>Log file is /root/.vnc/orangepi:1 kernel source code.log</p>|}</blockquoteli>[[File<li><p>The steps to use MobaXterm software to connect to the development board Linux system desktop are as follows:</p><ol style="list-style-type:zero2wlower-img276alpha;"><li>First click Session, then select VNC, then fill in the IP address and port of the development board, and finally click OK to confirm.png]]</li>
<ol startdiv class="6figure" style="list-style-type: decimal;"><li>If you choose to display the kernel configuration menu (the second option) in step 3), the kernel configuration interface opened through '''make menuconfig''' will pop up. At this time, you can directly modify the kernel configuration. After modification, save and exit. Yes, compilation of the kernel source code will begin after exiting.</li></ol>
[[File:zero2w-img283img227.png]] <ol style="list-style-type: lower-alpha;"><li>If you do not need to modify the kernel configuration options, when running the build.sh script, pass '''KERNEL_CONFIGURE=no''' to temporarily block the pop-up of the kernel configuration interface.</li></ol> test@test:~/orangepi-build$ '''sudo ./build.sh KERNEL_CONFIGURE=no'''
</div></ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>b. You can also Then enter the VNC password set '''KERNEL_CONFIGURE=no''' in the orangepi-buildearlier</userpatches/configp><p>[[File:zero2w-default.confconfiguration file to permanently disable this functionimg228.png]]</p></li><li><p>If the following error is prompted when compiling the kernelAfter successful login, it is because the Ubuntu PC terminal interface is too small, causing the make menuconfig interface to be unable to be displayed. Please increase the Ubuntu PC terminal to the maximum sizeas shown below, and then rerun you can remotely operate the desktop of the build.sh scriptdevelopment board Linux system.</p></li></ol>
[[File:zero2w-img284img229.png]] <ol start="7" style="list-style-type: decimal;"><li><p>Part of the information prompted when compiling the next branch kernel source code is explained as follows:</p><ol style="list-style-type: lower-alpha;"><li>Version of the linux kernel source code</li></ol>
</li></ol>
<span id="qt-installation-method"></span>
[ o.k. ] Compiling current kernel [ '''6.1.31''' ]== QT installation method ==
<ol start="2" style="list-style-type: lower-alphadecimal;"><li>The version of the cross-compilation tool chain used</lip></ol> [ o.k. ] Compiler version [ '''aarch64-linux-gnu-gcc 11''' ] <ol start="3" style="list-style-type: lower-alpha;"><li>The default configuration file used by Use the kernel following script to install QT5 and the path where it is stored are as followsQT Creator</lip></ol> [ o.k. ] Using kernel config file [ '''orangepi-build/external/config/kernel/linux-6.1-sun50iw9-next.config''' ] <ol start{| class="4wikitable" style="list-style-typewidth: lower-alpha800px;"><li>The path to the kernel|-related deb package generated by compilation</li></ol> [ o.k. ] Target directory [ '''output/debs/''' ]| <ol start="5" style="list-style-typep>orangepi@orangepi: lower-alpha;"><li>The package name of the kernel image deb package generated by compilation</li></ol> [ o.k. ] File name [ ~$ '''linux-image-next-sun50iw9_xinstall_qt.x.x_arm64.debsh''' ] <ol start="6" style="list-style-type: lower-alpha;"/p><li>Compilation time|}</li></ol> [ o.k. ] Runtime [ '''10 min''' ] <ol start="7" style="list-style-type: lower-alpha;"li><lip>FinallyAfter installation, the compilation command to repeatedly compile the last selected kernel QT version number will be displayed. Use the following command without selecting through the graphical interface, and you can directly start compiling the kernel source code.</li></ol> [ oautomatically printed.k. ] Repeat Build Options [ '''sudo ./build.sh BOARD=orangepizero2w BRANCH=next BUILD_OPT=kernel KERNEL_CONFIGURE=no''' ] <ol start="8" style="list-style-type: decimal;"><li><p>View the kernel-related deb package generated by compilation</p>
<ol style="list-style-type: lower-alpha;">
<li><p>The qt version that comes with Ubuntu20.04 is '''linux-dtb-next-sun50iw9_x5.x12.x_arm648'''</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''install_qt.debsh''' Contains dtb files used by the kernel</p><p>......</lip><lip>QMake version 3.1</p><p>Using Qt version '''linux-headers-next-sun50iw9_x<span style="color:#FF0000">5.x12.x_arm64.deb8</span>''' Contains kernel header filesin /usr/lib/aarch64-linux-gnu</p>|}</li><li><p>The QT version that comes with Ubuntu22.04 is '''linux-image-next-sun50iw9_x5.x15.x_arm643'''</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''install_qt.debsh''' Contains kernel images and kernel modules</p><p>......</p><p>QMake version 3.1</p><p>Using Qt version '''<span style="color:#FF0000">5.15.3</lispan>''' in /usr/lib/aarch64-linux-gnu</olp>|}</li><li><p>The QT version that comes with Debian11 is '''5.15.2'''</olp>{| class="wikitable" style="width:800px;" |-test| <p>orangepi@testorangepi:~$ '''install_qt.sh'''</p><p>......</p><p>QMake version 3.1</orangepi-build$ p><p>Using Qt version '''<span style="color:#FF0000">5.15.2</span>'''ls outputin /debsusr/lib/aarch64-linux-*gnu</p>|}</li><li><p>The QT version that comes with Debian12 is '''5.15.8'''</p>{| class="wikitable" style="width:800px;" |-| output<p>orangepi@orangepi:~$ '''install_qt.sh'''</debs/linux-dtb-next-sun50iw9_xp><p>....x.x_arm64.deb</p><p>QMake version 3.1</p>output<p>Using Qt version '''<span style="color:#FF0000">5.15.8</span>''' in /debsusr/lib/aarch64-linux-headersgnu</p>|}</li></ol></li><li><p>Then you can see the QT Creator startup icon in '''Applications'''</p><p>[[File:zero2w-nextimg230.png]]</p><p>You can also use the following command to open QT Creator</p>{| class="wikitable" style="width:800px;" |-sun50iw9_x.x.x_arm64.deb| <p>orangepi@orangepi:~$ '''qtcreator'''</p>|}output</debsli><li><p>The interface after QT Creator is opened is as follows</linuxp><p>[[File:zero2w-image-next-sun50iw9_ximg231.x.x_arm64.debpng]]</p></li><li><p>The version of QT Creator is as follows</p><ol start="9" style="list-style-type: decimallower-alpha;"><li>When the orangepi-bulid compilation system compiles the linux kernel source code, it will first synchronize the linux kernel source code with the linux kernel source code <p>The default version of the github serverQT Creator in '''Ubuntu20. Therefore, if you want to modify the linux kernel source code, you first need to turn off the update function of the source code (04'''it needs to be completely compiled once This function can only be turned off after obtaining the Linux kernel source code, otherwise it will prompt that the source code is as follows</p><p>[[File:zero2w-img232.png]]</p></li><li><p>The default version of the Linux kernel cannot be foundQT Creator in '''), otherwise the modifications will be restoredUbuntu22. The method 04''' is as follows</p><p>[[File:zero2w-img233.png]]</p></li><li><p>The default version of QT Creator in '''Debian11''' is as follows</olp><p>[[File:zero2w-img234.png]]</p></li><blockquoteli>Set the IGNORE_UPDATES variable <p>The default version of QT Creator in '''userpatchesDebian12''' is as follows</configp><p>[[File:zero2w-defaultimg235.confpng]]</p></li></ol></li><li><p>Then set up QT</p><ol style="list-style-type: lower-alpha;"><li><p>First open ''' to Help'''-&quotgt;yes&quot;'''About Plugins...'''.</blockquotep>test@test<p>[[File:~zero2w-img236.png]]</p></orangepi-build$ li><li><p>Then remove the check mark of '''vim userpatches/config-default.confClangCodeModel'''</p><p>[[File:zero2w-img237.png]]</p></li>IGNORE_UPDATES=&quot;<li><p>'''yes<span style="color:#FF0000">After setting up, you need to restart QT Creator</span>'''&quot;</p></li><li><p>Then make sure the GCC compiler used by QT Creator. If the default is Clang, please change it to GCC.</p><ol start{| class="10wikitable" style="listbackground-style-typecolor:#ffffdc;width: decimal800px;"|-| <big><p>'''Debian12 please skip this step.'''</p></big>|}<p>[[File:zero2w-img238.png]]</p><p>[[File:zero2w-img239.png]]</p></li></ol></li><li><p>If the kernel is modified, Then you can use open a sample code</p><p>[[File:zero2w-img240.png]]</p></li><li><p>After clicking on the following method to update sample code, the kernel and kernel module of corresponding instruction document will automatically open. You can read the development board Linux systeminstructions carefully.</p><ol style="listp>[[File:zero2w-style-typeimg241.png]]</p></li><li><p>Then click '''Configure Project'''</p><p>[[File: lowerzero2w-alpha;"img242.png]]</p></li><li>Upload <p>Then click the compiled deb package of green triangle in the Linux kernel lower left corner to compile and run the Linux system sample code</p><p>[[File:zero2w-img243.png]]</p></li><li><p>After waiting for a period of time, the interface shown in the development boardfigure below will pop up, which means that QT can compile and run normally.</p><p>[[File:zero2w-img244.png]]</p></li><li><p>References</p>{| class="wikitable" style="width:800px;" |-| <p>[https://olwiki.qt.io/Install_Qt_5_on_Ubuntu '''https://wiki.qt.io/Install_Qt_5_on_Ubuntu''']</p><p>[https://download.qt.io/archive/qtcreator '''https://download.qt.io/archive/qtcreator''']</p><p>[https://download.qt.io/archive/qt '''https://download.qt.io/archive/qt''']</p>|}
</li></ol>
test@test:~/orangepi-build$ '''cd output/debs''' test@test:~/orangepi-build/output/debs$ '''scp \''' '''linux-image-next-sun50iw9_x.x.x_arm64.deb root@192.168.1.xxx:/root''' <ol startspan id="2" style="list-styleros-type: lowerinstallation-alpha;method"><li>Install the deb package of the new linux kernel just uploaded.</li></olspan>
orangepi@orangepi:~$ '''sudo dpkg -i linux-image-next-sun50iw9_x.x.x_arm64.deb'''== ROS installation method ==
<ol startspan id="3" style="listhow-to-install-ros-style1-type: lowernoetic-alpha;"><li>Then restart the development board and check whether the kernelon-related modifications have taken effectubuntu20.</li04"></olspan>=== How to install ROS 1 Noetic on Ubuntu20.04 ===
orangepi@orangepi:~$ # The currently active version of ROS 1 is as follows, the recommended version is '''sudo''' '''rebootNoetic Ninjemys'''
<span id="compile::[[File:zero2w-rootfs"></span>== Compile rootfs ==img245.png]]
# Run the build::[[File:zero2w-img246.sh script, remember to add sudo permissionspng]] test@test:~:{| class="wikitable" style="width:800px;" |-| [http://docs.ros.org/orangepi-build$ '''sudo http://docs.ros.org'''] '''https://buildwiki.ros.shorg/Distributions'''|}
<ol start="2" style="list-style-type: decimal;">
<li>Select <p>The link to the official installation documentation of ROS 1 '''Noetic Ninjemys''' is as follows:</p>{| class="wikitable" style="width:800px;" |-| <p>[http://wiki.ros.org/noetic/Installation/Ubuntu '''http://wiki.ros.org/noetic/Installation/Ubuntu'''Rootfs and all deb packages]</p>|}</li><li><p>In the official installation documentation of ROS '''Noetic Ninjemys''', Ubuntu recommends using Ubuntu20.04, so please ensure that the system used by the development board is '''<span style="color:#FF0000">Ubuntu20.04 desktop system</span>'''.</p>{| class="wikitable" style="width:800px;" |-| <p>[http://wiki.ros.org/noetic/Installation '''http://wiki.ros.org/noetic/Installation''']</p><p>[[File:zero2w-img247.png]]</p>|}</li><li><p>Then use the script below to install ros1</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''install_ros.sh ros1''' </p>|}</li><li><p>Before using the ROS tool, you first need to initialize rosdep. Then when compiling the source code, you can quickly install some system dependencies and press Entersome core components in ROS.</p></li>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''<span style="color:#FF0000">Note that when running the following command, you need to ensure that the development board can access github normally, otherwise an error will be reported due to network problems.</olspan>'''
<div class="figure">
[[File:zero2w-img285'''The install_ros.png]]sh script will try to modify /etc/hosts and automatically run the following commands. However, this method cannot guarantee that github can be accessed normally every time. If install_ros.sh prompts the following error after installing ros1, please find other ways to allow the linux system of the development board to access github normally, and then manually run the following Order.'''
</div>
<ol start="3" style="list-style-type: decimal;">
<li>Then select the model of the development board</li></ol>
[[File'''https:zero2w//raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-img275homebrew.png]]yaml'''
<ol start="4" style="list-style-type'''Hit https: decimal;"><li><p>Then select the branch type of the kernel source code. Different versions of the kernel source code maintain different rootfs types.</p><ol style="list-style-type: lower-alpha;"><li><p>In the current branch, you can see three options: debian11, ubuntu20.04, and ubuntu22.04.</p></li><li><p>In the next branch, you can see three options: debian11, debian12, and ubuntu22raw.04githubusercontent.<com/p><ros/li><rosdistro/ol><master/li><rosdep/ol>base.yaml'''
[[File'''<span style="color:zero2w-img276.png]]#FF0000">ERROR: error loading sources list:</span>'''
::'''<span style="color:#FF0000">The read operation timed out</span>'''<ol start/big>|}{| class="5wikitable" style="list-style-typewidth: decimal800px;"><li>Then select the type of rootfs<|-| orangepi@orangepi:~$ '''source /opt/ros/li><noetic/ol>setup.bash'''
[[Fileorangepi@orangepi:zero2w-img286.png]]~$ '''sudo rosdep init'''
<ol start="6" style="list-style-type: decimal;"><li><p>Then select the type of image<Wrote /etc/ros/rosdep/p><ol style="sources.list-style-type: lower-alpha;"><li><p>'''Image with console interface (server)''' Represents the image of the server version, which is relatively small in size.<d/p></li><li><p>'''Image with desktop environment''' Represents an image with a desktop, which is relatively large in size20-default.</p></li></ol></li></ol>list
<div class="figure">Recommended: please run
[[File:zero2w-img287.png]]
</div><ol start="7" style="list-style-type: decimal;"><li>If you are compiling the server version of the image, you can also choose to compile the Standard version or the Minimal version. The Minimal version will have much less pre-installed software than the Standard version ('''please do not choose the Minimal version without special needs, because many things are not pre-installed by default. Some functions may not be available''')</li></ol>:rosdep update
<div class="figure">orangepi@orangepi:~$ '''rosdep update'''
[[File:zero2w-img288reading in sources list data from /etc/ros/rosdep/sources.png]]list.d
<Hit https:/div><ol start="8" style="list-style-type: decimal;"><li>If you are compiling a desktop version of the image, you also need to select the type of desktop environment/raw. Currently, only XFCE is maintained, so please select an XFCE type desktopgithubusercontent.<com/ros/li><rosdistro/ol>master/rosdep/osx-homebrew.yaml
[[FileHit https:zero2w-img289//raw.png]]githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
[[FileHit https:zero2w-img290//raw.png]]githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
You can then select additional packages that need to be installedHit https://raw. Please press the Enter key here to skip directlygithubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
[[FileHit https:zero2w-img291//raw.png]]githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml
<ol start="9" style="list-style-typeQuery rosdistro index https: decimal;"><li><p>Then the compilation of rootfs will start//raw. Some of the information prompted during compilation are as follows:<githubusercontent.com/p><ol style="list-style-type: lower-alpha;"><li>Type of rootfs<ros/li><rosdistro/ol><master/li></ol>index-v4.yaml
[ o.k. ] local not found [ Creating new rootfs cache for '''bullseye''' ]Skip end-of-life distro &quot;ardent&quot;
<ol start="2" style="listSkip end-styleof-type: lower-alphalife distro &quot;bouncy&quot;"><li>The storage path of the compiled rootfs compressed package</li></ol>
[ o.k. ] Target directory [ '''orangepiSkip end-build/external/cache/rootfs''' ]of-life distro &quot;crystal&quot;
<ol start="3" style="listSkip end-styleof-type: lower-alphalife distro &quot;dashing&quot;"><li>The name of the rootfs compressed package generated by compilation</li></ol>
[ o.k. ] File name [ '''bullseyeSkip end-xfceof-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4''' ]life distro &quot;eloquent&quot;
<ol start="10" style="list-style-type: decimalAdd distro &quot;"><li><p>View the compiled rootfs compressed package</p><ol style="list-style-type: lower-alphafoxy&quot;"><li>'''bullseye-xfce-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4''' It is a compressed package of rootfs. The meaning of each field in the name is</li></ol></li></ol>
<blockquote>a) '''bullseye''' represents the type of Linux distribution of rootfsAdd distro &quot;galactic&quot;
b) '''xfce''' indicates that the rootfs is the desktop version, and if it is cli, it indicates the server version.Skip end-of-life distro &quot;groovy&quot;
c) '''arm64''' represents the architecture type of rootfsAdd distro &quot;humble&quot;
d) '''25250ec7002de9e81a41de169f1f89721''' is the MD5 hash value generated by the package names of all software packages installed by rootfs. As long as the list Skip end-of software packages installed by rootfs is not modified, this value will not change. The compilation script will use this MD5 hash value. Determine whether rootfs needs to be recompiled</blockquote><ol start="2" style="list-style-type: lower-alphalife distro &quot;hydro&quot;"><li>'''bullseye-xfce-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4.list''' Lists the package names of all packages installed by rootfs</li></ol>
test@test:~/orangepiSkip end-build$ '''ls external/cache/rootfs/'''of-life distro &quot;indigo&quot;
bullseyeSkip end-xfceof-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4life distro &quot;jade&quot;
bullseyeSkip end-xfceof-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4.currentlife distro &quot;kinetic&quot;
bullseyeSkip end-xfceof-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4.listlife distro &quot;lunar&quot;
<ol start="11" style="list-style-type: decimalAdd distro &quot;melodic&quot;"><li>If the required rootfs already exists under '''external/cache/rootfs''', then compiling the rootfs again will directly skip the compilation process and will not restart the compilation. When compiling the image, it will also go to '''external/cache/rootfs''' to check whether it already exists. There is a cached rootfs available. If it is available, use it directly. This can save a lot of download and compilation time.</li></ol>
<span id="compile-linux-image"></span>== Compile linux image ==Add distro &quot;noetic&quot;
# Run the '''build.sh''' script, remember to add sudo permissionsAdd distro &quot;rolling&quot;
test@test:~updated cache in /home/orangepi-build$ '''sudo ./build.sh''' <ol start="2" style="list-style-type: decimal;"><li>Select '''Full OS image for flashing''' and press Enter<ros/li><rosdep/ol> <div class="figure"> [[File:zero2w-img292sources.png]]cache|}</div><ol start="3" style="list-style-type: decimal;"><li>Then select the model of the development board</li></ol> [[File:zero2w-img275.png]] <ol start="46" style="list-style-type: decimal;"><li><p>Then select open a command line terminal window on the branch type of the kernel source code. Different versions of the kernel source code maintain different rootfs types.</p><ol style="list-style-type: lower-alpha;"><li><p>In the current branch, you can see three options: debian11, ubuntu20.04'''desktop''', and ubuntu22then use the '''test_ros.04.</p></li><li><p>In the next branch, you sh''' script to start a small turtle routine to test whether ROS can see three options: debian11, debian12, and ubuntu22.04be used normally.</p></li></ol></li></ol> [[File:zero2w-img276.png]] <ol start{| class="5wikitable" style="list-style-typewidth: decimal800px;"><li><p>If you select the next branch, you will also be prompted to select the memory size, and you do not need to select the current branch.</p><ol style="list-style|-type: lower-alpha;"><li><p>If the development board you purchased has a memory size of 1.5GB, please select the first option.</p></li><li><p>If the development board you purchased has 1GB or 2GB or 4GB memory size, please choose the second option.</p>| <p>[[Fileorangepi@orangepi:zero2w-img277~$ '''test_ros.png]]sh'''</p></li></ol>|}
</li>
<li><p>Then select After running the '''test_ros.sh''' script, a small turtle as shown in the type of rootfspicture below will pop up.</p></li></olp> [[File:zero2w-img286img248.png]] <ol start="7" style="list-style-type: decimal;"><li></p>Then select the type of image</p><ol style="list-style-type: lower-alpha;"li><li><p>'''Image with console interface (server)''' Represents Then please keep the image of terminal window you just opened at the server version, which is relatively small in size.</p></li><li><p>'''Image with desktop environment'''Represents an image with a desktop, which is relatively large in size.top</p></li></ol></li></ol>
<div class="figure">
[[File:zero2w-img287img249.png]]
</div><ol start="8" style="list-style-type: decimal;"><li>If you are compiling the server version of the image, you can also choose to compile the Standard version or the Minimal version. The Minimal version will have much less pre-installed software than the Standard version ('''please do not choose the Minimal version without special needs, because many things are not pre-installed by default. Some functions may not be available''')</li></ol> <div class="figure"> [[File:zero2w-img288.png]] </div>
<ol start="9" style="list-style-type: decimal;">
<li>If you are compiling a desktop version of <p>At this time, press the direction keys on the image, you also need keyboard to select control the type of desktop environment. Currentlylittle turtle to move up, down, only XFCE is maintainedleft, so please select an XFCE type desktopand right.</p><p>[[File:zero2w-img250.png]]</p></li></ol>
[[File:zero2w<span id="how-img289to-install-ros-2-galactic-on-ubuntu20.png]]04"></span>
[[File:zero2w-img290=== How to install ROS 2 Galactic on Ubuntu20.png]]04 ===
You can then select additional packages <ol style="list-style-type: decimal;"><li><p>The currently active version of ROS 2 is as follows, the recommended version is '''Galactic Geochelone'''</p><p>[[File:zero2w-img251.png]]</p><p>[[File:zero2w-img252.png]]</p>{| class="wikitable" style="width:800px;" |-| <p>[http://docs.ros.org/ '''http://docs.ros.org''']</p><p>'''http://docs.ros.org/en/galactic/Releases.html'''</p>|}</li><li><p>The link to the official installation documentation of ROS 2 '''Galactic Geochelone''' is as follows:</p>{| class="wikitable" style="width:800px;" |-| <p>'''docs.ros.org/en/galactic/Installation.html'''</p><p>'''http://docs.ros.org/en/galactic/Installation/Ubuntu-Install-Debians.html'''</p>|}</li><li><p>In the official installation documentation of ROS 2 '''Galactic Geochelone''', Ubuntu Linux recommends using Ubuntu20.04, so please ensure that need the system used by the development board is the '''<span style="color:#FF0000">Ubuntu20.04 desktop system</span>'''. There are several ways to be installedinstall ROS 2. Please press The following demonstrates how to install ROS 2 '''Galactic Geochelone''' through '''Debian packages'''.</p></li><li><p>Use the Enter key here '''install_ros.sh''' script to skip directlyinstall ros2</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''install_ros.sh ros2'''</p>|}</li><li><p>The '''install_ros.sh''' script will automatically run the '''ros2 -h''' command after installing ros2. If you can see the following print, it means that the ros2 installation is complete.</p>{| class="wikitable" style="width:800px;" |-| <p>usage: ros2 [-h] Call `ros2 &lt;command&gt; -h` for more detailed usage. ...</p>
[[File:zero2w-img291.png]]
<ol start="10" style="listp>ros2 is an extensible command-style-type: decimal;"><li>Then the compilation of the linux image will beginline tool for ROS 2. The general process of compilation is as follows</li></olp>
a. Initialize the compilation environment of Ubuntu PC and install the software packages required for the compilation process.
b. Download the source code of u<p>optional arguments:</p>:<p>-boot h, --help show this help message and linux kernel (if already cached, only update the code)exit</p>
c. Compile u-boot source code and generate u-boot deb package
d. Compile linux source code <p>Commands:</p>:<p>action Various action related sub-commands</p>:<p>bag Various rosbag related sub-commands</p>:<p>component Various component related sub-commands</p>:<p>daemon Various daemon related sub-commands</p>:<p>doctor Check ROS setup and generate linuxother potential issues</p>:<p>interface Show information about ROS interfaces</p>:<p>launch Run a launch file</p>:<p>lifecycle Various lifecycle related sub-commands</p>:<p>multicast Various multicast related sub-commands</p>:<p>node Various node related sub-commands</p>:<p>param Various param related sub-commands</p>:<p>pkg Various package related deb packagessub-commands</p>:<p>run Run a package specific executable</p>:<p>security Various security related sub-commands</p>:<p>service Various service related sub-commands</p>:<p>topic Various topic related sub-commands</p>:<p>wtf Use `wtf` as alias to `doctor`</p>
e. Make the deb package of linux firmware
f:<p>Call `ros2 &lt;command&gt; -h` for more detailed usage. Make </p>|}</li><li><p>Then you can use the deb package '''test_ros.sh''' script to test whether ROS 2 is installed successfully. If you can see the following print, it means ROS 2 can run normally.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''test_ros.sh'''</p><p>[INFO] [1671174101.200091527] [talker]: Publishing: 'Hello World: 1'</p><p>[INFO] [1671174101.235661048] [listener]: I heard: [Hello World: 1]</p><p>[INFO] [1671174102.199572327] [talker]: Publishing: 'Hello World: 2'</p><p>[INFO] [1671174102.204196299] [listener]: I heard: [Hello World: 2]</p><p>[INFO] [1671174103.199580322] [talker]: Publishing: 'Hello World: 3'</p><p>[INFO] [1671174103.204019965] [listener]: I heard: [Hello World: 3]</p>|}</li><li><p>Run the following command to open rviz2</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''source /opt/ros/galactic/setup.bash'''</p><p>orangepi@orangepi:~$ '''ros2 run rviz2 rviz2'''</p>|}<p>[[File:zero2w-img253.png]]</p></li><li><p>For how to use ROS, please refer to the documentation of orangepiROS 2.</p>{| class="wikitable" style="width:800px;" |-config tool| <p>[http://docs.ros.org/en/galactic/Tutorials.html '''http://docs.ros.org/en/galactic/Tutorials.html''']</p>|}</li></ol>
g<span id="how-to-install-ros-2-humble-on-ubuntu22. Create a deb package with board-level support04"></span>
=== How to install ROS 2 Humble on Ubuntu22.04 === <ol style="list-style-type: decimal;"><li><p>Use the install_ros.sh script to '''install_ros.sh'''</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''install_ros.sh ros2'''</p>|}</li><li><p>The '''install_ros.sh''' script will automatically run the '''ros2 -h''' command after installing ros2. If you compile can see the desktop version imagefollowing print, you will also create a desktopit means that the ros2 installation is complete.</p>{| class="wikitable" style="width:800px;" |-| <p>usage: ros2 [-h] Call `ros2 &lt;command&gt; -related deb packageh` for more detailed usage. ...</p>
i. Check whether rootfs has been cached. If not, re-create rootfs. If it has been cached, decompress it directly and use it.
j<p>ros2 is an extensible command-line tool for ROS 2. Install the deb package generated previously into rootfs</p>
k. Make some specific settings for different development boards and different types of images, such as pre-installing additional software packages, modifying system configurations, etc.
l. Then create the image file <p>optional arguments:</p>:<p>-h, --help show this help message and format the partition. The default type is ext4.exit</p>
m. Then copy the configured rootfs to the mirror partition.
n. Then update initramfs<p>Commands:</p>:<p>action Various action related sub-commands</p>:<p>bag Various rosbag related sub-commands</p>:<p>component Various component related sub-commands</p>:<p>daemon Various daemon related sub-commands</p>:<p>doctor Check ROS setup and other potential issues</p>:<p>interface Show information about ROS interfaces</p>:<p>launch Run a launch file</p>:<p>lifecycle Various lifecycle related sub-commands</p>:<p>multicast Various multicast related sub-commands</p>:<p>node Various node related sub-commands</p>:<p>param Various param related sub-commands</p>:<p>pkg Various package related sub-commands</p>:<p>run Run a package specific executable</p>:<p>security Various security related sub-commands</p>:<p>service Various service related sub-commands</p>:<p>topic Various topic related sub-commands</p>:<p>wtf Use `wtf` as alias to `doctor`</p>
o. Finally, write the bin file of u-boot into the image through the dd command.
:<p>Call `ros2 &lt;command&gt; -h` for more detailed usage.</p>|}</li><li><p>Then you can use the '''test_ros.sh''' script to test whether ROS 2 is successfully installed. If you can see the following print, it means ROS 2 can run normally.<ol start/p>{| class="11wikitable" style="list-style-typewidth: decimal800px;"|-| <p>orangepi@orangepi:~$ '''test_ros.sh'''</p><p>[INFO] [1671174101.200091527] [talker]: Publishing: 'Hello World: 1'</p><p>[INFO] [1671174101.235661048] [listener]: I heard: [Hello World: 1]</p><p>[INFO] [1671174102.199572327] [talker]: Publishing: 'Hello World: 2'</p><p>[INFO] [1671174102.204196299] [listener]: I heard: [Hello World: 2]</p><p>[INFO] [1671174103.199580322] [talker]: Publishing: 'Hello World: 3'</p><p>[INFO] [1671174103.204019965] [listener]: I heard: [Hello World: 3]</p>|}</li><li><p>After compiling the image, Run the following message will be displayedcommand to open rviz2</p><ol {| class="wikitable" style="listwidth:800px;" |-| <p>orangepi@orangepi:~$ '''source /opt/ros/humble/setup.bash'''</p><p>orangepi@orangepi:~$ '''ros2 run rviz2 rviz2'''</p><p>[[File:zero2w-img254.png]]</p>|}</li><li><p>Reference documentation</p>{| class="wikitable" style-type="width: lower-alpha800px;">|-| <lip>The storage path of the compiled image'''http://docs.ros.org/en/humble/index.html'''</lip><p>[http:/ol/docs.ros.org/en/galactic/Tutorials.html '''http://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html''']</p>|}
</li></ol>
[ o.k. ] Done building [ '''output<span id="how-to-install-kernel-header-files"></images/orangepizero2w_x.x.x_debian_bullseye_linux6.1.xx_xfce_desktop/orangepizero2w_x.x.x_debian_bullseye_linux6.1.xx_xfce_desktop.img''' ]span>
<ol start="2" style="list-style-type: lower-alpha;"><li>Compilation time</li></ol>How to install kernel header files ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''[ oDebian11 system with <span style="color:#FF0000">Linux6.k1</span> kernel will report GCC error when compiling kernel module. So if you want to compile the kernel module, please use Debian12 or Ubuntu22.04. ] Runtime [ 19 min ]'''</big>|}
<ol start="3" style="list-style-type: lower-alphadecimal;"><li>Repeat the command to compile the <p>The Linux image. Use released by OPi comes with the following command to start compiling deb package of the image directly without selecting it through kernel header file by default, and the graphical interface.</li></ol> [ o.k. ] Repeat Build Options [ storage location is '''sudo ./build.sh BOARD=orangepizero2w BRANCH=next BUILD_OPT=image RELEASE=bullseye BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_CONFIGURE=yes''' ] <span id="instructions-for-using-the-orange-pi-os-arch-system"><opt/span> = '''Instructions for using the Orange Pi OS Arch system''' = <span id="orange-pi-os-arch-system-function-adaptation-status"></spanp>== Orange Pi OS Arch system function adaptation status == {| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''Motherboard functionsls /opt/linux-headers*'''</p><p>/opt/linux-headers-xxx-sun50iw9_x.x.x_arm64.deb</p>|}</li><li><p>Use the following command to install the deb package of the kernel header file</p>{| '''OPi OS Arch'''class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''HDMI videosudo dpkg -i /opt/linux-headers*.deb'''</p>| }</li><li><p>After installation, you can see the folder where the kernel header file is located under '''OK/usr/src'''.</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''HDMI Audiols /usr/src'''</p><p>linux-headers-x.x.x</p>| }</li><li><p>Then you can compile the source code of the hello kernel module that comes with the Linux image. The source code of the hello module is in '''OK/usr/src/hello'''. After entering this directory, then use the make command to compile.</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''cd /usr/src/hello/'''Type</p><p>orangepi@orangepi:/usr/src/hello$ '''sudo make'''</p><p>make -C USB2/lib/modules/5.4.125/build M=/usr/src/hello modules</p><p>make[1]: Entering directory '/usr/src/linux-headers-5.0 x 4.125'</p>:<p>CC [M] /usr/src/hello/hello.o</p>:<p>Building modules, stage 2.</p>:<p>MODPOST 1 modules</p>:<p>CC [M] /usr/src/hello/hello.mod.o</p>:<p>LD [M] /usr/src/hello/hello.ko</p><p>make[1]: Leaving directory '/usr/src/linux-headers-5.4.125''</p>| }</li><li><p>After compilation, the '''OKhello.ko'''kernel module will be generated</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:/usr/src/hello$ '''TF Card Startupls *.ko'''</p><p>hello.ko</p>| }</li><li><p>Use the '''insmod''' command to insert the '''OKhello.ko'''kernel module into the kernel</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:/usr/src/hello$ '''WIFIsudo insmod hello.ko'''</p>| }</li><li><p>Then use the '''OKdemsg'''command to view the output of the '''hello.ko''' kernel module. If you can see the following output, it means that the '''hello.ko''' kernel module is loaded correctly.</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:/usr/src/hello$ '''dmesg | grep &quot;Hello&quot;'''</p><p>[ 2871.893988] 'Bluetooth''Hello Orange Pi -- init'''</p>| }</li><li><p>Use the '''OKrmmod'''command to uninstall the '''hello.ko''' kernel module</p>{| class="wikitable" style="width:800px;"
|-
| '''LED Light'''| '''OK'''|-| '''40pin GPIO'''| '''OK'''|-| '''40pin I2C'''| '''OK'''|-| '''40pin SPI'''| '''OK'''|-| '''40pin UART'''| <p>orangepi@orangepi:/usr/src/hello$ '''OKsudo rmmod hello'''</p>|-| '''40pin PWM<p>orangepi@orangepi:/usr/src/hello$ '''dmesg | grep &quot;Hello&quot;'''OK'''</p>|<p>[ 2871.893988] Hello Orange Pi -| '''Temperature Sensor'''| '''OK'''|-init</p>| '<p>[ 3173.800892] ''Hardware watchdog'''| '''OK'''|Hello Orange Pi -| '''Mali GPU'''| '''NO'''|-| '''Video codec'''| '''NOexit'''</p>
|}
</li></ol>
 
<span id="testing-of-some-programming-languages-supported-by-linux-system"></span>
== Testing of some programming languages supported by Linux system == <span id="debian-bullseye-system"></span>=== Debian Bullseye system === <ol style="list-style-type: decimal;"><li><p>Debian Bullseye is installed with the gcc compilation tool chain by default, which can directly compile C language programs in the Linux system of the development board.</p><ol style="list-style-type: lower-alpha;"><li><p>The version of a.gcc is as follows</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''24pin expansion board functiongcc --version'''</p><p>gcc (Debian 10.2.1-6) 10.2.1 20210110</p><p>Copyright (C) 2020 Free Software Foundation, Inc.</p><p>This is free software; see the source for copying conditions. There is NO</p><p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p>| }</li><li><p>Write the '''OPi OS Archhello_world.c'''program in C language</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''100M network portvim hello_world.c'''</p><p>#include &lt;stdio.h&gt;</p>  <p>int main(void)</p><p>{</p>:<p>printf(&quot;Hello World!\n&quot;);</p>  :<p>return 0;</p><p>}</p>| }</li><li><p>Then compile and run '''OKhello_world.c'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''100M Ethernet port lightgcc -o hello_world hello_world.c'''</p>| <p>orangepi@orangepi:~$ '''OK./hello_world'''</p><p>Hello World!</p>|}</li></ol></li><li><p>Debian Bullseye has Python3 installed by default</p><ol style="list-style-type: lower-alpha;"><li><p>The specific version of Python is as follows</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''USB2.0 HOST x 2python3'''</p>| <p>'''OKPython 3.9.2'''(default, Feb 28 2021, 17:03:44)</p><p>[GCC 10.2.1 20210110] on linux</p><p>Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.</p><p>&gt;&gt;&gt;</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
| <big><p>'''Infrared receptionUse the Ctrl+D shortcut key to exit python's interactive mode.'''</p></big>| }</li><li><p>Write the '''OKhello_world.py'''program in Python language</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''vim hello_world.py''Headphone audio playback'</p><p>print('Hello World!')</p>| }</li><li><p>The result of running '''OKhello_world.py'''is as follows</p>{| class="wikitable" style="width:800px;"
|-
| '''On/off button'''| <p>orangepi@orangepi:~$ '''OKpython3 hello_world.py'''</p>|-| '''LRADC''' '''Custom buttons x 2'''| '''OK'''|-| '''TV-OUT'''| '''NO'''<p>Hello World!</p>
|}
</li></ol>
</li>
<li><p>Debian Bullseye does not install Java compilation tools and operating environment by default.</p>
<ol style="list-style-type: lower-alpha;">
<li><p>You can use the following command to install openjdk. The latest version in Debian Bullseye is openjdk-17</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdk'''</p>
|}
</li>
<li><p>After installation, you can check the Java version.</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''java --version'''</p>
|}
</li>
<li><p>Write the Java version of '''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.java'''</p>
<p>public class hello_world</p>
<p>{</p>
:<p>public static void main(String[] args)</p>
:<p>{</p>
::<p>System.out.println(&quot;Hello World!&quot;);</p>
:<p>}</p>
<p>}</p>
|}
</li>
<li><p>Then compile and run '''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''javac hello_world.java'''</p>
<p>orangepi@orangepi:~$ '''java hello_world'''</p>
<p>Hello World!</p>
|}
</li></ol>
</li></ol>
<span id="orangedebian-pi-os-archbookworm-system-user-guide-instructions"></span>== Orange Pi OS Arch System User Guide Instructions ==
First of all, please note that the OPi OS Arch system does not have a default orangepi user and password, so you cannot directly log in remotely through the serial port and ssh after the system is started after burning (not even the root user). This is different from Ubuntu and === Debian systems. When the OPi OS Arch system is started for the first time, you need to connect an HDMI display and then initialize the Bookworm system settings through the user wizard (including creating a new user name and setting a password). The setup steps of the user wizard are as follows:===
<ol style="list-style-type: decimal;">
<li><p>Debian Bookworm is installed with the gcc compilation tool chain by default, which can directly compile C language programs in the Linux system of the development board.</p>
<ol style="list-style-type: lower-alpha;">
<li><p>After burning the system, when you start it for the first time and enter the desktop, you will see the user wizard program shown in the figure belowThe version of a.gcc is as follows</p><div {| class="figurewikitable" style="width:800px;">|-| [[File<p>orangepi@orangepi:zero2w~$ '''gcc --version'''</p><p>gcc (Debian 12.2.0-img29314) 12.2.0</p><p>Copyright (C) 2022 Free Software Foundation, Inc.png]]</p><p>This is free software; see the source for copying conditions. There is NO</p><p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</divp>|}</li><li><p>First you need to select Write the '''hello_world.c''' program in C language you want</p><div {| class="figurewikitable" style="width:800px;">|-| [[File<p>orangepi@orangepi:zero2w-img294~$ '''vim hello_world.c'''</p><p>#include &lt;stdio.png]]h&gt;</p>
</div></li>
<li><p>After selecting the language, the user wizard will immediately switch to the corresponding language interface, as shown below in Chinese</p>
<div class="figure">
[[File<p>int main(void)</p><p>{</p>:zero2w-img295.png]]<p>printf(&quot;Hello World!\n&quot;);</p>
</div></li>
<li><p>Then select the area</p>
<div class="figure">
[[File:zero2w-img296.png]] </div></li><li><p>Then select the keyboard modelreturn 0;</p><div class="figure"> [[File:zero2w-img297.png]] </div></li><li><p>Then create a new username and set a password}</p><div class="figure"> [[File:zero2w-img298.png]]|}</div></li><li><p>Then make sure there is no problem with the selection, compile and then click the install run '''buttonhello_world.c'''</p><div {| class="figurewikitable"> [[File:zero2w-img299.png]] </div></li><li><p>Then wait for the installation to complete</p><div classstyle="figurewidth:800px;"> [[File:zero2w|-img300.png]]| </div></li><li><p>After the installation is complete, you need to click the orangepi@orangepi:~$ '''Finishgcc -o hello_world hello_world.c''' button to restart the system.</p><div class="figure"p[[Fileorangepi@orangepi:zero2w-img301.png]] </div></li><li><p>The Orange Pi Hello program will automatically start after restarting. At this time, you need to remove the check ~$ '''mark of Start on startup./hello_world''' in the lower right corner, otherwise you need to manually close the Orange Pi Hello program every time you start it.</p><div class="figure"> [[File:zero2w-img302.png]] </div><p>At this point, you can use the newly created username and password to log in to the OPi OS system through the serial port or ssh.Hello World!</p>|}</li></ol></li><span id="how-to-set-dt-overlays"li></spanp>== How to set DT overlays == The multiplexing functions such as I2C/SPI/UART/PWM in the 40-pin development board are turned off Debian Bookworm has Python3 installed by default in the kernel's dts, and the corresponding DT overlays need to be manually turned on before they can be used. The method to open DT overlays in OPi OS Arch system is as follows: # First open the '''</boot/extlinux/extlinux.conf''' configuration file [orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''p><ol start="2" style="list-style-type: decimallower-alpha;"><li>Then open the corresponding configuration by adding '''FDTOVERLAYS''' '''/dtbs/allwinner/overlay/xxx.dtbo''' in '''/boot/extlinux/extlinux.conf'''</lip>The specific version of Python is as follows</olp>{| class="wikitable" style="width:800px;" '''Note that xxx.dtbo in FDTOVERLAYS /dtbs/allwinner/overlay/xxx.dtbo needs to be replaced with the specific dtbo configuration, please do not copy it.'''|-| [<p>orangepi@orangepi-pc :~]$ '''sudo vim /boot/extlinux/extlinux.conf''' LABEL Orange Pi KERNEL /Image FDT /dtbs/allwinner/sun50i-h616-orangepi-zero2w.dtb python3'''FDTOVERLAYS </dtbs/allwinner/overlay/xxx.dtbo''' #Configuration that needs to be added <ol start="3" style="list-style-type: decimal;"p><li><p>The storage path of xxxPython 3.11.dtbo in the OPi OS Arch image is as follows2 (main, Mar 13 2023, 12:18:29) [GCC 12. Please note that not all dtbo under this path can be used2.0] on linux</p><p>'''/boot/dtbs/allwinner/overlay/'''Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.</p></li><li><p>The DT overlays configuration that can be used by the development board is as follows&gt;&gt;&gt;</p></li></ol>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
| <big><p>'''Functions on Use the development boardCtrl+D shortcut key to exit python's interactive mode.'''</p></big>| }</li><li><p>Write the '''Corresponding DT overlays configurationhello_world.py'''program in Python language</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin - i2c0vim hello_world.py'''</p><p>print('Hello World!')</p>| }</li><li><p>The result of running '''sun50i-h616-pi-i2c0hello_world.dtbopy'''is as follows</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin - i2c1python3 hello_world.py'''</p><p>Hello World!</p>| '''sun50i}</li></ol></li><li><p>Debian Bookworm does not install Java compilation tools and operating environment by default.</p><ol style="list-h616style-pitype: lower-i2c1alpha;"><li><p>You can use the following command to install openjdk.dtbo'''The latest version in Debian Bookworm is openjdk-17</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin sudo apt install -y openjdk-17- i2c2jdk'''</p>| '''sun50i-h616-pi-i2c2}</li><li><p>After installation, you can check the Java version.dtbo'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin java - uart2-version'''</p>| }</li><li><p>Write the Java version of '''sun50i-h616-pi-uart2hello_world.dtbojava'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin - uart3vim hello_world.java'''</p><p>public class hello_world</p><p>{</p>:<p>public static void main(String[] args)</p>:<p>{</p>::<p>System.out.println(&quot;Hello World!&quot;);</p>:<p>}</p><p>}</p>| }</li><li><p>Then compile and run '''sun50i-h616-pi-uart3hello_world.dtbojava'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin - uart4javac hello_world.java'''</p>| <p>orangepi@orangepi:~$ '''java hello_world'''sun50i</p><p>Hello World!</p>|}</li></ol></li></ol> <span id="ubuntu-h616focal-pisystem"></span> === Ubuntu Focal system === <ol style="list-style-uart4type: decimal;"><li><p>Ubuntu Focal is installed with the gcc compilation tool chain by default, which can directly compile C language programs in the Linux system of the development board.dtbo'''</p><ol style="list-style-type: lower-alpha;"><li><p>The version of a.gcc is as follows</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin gcc - uart5-version'''</p><p>gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0</p><p>Copyright (C) 2019 Free Software Foundation, Inc.</p><p>This is free software; see the source for copying conditions. There is NO</p><p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p>| }</li><li><p>Write the '''sun50i-h616-ph-uart5hello_world.dtboc'''program in C language</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin - pwm1vim hello_world.c'''</p><p>#include &lt;stdio.h&gt;</p>  <p>int main(void)</p><p>{</p>:<p>printf(&quot;Hello World!\n&quot;);</p>  :<p>return 0;</p><p>}</p>| }</li><li><p>Then compile and run '''sun50i-h616-pi-pwm1hello_world.dtboc'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin gcc - pwm2o hello_world hello_world.c'''</p>| <p>orangepi@orangepi:~$ '''sun50i-h616-pi-pwm2.dtbo/hello_world'''</p><p>Hello World!</p>|}</li></ol></li><li><p>Ubuntu Focal has Python3 installed by default</p><ol style="list-style-type: lower-alpha;"><li><p>The specific version of Python3 is as follows</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin - pwm3python3'''</p><p>Python 3.8.10 (default, Nov 14 2022, 12:59:47)</p><p>[GCC 9.4.0] on linux</p><p>Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.</p><p>&gt;&gt;&gt;</p>|}{| '''sun50iclass="wikitable" style="background-h616-pi-pwm3.dtbo'''color:#ffffdc;width:800px;"
|-
| <big><p>'''Use the Ctrl+D shortcut key to exit python'40pin - pwm4s interactive mode.'''</p></big>| }</li><li><p>Write the '''sun50i-h616-pi-pwm4hello_world.dtbopy'''program in Python language</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin - spi1 cs0vim hello_world.py'''</p><p>print('Hello World!')</p>| }</li><li><p>The result of running '''sun50i-h616-spi1-cs0-spidevhello_world.dtbopy'''is as follows</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin - spi1 cs1python3 hello_world.py'''</p><p>Hello World!</p>| '''sun50i}</li></ol></li><li><p>Ubuntu Focal does not have Java compilation tools and running environment installed by default.</p><ol style="list-h616style-spi1type: lower-cs1alpha;"><li><p>You can use the following command to install openjdk-spidev.dtbo'''17</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''40pin sudo apt install - spi1 cs0 cs1y openjdk-17-jdk'''</p>| '''sun50i-h616-spi1-cs0-cs1-spidev}</li><li><p>After installation, you can check the Java version.dtbo'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''设Set USB0 to Host modejava --version'''</p><p>openjdk 17.0.2 2022-01-18</p><p>OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)</p><p>OpenJDK 64-Bit Server VM (build 17.0.2+8-Ubuntu-120.04, mixed mode, sharing)</p>| }</li><li><p>Write the Java version of '''sun50i-h616-usb0-hosthello_world.dtbojava'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''Turn off the green LED lightvim hello_world.java'''</p><p>public class hello_world</p><p>{</p>:<p>public static void main(String[] args)</p>:<p>{</p>::<p>System.out.println(&quot;Hello World!&quot;);</p>:<p>}</p><p>}</p>| }</li><li><p>Then compile and run '''sun50i-h616-zero2w-disable-ledhello_world.dtbojava'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''How to close the UART0 debugging serial portjavac hello_world.java'''</p>| <p>orangepi@orangepi:~$ '''sun50i-h616-disable-uart0.dtbojava hello_world'''</p><p>Hello World!</p>
|}
</li></ol>
</li></ol>
<ol startspan id="5" style="listubuntu-stylejammy-type: decimal;system"><li>If you need to open multiple configurations at the same time, just add the paths of multiple configurations directly after '''FDTOVERLAYS.''' For example, the configuration of opening i2c1 and uart5 at the same time is as follows</li></olspan>
[orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''=== Ubuntu Jammy system ===
LABEL Orange Pi<ol style="list-style-type: decimal;"> KERNEL <li><p>Ubuntu Jammy is installed with the gcc compilation tool chain by default, which can directly compile C language programs in the Linux system of the development board.</Imagep> FDT /dtbs/allwinner/sun50i<ol style="list-h616style-orangepitype: lower-zero2walpha;"><li><p>The version of a.dtbgcc is as follows</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''FDTOVERLAYS gcc --version'''</dtbsp><p>gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) '''11.3.0'''</allwinnerp><p>Copyright (C) 2021 Free Software Foundation, Inc.</overlayp><p>This is free software; see the source for copying conditions. There is NO</sun50i-h616-pi-i2c1p><p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.dtbo </dtbsp>|}</allwinnerli><li><p>Write the '''hello_world.c''' program in C language</overlay/sun50ip>{| class="wikitable" style="width:800px;" |-h616-ph-uart5| <p>orangepi@orangepi:~$ '''vim hello_world.dtboc'''</p><p>#include &lt;stdio.h&gt;</p>
<ol start="6" style="list-style-type: decimal;">
<li>After setting, you need to restart the system for the configuration to take effect.</li></ol>
[orangepi@orangepi-pc ~]$ '''sudo reboot'''<p>int main(void)</p><p>{</p>:<p>printf(&quot;Hello World!\n&quot;);</p>
<span id="how-to-install-software"></span>
== How to install software ==
You can use the pacman package management tool to install software that is not available in OPi OS. For example, the command to install the vim editor is as follows. If you want to install other software, you only need to replace vim with the package name of the software you want to install.:<p>return 0;</p><p>}</p>[orangepi@orangepi-pc ~]$ '''sudo pacman -Syy vim'''|}</li><span id="android-12-tv-system-usage-instructions"li></spanp= Then compile and run '''Android 12 TV system usage instructionshello_world.c''' = <span id="supported-android-versions"></spanp>== Supported Android versions == {| class="wikitable" style="width:800px;"
|-
| Android Version<p>orangepi@orangepi:~$ '''gcc -o hello_world hello_world.c'''</p><p>orangepi@orangepi:~$ '''./hello_world'''</p><p>Hello World!</p>| Kernel }</li></ol></li><li><p>Ubuntu Jammy has Python3 installed by default</p><ol style="list-style-type: lower-alpha;"><li><p>The specific versionof Python3 is as follows</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''Android 12 TV Versionpython3'''</p>| '''linux5<p>Python 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] on linux</p><p>Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.4'''</p><p>&gt;&gt;&gt;</p>
|}
 <span id="android-12-tv-function-adaptation-status"></span>== Android 12 TV function adaptation status == {| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
| <big><p>'''Motherboard functionsUse the Ctrl+D shortcut key to exit python's interactive mode.'''</p></big>| }</li><li><p>Write the '''Android12 TVhello_world.py'''program in Python language</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''vim hello_world.py''HDMI video'</p><p>print('Hello World!')</p>| }</li><li><p>The result of running '''OKhello_world.py'''is as follows</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''HDMI Audiopython3 hello_world.py'''</p><p>Hello World!</p>| '''OK'''}</li></ol></li><li><p>Ubuntu Jammy does not install Java compilation tools and operating environment by default.</p><ol style="list-style-type: lower-alpha;"><li><p>You can use the following command to install openjdk-18</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''Typesudo apt install -y openjdk-18-C USB2.0 x 2jdk'''</p>| '''OK'''}</li><li><p>After installation, you can check the Java version.</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''TF card startupjava --version'''</p><p>openjdk 18.0.2-ea 2022-07-19</p><p>OpenJDK Runtime Environment (build 18.0.2-ea+9-Ubuntu-222.04)</p><p>OpenJDK 64-Bit Server VM (build 18.0.2-ea+9-Ubuntu-222.04, mixed mode, sharing)</p>| }</li><li><p>Write the Java version of '''OKhello_world.java'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''WIFIvim hello_world.java'''</p><p>public class hello_world</p><p>{</p>:<p>public static void main(String[] args)</p>:<p>{</p>::<p>System.out.println(&quot;Hello World!&quot;);</p>:<p>}</p><p>}</p>| }</li><li><p>Then compile and run '''OKhello_world.java'''</p>{| class="wikitable" style="width:800px;"
|-
| <p>orangepi@orangepi:~$ '''Bluetoothjavac hello_world.java'''</p>| <p>orangepi@orangepi:~$ '''OKjava hello_world'''</p><p>Hello World!</p>|}</li></ol></li></ol> <span id="method-of-uploading-files-to-the-development-board-linux-system"></span> == Method of uploading files to the development board Linux system ==| <span id="method-to-upload-files-to-the-development-board-linux-system-in-ubuntu-pc"></span>=== Method to upload files to the development board Linux system in Ubuntu PC === <span id="how-to-upload-files-using-scp-command"></span>==== How to upload files using scp command ==== <ol style="list-style-type: decimal;"><li><p>Use the scp command to upload files to the Linux system of the development board in Ubuntu PC. The specific command is as follows</p><ol style="list-style-type: lower-alpha;"><li><p>'''file_path: '''Needs to be replaced with the path of the file to be uploaded</p></li><li><p>'''orangepi: '''This is the user name of the development board's Linux system. It can also be replaced with something else, such as root.</p></li><li><p>'''USB Camera192.168.xx.xx:'''This is the IP address of the development board. Please modify it according to the actual situation.</p></li>| <li><p>'''OK/home/orangepi:'''The path in the development board Linux system can also be modified to other paths.</p>{| class="wikitable" style="width:800px;"
|-
| <p>test@test:~$ '''LED Lightscp file_path orangepi@192.168.xx.xx:/home/orangepi/'''</p>|}</li></ol></li><li><p>If you want to upload a folder, you need to add the -r parameter</p>{| '''OK'''class="wikitable" style="width:800px;"
|-
| <p>test@test:~$ '''40pin GPIOscp <span style="color:#FF0000">-r</span> dir_path orangepi@192.168.xx.xx:/home/orangepi/'''</p>|}</li><li><p>There are more usages of scp, please use the following command to view the man manual</p></li>{| '''OK'''class="wikitable" style="width:800px;"
|-
| test@test:~$ '''40pin I2Cman scp'''| '''OK'''}</ol><span id="how-to-upload-files-using-filezilla"></span> ==== How to upload files using filezilla ==== <ol style="list-style-type: decimal;"><li><p>First install filezilla in Ubuntu PC</p>{| class="wikitable" style="width:800px;"
|-
| <p>test@test:~$ '''40pin SPI1sudo apt install -y filezilla'''</p>|}</li><li><p>Then use the following command to open filezilla</p>{| '''OK'''class="wikitable" style="width:800px;"
|-
| '''40pin UART'''| <p>test@test:~$ '''OKfilezilla'''</p>|-| '''40pin PWM'''| '''OK'''|-| '''Temperature Sensor'''| '''OK'''|-| '''Hardware watchdog'''| '''OK'''|-| '''Mali GPU'''| '''OK'''|-}| '''Video codec'''</li>| '''OK'''<li><p>The interface after opening filezilla is as shown below. At this time, the remote site on the right is empty.</p>|}<div class="figure">
{| class="wikitable"|[[File:zero2w-| '''24pin Expansion board function'''| '''Android12 TV'''|-| '''100M network port'''| '''OK'''|-| '''100M Ethernet port light'''| '''OK'''|-| '''USB2.0 HOST x 2'''| '''OK'''|-| '''Infrared reception'''| '''OK'''|-| '''Headphone audio playback'''| '''OK'''|-| '''On/off button'''| '''OK'''|-| '''LRADC''' '''Custom buttons x 2'''| '''OK, The default setting is the volume up and down keysimg255.'''|-| '''TV-OUT'''| '''OK'''|}png]]
<span id="onboard-led-light-display-instructions"/div></spanli>== Onboard LED light display instructions ==<li><p>The method of connecting the development board is as shown in the figure below</p></li>
{| <div class="wikitablefigure"|-|| '''green light'''| '''red light'''|-| '''u-boot startup phase'''| '''Off'''| '''on'''|-| '''Kernel boot to enter the system'''| '''on'''| '''on'''|}>
<span id="how[[File:zero2w-to-return-to-the-previous-interface-in-android"></span>== How to return to the previous interface in Android ==img256.png]]
We generally use the mouse and keyboard </div></ol><ol start="5" style="list-style-type: decimal;"><li><p>Then choose to control '''save the Android system of the development board. When entering certain interfaces password''' and need to return to the previous interface or desktop, we can only return by rightclick '''OK'''</p><p>[[File:zero2w-clicking the mouse, img257.png]]</p></li><li><p>Then select '''Always trust this host''' and the keyboard cannot return.click '''OK'''</p></li>
If you have purchased the infrared remote control (other remote controls do not work) and a 24pin expansion board that come with the development board, after connecting the 24pin expansion board to the development board, you can also use the return key on the remote control to return to the previous menu. The location of the return key is as shown below. Shown:<div class="figure">
[[File:zero2w-img303img258.png]]
<span id/div></ol><ol start="how7" style="list-tostyle-use-adbtype: decimal;"><li>After the connection is successful, you can see the directory structure of the development board's Linux file system on the right side of the filezilla software.</spanli>== How to use ADB ==
<span iddiv class="use-network-connection-adb-debuggingfigure"></span>=== Use network connection adb debugging ===
'''Using network adb does not require a USB Typc C interface data cable to connect the computer and the development board[[File:zero2w-img259. Instead, it communicates through the network, so first make sure that the development board's wired or wireless network is connected, and then obtain the IP address of the development board. Next To be used.'''png]]
# Make sure </div></ol><ol start="8" style="list-style-type: decimal;"><li>Then select the '''service.adb.tcp.port''' path to be uploaded to the development board on the right side of the filezilla software, select the file to be uploaded in Ubuntu PC on the left side of the Android system is set filezilla software, right-click the mouse, and then click the upload option to 5555 port numberstart uploading the file to the development board.</li>
apollo-p2:/ # '''getprop | grep &quot;adb.tcp&quot;'''<div class="figure">
[service.adb.tcp[File:zero2w-img260.portpng]: [5555]
</div></ol><ol start="29" style="list-style-type: decimal;"><li>If '''service.adb.tcp.port''' <p>After the upload is not setcompleted, you can use go to the following command corresponding path in the serial port development board Linux system to set view the port number uploaded file.</p></li><li><p>The method of uploading a folder is the network adbsame as the method of uploading a file, so I won't go into details here.</p></li></ol>
apollo<span id="method-to-upload-files-from-windows-pc-p2:/ # '''setprop service.adb.tcp.port 5555'''to-development-board-linux-system"><br /span>apollo-p2:/ # '''stop adbd'''
apollo-p2:/ # '''start adbd'''=== Method to upload files from Windows PC to development board Linux system ===
<ol startspan id="3" style="listhow-to-upload-files-using-stylefilezilla-type: decimal;1"><li>Install adb tool on Ubuntu PC</li></olspan>==== How to upload files using filezilla ====
test@test:~$ '''sudo apt-get update'''# First download the installation file of the Windows version of the filezilla software. The download link is as follows
test@test:~$ :{| class="wikitable" style="width:800px;" |-| [https://filezilla-project.org/download.php?type=client '''sudo apt-get install https://filezilla-y adbproject.org/download.php?type=client''']|}
<ol start="4" style="list::[[File:zero2w-style-type: decimal;"><li>Then connect network adb on Ubuntu PC</li></ol>img261.png]]
test@test:~$ '''adb connect 192.168.1.xxx:5555''' '''(Need to be modified to the IP address of the development board)'''<div class="figure">
* daemon not running; starting now at tcp:5037:[[File:zero2w-img262.png]]
* daemon started successfully</div><ol start="2" style="list-style-type: decimal;"><li><p>The downloaded installation package is as shown below, then double-click to install it directly</p>{| class="wikitable" style="width:800px;" |-| <p>'''FileZilla_Server_1.5.1_win64-setup.exe'''</p>|}During the installation process, please select '''Decline''' on the following installation interface, and then select '''Next&gt;'''
connected to 192.168.1.xxx:5555<div class="figure">
test@test[[File:~$ '''adb devices'''zero2w-img263.png]]
List of devices attached</div></li></ol><ol start="3" style="list-style-type: decimal;"><li>The interface after opening filezilla is as shown below. At this time, the remote site on the right is empty.</li> <div class="figure"> [[File:zero2w-img264.png]]
192.168.1.xxx</div></ol><ol start="4" style="list-style-type:5555 devicedecimal;"><li>The method of connecting the development board is as shown in the figure below:</li>
<ol startdiv class="5figure" style="list-style-type: decimal;"><li>Then you can log in to the android system through adb shell on Ubuntu PC</li></ol>
test@test[[File:~$ '''adb shell'''zero2w-img256.png]]
apollo</div></ol><ol start="5" style="list-style-p2type:decimal;"><li>Then choose to '''save the password''' and click '''OK'''</ #li>
<span iddiv class="use-data-cable-to-connect-adb-debuggingfigure"></span>=== Use data cable to connect adb debugging ===
# Prepare a USB Type C interface data cable, plug one end of the USB interface into the USB interface of the computer, and plug one end of the USB Type C interface into the USB0 interface of the development board (see the description of the picture on the right below for the location of USB0). In this case, the development board is powered by the computer's USB interface, so please ensure that the computer's USB interface can provide the most sufficient power to drive the development board[[File:zero2w-img265.png]]
[[File:zero2w</div></ol><ol start="6" style="list-style-img304.png]] [[Filetype:zero2w-img305.png]]decimal;"><li>Then select '''Always trust this host''' and click '''OK'''</li>
<ol startdiv class="2figure" style="list-style-type: decimal;"><li>Install adb tool on Ubuntu PC</li></ol>
test@test[[File:~$ '''sudo aptzero2w-get update'''img266.png]]
test@test:~$ '''sudo apt</div></ol><ol start="7" style="list-get install style-y adb''type: decimal;"><li>After the connection is successful, you can see the directory structure of the development board's Linux file system on the right side of the filezilla software.</li>
<ol startdiv class="3figure" style="list-style-type: decimal;"><li>Check whether the ADB device is recognized</li></ol>
test@test[[File:~$ '''adb devices'''zero2w-img267.png]]
List </div></ol><ol start="8" style="list-style-type: decimal;"><li>Then select the path to be uploaded to the development board on the right side of devices attachedthe filezilla software, select the file to be uploaded on the Windows PC on the left side of the filezilla software, right-click the mouse, and then click the upload option to start uploading the file to the development board.</li>
4c00146473c28651dd0 device<div class="figure">
<ol start="4" style="list[[File:zero2w-style-type: decimal;"><li>Then you can log in to the android system through adb shell on Ubuntu PC</li></ol>img268.png]]
test@test</div></ol><ol start="9" style="list-style-type:~$ '''adb shell''decimal;"><li><p>After the upload is completed, you can go to the corresponding path in the development board Linux system to view the uploaded file.</p></li><li><p>The method of uploading a folder is the same as the method of uploading a file, so I won't go into details here.</p></li></ol>
apollo<span id="instructions-p2:for-using-the-logo-on-and-off-the-machine"></ $span>
<span id="view-how-to-set-hdmi-display-resolution"></span>== View how to set HDMI display resolution Instructions for using the logo on and off the machine ==
<ol style="list-style-type: decimal;">
<li><p>Enter first '''Settings'''<The power on/p><p>[[File:zero2w-img306off logo will only be displayed on the desktop version of the system by default.png]]</p></li><li><p>Then select Set the '''bootlogo''' variable to '''false'''in ''Device Preferences'/boot/orangepiEnv.txt''' to turn off the switch logo.</p><p>[[File{| class="wikitable" style="width:zero2w800px;" |-img307.png]]</p></li><li>| <p>Then select orangepi@orangepi:~$ '''Display &amp; Soundsudo vim /boot/orangepiEnv.txt'''</p><p>[[File:zero2w-img308.png]]verbosity=1</p></li><li><p>Then select '''Advanced display settings<span style="color:#FF0000">bootlogo=false</span>'''</p><p>[[File:zero2w-img309.png]]</p>|}</li><li><p>Then select Set the '''bootlogo''' variable to '''true'''in ''HDMI output mode'/boot/orangepiEnv.txt''' to enable the power on/off logo.</p>{| class="wikitable" style="width:800px;" |-| <p>[[Fileorangepi@orangepi:zero2w-img310~$ '''sudo vim /boot/orangepiEnv.png]]txt'''</p></li><li><p>Then you can see the list of resolutions supported by the monitor. At this time, clicking the corresponding option will switch to the corresponding resolution. Please note that different monitors may support different resolutions. If you connect it to a TV, you will generally see more resolution options than the picture below.verbosity=1</p><p>[[File'''<span style="color:zero2w-img311.png]]#FF0000">bootlogo=true</span>'''</p>|}</li><li><p>The HDMI output location of the development board supports 4K display. When connected to a 4K TV, you can see boot logo picture in the 4K resolution option.Linux system is</p>{| class="wikitable" style="width:800px;" |-| <p>[[File:zero2w-img312'''/usr/share/plymouth/themes/orangepi/watermark.png]]'''</p></li></ol>|}<span id="hdmi-to-vga-display-test-1"></span>=== HDMI to VGA display test === <ol style="list-style-type: decimal;"li><li><p>First After replacing the boot logo image, you need to prepare run the following accessoriescommand to take effect</p><ol {| class="wikitable" style="list-style-typewidth: lower-alpha800px;">|-| <lip>HDMI to VGA converterorangepi@orangepi:~$ '''sudo update-initramfs -u'''</li></olp>|}
</li></ol>
[[File:zero2w<span id="how-img144to-turn-on-the-power-button-in-linux5.png]]4"></span>
<ol start="2" style="list-style-type: lower-alpha;"><li>A VGA cable and a Mini HDMI male How to HDMI female adapter</li></ol>turn on the power button in Linux5.4 ==
[[File:zero2w-img145There is no power on/off button on the main board of the development board. We can expand it through a 24pin expansion board.png]] [[FileThe location of the power on/off button on the expansion board is as follows:zero2w-img146.png]]
<ol start="3" style="list-style-type[[File: lowerzero2w-alpha;"><li>A monitor or TV that supports VGA interface</li></ol>img269.png]]
<!-- --><ol start="2" style="list-style-type: decimal;"><li>HDMI The power on/off button of the Linux 6.1 image is turned on by default, but the power on/off button of the Linux 5.4 kernel image is turned off by default and needs to VGA display test is be turned on manually for normal use. The steps are as follows</li></ol>:
<ol style="list-style-type: decimal;"><li><p>First run '''orangepi-config'''. Ordinary users remember to add '''sudo''' permissions.</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li><li><p>Then select '''System'''</p><p>[[File:zero2w-img313img80.png]]</p></li> <li><p>Then select '''Hardware'''When using HDMI </p><p>[[File:zero2w-img81.png]]</p></li><li><p>Then use the keyboard's arrow keys to VGA displaylocate the position shown in the picture below, the development board and then use the Android system of the development board do not need '''space''' to make any settings. You only need select the Mini HDMI interface dtbo configuration of the development board SPI you want to display normallyopen. So if there is a problem with the test, please check whether there is a problem with the HDMI </p><p>[[File:zero2w-img270.png]]</p></li><li><p>Then select '''&lt;Save&gt;''' to VGA converter, VGA cable and monitorsave</p><p>[[File:zero2w-img83.png]]</p></li><li><p>Then select '''&lt;Back&gt;'''</p><span id="wip>[[File:zero2w-fi-connection-method"img84.png]]</p></spanli>== WI<li><p>Then select '''&lt;Reboot&gt;''' to restart the system to make the configuration take effect.</p><p>[[File:zero2w-FI connection method ==img85.png]]</p></li></ol>
# Choose first '''Settings'''<span id="how-to-shut-down-and-restart-the-development-board"></span>
[[File:zero2w-img306.png]]== How to shut down and restart the development board ==
<ol startstyle="list-style-type: decimal;"><li><p>During the running of the Linux system, if you directly unplug the power supply, it may cause the file system to lose some data. It is recommended to use the '''poweroff''' command to shut down the Linux system of the development board before powering off, and then unplug the power supply.</p>{| class="2wikitable" style="listwidth:800px;" |-| <p>orangepi@orangepi:~$ '''sudo poweroff'''</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Note that after turning off the development board, you need to unplug and replug the power supply before it can be turned on.'''</p></big>|}</li><li><p>In addition to using the poweroff command to shut down, you can also use the power on/off button on the expansion board to shut down.</p><p>[[File:zero2w-img269.png]]</p>{| class="wikitable" style="background-typecolor:#ffffdc;width: decimal800px;"|-| <big><p>'''Note that Linux 5.4 requires manual configuration of the power on/off button before it can be used. For the opening method, please refer to [[Orange Pi Zero 2W#How to turn on the power button in Linux5.4|the method of opening the power button in Linux5.4]].'''</p></big>|}</li><li>Then select <p>Use the '''Network &ampreboot''' command to restart the Linux system in the development board</p>{| class="wikitable" style="width:800px; Internet" |-| <p>orangepi@orangepi:~$ '''sudo''' '''reboot'''</p>|}</li></ol>
[[File:zero2w<span id="linux-img314.png]]sdkorangepi-build-usage-instructions"></span>
<ol start="3" style'''Linux SDK——orangepi-build usage instructions''' ="list-style-type: decimal;"><li>Then turn on WI-FI</li></ol>
[[File:zero2w<span id="compilation-img315.png]]system-requirements"></span>== Compilation system requirements ==
The Linux SDK, '''orangepi-build''', only supports running on X64 computers with '''<ol start="4" span style="list-style-typecolor: decimal;#FF0000">Ubuntu 22.04<li/span>After turning on WI''' installed. Therefore, before downloading orangepi-FIbuild, you can see please first ensure that the Ubuntu version installed on your computer is Ubuntu 22.04. The command to check the Ubuntu version installed on the computer is as follows. If the searched signals under '''Available networksRelease field does not display '''.</lispan style="color:#FF0000">22.04</olspan>''', it means that the Ubuntu version currently used does not meet the requirements. Please change the system before performing the following operations.
[[File{| class="wikitable" style="width:zero2w800px;" |-img316.png]]| test@test:~$ '''lsb_release -a'''
<ol start="5" style="list-style-type: decimal;"><li>After selecting the WI-FI you want to connect to, the password input interface shown below will pop upNo LSB modules are available.</li></ol>
<div class="figure">Distributor ID: Ubuntu
[[FileDescription:zero2w-img317Ubuntu 22.png]]04 LTS
Release: '''</div><ol start="6" span style="list-style-typecolor: decimal;#FF0000"><li>Then use the keyboard to enter the password corresponding to the WI-FI, and then use the mouse to click the Enter button on the virtual keyboard to start connecting to the WI-FI22.04</li></olspan>'''
<div class="figure">Codename: '''jammy'''|}
[[File:zero2wIf the computer is installed with a Windows system and does not have Ubuntu 22.04 installed on it, you can consider using'''VirtualBox''' or '''VMware''' to install an Ubuntu 22.04 virtual machine in the Windows system. But please note, do not compile orangepi-build on the WSL virtual machine, because orangepi-build has not been tested in the WSL virtual machine, so there is no guarantee that orangepi-build can be used normally in WSL. In addition, please do not compile the Linux system on the development board. Use orangepi-img318build.png]]The installation image download address of Ubuntu 22.04 amd64 version is:
</div><ol start{| class="7wikitable" style="list-style-typewidth: decimal800px;"><li>The display after successful WI|-| [https://repo.huaweicloud.com/ubuntu-releases/21.04/ubuntu-21.04-FI connection is as shown below<desktop-amd64.iso '''https:/li></ol>mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ubuntu-22.04-desktop-amd64.iso''']|}
[[FileAfter installing Ubuntu 22.04 on your computer or virtual machine, please first set the software source of Ubuntu 22.04 to Tsinghua source (or other domestic sources that you think is fast), otherwise it is easy to make errors due to network reasons when installing the software later. The steps to replace Tsinghua Source are as follows:zero2w-img319.png]]
<span idol style="howlist-to-use-wistyle-fitype: lower-hotspotalpha;"><li>For the method of replacing Tsinghua Source, please refer to the instructions on this page.</spanli>== How to use WI-FI hotspot ==
# First, please make sure that the Ethernet port is connected to the network cable and can access the Internet normally{| class="wikitable" style="width:800px;" |-| [https://mirrors.tuna.tsinghua.edu.# Then select cn/help/ubuntu/ '''Settingshttps://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/''']|}</ol><ol start="2" style="list-style-type: lower-alpha;"><li>Note that the Ubuntu version needs to be switched to 22.04.</li>
[[File:zero2w-img306img271.png]]</ol><ol start="3" style="list-style-type: lower-alpha;"><li>The contents of the '''/etc/apt/sources.list''' file that need to be replaced are:</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''sudo mv /etc/apt/sources.list cat /etc/apt/sources.list.bak'''
<ol start="3" style="list-style-typetest@test: decimal;"><li>Then select ~$ '''Network &amp; Internetsudo vim /etc/apt/sources.list'''</li></ol>
[[File:zero2w-img314'''#''' The source code image is commented by default to improve apt update speed. You can uncomment it yourself if necessary.png]]
<ol start="4" style="list-style-typedeb https: decimal;"><li>Then select '''WIFI hotspot'''</li></ol>mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
[[File'''#''' deb-src https:zero2w-img320//mirrors.tuna.tsinghua.edu.png]]cn/ubuntu/ jammy main restricted universe multiverse
<ol start="5" style="list-style-typedeb https: decimal;"><li>Then open '''Hotspot Enable'''//mirrors. You can also see the name and password of the generated hotspot in the picture belowtuna. Remember them and use them when connecting to the hotspot (if you need to modify the name and password of the hotspot, you need to close Hotspot Enable firsttsinghua. Then you can modify it)<edu.cn/li><ubuntu/ol>jammy-updates main restricted universe multiverse
[[File'''#''' deb-src https:zero2w//mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-img321.png]]updates main restricted universe multiverse
<ol start="6" style="list-style-typedeb https: decimal;"><li>At this time, you can take out your mobile phone//mirrors. If everything is normal, you can find the WIFI hotspot with the same name ('''here AndroidAP_7132''') shown under the '''Hotspot name''' in the picture above in the WI-FI list searched by the mobile phonetuna. Then you can click AndroidAP_7132 to connect to the hotspottsinghua. The password can be seen under the '''Hotspot password''' in the picture aboveedu.<cn/li><ubuntu/ol>jammy-backports main restricted universe multiverse
[[File'''#''' deb-src https:zero2w//mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-img322.png]]backports main restricted universe multiverse
<ol start="7" style="list-style-typedeb https: decimal;"><li>After the connection is successful, it will be displayed as shown below (the interface will be different on different mobile phones, the specific interface is subject to the one displayed on your mobile phone)//mirrors. At this time, you can open a web page on your mobile phone to see if you can access the Internettuna. If the web page can be opened normally, it means that the '''WI-FI Hotspot''' of the development board can be used normallytsinghua.edu.<cn/li><ubuntu/ol>jammy-security main restricted universe multiverse
[[File'''#''' deb-src https:zero2w//mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-img323.png]]security main restricted universe multiverse
<span id="how-to-check-the-ip-address-of-the-ethernet-port"></span>
== How to check the IP address of the Ethernet port ==
'''# There is no wired network interface on the main board of the development board. We can expand the 100M Ethernet through a 24pin expansion board.''' Pre-release software source, not recommended to be enabled
[[File'''#''' deb https:zero2w//mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-img107.png]]proposed main restricted universe multiverse
'''#''' deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse|}</ol><ol start="24" style="list-style-type: decimallower-alpha;"><li><p>Then make sure After the network port of the expansion board is connected replacement, you need to update the router or switch</p>package information and ensure that no errors are reported.</li><li><p>Then open {| class="wikitable" style="width:800px;" |-| test@test:~$ '''Settingssudo apt-get update'''|}</pol><p>[[Fileol start="5" style="list-style-type:zero2wlower-img324.png]]</p></lialpha;"><li><p>Then select '''Network &amp; Internet'''</p><p>[[Filespan style="color:zero2w-img325.png]]</p></li><li><p#FF0000">Then you can see In addition, since the IP address source code of the development board's wired network port at kernel and Uboot are stored on GitHub, it is very important to ensure that the computer can download the location shown in code from GitHub normally when compiling the picture belowimage.</p><p>[[File:zero2w-img326.png]]</pspan>'''</li></ol>
<span id="bluetoothobtain-connectionthe-methodsource-code-of-linux-sdk"></span>== Bluetooth connection method ==
# Choose first '''Settings'''== Obtain the source code of linux sdk ==
[[File:zero2w<span id="download-img306.png]]orangepi-build-from-github"></span>=== Download orangepi-build from github ===
<ol start="2" style="listLinux sdk refers to the orangepi-stylebuild set of codes. Orangepi-typebuild is modified based on the armbian build compilation system. Multiple versions of Linux images can be compiled using orangepi-build. Use the following command to download the orangepi-build code: decimal;"><li>Then select '''Bluetooth'''</li></ol>
[[File{| class="wikitable" style="width:zero2w800px;" |-img327.png]]| test@test:~$ '''sudo apt-get update'''
<ol start="3" style="list-style-typetest@test: decimal;"><li>Then Open ~$ '''Bluetooth Enablesudo apt-get install -y git'''</li></ol>
[[Filetest@test:zero2w~$ '''git clone https://github.com/orangepi-xunlong/orangepi-build.git -b next'''|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note that when using the H618 Soc development board, you need to download the source code of the <span style="color:#FF0000">next</span> branch of orangepi-build. The above git clone command needs to specify the branch of the orangepi-img328build source code as next.png]]'''</big>
<ol startdiv class="4figure" style="list-style-type: decimal;"><li>Then click '''Pair new device'''to start scanning for surrounding Bluetooth devices</li></ol>
[[File:zero2w-img329img272.png|center|800px]]
<ol start/div>|}{| class="5wikitable" style="listbackground-style-typecolor:#ffffdc;width: decimal800px;">|-| <libig>The searched Bluetooth devices will be displayed under '''Available devicesWhen downloading the orangepi-build code through the git clone command, you do not need to enter the user name and password of the github account (the same is true for downloading other codes in this manual). If after entering the git clone command, Ubuntu PC prompts you to enter the user name of the github account. The name and password are usually entered incorrectly in the address of the orangepi-build warehouse behind git clone. Please carefully check whether there are any errors in the spelling of the command, rather than thinking that we have forgotten to provide the username and password of the github account.'''</li></olbig>|}
[[FileThe u-boot and linux kernel versions currently used by the H618 series development boards are as follows:zero2w-img330.png]]
<ol start{| class="6wikitable" style="listwidth:800px;text-style-typealign: decimalcenter;"><li>Then click on the Bluetooth device you want to connect to start pairing|-| '''branch'''| '''u-boot Version'''| '''linux Kernel version'''|-| '''current'''| '''u-boot v2018.05'''| '''linux5.4'''|-| '''next'''| '''u-boot v2021. When the following interface pops up, please use the mouse to select the 07'''Pair| '''option</li></ol>linux6.1'''|}
[[File{| class="wikitable" style="background-color:#ffffdc;width:zero2w800px;" |-| <big>'''The branch mentioned here is not the same thing as the branch of orangepi-img331build source code, please don't get confused. This branch is mainly used to distinguish different kernel source code versions.png]]'''
<ol start="7" style="list-style-type: decimal;"><li>What is tested here is '''We define the Bluetooth configuration process between the development board and linux5.4 bsp kernel currently provided by Allwinner as the Android phonecurrent branch. At this time, the following confirmation interface will pop up on the phoneThe latest linux6. Click 1 LTS kernel is defined as the pairing button on the phone to start the pairing processnext branch.'''</li></olbig>|}
[[FileAfter downloading, the following files and folders will be included:zero2w-img332.png]]
<ol start="8" style="list-style-type: decimallower-alpha;"><li>After pairing is completed<p>'''build.sh''': Compile startup script</p></li><li><p>'''external''': Contains configuration files needed to compile the image, specific scripts, and source code of some programs, open etc.</p></li><li><p>'''LICENSE'Paired devices'': GPL 2 license file</p></li><li><p>''' and you will see the paired Bluetooth devicesREADME.md''': orangepi-build documentation</p></li><li><p>'''scripts''': Common script for compiling linux images</p></li></ol>{| class="wikitable" style="width:800px;" |-| test@test:~/orangepi-build$ '''ls'''
[[File'''build.sh &nbsp;&nbsp;&nbsp;&nbsp; external &nbsp;&nbsp;&nbsp;&nbsp; LICENSE &nbsp;&nbsp;&nbsp;&nbsp; README.md &nbsp;&nbsp;&nbsp;&nbsp; scripts'''|}{| class="wikitable" style="background-color:#ffffdc;width:zero2w800px;" |-| <big>'''If you downloaded the orangepi-build code from github, after downloading, you may find that orangepi-build does not contain the source code of u-boot and linux kernel, and there is no cross-compilation tool required to compile u-boot and linux kernel. chain, this is normal, because these things are stored in other separate github repositories or some servers (their addresses will be detailed below). Orangepi-build will specify the addresses of u-boot, Linux kernel and cross-compilation tool chain in the script and configuration file. When running orangepi-img333build, when it finds that these things are not available locally, it will automatically download them from the corresponding places.png]]'''</big>|}
<ol startspan id="9" style="listdownload-the-cross-compilation-styletool-type: decimal;chain"><li>At this time, you can use the Bluetooth of your mobile phone to send a picture to the development board. After sending, you can see the following confirmation interface in the Android system of the development board, and then click '''Accept''' to start receiving the pictures sent by the mobile phone.</li></olspan>
[[File:zero2w=== Download the cross-img334.png]]compilation tool chain ===
<ol start="10" style="listWhen orangepi-style-type: decimal;"><li>Pictures received by build is run for the Bluetooth system of first time, it will automatically download the development board Android system can be viewed cross-compilation '''toolchain''' and put it in the '''toolchains'Received files''folder. Every time you run orangepi-build's build.sh script, it will check whether the cross-compilation toolchain in toolchains exists. If If it does not exist, the download will be restarted. If it exists, it will be used directly without repeated downloading.</li></ol>
[[File:zero2w-img335.png]]<div class="figure">
<span id="how[[File:zero2w-to-set-usb0-to-host-mode-1"></span>== How to set USB0 to HOST mode ==img273.png]]
As shown in </div>The mirror URL of the figure below, there are two Typecross-C interfaces on compilation tool chain in China is the motherboard open source software mirror site of the development boardTsinghua University: USB0 and USB1. Both of these interfaces can be used to power the development board, and they can also be used as USB2.0 HOST interfaces. The difference between USB0 and USB1 is that in addition to being set to HOST mode, USB0 can also be set to Device mode, while USB1 only has HOST mode.
{| class="wikitable" style="width:800px;" |-| [[Filehttps:zero2w//mirrors.tuna.tsinghua.edu.cn/armbian-img160releases/_toolchain/ '''https://mirrors.tuna.tsinghua.edu.png]cn/armbian-releases/_toolchain/''']|}
USB0 of the Android12 TV system released by Orange Pi is set to Device mode by default, so when there After toolchains is no need to use USB0 Device mode (ADB function needs to ensure that USB0 is in Device mode)downloaded, it is recommended to use USB0 for power supply, so that USB1 can be directly used to connect USB devices .will contain multiple versions of cross-compilation '''toolchain''':
If you want to use USB0 to connect USB devices, you need to set USB0 to HOST mode. The method is as follows{| class="wikitable" style="width:800px;" |-| test@test:~/orangepi-build$ '''ls toolchains/'''
<ol style="listgcc-stylearm-type: lower11.2-alpha;"><li>Run the following command to set USB0 to HOST mode:</li></ol>2022.02-x86_64-aarch64-none-linux-gnu
apollogcc-p2:/ # '''cat /sys/devices/platform/soc@3000000/soc@3000000\:usbc0@0/usb_host'''linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu
host_chose finished!gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi
apollogcc-p2:/ #arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf
<ol start="2" style="listgcc-stylelinaro-type: lower4.9.4-alpha;"><li>Run the following command to switch back to Device mode</li></ol>2017.01-x86_64_arm-linux-gnueabi
apollogcc-p2:/ # '''cat /sys/devices/platform/soc@3000000/soc@3000000\:usbc0@0/usb_device'''linaro-aarch64-none-elf-4.8-2013.11_linux
device_chose finished!gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu
apollogcc-p2:/ #linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf
<ol start="3" style="listgcc-stylelinaro-type: lowerarm-alpha;"><li>The command to view the current mode of USB0 is</li></ol>linux-gnueabihf-4.8-2014.04_linux
apollogcc-p2:/ # '''cat /sys/devices/platform/soc@3000000/soc@3000000\:usbc0@0/otg_role'''arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf
usb_hostgcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu
<span id="howgcc-tolinaro-usearm-usbnone-camera"></span>eabi-4.8-2014.04_linux== How to use USB camera ==|}
# First insert The cross-compilation tool chain used to compile the USB (UVC protocol) camera into the USB interface of the development board# If the USB camera H618 Linux kernel source code is recognized normally, the corresponding video device node will be generated under /dev:
console<ol style="list-style-type:lower-alpha;"><li>linux5.4</ # li>{| class="wikitable" style="width:800px;" |-| '''gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu'''ls |}</devol><ol start="2" style="list-style-type: lower-alpha;"><li>linux6.1</video0li>{| class="wikitable" style="width:800px;" |-| '''gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu'''|}</ol>The cross-compilation tool chain used to compile the H618 u-boot source code is:
<ol style="list-style-type: lower-alpha;"><li>v2018.05</devli>{| class="wikitable" style="width:800px;" |-| '''gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi'''|}</video0ol><ol start="2" style="list-style-type: lower-alpha;"><li>v2021.07</li>{| class="wikitable" style="width:800px;" |-| '''gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu'''|}</ol><span id="orangepi-build-complete-directory-structure-description"></span>
<ol start="3" style="list= orangepi-style-type: decimal;"><li><p>Then make sure that the adb connection between the Ubuntu PC and the development board is normal. For how to use adb, please refer to the instructions in the section &quot;'''How to use ADB'''&quot;.</p></li><li><p>Download the USB camera test APP from the '''official tool''' on the development board information download page</p></li></ol>build complete directory structure description ===
<div ol style="list-style-type: decimal;"><li><p>After downloading, the orangepi-build warehouse does not contain the source code of the linux kernel, u-boot and cross-compilation tool chain. The source code of the linux kernel and u-boot is stored in an independent git warehouse.</p><ol style="list-style-type: lower-alpha;"><li><p>The git warehouse where the linux kernel source code is stored is as follows. Please note that the branch of the linux-orangepi warehouse is switched to</p><ol style="list-style-type: none;"><li>a) Linux5.4</li>{| class="figurewikitable"style="width:800px;" |-| https://github.com/orangepi-xunlong/linux-orangepi/tree/'''orange-pi-5.4-sun50iw9'''|}</ol><ol start="2" style="list-style-type: lower-alpha;">[[File<li>b) Linux6.1</li>{| class="wikitable" style="width:zero2w800px;" |-img336| https://github.png]]com/orangepi-xunlong/linux-orangepi/tree/'''orange-pi-6.1-sun50iw9'''|}</ol></li></ol><ol start="2" style="list-style-type: lower-alpha;"><li><p>The git warehouse where the u-boot source code is stored is as follows. Please note that the branch of the u-boot-orangepi warehouse is switched to</divp><div ol style="list-style-type: lower-alpha;"><li>a) v2018.05</li>{| class="figurewikitable" style="width:800px;" |-| https://github.com/orangepi-xunlong/u-boot-orangepi/tree/'''v2018.05-h618'''|}</ol><ol start="2" style="list-style-type: lower-alpha;"><li>b) v2021.07</li>[[File{| class="wikitable" style="width:zero2w800px;" |-img337| https://github.com/orangepi-xunlong/u-boot-orangepi/tree/'''v2021.png]]07-sunxi'''|}</divol></li></ol></li></ol><ol start="52" style="list-style-type: decimal;"><li>Then use <p>When orangepi-build is run for the adb command first time, it will download the cross-compilation tool chain, u-boot and linux kernel source code. After successfully compiling a linux image, the files and folders that can be seen in orangepi-build are:</p><ol style="list-style-type: lower-alpha;"><li><p>'''build.sh''': Compile startup script</p></li><li><p>'''external''': Contains the configuration files needed to install compile the USB camera test APP into image, scripts for specific functions, and the Android systemsource code of some programs. Of course, you can The rootfs compressed package cached during the image compilation process is also use a USB disk copy to install itstored in external.</p></li><li><p>'''kernel''': Store the source code of the linux kernel</p></li><li><p>'''LICENSE''': GPL 2 license file</p></li><li><p>'''README.md''': orangepi-build documentation</p></li><li><p>'''output''': Store compiled u-boot, linux and other deb packages, compilation logs, and compiled images and other files</p></li><li><p>'''scripts''': Common script for compiling linux images</p></li><li><p>'''toolchains''': Store cross-compilation tool chain</p></li><li><p>'''u-boot''': Store the source code of u-boot</p></li><li><p>'''userpatches''': Store the configuration files needed to compile the script</p></olli>{| class="wikitable" style="width:800px;" |-| test@test:~/orangepi-build$ '''ls'''
test@test:~$ '''adb install usbcamerabuild.apksh &nbsp;&nbsp;&nbsp;&nbsp; external &nbsp;&nbsp;&nbsp;&nbsp; kernel &nbsp;&nbsp;&nbsp;&nbsp; LICENSE &nbsp;&nbsp;&nbsp;&nbsp; output &nbsp;&nbsp;&nbsp;&nbsp; README.md &nbsp;&nbsp;&nbsp;&nbsp; scripts &nbsp;&nbsp;&nbsp;&nbsp; toolchains &nbsp;&nbsp;&nbsp;&nbsp; u-boot &nbsp;&nbsp;&nbsp;&nbsp; userpatches'''|}</ol></li></ol>
<ol startspan id="6" style="listcompile-styleu-type: decimal;boot"><li>After installation, you can see the startup icon of the USB camera on the Android desktop.</li></olspan>
[[File:zero2w== Compile u-img338.png]]boot ==
<ol start="7" style="list-style-type: decimal;"><li>Then double-click to open the USB camera APP and you can see the output video of # Run the USB camerabuild.</li></ol>sh script, remember to add sudo permissions
<span id{| class="androidwikitable" style="width:800px;" |-system-root| test@test:~/orangepi-description"><build$ '''sudo ./span>build.sh'''== Android system ROOT description ==|}
'''The Android system released by Orange Pi has been ROOT and can be tested using the following method.'''<ol start="2" style="list-style-type: decimal;"> # Download from the <li>Select '''official tool''' on the development board data download page '''rootcheck.apkU-boot package'''and press Enter</li>
<div class="figure">
[[File:zero2w-img336img274.png]]
</div><div class="figure"> [[File:zero2w-img339.png]] </divol><ol start="23" style="list-style-type: decimal;"><li><p>Then make sure that the adb connection between select the Ubuntu PC and model of the development board is normal. For how to use adb, please refer to the instructions in the section &quot;'''How to use ADB'''&quot;.</p></li><li><p>Then use the adb command to install rootcheck.apk into the Android system. Of course, you can also use a USB disk copy to install it.</p></li></ol> test@test:~$ '''adb install rootcheck.apk'''
[[File:zero2w-img275.png]]
</ol>
<ol start="4" style="list-style-type: decimal;">
<li>After installation, you can see <p>Then select the startup icon branch type of u-boot</p><ol style="list-style-type: lower-alpha;"><li><p>The current branch will compile the ROOT test tool on u-boot v2018.05 version code that needs to be used by the Android desktoplinux5.4 image.</p></li><li><p>The next branch will compile the u-boot v2021.07 version code that needs to be used by the linux6.1 image.</olp<p>[[File:zero2w-img340img276.png]]</p></li></ol></li><li><p>If you select the next branch, you will also be prompted to select the memory size, and you do not need to select the current branch.</p><ol start="5" style="list-style-type: decimallower-alpha;"><li>The display interface after opening <p>If the '''ROOT test tool''' for development board you purchased has a memory size of 1.5GB, please select the first time is as shown belowoption.</p></li><li><p>If the development board you purchased has 1GB or 2GB or 4GB memory size, please choose the second option.</olp<p>[[File:zero2w-img341img277.png]]</p></li></ol></li></ol>
<ol start="6" style="list-style-type: decimal;">
<li><p>Then you can click '''CHECK NOW''' it will start to start checking the ROOT status compile u-boot. Some of the Android system. After the check is completed, information prompted when compiling the display next branch is as follows. You can see that the Android system has obtained ROOT permissions.:</p><ol style="list-style-type: lower-alpha;"><li>Version of u-boot source code</olli>{| class="wikitable" style="width:800px;" |-| [o.k. ] Compiling u-boot [File:zero2w-img342'''v2021.png]07''' ]|}</ol><span idol start="how2" style="list-tostyle-usetype: lower-miracastreceiveralpha;"><li>Version of the cross-tocompilation tool chain</li>{| class="wikitable" style="width:800px;" |-cast| [ o.k. ] Compiler version [ '''aarch64-thelinux-mobilegnu-phonegcc 11''' ]|}</ol><ol start="3" style="list-style-screentype: lower-alpha;"><li>Path to-thecompiled u-development-board">boot deb package</spanli>{| class="wikitable" style= How to use MiracastReceiver to cast the mobile phone screen to the development board =="width:800px;" |-| [ o.k. ] Target directory [ '''orangepi-build/output/debs/u-boot''' ]|}</ol><ol start="4" style="list-style-type: decimallower-alpha;"><li>The package name of the compiled u-boot deb package<p/li>First, please make sure that both the development board and the mobile phone are connected to the same WIFI hotspot{| class="wikitable" style="width:800px;" |-| [ o.k. For the method of connecting the development board to WIFI, please refer to ] File name [ '''the instructions in the WIlinux-u-boot-next-FI connection methodorangepizero2w_x.x.x_arm64.deb''']|}</pol></liol start="5" style="list-style-type: lower-alpha;"><li>Compilation time<p/li>Then open the {| class="wikitable" style="width:800px;" |-| [ o.k. ] Runtime [ '''MiracastReceiver1 min'''application in ]|}</ol><ol start="6" style="list-style-type: lower-alpha;"><li>Repeat the command to compile u-boot. Use the Android system of following command without selecting through the development boardgraphical interface. You can start compiling u-boot directly.</pli><p>[[File{| class="wikitable" style="width:zero2w800px;" |-img343| [ o.k.png]Repeat Build Options [ '''sudo ./build.sh BOARD=orangepizero2w BRANCH=next BUILD_OPT=u-boot''' ]|}</pol></li></ol><liol start="7" style="list-style-type: decimal;"><pli>The interface after '''MiracastReceiver''' is opened is as followsView the compiled u-boot deb package</pli><div {| class="figurewikitable" style="width:800px;">|-| [[Filetest@test:zero2w~/orangepi-build$ '''ls output/debs/u-img344.png]]boot/'''
</div></li><li><p>Then find the screen mirroring function in the phone settings. Here we take '''Xiaomi 12S Pro mobile phonelinux-u-boot-next-orangepizero2w_x.x.x_arm64.deb''' as an example. Please research other brands of mobile phones by yourself. As shown in the picture below, click the button in the red box to open the screen mirroring function of the phone.|}</pol><p>[[Fileol start="8" style="list-style-type:zero2w-img345.png]]</p></lidecimal;"><li><p>After waiting for a period When the orangepi-bulid compilation system compiles the u-boot source code, it will first synchronize the u-boot source code with the u-boot source code of timethe github server. Therefore, if you will be able want to see modify the searched connectable devices on your mobile phoneu-boot source code, and then we can select the device corresponding you first need to turn off the development board to connect.</p><p>[[File:zero2w-img346.png]]</p></li><li><p>Then the selection box shown in the figure below will pop up in the '''MiracastReceiver''' application interface download and update function of the development boardsource code. Here we can select ('''Accept'''</p><p>[[File:zero2wYou need to completely compile u-img347.png]]</p></li><li><p>Then boot before you can see turn off this function, otherwise it will prompt that the content source code of u-boot cannot be found'''), otherwise the mobile phone screen on the HDMI screen connected to the development board</p><p>[[Filemodifications will be restored. The method is as follows:zero2w-img348.png]]</p></li></ol>
<span id="method-of-turning-on-and-off-Set theIGNORE_UPDATES variable in u'''userpatches/config-machine-through-buttons-or-infrared-remote-control"></span>== Method of turning on and off the machine through buttons or infrared remote control ==default.conf''' to &quot;yes&quot;
We can turn off or turn on the Android system of the development board through the power on{| class="wikitable" style="width:800px;" |-| test@test:~/off button or infrared remote control. However, it should be noted that there is no power onorangepi-build$ '''vim userpatches/off button and infrared receiver on the main board of the development board, and it needs to be expanded through a 24pin expansion boardconfig-default.conf'''
[[File:zero2w-img107.png]].....
The location of the power button on the 24pin expansion board is as shown in the figure belowIGNORE_UPDATES=&quot;'''<span style="color:#FF0000">yes</span>'''&quot;
[[File......|}</ol><ol start="9" style="list-style-type:zero2wdecimal;"><li><p>When debugging u-img269boot code, you can use the following method to update u-boot in the linux image for testing</p><ol style="list-style-type: lower-alpha;"><li>First upload the compiled deb package of u-boot to the Linux system of the development board.png]]</li>{| class="wikitable" style="width:800px;" |-| test@test:~/orangepi-build$ '''cd output/debs/u-boot'''
The location of the infrared remote control power button is as followstest@test:~/orangepi_build/output/debs/u-boot$ '''scp \'''
'''linux-u-boot-next-orangepizero2w_x.x.x_arm64.deb [[Filemailto:root@192.168.1.xxx:/root root@192.168.1.xxx:/root]'''|}</ol><ol start="2" style="list-style-type: lower-alpha;"><li>Install the new u-boot deb package just uploaded</li>{| class="wikitable" style="width:800px;" |-| orangepi@orangepi:zero2w~$ '''sudo dpkg -i''' '''linux-u-boot-img349next-orangepizero2w_x.x.x_arm64.png]]deb'''|}</ol><ol start="3" style="list-style-type: lower-alpha;"><li>Then run the nand-sata-install script</li>{| class="wikitable" style="width:800px;" |-| orangepi@orangepi:~$ '''sudo nand-sata-install'''|}</ol><ol start="4" style="list-style-type: lower-alpha;"><li>Then select '''5 Install/Update the bootloader on SD/eMMC'''</li>
When shutting down, we need to press and hold [[File:zero2w-img278.png]]</ol><ol start="5" style="list-style-type: lower-alpha;"><li>After pressing the power button or the power button on the infrared remote controlEnter key, and then the Android system a Warning will pop up the confirmation dialog box shown in the figure below, and then select '''OK''' to shut down the Android systemfirst.</li>
[[File:zero2w-img350img279.png]]</ol><ol start="6" style="list-style-type: lower-alpha;"><li>Press the Enter key again to start updating u-boot. After the update is completed, the following information will be displayed.</li>
After shutting down, press and hold [[File:zero2w-img280.png]]</ol><ol start="7" style="list-style-type: lower-alpha;"><li>Then you can restart the power button or development board to test whether the power button on u-boot modification has taken effect.</li></ol></li></ol><span id="compile-the infrared remote control again to turn it on.-linux-kernel"></span>
<span id="pin-interface-gpio-uart-spi-test"></span>== 40pin interface GPIO, UART, SPI test Compile the linux kernel ==
# Run the '''Note: The pin header on the 40pin interface is not soldered by default, and you need to solder it yourself before it can be usedbuild.sh'''script, remember to add sudo permissions
<span id::{| class="pin-gpio-portwikitable" style="width:800px;" |-| test@test:~/orangepi-method"><build$ '''sudo ./span>build.sh'''=== 40pin GPIO port test method ===|}
# First open wiringOP APP on the desktop<ol start="2" style="list-style-type: decimal;"><li>Select '''Kernel package''' and press Enter</li>
[[File:zero2w-img351.png]]<div class="figure">
<ol start="2" style="list-style-type: decimal;"><li>Then click the '''GPIO_TEST''' button to open the GPIO test interface</li></ol> [[File:zero2w-img352img281.png]]
</div></ol>
<ol start="3" style="list-style-type: decimal;">
<li>The GPIO test interface is as shown in the figure below. The two rows of '''CheckBox''' buttons on the left have a one-Then you will be prompted whether you need to-one correspondence with display the 40pin pinskernel configuration interface. When the '''CheckBox''' button is checked, the corresponding GPIO pin will be set If you do not need to '''OUT''' mode and modify the pin level is set to high level; when uncheckedkernel configuration, select the GPIO pin level will be set to low level; when the GPIO is clicked When you click the '''GPIO READALL''' button, you can get information such as wPi number, GPIO mode, pin level, etcfirst one.; when If you click need to modify the'''BLINK ALL GPIO''' buttonkernel configuration, all GPIO ports will cycle through outputting high and low levels. This function can be used to test all select the 40pin pins. GPIO portsecond one.</li></ol> [[File:zero2w-img353.png]]
[[File:zero2w-img282.png]]
</ol>
<ol start="4" style="list-style-type: decimal;">
<li>Then click select the '''GPIO READALL''' button, and model of the output information is as shown below:development board</li></ol>
[[File:zero2w-img275.png]]<div class/ol><ol start="5" style="figurelist-style-type: decimal;"><li>Then select the branch type of the kernel source code</li>
[[File:zero2w-img354:a. The current branch will compile the linux5.png]]4 kernel source code
</div><ol start="5" style="list-style-type: decimal;"><li>There are a total of 28 GPIO ports available in the 40-pin development board:b. The following takes pin 12 - corresponding to GPIO PI01 - corresponding to wPi serial number 6 - as an example to demonstrate how to set the high and low levels of the GPIO port. First click the '''CheckBox''' button corresponding to pin 12. When the button is selected, pin 12 next branch will be set to high level. After setting, you can use a multimeter to measure the value of the voltage of the pin. If it is '''3.3v''', it means compile the setting High level successlinux6.</li></ol>1 kernel source code
::[[File:zero2w-img355img276.png]]</ol><ol start="6" style="list-style-type: decimal;"><li>If you choose to display the kernel configuration menu (the second option) in step 3), the kernel configuration interface opened through '''make menuconfig''' will pop up. At this time, you can directly modify the kernel configuration. After modification, save and exit. Yes, compilation of the kernel source code will begin after exiting.</li>
<ol start="6" style="list[[File:zero2w-style-type: decimal;"><li>Then click the '''GPIO READALL''' button and you can see that the current pin 12 mode is '''OUT''' and the pin level is high levelimg283.</li></ol>png]]
[[File<ol style="list-style-type: lower-alpha;"><li>If you do not need to modify the kernel configuration options, when running the build.sh script, pass '''KERNEL_CONFIGURE=no''' to temporarily block the pop-up of the kernel configuration interface.</li>{| class="wikitable" style="width:800px;" |-| test@test:~/orangepi-build$ '''sudo ./build.sh KERNEL_CONFIGURE=no'''|}</ol><ol start="2" style="list-style-type:zero2wlower-img356alpha;"><li><p>b. You can also set '''KERNEL_CONFIGURE=no''' in the orangepi-build/userpatches/config-default.confconfiguration file to permanently disable this function.</p></li><li><p>If the following error is prompted when compiling the kernel, it is because the Ubuntu PC terminal interface is too small, causing the make menuconfig interface to be unable to be displayed. Please increase the Ubuntu PC terminal to the maximum size, and then rerun the build.sh script.png]]</p></li>
[[File:zero2w-img284.png]]
</ol>
</ol>
<ol start="7" style="list-style-type: decimal;">
<li>Click the '''CheckBox''' button in the picture below again to uncheck it, and pin 12 will be set to low level. After setting, you can use a multimeter to measure the voltage value <p>Part of the pin. If it is '''0v''', it means information prompted when compiling the low level setting next branch kernel source code is successful.</li>explained as follows:</olp[[File:zero2w-img357.png]] <ol start="8" style="list-style-type: decimallower-alpha;"><li>Then click Version of the '''GPIO READALL''' button and you can see that the current pin 12 mode is OUT and the pin level is low level.linux kernel source code</li></ol> [[File:zero2w-img358.png]] <span id="pin-uart-test-method"></span>=== 40pin UART test method === # As can be seen from the table below, the default uarts available in the Android12 TV system are uart2 and uart5. Please note that uart0 is set as a debugging serial port by default. Please do not use uart0 as a normal serial port. {| class="wikitable" style="width:800px;"
|-
| '''GPIO序号'''| [ o.k. ] Compiling current kernel [ '''GPIO6.1.31''']| '''功能'''}| '''引脚'''|| '''引脚'''</ol>| '''功能'''<ol start="2" style="list-style-type: lower-alpha;">| '''GPIO'''<li>The version of the cross-compilation tool chain used</li>{| '''GPIO序号'''class="wikitable" style="width:800px;"
|-
| style="text-align: left;"|| style="text-align: left;"|| '''3[ o.k.3V] Compiler version [ '''| '''1aarch64-linux-gnu-gcc 11''']|}| '''2'''</ol>| '''5V'''| <ol start="3" style="textlist-style-aligntype: leftlower-alpha;"|><li>The default configuration file used by the kernel and the path where it is stored are as follows</li>{| class="wikitable" style="text-alignwidth: left800px;"|
|-
| '''264'''| [ o.k. ] Using kernel config file [ '''PI8'''| '''TWI1orangepi-build/external/config/kernel/linux-6.1-sun50iw9-SDAnext.config''']| '''3'''}|</ol>| '''<ol start="4'''| '''5V'''| " style="textlist-alignstyle-type: leftlower-alpha;"|><li>The path to the kernel-related deb package generated by compilation</li>{| class="wikitable" style="text-alignwidth: left800px;"|
|-
| [ o.k. ] Target directory [ '''263output/debs/''']| '''PI7'''}| '''TWI1-SCL'''</ol>| '''<ol start="5'''|| '''6'''| '''GND'''| " style="textlist-alignstyle-type: leftlower-alpha;"|><li>The package name of the kernel image deb package generated by compilation</li>{| class="wikitable" style="text-alignwidth: left800px;"|
|-
| '''269'''| [ o.k. ] File name [ '''PI13linux-image-next-sun50iw9_x.x.x_arm64.deb''']| '''PWM3'''}| '''7'''|| '''8'''</ol>| '''UART0_TX'''<ol start="6" style="list-style-type: lower-alpha;">| '''PH0'''<li>Compilation time</li>{| '''224'''class="wikitable" style="width:800px;"
|-
| [ o.k. ] Runtime [ '''10 min''' ]|}</ol><ol start="7" style="textlist-alignstyle-type: leftlower-alpha;"|><li>Finally, the compilation command to repeatedly compile the last selected kernel will be displayed. Use the following command without selecting through the graphical interface, and you can directly start compiling the kernel source code.</li>{| class="wikitable" style="text-alignwidth: left800px;"|| '''GND'''| '''9'''|| '''10'''| '''UART0_RX'''| '''PH1'''| '''225'''
|-
| [ o.k. ] Repeat Build Options [ '''226sudo ./build.sh BOARD=orangepizero2w BRANCH=next BUILD_OPT=kernel KERNEL_CONFIGURE=no''']| '''PH2'''}</ol></li></ol><ol start="8" style="list-style-type: decimal;"><li><p>View the kernel-related deb package generated by compilation</p><ol style="list-style-type: lower-alpha;">| <li><p>'''UART5_TXlinux-dtb-next-sun50iw9_x.x.x_arm64.deb'''Contains dtb files used by the kernel</p></li>| <li><p>'''11linux-headers-next-sun50iw9_x.x.x_arm64.deb'''Contains kernel header files</p></li>|| <li><p>'''12linux-image-next-sun50iw9_x.x.x_arm64.deb'''Contains kernel images and kernel modules</p></li>{| class="wikitable" style="text-alignwidth: left800px;"|| '''PI1'''| '''257'''
|-
| test@test:~/orangepi-build$ '''227ls output/debs/linux-*''' output/debs/linux-dtb-next-sun50iw9_x.x.x_arm64.deb output/debs/linux-headers-next-sun50iw9_x.x.x_arm64.deb output/debs/linux-image-next-sun50iw9_x.x.x_arm64.deb| '''PH3'''}</ol></li></ol>| '''UART5_RX'''<ol start="9" style="list-style-type: decimal;">| <li>When the orangepi-bulid compilation system compiles the linux kernel source code, it will first synchronize the linux kernel source code with the linux kernel source code of the github server. Therefore, if you want to modify the linux kernel source code, you first need to turn off the update function of the source code ('''13it needs to be completely compiled once This function can only be turned off after obtaining the Linux kernel source code, otherwise it will prompt that the source code of the Linux kernel cannot be found'''), otherwise the modifications will be restored. The method is as follows:</li>|| Set the IGNORE_UPDATES variable in '''14userpatches/config-default.conf'''to &quot;yes&quot;| '''GND'''{| styleclass="text-align: left;wikitable"|| style="text-alignwidth: left800px;"|
|-
| test@test:~/orangepi-build$ '''261vim userpatches/config-default.conf'''| IGNORE_UPDATES=&quot;'''PI5<span style="color:#FF0000">yes</span>'''&quot;| '''UART2_TX'''}| '''15'''</ol>|<ol start="10" style="list-style-type: decimal;">| '''16'''<li><p>If the kernel is modified, you can use the following method to update the kernel and kernel module of the development board Linux system</p>| '''PWM4'''<ol style="list-style-type: lower-alpha;">| '''PI14'''<li>Upload the compiled deb package of the Linux kernel to the Linux system of the development board</li>{| '''270'''class="wikitable" style="width:800px;"
|-
| style="text-aligntest@test: left;"|| style="text~/orangepi-align: left;"|| build$ '''3.3Vcd output/debs'''| test@test:~/orangepi-build/output/debs$ '''17scp \'''|| '''18linux-image-next-sun50iw9_x.x.x_arm64.deb root@192.168.1.xxx:/root'''| }</ol><ol start="2" style="textlist-style-aligntype: leftlower-alpha;"|>| '''PH4'''<li>Install the deb package of the new linux kernel just uploaded.</li>{| '''228'''class="wikitable" style="width:800px;"
|-
| '''231'''| orangepi@orangepi:~$ '''PH7sudo dpkg -i linux-image-next-sun50iw9_x.x.x_arm64.deb'''| '''SPI1_MOSI'''}| '''19'''</ol>|| '''20'''| '''GND'''| <ol start="3" style="textlist-alignstyle-type: leftlower-alpha;"|><li>Then restart the development board and check whether the kernel-related modifications have taken effect.</li>{| class="wikitable" style="text-alignwidth: left800px;"|
|-
| orangepi@orangepi:~$ '''232sudo'''| '''PH8reboot'''| '''SPI1_MISO'''}</ol></li></ol><span id="compile-rootfs"></span>| '''21'''|== Compile rootfs ==| '''22'''| '''UART2_RX'''# Run the build.sh script, remember to add sudo permissions| '''PI6'''::{| '''262'''class="wikitable" style="width:800px;"
|-
| test@test:~/orangepi-build$ '''230sudo ./build.sh'''| } <ol start="2" style="list-style-type: decimal;"><li>Select '''PH6Rootfs and all deb packages'''and press Enter</li> <div class="figure"> [[File:zero2w-img285.png]] </div></ol><ol start="3" style="list-style-type: decimal;"><li>Then select the model of the development board</li> [[File:zero2w-img275.png]]</ol><ol start="4" style="list-style-type: decimal;"><li><p>Then select the branch type of the kernel source code. Different versions of the kernel source code maintain different rootfs types.</p><ol style="list-style-type: lower-alpha;"><li><p>In the current branch, you can see three options: debian11, ubuntu20.04, and ubuntu22.04.</p></li><li><p>In the next branch, you can see three options: debian11, debian12, and ubuntu22.04.</p></li>| '''SPI1_CLK'''| '''23'''[[File:zero2w-img276.png]]|</ol>| '''24'''</li></ol>| '''SPI1_CS0'''<ol start="5" style="list-style-type: decimal;">| '''PH5'''<li>Then select the type of rootfs</li>| '''229'''|[[File:zero2w-img286.png]]| </ol><ol start="6" style="textlist-alignstyle-type: leftdecimal;"|><li><p>Then select the type of image</p>| <ol style="textlist-alignstyle-type: leftlower-alpha;"|>| <li><p>'''GNDImage with console interface (server)'''Represents the image of the server version, which is relatively small in size.</p></li>| <li><p>'''25Image with desktop environment'''Represents an image with a desktop, which is relatively large in size.</p></li> <div class="figure"> [[File:zero2w-img287.png]]|| </div></ol></li></ol><ol start="7" style="list-style-type: decimal;"><li>If you are compiling the server version of the image, you can also choose to compile the Standard version or the Minimal version. The Minimal version will have much less pre-installed software than the Standard version ('''26please do not choose the Minimal version without special needs, because many things are not pre-installed by default. Some functions may not be available''')</li> <div class="figure"> [[File:zero2w-img288.png]] </div></ol><ol start="8" style="list-style-type: decimal;"><li>If you are compiling a desktop version of the image, you also need to select the type of desktop environment. Currently, only XFCE is maintained, so please select an XFCE type desktop.</li>| '''SPI1_CS1'''| '''PH9'''[[File:zero2w-img289.png]]| '''233'''|[[File:zero2w-img290.png]]| '''266'''| '''PI10'''You can then select additional packages that need to be installed. Please press the Enter key here to skip directly. | '''TWI2[[File:zero2w-SDA'''img291.png]]| '''27'''</ol>|<ol start="9" style="list-style-type: decimal;">| '''28'''<li><p>Then the compilation of rootfs will start. Some of the information prompted during compilation are as follows:</p>| '''TWI2<ol style="list-style-type: lower-SCL'''alpha;">| '''PI9'''<li>Type of rootfs</li>{| '''265'''class="wikitable" style="width:800px;"
|-
| [ o.k. ] local not found [ Creating new rootfs cache for '''256bullseye''']| '''PI0'''}</ol>| <ol start="2" style="textlist-alignstyle-type: leftlower-alpha;"|| '''29'''|>| '''30'''<li>The storage path of the compiled rootfs compressed package</li>{| '''GND'''| styleclass="text-align: left;wikitable"|| style="text-alignwidth: left800px;"|
|-
| [ o.k. ] Target directory [ '''271orangepi-build/external/cache/rootfs''']| '''PI15'''}</ol>| <ol start="3" style="textlist-style-aligntype: leftlower-alpha;"|>| '''31'''<li>The name of the rootfs compressed package generated by compilation</li>{|| '''32'''| '''PWM1'''| '''PI11'''| '''267'''class="wikitable" style="width:800px;"
|-
| '''268'''| '''PI12'''| '''PWM2'''| '''33'''|| '''34'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''258'''| [ o.k. ] File name [ '''PI2'''| style="textbullseye-align: left;"|| '''35'''|| '''36'''| style="textxfce-align: left;"|| '''PC12'''| '''76'''|-| '''272'''| '''PI16'''| style="text-align: left;"|| '''37'''|| '''38'''| style="text-align: left;"|| '''PI4'''| '''260'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''39'''|| '''40'''| style="text-align: left;"|| '''PI3'''| '''259arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4''']
|}
</ol>
</li></ol>
<ol start="10" style="list-style-type: decimal;">
<li><p>View the compiled rootfs compressed package</p>
<ol style="list-style-type: lower-alpha;">
<li>'''bullseye-xfce-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4''' It is a compressed package of rootfs. The meaning of each field in the name is</li>
<ol start="2" style="list-style-type: decimal;"><li>The device node corresponding to uart2 is a) '''/dev/ttyAS2bullseye''', and represents the device node corresponding to uart5 is'''/dev/ttyAS5'''</li></ol>type of Linux distribution of rootfs
apollo-p2:/ # ls /dev/ttyAS*b) '''xfce''' indicates that the rootfs is the desktop version, and if it is cli, it indicates the server version.
/dev/ttyAS0 /dev/ttyAS1 :c) '''/dev/ttyAS2 /dev/ttyAS5arm64'''represents the architecture type of rootfs
:d) '''25250ec7002de9e81a41de169f1f89721''' is the MD5 hash value generated by the package names of all software packages installed by rootfs. As long as the list of software packages installed by rootfs is not modified, this value will not change. The compilation script will use this MD5 hash value. Determine whether rootfs needs to be recompiled</ol><ol start="32" style="list-style-type: decimallower-alpha;"><li>First open wiringOP APP on '''bullseye-xfce-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4.list''' Lists the desktoppackage names of all packages installed by rootfs</li><{| class="wikitable" style="width:800px;" |-| test@test:~/orangepi-build$ '''ls external/cache/rootfs/ol>'''
[[File:zero2wbullseye-img351xfce-arm64.5250ec7002de9e81a41de169f1f89721.tar.png]]lz4
<ol start="4" style="listbullseye-stylexfce-type: decimal;"><li>Then click the '''UART_TEST'''button to open the UART test interface</li></ol>arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4.current
[[Filebullseye-xfce-arm64.5250ec7002de9e81a41de169f1f89721.tar.lz4.list|}</ol></li></ol><ol start="11" style="list-style-type:zero2w-img359decimal;"><li>If the required rootfs already exists under '''external/cache/rootfs''', then compiling the rootfs again will directly skip the compilation process and will not restart the compilation. When compiling the image, it will also go to '''external/cache/rootfs''' to check whether it already exists. There is a cached rootfs available. If it is available, use it directly. This can save a lot of download and compilation time.png]]</li></ol>
<ol startspan id="5" style="listcompile-stylelinux-type: decimal;image"><li>The serial port test interface of wiringOP is as shown in the figure below</li></olspan>
[[File:zero2w-img360.png]]== Compile linux image ==
<ol start="6" style="list-style-type: decimal;"><li><p>Then select # Run the '''/dev/ttyAS2''' or'''/dev/ttyAS5build.sh''' node in the selection box</p><p>[[File:zero2w-img361.png]]</p></li><li><p>Enter the baud rate you want to set in the edit boxscript, and then click the '''OPEN''' button remember to open the uart node. After the opening is successful, the '''OPEN''' button becomes unselectable, and the '''CLOSE''' button and '''SEND''' button become selectable.</p></li></ol>add sudo permissions
[[File:zero2w:{| class="wikitable" style="width:800px;" |-img362| test@test:~/orangepi-build$ '''sudo ./build.png]]sh'''|}
<ol start="82" style="list-style-type: decimal;"><li><p>Then use Dupont wire to short the rx and tx pins of uart</p></li><li><p>Then you can enter a paragraph of characters in the send edit box below and click the Select '''SENDFull OS image for flashing''' button to start sending.</p>and press Enter</li></ol>
[[File:zero2w-img363.png]]<div class="figure">
<ol start="10" style="list[[File:zero2w-style-type: decimal;"><li>If everything is normal, the received string will be displayed in the receiving box</li></ol>img292.png]]
[[File</div></ol><ol start="3" style="list-style-type:zero2w-img364.png]]decimal;"><li>Then select the model of the development board</li>
[[File:zero2w-img275.png]]<span id/ol><ol start="pin4" style="list-spistyle-testtype: decimal;"><li><p>Then select the branch type of the kernel source code. Different versions of the kernel source code maintain different rootfs types.</p><ol style="list-methodstyle-type: lower-alpha;"><li><p>In the current branch, you can see three options: debian11, ubuntu20.04, and ubuntu22.04.</p></spanli>=== 40pin SPI test method ===<li><p>In the next branch, you can see three options: debian11, debian12, and ubuntu22.04.</p></li>
# As can [[File:zero2w-img276.png]]</ol></li></ol><ol start="5" style="list-style-type: decimal;"><li><p>If you select the next branch, you will also be seen from prompted to select the memory size, and you do not need to select the current branch.</p><ol style="list-style-type: lower-alpha;"><li><p>If the table belowdevelopment board you purchased has a memory size of 1.5GB, please select the spi available for first option.</p></li><li><p>If the 40pin interface is spi1development board you purchased has 1GB or 2GB or 4GB memory size, and there are two chip please choose the second option.</p><p>[[File:zero2w-img277.png]]</p></li></ol></li><li><p>Then select pins cs0 and cs1the type of rootfs</p></li>
{| class[[File:zero2w-img286.png]]</ol><ol start="7" style="wikitablelist-style-type: decimal;"><li><p>Then select the type of image</p>|<ol style="list-style-type: lower-alpha;">| <li><p>'''GPIO serial numberImage with console interface (server)'''Represents the image of the server version, which is relatively small in size.</p></li>| <li><p>'''GPIOImage with desktop environment'''Represents an image with a desktop, which is relatively large in size.</p></li>| <div class="figure"> [[File:zero2w-img287.png]] </div></ol></li></ol><ol start="8" style="list-style-type: decimal;"><li>If you are compiling the server version of the image, you can also choose to compile the Standard version or the Minimal version. The Minimal version will have much less pre-installed software than the Standard version ('''Functionplease do not choose the Minimal version without special needs, because many things are not pre-installed by default. Some functions may not be available''')</li> <div class="figure"> [[File:zero2w-img288.png]] </div></ol><ol start="9" style="list-style-type: decimal;"><li>If you are compiling a desktop version of the image, you also need to select the type of desktop environment. Currently, only XFCE is maintained, so please select an XFCE type desktop.</li> [[File:zero2w-img289.png]] [[File:zero2w-img290.png]] You can then select additional packages that need to be installed. Please press the Enter key here to skip directly. [[File:zero2w-img291.png]]</ol><ol start="10" style="list-style-type: decimal;"><li>Then the compilation of the linux image will begin. The general process of compilation is as follows</li> ::a. Initialize the compilation environment of Ubuntu PC and install the software packages required for the compilation process. ::b. Download the source code of u-boot and linux kernel (if already cached, only update the code) ::c. Compile u-boot source code and generate u-boot deb package ::d. Compile linux source code and generate linux-related deb packages ::e. Make the deb package of linux firmware ::f. Make the deb package of orangepi-config tool ::g. Create a deb package with board-level support ::h. If you compile the desktop version image, you will also create a desktop-related deb package. ::i. Check whether rootfs has been cached. If not, re-create rootfs. If it has been cached, decompress it directly and use it. ::j. Install the deb package generated previously into rootfs ::k. Make some specific settings for different development boards and different types of images, such as pre-installing additional software packages, modifying system configurations, etc. ::l. Then create the image file and format the partition. The default type is ext4. ::m. Then copy the configured rootfs to the mirror partition. ::n. Then update initramfs ::o. Finally, write the bin file of u-boot into the image through the dd command.</ol><ol start="11" style="list-style-type: decimal;"><li><p>After compiling the image, the following message will be displayed</p><ol style="list-style-type: lower-alpha;"><li>The storage path of the compiled image</li>{| '''pin'''class="wikitable" style="width:800px;" |-| [ o.k. ] Done building [ '''pinoutput/images/orangepizero2w_x.x.x_debian_bullseye_linux6.1.xx_xfce_desktop/orangepizero2w_x.x.x_debian_bullseye_linux6.1.xx_xfce_desktop.img''']| '''Function'''}</ol><ol start="2" style="list-style-type: lower-alpha;">| '''GPIO'''<li>Compilation time</li>{| '''GPIO serial number'''class="wikitable" style="width:800px;"
|-
| '''[ o.k. ] Runtime [ 19 min ]'''|}</ol><ol start="3" style="textlist-style-aligntype: leftlower-alpha;"|><li>Repeat the command to compile the image. Use the following command to start compiling the image directly without selecting it through the graphical interface.</li>{| class="wikitable" style="text-alignwidth: left800px;"|-| [ o.k. ] Repeat Build Options [ '''3sudo ./build.3Vsh BOARD=orangepizero2w BRANCH=next BUILD_OPT=image RELEASE=bullseye BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_CONFIGURE=yes''']| '''1'''}</ol></li></ol><span id="instructions-for-using-the-orange-pi-os-arch-system"></span>|| = '''2Instructions for using the Orange Pi OS Arch system'''=| '''5V'''| style<span id="textorange-pi-os-arch-system-function-adaptation-align: left;status"|></span>== Orange Pi OS Arch system function adaptation status == {| class="wikitable" style="width:800px;text-align: leftcenter;"|
|-
| '''264Motherboard functions'''| '''PI8OPi OS Arch'''| '''TWI1-SDA'''| '''3'''|| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''263HDMI video'''| '''PI7OK'''| '''TWI1-SCL'''| '''5'''|| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''269HDMI Audio'''| '''PI13'''| '''PWM3'''| '''7'''|| '''8'''| '''UART0_TX'''| '''PH0'''| '''224OK'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''9'''|| '''10'''| '''UART0_RX'''| '''PH1Type-C USB2.0 x 2'''| '''225OK'''
|-
| '''226TF Card Startup'''| '''PH2'''| '''UART5_TX'''| '''11'''|| '''12'''| style="text-align: left;"|| '''PI1'''| '''257OK'''
|-
| '''227WIFI'''| '''PH3OK'''| '''UART5_RX'''| '''13'''|| '''14'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''261Bluetooth'''| '''PI5'''| '''UART2_TX'''| '''15'''|| '''16'''| '''PWM4'''| '''PI14'''| '''270OK'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''17'''|| '''18'''| style="text-align: left;"|| '''PH4LED Light'''| '''228OK'''
|-
| '''23140pin GPIO'''| '''PH7OK'''| '''SPI1_MOSI'''| '''19'''|| '''20'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''23240pin I2C'''| '''PH8OK'''| '''SPI1_MISO'''| '''21'''|| '''22'''| '''UART2_RX'''-| '''PI640pin SPI'''| '''262OK'''
|-
| '''23040pin UART'''| '''PH6'''| '''SPI1_CLK'''| '''23'''|| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229OK'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''25'''|| '''26'''| '''SPI1_CS1'''| '''PH940pin PWM'''| '''233OK'''
|-
| '''266Temperature Sensor'''| '''PI10'''| '''TWI2-SDA'''| '''27'''|| '''28'''| '''TWI2-SCL'''| '''PI9'''| '''265OK'''
|-
| '''256Hardware watchdog'''| '''PI0OK'''| style="text-align: left;"|| '''29'''|| '''30'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''271Mali GPU'''| '''PI15<span style="color:#FF0000">NO</span>'''|-| '''Video codec'''| '''<span style="color:#FF0000">NO</span>'''| } {| class="wikitable" style="width:800px;text-align: leftcenter;"|-|'''24pin expansion board function'''| '''31OPi OS Arch'''|-| '''100M network port'''| '''32OK'''| -| '''100M Ethernet port light'''PWM1| '''OK'''|-| '''USB2.0 HOST x 2'''| '''OK'''|-| '''Infrared reception'''| '''OK'''|-| '''Headphone audio playback'''| '''OK'''|-| '''PI11On/off button'''| '''267OK'''
|-
| '''268LRADC'''| '''PI12'''| '''PWM2'''| '''33Custom buttons x 2'''|| '''34OK'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''258'''| '''PI2'''| style="textTV-align: left;"|| '''35OUT'''|| '''36'''| <span style="text-aligncolor: left;#FF0000"|| '''PC12'''| '''76>NO</span>'''
|}
<ol startspan id="2" style="listorange-pi-os-arch-system-user-styleguide-type: decimal;instructions"><li>The device node corresponding to SPI1 CS0 is '''/dev/spidev1.0''', and the device node corresponding to SPI1 CS1 is '''/dev/spidev1.1'''</li></olspan>
apollo-p2:/ # '''ls /dev/spidev1.*'''== Orange Pi OS Arch System User Guide Instructions ==
'''/dev/spidev1First of all, please note that the OPi OS Arch system does not have a default orangepi user and password, so you cannot directly log in remotely through the serial port and ssh after the system is started after burning (not even the root user).0 /dev/spidev1This is different from Ubuntu and Debian systems.1'''
<ol start="3" style="list-style-type: decimal;"><li>Here When the OPi OS Arch system is a demonstration started for the first time, you need to test connect an HDMI display and then initialize the SPI1 interface system settings through the '''w25qxx''' moduleuser wizard (including creating a new user name and setting a password). First, connect The setup steps of the w25qxx module to the SPI1 interface.</li></ol>user wizard are as follows:
'''It doesn't matter if there is no w25qxx module<ol style="list-style-type: lower-alpha;"><li><p>After burning the system, because there is a SPIFlash on when you start it for the first time and enter the development board connected to SPI0desktop, and you will see the configuration of SPI0 is also turned on by default user wizard program shown in Android, so we can also directly use the onboard SPIFlash for testingfigure below.</p><div class="figure"> [[File:zero2w-img293.'''png]]
<ol start="4" style="list-style-type: decimal;"/div></li><li>Then open wiringOP APP on <p>First you need to select the desktoplanguage you want</lip></oldiv class="figure">
[[File:zero2w-img351img294.png]]
<ol start="5" style="list-style-type: decimal;"/div></li><li>Then click <p>After selecting the '''SPI_TEST''' button language, the user wizard will immediately switch to open the SPI test corresponding language interface, as shown below in Chinese</lip></oldiv class="figure">
[[File:zero2w-img365img295.png]]
<ol start="6" style="list-style-type: decimal;"/div></li><li><p>Then select the spi device node in the upper left corner. If you test the onboard SPIFlash directly, just keep the default '''/dev/spidev0.0'''. If the '''w25qxx''' module is connected to the 40pin spi1 cs0, then please select'''/dev/spidev1.0''', if the w25qxx module is connected to the 40pin spi1 cs1, then please select '''/dev/spidev1.1'''area</p>
<div class="figure">
[[File:zero2w-img366img296.png]]
</div></li>
<li><p>Then click select the '''OPEN''' button to initialize the SPIkeyboard model</p></li></oldiv class="figure"[[File:zero2w-img297.png]]
[[File:zero2w-img367.png]]</div></li><li><p>Then create a new username and set a password</p><div class="figure">
<ol start="8" style="list[[File:zero2w-style-type: decimal;"><li>Then fill in the bytes that need to be sent, such as reading the ID information of the onboard SPIFlash, filling in the address 0x9f in data[0img298.png]], and then click the '''TRANSFER''' button</li></ol>
[[File:zero2w-img368.png]]</div></li><li><p>Then make sure there is no problem with the selection, and then click the install '''button'''</p><div class="figure">
<ol start="9" style="list[[File:zero2w-style-type: decimal;"><li>Finally, the APP will display the read ID information of the onboard SPI Flashimg299.</li></ol>png]]
[[File:zero2w-img369.png]]</div></li><li><p>Then wait for the installation to complete</p><div class="figure">
<ol start="10" style="list[[File:zero2w-style-type: decimal;"><li>If the w25qxx module connected to 40pin SPI1 is read, the ID information of the onboard SPI Flash is also similarimg300.</li></ol>png]]
<span id="pin-i2c-test-method"/div></li><li><p>After the installation is complete, you need to click the '''Finish''' button to restart the system.</spanp><div class=== 40pin I2C test method ==="figure">
# As can be seen from the table below, the Android12 TV system has i2c1 and i2c2 turned on by default[[File:zero2w-img301.png]]
{| </div></li><li><p>The Orange Pi Hello program will automatically start after restarting. At this time, you need to remove the check '''mark of Start on startup''' in the lower right corner, otherwise you need to manually close the Orange Pi Hello program every time you start it.</p><div class="wikitablefigure">|[[File:zero2w-img302.png]] </div>| '''GPIO <p>At this point, you can use the newly created username and password to log in to the OPi OS system through the serial number'''port or ssh.</p></li></ol> <span id="how-to-set-dt-overlays"></span>| '''GPIO'''== How to set DT overlays ==| '''Function'''| '''The multiplexing functions such as I2C/SPI/UART/PWM in the 40-pindevelopment board are turned off by default in the kernel'''s dts, and the corresponding DT overlays need to be manually turned on before they can be used. |The method to open DT overlays in OPi OS Arch system is as follows:| '''pin'''| # First open the '''Function/boot/extlinux/extlinux.conf'''configuration file| '''GPIO'''::{| '''GPIO serial number'''class="wikitable" style="width:800px;"
|-
| style[orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''|} <ol start="text-align: left;2"|| style="textlist-style-aligntype: leftdecimal;"|>| <li>Then open the corresponding configuration by adding '''3.3VFDTOVERLAYS'''| '''1/dtbs/allwinner/overlay/xxx.dtbo'''|| in '''2/boot/extlinux/extlinux.conf'''</li>| '''5V'''{| styleclass="text-align: left;wikitable"|| style="textbackground-aligncolor:#ffffdc;width: left800px;"|
|-
| '''264'''| '''PI8'''| '''TWI1-SDA'''| '''3'''|| <big>'''4Note that xxx.dtbo in FDTOVERLAYS /dtbs/allwinner/overlay/xxx.dtbo needs to be replaced with the specific dtbo configuration, please do not copy it.'''</big>| '''5V'''}{| styleclass="text-align: left;wikitable"|| style="text-alignwidth: left800px;"|
|-
| [orangepi@orangepi-pc ~]$ '''263sudo vim /boot/extlinux/extlinux.conf'''| LABEL Orange Pi KERNEL /Image FDT /dtbs/allwinner/sun50i-h616-orangepi-zero2w.dtb '''PI7FDTOVERLAYS /dtbs/allwinner/overlay/<span style="color:#FF0000">xxx.dtbo</span>'''#Configuration that needs to be added| '''TWI1}</ol><ol start="3" style="list-style-SCL'''type: decimal;"><li><p>The storage path of xxx.dtbo in the OPi OS Arch image is as follows. Please note that not all dtbo under this path can be used.</p>{| '''5'''class="wikitable" style="width:800px;" |-| <p>'''6/boot/dtbs/allwinner/overlay/'''</p>| '''GND'''}</li><li><p>The DT overlays configuration that can be used by the development board is as follows</p></li> {| styleclass="text-align: left;wikitable"|| style="width:800px;text-align: leftcenter;"|
|-
| '''269Functions on the development board'''| '''PI13'''| '''PWM3'''| '''7'''|| '''8'''| '''UART0_TX'''| '''PH0'''| '''224Corresponding DT overlays configuration'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GND40pin - i2c0'''| '''9'''|| '''10'''| '''UART0_RX'''| '''PH1'''| '''225sun50i-h616-pi-i2c0.dtbo'''
|-
| '''22640pin - i2c1'''| '''PH2'''| '''UART5_TX'''| '''11'''|| '''12'''| style="textsun50i-h616-pi-align: left;"|| '''PI1'''| '''257i2c1.dtbo'''
|-
| '''22740pin - i2c2'''| '''PH3'''| '''UART5_RX'''| '''13'''|| '''14''sun50i-h616-pi-i2c2.dtbo'| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''26140pin - uart2'''| '''PI5sun50i-h616-pi-uart2.dtbo'''| '''UART2_TX'''| '''15'''|| '''16'''| '''PWM4'''-| '''PI1440pin - uart3'''| '''270sun50i-h616-pi-uart3.dtbo'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''3.3V40pin - uart4'''| '''17'''|| '''18'''| style="textsun50i-h616-pi-align: left;"|| '''PH4'''| '''228uart4.dtbo'''
|-
| '''23140pin - uart5'''| '''PH7'''| '''SPI1_MOSI'''| '''19'''|| '''20''sun50i-h616-ph-uart5.dtbo'| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''23240pin - pwm1'''| '''PH8'''| '''SPI1_MISO'''| '''21'''|| '''22'''| '''UART2_RX'''| '''PI6'''| '''262sun50i-h616-pi-pwm1.dtbo'''
|-
| '''23040pin - pwm2'''| '''PH6'''| '''SPI1_CLK'''| '''23'''|| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229sun50i-h616-pi-pwm2.dtbo'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GND40pin - pwm3'''| '''25'''|| '''26'''| '''SPI1_CS1'''| '''PH9'''| '''233sun50i-h616-pi-pwm3.dtbo'''
|-
| '''26640pin - pwm4'''| '''PI10'''| '''TWI2sun50i-h616-SDA'''| '''27'''|| '''28'''| '''TWI2pi-SCL'''| '''PI9'''| '''265pwm4.dtbo'''
|-
| '''25640pin - spi1 cs0'''| '''PI0'''| style="textsun50i-h616-spi1-cs0-align: left;"|| '''29'spidev.dtbo''|| '''30'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''27140pin - spi1 cs1'''| '''PI15'''| style="textsun50i-h616-spi1-cs1-align: left;"|| '''31'''|| '''32'''| '''PWM1'''| '''PI11'''| '''267spidev.dtbo'''
|-
| '''26840pin - spi1 cs0 cs1'''| '''PI12'''| '''PWM2'''| '''33'''|| '''34'''| '''GNDsun50i-h616-spi1-cs0-cs1-spidev.dtbo'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''258设Set USB0 to Host mode'''| '''PI2'''| style="textsun50i-h616-align: left;"|| '''35'''|| '''36'''| style="textusb0-align: left;"|| '''PC12'''| '''76host.dtbo'''
|-
| '''272Turn off the green LED light'''| '''PI16'''| style="textsun50i-h616-zero2w-align: left;"|| '''37'''|| '''38'''| style="textdisable-align: left;"|| '''PI4'''| '''260led.dtbo'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GNDHow to close the UART0 debugging serial port'''| '''39'''|| '''40'''| style="textsun50i-h616-disable-align: left;"|| '''PI3'''| '''259uart0.dtbo'''
|}
</ol>
<ol start="5" style="list-style-type: decimal;">
<li>If you need to open multiple configurations at the same time, just add the paths of multiple configurations directly after '''FDTOVERLAYS.''' For example, the configuration of opening i2c1 and uart5 at the same time is as follows</li>
{| class="wikitable" style="width:800px;"
|-
|
[orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''
<ol start="2" style="list-style-type: decimal;"><li>The device node corresponding to i2c1 is '''/dev/i2c-1''', and the device node corresponding to i2c2 is '''/dev/i2c-2'''</li></ol>LABEL Orange Pi
apollo-p2:KERNEL / # '''ls /dev/i2c-*'''Image
'''FDT /devdtbs/i2callwinner/sun50i-1 /dev/i2ch616-2''' /dev/i2corangepi-5zero2w.dtb
'''FDTOVERLAYS <span style="color:#FF0000">/dtbs/allwinner/overlay/sun50i-h616-pi-i2c1.dtbo /dtbs/allwinner/overlay/sun50i-h616-ph-uart5.dtbo</span>'''|}</ol><ol start="36" style="list-style-type: decimal;"><li>First open wiringOP APP on After setting, you need to restart the desktopsystem for the configuration to take effect.</li>{| class="wikitable" style="width:800px;" |-| [orangepi@orangepi-pc ~]$ '''sudo reboot'''|}</ol><span id="how-to-install-software"></span>
[[File:zero2w-img351.png]]== How to install software ==
<ol start="4" style="list-style-type: decimal;"><li>Then click You can use the '''I2C_TEST''' button pacman package management tool to open install software that is not available in OPi OS. For example, the i2c test interface</li></ol>command to install the vim editor is as follows. If you want to install other software, you only need to replace vim with the package name of the software you want to install.
{| class="wikitable" style="width:800px;" |-| [[File:zero2worangepi@orangepi-img370.png]pc ~]$ '''sudo pacman -Syy vim'''|}
<ol startspan id="5" style="listandroid-12-tv-system-styleusage-type: decimal;instructions"><li>The i2c test interface of wiringOP is shown in the figure below</li></olspan>
[[File:zero2w-img371.png]]= '''Android 12 TV system usage instructions''' =
<ol startspan id="6" style="listsupported-styleandroid-type: decimal;versions"><li>Then click the device node selection box in the upper left corner to select the i2c you want to test</li></olspan>== Supported Android versions ==
[[File{| class="wikitable" style="width:zero2w800px;text-img372align: center;"|-| Android Version| Kernel version|-| '''Android 12 TV Version'''| '''linux5.png]]4'''|}
<ol startspan id="7" style="listandroid-12-tv-function-styleadaptation-type: decimal;status"><li>Then connect an i2c device to the 40pin i2c pin. Here we take the ds1307 rtc module as an example.</li></olspan>== Android 12 TV function adaptation status ==
[[File:zero2w-img178.png]] <ol start{| class="8wikitable" style="list-style-typewidth: decimal800px;"><li><p>The i2c address of the ds1307 rtc module is 0x68. After connecting the lines, we can use the '''i2cdetect -y 1''' or '''i2cdetect -y 2''' command on the serial port command line to check whether the i2c address of the ds1307 rtc module can be scanned. If you can see the address 0x68, it means that the ds1307 rtc module is wired correctly.</p><p>apollo-p2:/ # '''i2cdetect -y 1'''</p><p>'''Or'''</p><p>apollo-p2:/ # '''i2cdetect -y 2'''</p><p>[[File:zero2w-img373.png]]</p></li><li><p>Then set the i2c address to 0x68 in wiringOP, and then click the '''OPEN''' button to open i2c</p><p>[[File:zero2w-img374.png]]</p></li><li><p>After clicking the '''OPEN''' button to open i2c, the display is as follows</p><p>[[File:zero2w-img375.png]]</p></li><li><p>Then we test writing a value to the register of the rtc module, for example, writing 0x55 to the 0x1c address</p><ol style="list-styletext-typealign: lower-alphacenter;"><li><p>We first set the address of the register to be written to 0x1c</p><p>[[File:zero2w|-img376.png]]</p></li><li><p>Then set the value to be written to 0x55</p><p>[[File:zero2w-img377.png]]</p></li><li><p>Then click the | '''WRITE BYTEMotherboard functions''' button to perform the writing action</p><p>[[File:zero2w-img378.png]]</p></li></ol></li><li><p>Then click the | '''READ BYTEAndroid12 TV''' button to read the value of the 0x1c register. If it displays 0x55, it means that the i2c read and write test has passed.</p><p>[[File:zero2w-img379.png]]</p></li></ol> <span id="pin-pwm-test"></span>=== 40pin PWM test === # As can be seen from the table below, the available pwm are pwm1, pwm2, pwm3 and pwm4. {| class="wikitable"
|-
| '''GPIO serial numberHDMI video'''| '''GPIO'''| '''Function'''| '''pin'''|| '''pin'''| '''Function'''| '''GPIO'''| '''GPIO serial numberOK'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''1'''|| '''2HDMI Audio'''| '''5VOK'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''264'''| '''PI8'''| '''TWI1Type-SDA'''| '''3C USB2.0 x 2'''|| '''4OK'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''263TF card startup'''| '''PI7OK'''| '''TWI1-SCL'''| '''5'''|| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''269WIFI'''| '''PI13'''| '''PWM3'''| '''7'''|| '''8'''| '''UART0_TX'''| '''PH0'''| '''224OK'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''9'''|| '''10'''| '''UART0_RX'''| '''PH1Bluetooth'''| '''225OK'''
|-
| '''226USB Camera'''| '''PH2'''| '''UART5_TX'''| '''11'''|| '''12'''| style="text-align: left;"|| '''PI1'''| '''257OK'''
|-
| '''227LED Light'''| '''PH3OK'''| '''UART5_RX'''-| '''1340pin GPIO'''|| '''14'OK''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''26140pin I2C'''| '''PI5'''| '''UART2_TX'''| '''15'''|| '''16'''| '''PWM4'''| '''PI14'''| '''270OK'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''17'''|| '''18'''| style="text-align: left;"|| '''PH440pin SPI1'''| '''228OK'''
|-
| '''23140pin UART'''| '''PH7OK'''| '''SPI1_MOSI'''| '''19'''|| '''20'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''23240pin PWM'''| '''PH8'''| '''SPI1_MISO'''| '''21'''|| '''22'''| '''UART2_RX'''| '''PI6'''| '''262OK'''
|-
| '''230Temperature Sensor'''| '''PH6OK'''| '''SPI1_CLK'''| '''23'''|| '''24'''| '''SPI1_CS0'''-| '''PH5Hardware watchdog'''| '''229OK'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''25'''|| '''26'''| '''SPI1_CS1'''| '''PH9Mali GPU'''| '''233OK'''
|-
| '''266Video codec'''| '''PI10OK'''| '''TWI2-SDA'''}| '''27'''|| '''28'''{| '''TWI2class="wikitable" style="width:800px;text-SCL'''| '''PI9'''| '''265'''align: center;"
|-
| '''25624pin Expansion board function'''| '''PI0Android12 TV'''| style="text-align: left;"|| '''29'''|| '''30'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"|
|-
| '''271100M network port'''| '''PI15'''| style="text-align: left;"|| '''31'''|| '''32'''| '''PWM1'''| '''PI11'''| '''267OK'''
|-
| '''268100M Ethernet port light'''| '''PI12OK'''|-| '''PWM2USB2.0 HOST x 2'''| '''33OK'''|-| '''34Infrared reception'''| '''GNDOK'''| style="text-align: left;"|'''Headphone audio playback'''| style="text-align: left;"|'''OK'''
|-
| '''258On/off button'''| '''PI2'''| style="text-align: left;"|| '''35'''|| '''36'''| style="text-align: left;"|| '''PC12'''| '''76OK'''
|-
| '''272LRADC'''| '''PI16'''| style="text-align: left;"|| '''37'''|| '''38'''| style="text-align: left;"|| '''PI4Custom buttons x 2'''| '''260OK, The default setting is the volume up and down keys.'''
|-
| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''39'''|| '''40'''| style="textTV-align: left;"|| '''PI3OUT'''| '''259OK'''
|}
<ol startspan id="2" style="listonboard-led-light-styledisplay-type: decimal;instructions"><li>First click the wiringOP icon to open wiringOP APP</li></olspan>== Onboard LED light display instructions ==
[[File:zero2w-img351.png]] <ol start{| class="3wikitable" style="list-stylewidth:800px;text-typealign: decimalcenter;"><li>Then click the |-|| '''green light'''| '''red light'''|-| '''u-boot startup phase'''| '''Off'''PWM_TEST| ''' button on the main interface of wiringOP '''|-| '''Kernel boot to enter the PWM test interface</li></ol>system'''| '''on'''[[File:zero2w-img380.png]]| '''on'''|}
<ol startspan id="4" style="listhow-to-return-to-the-previous-interface-stylein-type: decimal;android"><li/span>The PWM test == How to return to the previous interface is as follows</li></ol>in Android ==
<div class="figure">We generally use the mouse and keyboard to control the Android system of the development board. When entering certain interfaces and need to return to the previous interface or desktop, we can only return by right-clicking the mouse, and the keyboard cannot return.
[[FileIf you have purchased the infrared remote control (other remote controls do not work) and a 24pin expansion board that come with the development board, after connecting the 24pin expansion board to the development board, you can also use the return key on the remote control to return to the previous menu. The location of the return key is as shown below. Shown:zero2w-img381.png]]
</div><ol start="5" style="list[[File:zero2w-style-type: decimal;"><li>Then set which PWM you want to use in the Channel. The default is PWM1. If you want to set it to PWM2, just enter 2 in the Channel. PWM3 and PWM4 and so onimg303.</li></ol>png]]
[[File:zero2w<span id="how-img382.png]]to-use-adb"></span>== How to use ADB ==
<ol startspan id="6" style="listuse-network-connection-styleadb-type: decimal;debugging"><li>Then you can set the PWM period. The default configuration is '''50000ns'''. The converted PWM frequency is '''20KHz'''</li></olspan>=== Use network connection adb debugging ===
[[File{| class="wikitable" style="background-color:#ffffdc;width:zero2w800px;" |-img383| <big>'''Using network adb does not require a USB Typc C interface data cable to connect the computer and the development board. Instead, it communicates through the network, so first make sure that the development board's wired or wireless network is connected, and then obtain the IP address of the development board. Next To be used.png]]'''</big>|}
<ol start="7" style="list-style-type: decimal;"><li>Then click # Make sure the '''EXPORTservice.adb.tcp.port'''button of the Android system is set to export PWM</li></ol>5555 port number
[[File:zero2w:{| class="wikitable" style="width:800px;" |-| apollo-img384p2:/ # '''getprop | grep &quot;adb.png]]tcp&quot;'''
<ol start="8" style="list-style-type[service.adb.tcp.port]: decimal;">[5555]<li>Then drag the progress bar below to change the PWM duty cycle, and then check '''Enable''' to output the PWM waveform.</li></ol>|}
[[File<ol start="2" style="list-style-type: decimal;"><li>If '''service.adb.tcp.port''' is not set, you can use the following command in the serial port to set the port number of the network adb</li>{| class="wikitable" style="width:zero2w800px;" |-img385| apollo-p2:/ # '''setprop service.adb.tcp.png]]port 5555'''
<ol start="9" style="listapollo-style-typep2: decimal;"><li>Then use an oscilloscope to measure the corresponding pins in the 40pin development board and you can see the following waveform.</li></ol># '''stop adbd'''
[[Fileapollo-p2:/ # '''start adbd'''|}</ol><ol start="3" style="list-style-type: decimal;"><li>Install adb tool on Ubuntu PC</li>{| class="wikitable" style="width:800px;" |-| test@test:zero2w~$ '''sudo apt-img386.png]]get update'''
test@test:~$ '''sudo apt-get install -y adb'''|}</ol><span idol start="how4" style="list-tostyle-compile-android-12-source-codetype: decimal;"><li>Then connect network adb on Ubuntu PC</spanli>{| class="wikitable" style="width:800px;" = |-| test@test:~$ '''adb connect 192.168.1.xxx:5555''' '''How (Need to compile Android 12 source codebe modified to the IP address of the development board)''' =
<span id="download-the-source-code-of-android-12"p>* daemon not running; starting now at tcp:5037</spanp>== Download the source code of Android 12 ==
<ol style="list-style-type: decimal;"><li><p>First download the compressed package of the Android 12 source code and the compressed package of the files modified by Orange Pi Zero2w from Google Cloud Drive* daemon started successfully</p><ol style="list-style-type: lower-alpha;"><li>Google Cloud Drive</li></ol></li></ol>
[[Fileconnected to 192.168.1.xxx:zero2w-img387.png]]5555
<ol start="2" style="list-style-type: decimal;">
<li>After downloading the compressed package of Android 12 source code, please check whether the MD5 checksum is correct. If it is incorrect, please download the source code again. Here's how to check the MD5 checksum:</li></ol>
test@test:~$ '''md5sum -c H618-Android12-Src.tar.gz.md5sumadb devices'''
H618-Android12-Src.tar.gzaa: '''OK'''List of devices attached
H618192.168.1.xxx:5555 device|}</ol><ol start="5" style="list-Android12style-Src.tar.gzabtype: decimal;"><li>Then you can log in to the android system through adb shell on Ubuntu PC</li>{| class="wikitable" style="width:800px;" |-| test@test: ~$ '''OKadb shell'''
......apollo-p2:/ #|}</ol><span id="use-data-cable-to-connect-adb-debugging"></span>
<ol start="3" style="list-style-type: decimal;"><li>Then you need = Use data cable to merge multiple compressed files into one, and then extract the Android source code. The command looks like this:</li></ol>connect adb debugging ===
test@test:~$ '# Prepare a USB Type C interface data cable, plug one end of the USB interface into the USB interface of the computer, and plug one end of the USB Type C interface into the USB0 interface of the development board (see the description of the picture on the right below for the location of USB0). In this case, the development board is powered by the computer's USB interface, so please ensure that the computer'cat H618-Android12-Src.tar.gza* &gt; H618-Android12-Src.tars USB interface can provide the most sufficient power to drive the development board.gz'''
test@test:~$ '''tar :[[File:zero2w-xvf H618img304.png]] [[File:zero2w-Android12-Src.tarimg305.gz'''png]]
<ol start="42" style="list-style-type: decimal;"><li>Then unzip the compressed package of the files modified by Orange Pi Zero2wInstall adb tool on Ubuntu PC</li></ol>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''sudo apt-get update'''
test@test:~$ '''tar zxf opizero2w_android12_patches.tar.gzsudo apt-get install -y adb'''|}</ol><ol start="3" style="list-style-type: decimal;"><li>Check whether the ADB device is recognized</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''adb devices'''
test@test:~$ '''ls'''List of devices attached
4c00146473c28651dd0 device|}</ol><ol start="4" style="list-style-type: decimal;"><li>Then you can log in to the android system through adb shell on Ubuntu PC</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''opizero2w_android12_patchesadb shell''' opizero2w_android12_patches.tar.gz
apollo-p2:/ $|}</ol start><span id="5" style="listview-how-to-set-hdmi-styledisplay-type: decimal;resolution"><li>Then copy the files modified by Orange Pi Zero2w to the Android source code</li></olspan>
test@test:~$ '''cp -rf opizero2w_android12_patches/* H618-Android12-Src/'''== View how to set HDMI display resolution ==
<span idol style="compilelist-thestyle-type: decimal;"><li><p>Enter first '''Settings'''</p><p>[[File:zero2w-sourceimg306.png]]</p></li><li><p>Then select '''Device Preferences'''</p><p>[[File:zero2w-codeimg307.png]]</p></li><li><p>Then select '''Display &amp; Sound'''</p><p>[[File:zero2w-ofimg308.png]]</p></li><li><p>Then select '''Advanced display settings'''</p><p>[[File:zero2w-androidimg309.png]]</p></li><li><p>Then select '''HDMI output mode'''</p><p>[[File:zero2w-12"img310.png]]</p></spanli>== Compile <li><p>Then you can see the list of resolutions supported by the monitor. At this time, clicking the corresponding option will switch to the corresponding resolution. Please note that different monitors may support different resolutions. If you connect it to a TV, you will generally see more resolution options than the source code picture below.</p><p>[[File:zero2w-img311.png]]</p></li><li><p>The HDMI output of Android 12 ==the development board supports 4K display. When connected to a 4K TV, you can see the 4K resolution option.</p><p>[[File:zero2w-img312.png]]</p></li></ol>
'''Android12 is compiled on an x86_64 computer with Ubuntu 22.04 installed. Other versions of Ubuntu system package dependencies may have some differences. The image download address of the Ubuntu 22.04 amd64 version is as follows:'''<span id="hdmi-to-vga-display-test-1"></span>=== HDMI to VGA display test ===
[https<ol style="list-style-type:decimal;"><li><p>First you need to prepare the following accessories<//repo.huaweicloud.com/ubuntu-releases/22.04/ubuntup><ol style="list-22.04.2style-desktop-amd64.iso '''httpstype://repo.huaweicloud.com/ubuntulower-releasesalpha;"><li>HDMI to VGA converter</22.04/ubuntu-22.04.2-desktop-amd64.iso''']li>
'''The x86_64 computer hardware configuration for compiling Android12 source code recommends a memory of 16GB or more, [[File:zero2w-img144.png]]</ol><ol start="2" style="list-style-type: lower-alpha;"><li>A VGA cable and a hard disk space of 200GB or more is recommended. The more CPU cores, the better.'''Mini HDMI male to HDMI female adapter</li>
# First install the software packages needed to compile Android12 source code[[File:zero2w-img145.png]] [[File:zero2w-img146.png]]</ol><ol start="3" style="list-style-type: lower-alpha;"><li>A monitor or TV that supports VGA interface</li></ol></li></ol>
<ol start="2" style="list-style-type: decimal;"><li>HDMI to VGA display test@test:~$ '''sudo apt-get update'''is as follows</li>
test@test[[File:~$ '''sudo aptzero2w-get install -y git gnupg flex bison gperf build-essential \'''img313.png]]
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''When using HDMI to VGA display, the development board and the Android system of the development board do not need to make any settings. You only need the Mini HDMI interface of the development board to display normally. So if there is a problem with the test, please check whether there is a problem with the HDMI to VGA converter, VGA cable and monitor.'''zip curl zlib1g-dev gcc</big>|}</ol><span id="wi-multilib g++fi-multilib libc6connection-dev-i386 \'''method"></span>
'''lib32ncurses5== WI-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \'''FI connection method ==
# Choose first '''libgl1-mesa-dev libxml2-utils xsltproc unzip u-boot-tools python-is-python3 \Settings'''
'''libssl::[[File:zero2w-dev libncurses5 clang gawk'''img306.png]]
<ol start="2" style="list-style-type: decimal;">
<li><p>Then compile the code in the longan folder, which mainly contains u-boot and linux kernel</p><ol style="list-style-type: lower-alpha;"><li>First run select '''./build.sh configNetwork &amp; Internet''' to set compilation options</li></ol></li></ol>
test@test[[File:~$ '''cd H618zero2w-Android12img314.png]]</ol><ol start="3" style="list-style-type: decimal;"><li>Then turn on WI-SrcFI</longan'''li>
test@test[[File:~zero2w-img315.png]]</H618ol><ol start="4" style="list-Android12style-Src/longan$ type: decimal;"><li>After turning on WI-FI, you can see the searched signals under '''./build.sh configAvailable networks'''.</li>
Welcome [[File:zero2w-img316.png]]</ol><ol start="5" style="list-style-type: decimal;"><li>After selecting the WI-FI you want to mkscript setup progressconnect to, the password input interface shown below will pop up.</li>
All available platform:<div class="figure">
0[[File:zero2w-img317. androidpng]]
1</div></ol><ol start="6" style="list-style-type: decimal;"><li>Then use the keyboard to enter the password corresponding to the WI-FI, and then use the mouse to click the Enter button on the virtual keyboard to start connecting to the WI-FI. linux</li>
Choice [android]: '''0'''<div class="figure">
All available ic[[File:zero2w-img318.png]]
0. h618</div></ol><ol start="7" style="list-style-type: decimal;"><li>The display after successful WI-FI connection is as shown below</li>
Choice [h618[File:zero2w-img319.png]]: '''0'''</ol><span id="how-to-use-wi-fi-hotspot"></span>
All available board:== How to use WI-FI hotspot ==
0# First, please make sure that the Ethernet port is connected to the network cable and can access the Internet normally. ft# Then select '''Settings'''
1::[[File:zero2w-img306. p1png]]
2. p2<ol start="3" style="list-style-type: decimal;"><li>Then select '''Network &amp; Internet'''</li>
3[[File:zero2w-img314. p7png]]</ol><ol start="4" style="list-style-type: decimal;"><li>Then select '''WIFI hotspot'''</li>
4[[File:zero2w-img320. p7lpng]]</ol><ol start="5" style="list-style-type: decimal;"><li>Then open '''Hotspot Enable'''. You can also see the name and password of the generated hotspot in the picture below. Remember them and use them when connecting to the hotspot (if you need to modify the name and password of the hotspot, you need to close Hotspot Enable first. Then you can modify it)</li>
5[[File:zero2w-img321. perf1png]]</ol><ol start="6" style="list-style-type: decimal;"><li>At this time, you can take out your mobile phone. If everything is normal, you can find the WIFI hotspot with the same name ('''here AndroidAP_7132''') shown under the '''Hotspot name''' in the picture above in the WI-FI list searched by the mobile phone. Then you can click AndroidAP_7132 to connect to the hotspot. The password can be seen under the '''Hotspot password''' in the picture above.</li>
6[[File:zero2w-img322. perf2png]]</ol><ol start="7" style="list-style-type: decimal;"><li>After the connection is successful, it will be displayed as shown below (the interface will be different on different mobile phones, the specific interface is subject to the one displayed on your mobile phone). At this time, you can open a web page on your mobile phone to see if you can access the Internet. If the web page can be opened normally, it means that the '''WI-FI Hotspot''' of the development board can be used normally.</li>
7[[File:zero2w-img323. perf3png]]</ol><span id="how-to-check-the-ip-address-of-the-ethernet-port"></span>
8. qa== How to check the IP address of the Ethernet port ==
Choice [p2]: '''2'''# There is no wired network interface on the main board of the development board. We can expand the 100M Ethernet through a 24pin expansion board.
All available flash::[[File:zero2w-img107.png]]
0<ol start="2" style="list-style-type: decimal;"><li><p>Then make sure the network port of the expansion board is connected to the router or switch</p></li><li><p>Then open '''Settings'''</p><p>[[File:zero2w-img324. defaultpng]]</p></li><li><p>Then select '''Network &amp; Internet'''</p><p>[[File:zero2w-img325.png]]</p></li><li><p>Then you can see the IP address of the development board's wired network port at the location shown in the picture below.</p><p>[[File:zero2w-img326.png]]</p></li></ol>
1. nor<span id="bluetooth-connection-method"></span>
Choice [default]: '''0'''== Bluetooth connection method ==
All available kern_ver:# Choose first '''Settings'''
0. linux::[[File:zero2w-5img306.4png]]
Choice [linux<ol start="2" style="list-5.4]style-type: decimal;"><li>Then select '''0Bluetooth'''</li>
All available arch[[File:zero2w-img327.png]]</ol><ol start="3" style="list-style-type: decimal;"><li>Then Open '''Bluetooth Enable'''</li>
0[[File:zero2w-img328. armpng]]</ol><ol start="4" style="list-style-type: decimal;"><li>Then click '''Pair new device'''to start scanning for surrounding Bluetooth devices</li>
1[[File:zero2w-img329. arm64png]]</ol><ol start="5" style="list-style-type: decimal;"><li>The searched Bluetooth devices will be displayed under '''Available devices'''</li>
Choice [arm64[File:zero2w-img330.png]]</ol><ol start="6" style="list-style-type: '''1'''decimal;"><li>Then click on the Bluetooth device you want to connect to start pairing. When the following interface pops up, please use the mouse to select the '''......Pair'''option</li>
*** Default [[File:zero2w-img331.png]]</ol><ol start="7" style="list-style-type: decimal;"><li>What is tested here is the Bluetooth configuration is based process between the development board and the Android phone. At this time, the following confirmation interface will pop up on the phone. Click the pairing button on 'sun50iw9p1smp_h618_android_defconfig'the phone to start the pairing process.</li>
#[[File:zero2w-img332.png]]</ol><ol start="8" style="list-style-type: decimal;"><li>After pairing is completed, open '''Paired devices''' and you will see the paired Bluetooth devices.</li>
# configuration written [[File:zero2w-img333.png]]</ol><ol start="9" style="list-style-type: decimal;"><li>At this time, you can use the Bluetooth of your mobile phone to send a picture to the development board. After sending, you can see the following confirmation interface in the Android system of the development board, and then click '''Accept''' to start receiving the pictures sent by the mobile phone.config</li>
#[[File:zero2w-img334.png]]</ol><ol start="10" style="list-style-type: decimal;"><li>Pictures received by the Bluetooth system of the development board Android system can be viewed in '''Received files'''.</li>
make[1[File:zero2w-img335.png]]: Leaving directory '</home/test/H618ol><span id="how-to-set-usb0-to-host-Android12mode-Src/longan/out/kernel1"></build'span>
make: Leaving directory '/home/test/H618-Android12-Src/longan/kernel/linux-5.4'== How to set USB0 to HOST mode ==
INFOAs shown in the figure below, there are two Type-C interfaces on the motherboard of the development board: clean buildserverUSB0 and USB1. Both of these interfaces can be used to power the development board, and they can also be used as USB2.0 HOST interfaces. The difference between USB0 and USB1 is that in addition to being set to HOST mode, USB0 can also be set to Device mode, while USB1 only has HOST mode.
INFO[[File: prepare_buildserverzero2w-img160.png]]
<ol start="2" style="list-style-type: lower-alpha;"><li>Then run USB0 of the '''./build.sh''' script Android12 TV system released by Orange Pi is set to Device mode by default, so when there is no need to use USB0 Device mode (ADB function needs to ensure that USB0 is in Device mode), it is recommended to use USB0 for power supply, so that USB1 can be directly used to start compilationconnect USB devices .</li></ol>
test@testIf you want to use USB0 to connect USB devices, you need to set USB0 to HOST mode. The method is as follows:~/H618-Android12-Src/longan$ '''./build.sh'''
<ol start="3" style="list-style-type: lower-alpha;"><li>After compilation is completed, you will see Run the following outputcommand to set USB0 to HOST mode:</li><{| class="wikitable" style="width:800px;" |-| apollo-p2:/ # '''cat /sys/devices/platform/soc@3000000/soc@3000000\:usbc0@0/ol>usb_host'''
sun50iw9p1 compile Kernel successfulhost_chose finished!
INFOapollo-p2: Prepare toolchain .../ #|}</ol><ol start="2" style="list-style-type: lower-alpha;"><li>Run the following command to switch back to Device mode</li>{| class="wikitable" style="width:800px;" |-| apollo-p2:/ # '''cat /sys/devices/platform/soc@3000000/soc@3000000\:usbc0@0/usb_device'''
'''......'''device_chose finished!
INFOapollo-p2: build kernel OK./ #|}</ol><ol start="3" style="list-style-type: lower-alpha;"><li>The command to view the current mode of USB0 is</li>{| class="wikitable" style="width:800px;" |-| apollo-p2:/ # '''cat /sys/devices/platform/soc@3000000/soc@3000000\:usbc0@0/otg_role'''
INFO: build rootfs ...usb_host|}</ol><span id="how-to-use-usb-camera"></span>
INFO: skip make rootfs for android== How to use USB camera ==
INFO# First insert the USB (UVC protocol) camera into the USB interface of the development board# If the USB camera is recognized normally, the corresponding video device node will be generated under /dev : :{| class="wikitable" style="width:800px;" |-| console:/ # '''ls /dev/video0''' /dev/video0|} <ol start="3" style="list-style-type: decimal;"><li><p>Then make sure that the adb connection between the Ubuntu PC and the development board is normal. For how to use adb, please refer to the instructions in the section &quot;[[Orange Pi Zero 2W#How to use ADB|'''How to use ADB''']]&quot;.</p></li><li><p>Download the USB camera test APP from the '''official tool''' on the development board information download page</p></li> <div class="figure"> [[File:zero2w-img336.png]] </div><div class="figure"> [[File:zero2w-img337.png]] </div></ol><ol start="5" style="list-style-type: decimal;"><li>Then use the adb command to install the USB camera test APP into the Android system. Of course, you can also use a USB disk copy to install it.</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''adb install usbcamera.apk'''|}</ol><ol start="6" style="list-style-type: decimal;"><li>After installation, you can see the startup icon of the USB camera on the Android desktop.</li> [[File:zero2w-img338.png]]</ol><ol start="7" style="list-style-type: decimal;"><li>Then double-click to open the USB camera APP and you can see the output video of the USB camera.</li></ol> <span id="android-system-root-description"></span> == Android system ROOT description == {| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''The Android system released by Orange Pi has been ROOT and can be tested using the following method.'''</big>|} # Download from the '''official tool''' on the development board data download page '''rootcheck.apk''' <div class="figure"> ::[[File:zero2w---------------------img336.png]]
INFO: build lichee OK.</div><div class="figure">
INFO: :[[File:zero2w----------------------------------------img339.png]]
</div><ol start="32" style="list-style-type: decimal;"><li><p>Then make sure that the adb connection between the Ubuntu PC and the development board is normal. For how to use the following command adb, please refer to compile the Android source code and generate instructions in the final Android imagesection &quot;[[Orange Pi Zero 2W#How to use ADB|'''How to use ADB''']]&quot;.</lip></ollitest<li><p>Then use the adb command to install rootcheck.apk into the Android system. Of course, you can also use a USB disk copy to install it.</p></li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''cd H618-Android12-Srcadb install rootcheck.apk'''|}test@test:~/H618</ol><ol start="4" style="list-Android12style-Src$ '''source build/envsetup.sh'''type: decimal;"><li>After installation, you can see the startup icon of the ROOT test@testtool on the Android desktop.</li> [[File:~zero2w-img340.png]]</H618ol><ol start="5" style="list-Android12style-Src$ type: decimal;"><li>The display interface after opening the '''lunch apollo_p2-userdebugROOT test tool''' test@test:~for the first time is as shown below</H618-Android12-Src$ '''make -j8'''li> test@test[[File:~/H618zero2w-Android12-Src$ '''pack'''img341.png]]</ol><ol start="46" style="list-style-type: decimal;"><li><p>The storage path Then you can click '''CHECK NOW''' to start checking the ROOT status of the Android image generated by compilation system. After the check is completed, the display is:as follows. You can see that the Android system has obtained ROOT permissions.</pli><p>'''longan/out/h618_android12_p2_uart0[[File:zero2w-img342.img'''png]]</p></li></olol> <span id="appendixhow-to-use-miracastreceiver-to-cast-the-mobile-phone-screen-to-the-development-board"></span> == How to use MiracastReceiver to cast the mobile phone screen to the development board == <ol style="list-style-type: decimal;"><li><p>First, please make sure that both the development board and the mobile phone are connected to the same WIFI hotspot. For the method of connecting the development board to WIFI, please refer to [[Orange Pi Zero 2W#WI-FI connection method|'''the instructions in the WI-FI connection method.''']]</p></li><li><p>Then open the '''MiracastReceiver'''application in the Android system of the development board</p><p>[[File:zero2w-img343.png]]</p></li><li><p>The interface after '''MiracastReceiver''' is opened is as follows</p><div class="figure"> [[File:zero2w-img344.png]] </div></li><li><p>Then find the screen mirroring function in the phone settings. Here we take '''Xiaomi 12S Pro mobile phone''' as an example. Please research other brands of mobile phones by yourself. As shown in the picture below, click the button in the red box to open the screen mirroring function of the phone.</p><p>[[File:zero2w-img345.png]]</p></li><li><p>After waiting for a period of time, you will be able to see the searched connectable devices on your mobile phone, and then we can select the device corresponding to the development board to connect.</p><p>[[File:zero2w-img346.png]]</p></li><li><p>Then the selection box shown in the figure below will pop up in the '''MiracastReceiver''' application interface of the development board. Here we can select '''Accept'''</p><p>[[File:zero2w-img347.png]]</p></li><li><p>Then you can see the content of the mobile phone screen on the HDMI screen connected to the development board</p><p>[[File:zero2w-img348.png]]</p></li></ol> <span id="method-of-turning-on-and-off-the-machine-through-buttons-or-infrared-remote-control"></span> == Method of turning on and off the machine through buttons or infrared remote control == We can turn off or turn on the Android system of the development board through the power on/off button or infrared remote control. However, it should be noted that there is no power on/off button and infrared receiver on the main board of the development board, and it needs to be expanded through a 24pin expansion board. [[File:zero2w-img107.png]] The location of the power button on the 24pin expansion board is as shown in the figure below: [[File:zero2w-img269.png]] The location of the infrared remote control power button is as follows: [[File:zero2w-img349.png]] When shutting down, we need to press and hold the power button or the power button on the infrared remote control, and then the Android system will pop up the confirmation dialog box shown in the figure below, and then select '''OK''' to shut down the Android system. [[File:zero2w-img350.png]] After shutting down, press and hold the power button or the power button on the infrared remote control again to turn it on. <span id="pin-interface-gpio-uart-spi-test"></span>== 40pin interface GPIO, UART, SPI test == {| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Note: The pin header on the 40pin interface is not soldered by default, and you need to solder it yourself before it can be used.'''</big>|} <span id="pin-gpio-port-test-method"></span>=== 40pin GPIO port test method === # First open wiringOP APP on the desktop ::[[File:zero2w-img351.png]] <ol start="2" style="list-style-type: decimal;"><li>Then click the '''GPIO_TEST''' button to open the GPIO test interface</li> [[File:zero2w-img352.png]]</ol><ol start="3" style="list-style-type: decimal;"><li>The GPIO test interface is as shown in the figure below. The two rows of '''CheckBox''' buttons on the left have a one-to-one correspondence with the 40pin pins. When the '''CheckBox''' button is checked, the corresponding GPIO pin will be set to '''OUT''' mode and the pin level is set to high level; when unchecked, the GPIO pin level will be set to low level; when the GPIO is clicked When you click the '''GPIO READALL''' button, you can get information such as wPi number, GPIO mode, pin level, etc.; when you click the'''BLINK ALL GPIO''' button, all GPIO ports will cycle through outputting high and low levels. This function can be used to test all the 40pin pins. GPIO port.</li> [[File:zero2w-img353.png]]</ol><ol start="4" style="list-style-type: decimal;"><li>Then click the '''GPIO READALL''' button, and the output information is as shown below:</li> <div class="figure"> [[File:zero2w-img354.png]] </div></ol><ol start="5" style="list-style-type: decimal;"><li>There are a total of 28 GPIO ports available in the 40-pin development board. The following takes pin 12 - corresponding to GPIO PI01 - corresponding to wPi serial number 6 - as an example to demonstrate how to set the high and low levels of the GPIO port. First click the '''CheckBox''' button corresponding to pin 12. When the button is selected, pin 12 will be set to high level. After setting, you can use a multimeter to measure the value of the voltage of the pin. If it is '''3.3v''', it means the setting High level success.</li> [[File:zero2w-img355.png]]</ol><ol start="6" style="list-style-type: decimal;"><li>Then click the '''GPIO READALL''' button and you can see that the current pin 12 mode is '''OUT''' and the pin level is high level.</li> [[File:zero2w-img356.png]]</ol><ol start="7" style="list-style-type: decimal;"><li>Click the '''CheckBox''' button in the picture below again to uncheck it, and pin 12 will be set to low level. After setting, you can use a multimeter to measure the voltage value of the pin. If it is '''0v''', it means the low level setting is successful.</li> [[File:zero2w-img357.png]]</ol><ol start="8" style="list-style-type: decimal;"><li>Then click the '''GPIO READALL''' button and you can see that the current pin 12 mode is OUT and the pin level is low level.</li> [[File:zero2w-img358.png]]</ol><span id="pin-uart-test-method"></span> === 40pin UART test method === # As can be seen from the table below, the default uarts available in the Android12 TV system are uart2 and uart5. Please note that uart0 is set as a debugging serial port by default. Please do not use uart0 as a normal serial port. <div style="display: flex;">::{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''GPIO NO.'''| '''GPIO'''| '''Function'''| '''Pin'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''1'''|-| '''264'''| '''PI8'''| '''TWI1-SDA'''| '''3'''|-| '''263'''| '''PI7'''| '''TWI1-SCL'''| '''5'''|-| '''269'''| '''PI13'''| '''PWM3'''| '''7'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''9'''|-| '''<span style="color:#FF0000">226</span>'''| '''<span style="color:#FF0000">PH2</span>'''| '''<span style="color:#FF0000">UART5_TX</span>'''| '''<span style="color:#FF0000">11</span>'''|-| '''<span style="color:#FF0000">227</span>'''| '''<span style="color:#FF0000">PH3</span>'''| '''<span style="color:#FF0000">UART5_RX</span>'''| '''<span style="color:#FF0000">13</span>'''|-| '''<span style="color:#FF0000">261</span>'''| '''<span style="color:#FF0000">PI5</span>'''| '''<span style="color:#FF0000">UART2_TX</span>'''| '''<span style="color:#FF0000">15</span>'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''17'''|-| '''231'''| '''PH7'''| '''SPI1_MOSI'''| '''19'''|-| '''232'''| '''PH8'''| '''SPI1_MISO'''| '''21'''|-| '''230'''| '''PH6'''| '''SPI1_CLK'''| '''23'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''25'''|-| '''266'''| '''PI10'''| '''TWI2-SDA'''| '''27'''|-| '''256'''| '''PI0'''| style="text-align: left;"|| '''29'''|-| '''271'''| '''PI15'''| style="text-align: left;"|| '''31'''|-| '''268'''| '''PI12'''| '''PWM2'''| '''33'''|-| '''258'''| '''PI2'''| style="text-align: left;"|| '''35'''|-| '''272'''| '''PI16'''| style="text-align: left;"|| '''37'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''39'''|}{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''Pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''8'''| '''UART0_TX'''| '''PH0'''| '''224'''|-| '''10'''| '''UART0_RX'''| '''PH1'''| '''225'''|-| '''12'''| style="text-align: left;"|| '''PI1'''| '''257'''|-| '''14'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''16'''| '''PWM4'''| '''PI14'''| '''270'''|-| '''18'''| style="text-align: left;"|| '''PH4'''| '''228'''|-| '''20'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''<span style="color:#FF0000">22</span>'''| '''<span style="color:#FF0000">UART2_RX</span>'''| '''<span style="color:#FF0000">PI6</span>'''| '''<span style="color:#FF0000">262</span>'''|-| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229'''|-| '''26'''| '''SPI1_CS1'''| '''PH9'''| '''233'''|-| '''28'''| '''TWI2-SCL'''| '''PI9'''| '''265'''|-| '''30'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''32'''| '''PWM1'''| '''PI11'''| '''267'''|-| '''34'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''36'''| style="text-align: left;"|| '''PC12'''| '''76'''|-| '''38'''| style="text-align: left;"|| '''PI4'''| '''260'''|-| '''40'''| style="text-align: left;"|| '''PI3'''| '''259'''|}</div> <ol start="2" style="list-style-type: decimal;"><li>The device node corresponding to uart2 is '''/dev/ttyAS2''', and the device node corresponding to uart5 is'''/dev/ttyAS5'''</li>{| class="wikitable" style="width:800px;" |-| <p>apollo-p2:/ # ls /dev/ttyAS*</p><p>/dev/ttyAS0 &nbsp;&nbsp;&nbsp;&nbsp; /dev/ttyAS1 &nbsp;&nbsp;&nbsp;&nbsp; '''<span style="color:#FF0000">/dev/ttyAS2 &nbsp;&nbsp;&nbsp;&nbsp; /dev/ttyAS5</span>'''</p>|}</ol><ol start="3" style="list-style-type: decimal;"><li>First open wiringOP APP on the desktop</li> [[File:zero2w-img351.png]]</ol><ol start="4" style="list-style-type: decimal;"><li>Then click the '''UART_TEST'''button to open the UART test interface</li> [[File:zero2w-img359.png]]</ol><ol start="5" style="list-style-type: decimal;"><li>The serial port test interface of wiringOP is as shown in the figure below</li> [[File:zero2w-img360.png]]</ol><ol start="6" style="list-style-type: decimal;"><li><p>Then select the '''/dev/ttyAS2''' or'''/dev/ttyAS5''' node in the selection box</p><p>[[File:zero2w-img361.png]]</p></li><li><p>Enter the baud rate you want to set in the edit box, and then click the '''OPEN''' button to open the uart node. After the opening is successful, the '''OPEN''' button becomes unselectable, and the '''CLOSE''' button and '''SEND''' button become selectable.</p></li> [[File:zero2w-img362.png]]</ol><ol start="8" style="list-style-type: decimal;"><li><p>Then use Dupont wire to short the rx and tx pins of uart</p></li><li><p>Then you can enter a paragraph of characters in the send edit box below and click the '''SEND''' button to start sending.</p></li> [[File:zero2w-img363.png]]</ol><ol start="10" style="list-style-type: decimal;"><li>If everything is normal, the received string will be displayed in the receiving box</li> [[File:zero2w-img364.png]]</ol><span id="pin-spi-test-method"></span> === 40pin SPI test method === # As can be seen from the table below, the spi available for the 40pin interface is spi1, and there are two chip select pins cs0 and cs1 <div style="display: flex;">::{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''GPIO NO.'''| '''GPIO'''| '''Function'''| '''Pin'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''1'''|-| '''264'''| '''PI8'''| '''TWI1-SDA'''| '''3'''|-| '''263'''| '''PI7'''| '''TWI1-SCL'''| '''5'''|-| '''269'''| '''PI13'''| '''PWM3'''| '''7'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''9'''|-| '''226'''| '''PH2'''| '''UART5_TX'''| '''11'''|-| '''227'''| '''PH3'''| '''UART5_RX'''| '''13'''|-| '''261'''| '''PI5'''| '''UART2_TX'''| '''15'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''17'''|-| '''231'''| '''PH7'''| '''SPI1_MOSI'''| '''19'''|-| '''232'''| '''PH8'''| '''SPI1_MISO'''| '''21'''|-| '''230'''| '''PH6'''| '''SPI1_CLK'''| '''23'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''25'''|-| '''266'''| '''PI10'''| '''TWI2-SDA'''| '''27'''|-| '''256'''| '''PI0'''| style="text-align: left;"|| '''29'''|-| '''271'''| '''PI15'''| style="text-align: left;"|| '''31'''|-| '''268'''| '''PI12'''| '''PWM2'''| '''33'''|-| '''258'''| '''PI2'''| style="text-align: left;"|| '''35'''|}{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''Pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''8'''| '''UART0_TX'''| '''PH0'''| '''224'''|-| '''10'''| '''UART0_RX'''| '''PH1'''| '''225'''|-| '''12'''| style="text-align: left;"|| '''PI1'''| '''257'''|-| '''14'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''16'''| '''PWM4'''| '''PI14'''| '''270'''|-| '''18'''| style="text-align: left;"|| '''PH4'''| '''228'''|-| '''20'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''22'''| '''UART2_RX'''| '''PI6'''| '''262'''|-| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229'''|-| '''26'''| '''SPI1_CS1'''| '''PH9'''| '''233'''|-| '''28'''| '''TWI2-SCL'''| '''PI9'''| '''265'''|-| '''30'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''32'''| '''PWM1'''| '''PI11'''| '''267'''|-| '''34'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''36'''| style="text-align: left;"|| '''PC12'''| '''76'''|}</div> <ol start="2" style="list-style-type: decimal;"><li>The device node corresponding to SPI1 CS0 is '''/dev/spidev1.0''', and the device node corresponding to SPI1 CS1 is '''/dev/spidev1.1'''</li>{| class="wikitable" style="width:800px;" |-| apollo-p2:/ # '''ls /dev/spidev1.*''' '''<span style="color:#FF0000">/dev/spidev1.0 &nbsp;&nbsp;&nbsp;&nbsp; /dev/spidev1.1</span>'''|}</ol><ol start="3" style="list-style-type: decimal;"><li>Here is a demonstration to test the SPI1 interface through the '''w25qxx''' module. First, connect the w25qxx module to the SPI1 interface.</li>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''It doesn't matter if there is no w25qxx module, because there is a SPIFlash on the development board connected to SPI0, and the configuration of SPI0 is also turned on by default in Android, so we can also directly use the onboard SPIFlash for testing.'''</big>|}</ol><ol start="4" style="list-style-type: decimal;"><li>Then open wiringOP APP on the desktop</li> [[File:zero2w-img351.png]]</ol><ol start="5" style="list-style-type: decimal;"><li>Then click the '''SPI_TEST''' button to open the SPI test interface</li> [[File:zero2w-img365.png]]</ol><ol start="6" style="list-style-type: decimal;"><li><p>Then select the spi device node in the upper left corner. If you test the onboard SPIFlash directly, just keep the default '''/dev/spidev0.0'''. If the '''w25qxx''' module is connected to the 40pin spi1 cs0, then please select'''/dev/spidev1.0''', if the w25qxx module is connected to the 40pin spi1 cs1, then please select '''/dev/spidev1.1'''</p><div class="figure"> [[File:zero2w-img366.png]] </div></li><li><p>Then click the '''OPEN''' button to initialize the SPI</p></li> [[File:zero2w-img367.png]]</ol><ol start="8" style="list-style-type: decimal;"><li>Then fill in the bytes that need to be sent, such as reading the ID information of the onboard SPIFlash, filling in the address 0x9f in data[0], and then click the '''TRANSFER''' button</li> [[File:zero2w-img368.png]]</ol><ol start="9" style="list-style-type: decimal;"><li>Finally, the APP will display the read ID information of the onboard SPI Flash.</li> [[File:zero2w-img369.png]]</ol><ol start="10" style="list-style-type: decimal;"><li>If the w25qxx module connected to 40pin SPI1 is read, the ID information of the onboard SPI Flash is also similar.</li></ol> <span id="pin-i2c-test-method"></span> === 40pin I2C test method === # As can be seen from the table below, the Android12 TV system has i2c1 and i2c2 turned on by default. <div style="display: flex;">::{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''GPIO NO.'''| '''GPIO'''| '''Function'''| '''Pin'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''1'''|-| '''<span style="color:#FF0000">264</span>'''| '''<span style="color:#FF0000">PI8</span>'''| '''<span style="color:#FF0000">TWI1-SDA</span>'''| '''<span style="color:#FF0000">3</span>'''|-| '''<span style="color:#FF0000">263</span>'''| '''<span style="color:#FF0000">PI7</span>'''| '''<span style="color:#FF0000">TWI1-SCL</span>'''| '''<span style="color:#FF0000">5</span>'''|-| '''269'''| '''PI13'''| '''PWM3'''| '''7'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''9'''|-| '''226'''| '''PH2'''| '''UART5_TX'''| '''11'''|-| '''227'''| '''PH3'''| '''UART5_RX'''| '''13'''|-| '''261'''| '''PI5'''| '''UART2_TX'''| '''15'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''17'''|-| '''231'''| '''PH7'''| '''SPI1_MOSI'''| '''19'''|-| '''232'''| '''PH8'''| '''SPI1_MISO'''| '''21'''|-| '''230'''| '''PH6'''| '''SPI1_CLK'''| '''23'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''25'''|-| '''<span style="color:#FF0000">266</span>'''| '''<span style="color:#FF0000">PI10</span>'''| '''<span style="color:#FF0000">TWI2-SDA</span>'''| '''<span style="color:#FF0000">27</span>'''|-| '''256'''| '''PI0'''| style="text-align: left;"|| '''29'''|-| '''271'''| '''PI15'''| style="text-align: left;"|| '''31'''|-| '''268'''| '''PI12'''| '''PWM2'''| '''33'''|-| '''258'''| '''PI2'''| style="text-align: left;"|| '''35'''|-| '''272'''| '''PI16'''| style="text-align: left;"|| '''37'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''39'''|}{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''Pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''8'''| '''UART0_TX'''| '''PH0'''| '''224'''|-| '''10'''| '''UART0_RX'''| '''PH1'''| '''225'''|-| '''12'''| style="text-align: left;"|| '''PI1'''| '''257'''|-| '''14'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''16'''| '''PWM4'''| '''PI14'''| '''270'''|-| '''18'''| style="text-align: left;"|| '''PH4'''| '''228'''|-| '''20'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''22'''| '''UART2_RX'''| '''PI6'''| '''262'''|-| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229'''|-| '''26'''| '''SPI1_CS1'''| '''PH9'''| '''233'''|-| '''<span style="color:#FF0000">28</span>'''| '''<span style="color:#FF0000">TWI2-SCL</span>'''| '''<span style="color:#FF0000">PI9</span>'''| '''<span style="color:#FF0000">265</span>'''|-| '''30'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''32'''| '''PWM1'''| '''PI11'''| '''267'''|-| '''34'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''36'''| style="text-align: left;"|| '''PC12'''| '''76'''|-| '''38'''| style="text-align: left;"|| '''PI4'''| '''260'''|-| '''40'''| style="text-align: left;"|| '''PI3'''| '''259'''|}</div> <ol start="2" style="list-style-type: decimal;"><li>The device node corresponding to i2c1 is '''/dev/i2c-1''', and the device node corresponding to i2c2 is '''/dev/i2c-2'''</li>{| class="wikitable" style="width:800px;" |-| apollo-p2:/ # '''ls /dev/i2c-*''' '''<span style="color:#FF0000">/dev/i2c-1 &nbsp;&nbsp;&nbsp;&nbsp; /dev/i2c-2</span>''' &nbsp;&nbsp;&nbsp;&nbsp; /dev/i2c-5|}</ol><ol start="3" style="list-style-type: decimal;"><li>First open wiringOP APP on the desktop</li> [[File:zero2w-img351.png]]</ol><ol start="4" style="list-style-type: decimal;"><li>Then click the '''I2C_TEST''' button to open the i2c test interface</li> [[File:zero2w-img370.png]]</ol><ol start="5" style="list-style-type: decimal;"><li>The i2c test interface of wiringOP is shown in the figure below</li> [[File:zero2w-img371.png]]</ol><ol start="6" style="list-style-type: decimal;"><li>Then click the device node selection box in the upper left corner to select the i2c you want to test</li> [[File:zero2w-img372.png]]</ol><ol start="7" style="list-style-type: decimal;"><li>Then connect an i2c device to the 40pin i2c pin. Here we take the ds1307 rtc module as an example.</li> [[File:zero2w-img178.png]]</ol><ol start="8" style="list-style-type: decimal;"><li><p>The i2c address of the ds1307 rtc module is 0x68. After connecting the lines, we can use the '''i2cdetect -y 1''' or '''i2cdetect -y 2''' command on the serial port command line to check whether the i2c address of the ds1307 rtc module can be scanned. If you can see the address 0x68, it means that the ds1307 rtc module is wired correctly.</p>{| class="wikitable" style="width:800px;" |-| <p>apollo-p2:/ # '''i2cdetect -y 1'''</p><p>'''Or'''</p><p>apollo-p2:/ # '''i2cdetect -y 2'''</p>|}<p>[[File:zero2w-img373.png]]</p></li><li><p>Then set the i2c address to 0x68 in wiringOP, and then click the '''OPEN''' button to open i2c</p><p>[[File:zero2w-img374.png]]</p></li><li><p>After clicking the '''OPEN''' button to open i2c, the display is as follows</p><p>[[File:zero2w-img375.png]]</p></li><li><p>Then we test writing a value to the register of the rtc module, for example, writing 0x55 to the 0x1c address</p><ol style="list-style-type: lower-alpha;"><li><p>We first set the address of the register to be written to 0x1c</p><p>[[File:zero2w-img376.png]]</p></li><li><p>Then set the value to be written to 0x55</p><p>[[File:zero2w-img377.png]]</p></li><li><p>Then click the '''WRITE BYTE''' button to perform the writing action</p><p>[[File:zero2w-img378.png]]</p></li></ol></li><li><p>Then click the '''READ BYTE''' button to read the value of the 0x1c register. If it displays 0x55, it means that the i2c read and write test has passed.</p><p>[[File:zero2w-img379.png]]</p></li></ol> <span id="pin-pwm-test"></span> === 40pin PWM test === # As can be seen from the table below, the available pwm are pwm1, pwm2, pwm3 and pwm4. <div style="display: flex;">::{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''GPIO NO.'''| '''GPIO'''| '''Function'''| '''Pin'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''1'''|-| '''264'''| '''PI8'''| '''TWI1-SDA'''| '''3'''|-| '''263'''| '''PI7'''| '''TWI1-SCL'''| '''5'''|-| '''<span style="color:#FF0000">269</span>'''| '''<span style="color:#FF0000">PI13</span>'''| '''<span style="color:#FF0000">PWM3</span>'''| '''<span style="color:#FF0000">7</span>'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''9'''|-| '''226'''| '''PH2'''| '''UART5_TX'''| '''11'''|-| '''227'''| '''PH3'''| '''UART5_RX'''| '''13'''|-| '''261'''| '''PI5'''| '''UART2_TX'''| '''15'''|-| style="text-align: left;"|| style="text-align: left;"|| '''3.3V'''| '''17'''|-| '''231'''| '''PH7'''| '''SPI1_MOSI'''| '''19'''|-| '''232'''| '''PH8'''| '''SPI1_MISO'''| '''21'''|-| '''230'''| '''PH6'''| '''SPI1_CLK'''| '''23'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''25'''|-| '''266'''| '''PI10'''| '''TWI2-SDA'''| '''27'''|-| '''256'''| '''PI0'''| style="text-align: left;"|| '''29'''|-| '''271'''| '''PI15'''| style="text-align: left;"|| '''31'''|-| '''<span style="color:#FF0000">268</span>'''| '''<span style="color:#FF0000">PI12</span>'''| '''<span style="color:#FF0000">PWM2</span>'''| '''<span style="color:#FF0000">33</span>'''|-| '''258'''| '''PI2'''| style="text-align: left;"|| '''35'''|-| '''272'''| '''PI16'''| style="text-align: left;"|| '''37'''|-| style="text-align: left;"|| style="text-align: left;"|| '''GND'''| '''39'''|}{| class="wikitable" style="width:390px;margin-right: 20px;text-align: center;"|-| '''Pin'''| '''Function'''| '''GPIO'''| '''GPIO NO.'''|-| '''2'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''4'''| '''5V'''| style="text-align: left;"|| style="text-align: left;"||-| '''6'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''8'''| '''UART0_TX'''| '''PH0'''| '''224'''|-| '''10'''| '''UART0_RX'''| '''PH1'''| '''225'''|-| '''12'''| style="text-align: left;"|| '''PI1'''| '''257'''|-| '''14'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''<span style="color:#FF0000">16</span>'''| '''<span style="color:#FF0000">PWM4</span>'''| '''<span style="color:#FF0000">PI14</span>'''| '''<span style="color:#FF0000">270</span>'''|-| '''18'''| style="text-align: left;"|| '''PH4'''| '''228'''|-| '''20'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''22'''| '''UART2_RX'''| '''PI6'''| '''262'''|-| '''24'''| '''SPI1_CS0'''| '''PH5'''| '''229'''|-| '''26'''| '''SPI1_CS1'''| '''PH9'''| '''233'''|-| '''28'''| '''TWI2-SCL'''| '''PI9'''| '''265'''|-| '''30'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''<span style="color:#FF0000">32</span>'''| '''<span style="color:#FF0000">PWM1</span>'''| '''<span style="color:#FF0000">PI11</span>'''| '''<span style="color:#FF0000">267</span>'''|-| '''34'''| '''GND'''| style="text-align: left;"|| style="text-align: left;"||-| '''36'''| style="text-align: left;"|| '''PC12'''| '''76'''|-| '''38'''| style="text-align: left;"|| '''PI4'''| '''260'''|-| '''40'''| style="text-align: left;"|| '''PI3'''| '''259'''|}</div> <ol start="2" style="list-style-type: decimal;"><li>First click the wiringOP icon to open wiringOP APP</li> [[File:zero2w-img351.png]]</ol><ol start="3" style="list-style-type: decimal;"><li>Then click the '''PWM_TEST''' button on the main interface of wiringOP to enter the PWM test interface</li> [[File:zero2w-img380.png]]</ol><ol start="4" style="list-style-type: decimal;"><li>The PWM test interface is as follows</li> <div class="figure"> [[File:zero2w-img381.png]] </div></ol><ol start="5" style="list-style-type: decimal;"><li>Then set which PWM you want to use in the Channel. The default is PWM1. If you want to set it to PWM2, just enter 2 in the Channel. PWM3 and PWM4 and so on.</li> [[File:zero2w-img382.png]]</ol><ol start="6" style="list-style-type: decimal;"><li>Then you can set the PWM period. The default configuration is '''50000ns'''. The converted PWM frequency is '''20KHz'''</li> [[File:zero2w-img383.png]]</ol><ol start="7" style="list-style-type: decimal;"><li>Then click the '''EXPORT'''button to export PWM</li> [[File:zero2w-img384.png]]</ol><ol start="8" style="list-style-type: decimal;"><li>Then drag the progress bar below to change the PWM duty cycle, and then check '''Enable''' to output the PWM waveform.</li> [[File:zero2w-img385.png]]</ol><ol start="9" style="list-style-type: decimal;"><li>Then use an oscilloscope to measure the corresponding pins in the 40pin development board and you can see the following waveform.</li> [[File:zero2w-img386.png]]</ol><span id="how-to-compile-android-12-source-code"></span> = '''How to compile Android 12 source code''' = <span id="download-the-source-code-of-android-12"></span>== Download the source code of Android 12 == <ol style="list-style-type: decimal;"><li><p>First download the compressed package of the Android 12 source code and the compressed package of the files modified by Orange Pi Zero2w from Google Cloud Drive</p><ol style="list-style-type: lower-alpha;"><li>Google Cloud Drive</li> [[File:zero2w-img387.png]]</ol></li></ol><ol start="2" style="list-style-type: decimal;"><li>After downloading the compressed package of Android 12 source code, please check whether the MD5 checksum is correct. If it is incorrect, please download the source code again. Here's how to check the MD5 checksum:</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''md5sum -c H618-Android12-Src.tar.gz.md5sum''' H618-Android12-Src.tar.gzaa: '''<span style="color:#FF0000">OK</span>''' H618-Android12-Src.tar.gzab: '''<span style="color:#FF0000">OK</span>''' ......|}</ol><ol start="3" style="list-style-type: decimal;"><li>Then you need to merge multiple compressed files into one, and then extract the Android source code. The command looks like this:</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''cat H618-Android12-Src.tar.gz<span style="color:#FF0000">a</span>* &gt; H618-Android12-Src.tar.gz''' test@test:~$ '''tar -xvf H618-Android12-Src.tar.gz'''|}</ol><ol start="4" style="list-style-type: decimal;"><li>Then unzip the compressed package of the files modified by Orange Pi Zero2w</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''tar zxf opizero2w_android12_patches.tar.gz''' test@test:~$ '''ls''' '''opizero2w_android12_patches''' opizero2w_android12_patches.tar.gz|}</ol><ol start="5" style="list-style-type: decimal;"><li>Then copy the files modified by Orange Pi Zero2w to the Android source code</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''cp -rf opizero2w_android12_patches/* H618-Android12-Src/'''|}</ol><span id="compile-the-source-code-of-android-12"></span> == Compile the source code of Android 12 == {| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Android12 is compiled on an x86_64 computer with <span style="color:#FF0000">Ubuntu 22.04</span> installed. Other versions of Ubuntu system package dependencies may have some differences. The image download address of the Ubuntu 22.04 <span style="color:#FF0000">amd64</span> version is as follows:''' [https://repo.huaweicloud.com/ubuntu-releases/22.04/ubuntu-22.04.2-desktop-amd64.iso '''https://repo.huaweicloud.com/ubuntu-releases/22.04/ubuntu-22.04.2-desktop-amd64.iso'''] '''The x86_64 computer hardware configuration for compiling Android12 source code recommends a memory of 16GB or more, and a hard disk space of 200GB or more is recommended. The more CPU cores, the better.'''</big>|} # First install the software packages needed to compile Android12 source code ::{| class="wikitable" style="width:800px;" |-| test@test:~$ '''sudo apt-get update''' test@test:~$ '''sudo apt-get install -y git gnupg flex bison gperf build-essential \''' '''zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \''' '''lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \''' '''libgl1-mesa-dev libxml2-utils xsltproc unzip u-boot-tools python-is-python3 \''' '''libssl-dev libncurses5 clang gawk'''|} <ol start="2" style="list-style-type: decimal;"><li><p>Then compile the code in the longan folder, which mainly contains u-boot and linux kernel</p><ol style="list-style-type: lower-alpha;"><li>First run '''./build.sh config''' to set compilation options</li>{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''cd H618-Android12-Src/longan'''</p><p>test@test:~/H618-Android12-Src/longan$ '''./build.sh config'''</p>  <p>Welcome to mkscript setup progress</p><p>All available platform:</p>:<p>0. android</p>:<p>1. linux</p><p>Choice [android]: '''<span style="color:#FF0000">0</span>'''</p><p>All available ic:</p>:<p>0. h618</p><p>Choice [h618]: '''<span style="color:#FF0000">0</span>'''</p><p>All available board:</p>:<p>0. ft</p>:<p>1. p1</p>:<p>2. p2</p>:<p>3. p7</p>:<p>4. p7l</p>:<p>5. perf1</p>:<p>6. perf2</p>:<p>7. perf3</p>:<p>8. qa</p><p>Choice [p2]: '''<span style="color:#FF0000">2</span>'''</p><p>All available flash:</p>:<p>0. default</p>:<p>1. nor</p><p>Choice [default]: '''<span style="color:#FF0000">0</span>'''</p><p>All available kern_ver:</p>:<p>0. linux-5.4</p><p>Choice [linux-5.4]: '''<span style="color:#FF0000">0</span>'''</p><p>All available arch:</p>:<p>0. arm</p>:<p>1. arm64</p><p>Choice [arm64]: '''<span style="color:#FF0000">1</span>'''</p><p>'''......'''</p><p>*** Default configuration is based on 'sun50iw9p1smp_h618_android_defconfig'</p><p>#</p><p># configuration written to .config</p><p>#</p><p>make[1]: Leaving directory '/home/test/H618-Android12-Src/longan/out/kernel/build'</p><p>make: Leaving directory '/home/test/H618-Android12-Src/longan/kernel/linux-5.4'</p><p>INFO: clean buildserver</p><p>INFO: prepare_buildserver</p>|}</ol><ol start="2" style="list-style-type: lower-alpha;"><li>Then run the '''./build.sh''' script to start compilation.</li>{| class="wikitable" style="width:800px;" |-| test@test:~/H618-Android12-Src/longan$ '''./build.sh'''|}</ol><ol start="3" style="list-style-type: lower-alpha;"><li>After compilation is completed, you will see the following output</li>{| class="wikitable" style="width:800px;" |-| sun50iw9p1 compile Kernel successful INFO: Prepare toolchain ... '''......''' INFO: build kernel OK. INFO: build rootfs ... INFO: skip make rootfs for android INFO: ---------------------------------------- INFO: build lichee OK. INFO: ----------------------------------------|}</ol></li></ol><ol start="3" style="list-style-type: decimal;"><li>Then use the following command to compile the Android source code and generate the final Android image</li>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''cd H618-Android12-Src''' test@test:~/H618-Android12-Src$ '''source build/envsetup.sh''' test@test:~/H618-Android12-Src$ '''lunch apollo_p2-userdebug''' test@test:~/H618-Android12-Src$ '''make -j8''' test@test:~/H618-Android12-Src$ '''pack'''|}</ol><ol start="4" style="list-style-type: decimal;"><li><p>The storage path of the Android image generated by compilation is:</p>{| class="wikitable" style="width:800px;" |-| <p>'''longan/out/h618_android12_p2_uart0.img'''</p>|}</li></ol> <span id="appendix"></span> = '''Appendix''' = <span id="user-manual-update-history"></span>== User manual update history == {| class="wikitable" style="width:800px;text-align: center;"|-| '''Version'''| '''Date'''| '''Release Notes'''|-| v1.0| 2023-09-14| initial version|} <span id="image-update-history"></span>== Image update history == {| class="wikitable" style="width:800px;"|-| style="text-align: center;"| '''Date''' | style="text-align: center;"| '''Release Notes'''|-| style="text-align: center;"| 2023-09-14| orangepizero2w_1.0.0_debian_bullseye_server_linux5.4.125.7z orangepizero2w_1.0.0_ubuntu_focal_server_linux5.4.125.7z orangepizero2w_1.0.0_ubuntu_focal_desktop_xfce_linux5.4.125.7z orangepizero2w_1.0.0_debian_bullseye_desktop_xfce_linux5.4.125.7z  orangepizero2w_1.0.0_ubuntu_jammy_server_linux6.1.31.7z orangepizero2w_1.0.0_debian_bookworm_server_linux6.1.31.7z orangepizero2w_1.0.0_debian_bullseye_server_linux6.1.31.7z orangepizero2w_1.0.0_ubuntu_jammy_desktop_xfce_linux6.1.31.7z orangepizero2w_1.0.0_debian_bookworm_desktop_xfce_linux6.1.31.7z orangepizero2w_1.0.0_debian_bullseye_desktop_xfce_linux6.1.31.7z  OrangePi_Zero2w_Android12_v1.0.tar.gz
= '''Appendix''' =
 
<span id="user-manual-update-history"></span>
== User manual update history ==
 
{| class="wikitable"
|-
| '''Version'''
| '''Date'''
| '''Release Notes'''
|-
| v1.0
| 2023-09-14
| initial version
|}
 
<span id="image-update-history"></span>
== Image update history ==
 
{| class="wikitable"
|-
| '''Date'''
 
| '''Release Notes'''
|-
| 202 3-09-14
|
orangepizero2w_1.0.0_debian_bullseye_server_linux5.4.125.7z
 
orangepizero2w_1.0.0_ubuntu_focal_server_linux5.4.125.7z
 
orangepizero2w_1.0.0_ubuntu_focal_desktop_xfce_linux5.4.125.7z
 
orangepizero2w_1.0.0_debian_bullseye_desktop_xfce_linux5.4.125.7z
 
orangepizero2w_1.0.0_ubuntu_jammy_server_linux6.1.31.7z
 
orangepizero2w_1.0.0_debian_bookworm_server_linux6.1.31.7z
 
orangepizero2w_1.0.0_debian_bullseye_server_linux6.1.31.7z
 
orangepizero2w_1.0.0_ubuntu_jammy_desktop_xfce_linux6.1.31.7z
 
orangepizero2w_1.0.0_debian_bookworm_desktop_xfce_linux6.1.31.7z
 
orangepizero2w_1.0.0_debian_bullseye_desktop_xfce_linux6.1.31.7z
 
OrangePi_Zero2w_Android12_v1.0.tar.gz
Opios-arch-aarch64-xfce-opizero2w-23.09-linux6.1.31.img.xz

Navigation menu