打开主菜单

Wiki-Orange Pi β

更改

Orange Pi 5 Ultra

添加539,842字节, 2024年12月9日 (一) 20:13
创建页面,内容为“'''Orange Pi 5 Ultra''' '''用户手册''' <div class="figure"> 546x477px|_MG_3135 </div> <span id="orange-pi-5-ultra的…”
'''Orange Pi 5 Ultra'''

'''用户手册'''

<div class="figure">

[[File:Orange_Pi_5_Ultra-image2.png|546x477px|_MG_3135]]

</div>

<span id="orange-pi-5-ultra的基本特性"></span>
= Orange Pi 5 Ultra的基本特性 =

<span id="什么是-orange-pi-5-ultra"></span>
== 什么是 Orange Pi 5 Ultra ==

Orange Pi 5 Ultra采用了瑞芯微RK3588新一代八核64位ARM处理器,具体为四核A76和四核A55,采用的三星8nm LP制程工艺,大核主频最高可达2.4GHz,集成ARM Mali-G610 MP4 GPU,内嵌高性能3D和2D图像加速模块,内置高达6 Tops算力的AI加速器NPU,拥有4GB/8GB/16GB(LPDDR5)内存,具有高达8K显示处理能力。

Orange Pi 5 Ultra引出了相当丰富的接口,包括HDMI输出、HDMI输入、Wi-Fi6、M.2 M-key PCIe3.0x4、2.5G网口、USB2.0、USB3.1接口和40pin扩展排针等。可广泛适用于高端平板、边缘计算、人工智能、云计算、AR/VR、智能安防、智能家居等领域,覆盖 AIoT各个行业。

Orange Pi 5 Ultra支持Orange Pi 官方研发的操作系统Orange Pi OS,同时,支持Android 13、Debian11、Debian12、Ubuntu20.04和Ubuntu22.04等操作系统。

<span id="orange-pi-5-ultra的用途"></span>
== Orange Pi 5 Ultra的用途 ==

我们可以用它实现:

* 一台Linux桌面计算机。
* 一台Linux网络服务器。
* Android平板。
* Android游戏机等。

'''当然还有其他更多的功能,依托强大的生态系统以及各式各样的扩展配件,Orange Pi可以帮助用户轻松实现从创意到原型再到批量生产的交付,是创客、梦想家、业余爱好者的理想创意平台。'''

<span id="orange-pi-5-ultra的硬件特性"></span>
== Orange Pi 5 Ultra的硬件特性 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''硬件特性介绍'''
| style="text-align: center;"|
|-
| style="text-align: center;"| CPU
| style="text-align: center;"| • Rockchip RK3588 (8nm LP制程)

• 8核64位处理器

• 4核Cortex-A76和4核Cortex-A55大小核架构

• 大核主频最高2.4GHz,小核主频最高1.8GHz

|-
| style="text-align: center;"| GPU
| style="text-align: center;"| • 集成ARM Mali-G610

• OpenGL ES1.1/2.0/3.2、OpenCL 2.2 和 Vulkan 1.2

|-
| style="text-align: center;"| NPU
| style="text-align: center;"| • 内置高达6 Tops算力的AI加速器NPU

• 支持INT4/INT8/INT16混合运算

|-
| style="text-align: center;"| 视频
| style="text-align: center;"| • 1 * HDMI 2.1,最大支持8K @60Hz

• 1 * HDMI输入,高达4K@60FPS

• 1 * MIPI D-PHY TX 4Lane

|-
| style="text-align: center;"| 内存
| style="text-align: center;"| 4GB/8GB/16GB(LPDDR5)
|-
| style="text-align: center;"| 摄像头
| style="text-align: center;"| • 2 * MIPI CSI 4Lane

• 1 * MIPI D-PHY RX 4Lane

|-
| style="text-align: center;"| PMU
| style="text-align: center;"| RK806-1
|-
| style="text-align: center;"| 板载存储
| style="text-align: center;"| • eMMC插座,可外接eMMC模块

• 16MB QSPI Nor FLASH

• MicroSD (TF) Card插槽

• PCIe3.0x4 M.2 M-KEY (SSD) 插槽

|-
| style="text-align: center;"| 以太网
| style="text-align: center;"| 1 * PCIe 2.5G 以太网口(RTL8125BG )
|-
| style="text-align: center;"| WIFI+BT
| style="text-align: center;"| • 板载Wi-Fi 6E+BT 5.3/BLE模块:AP6611

• Wi-Fi接口:SDIO3.0

• BT接口:UART/PCM

|-
| style="text-align: center;"| 音频
| style="text-align: center;"| • 3.5mm 耳机孔音频输入/输出

• 板载MIC输入

• 2 * HDMI输出

|-
| style="text-align: center;"| PCIe M.2 M-KEY
| style="text-align: center;"| • PCIe 3.0 x 4 lanes,用于接NVMe SSD固态硬盘
|-
| style="text-align: center;"| USB接口
| style="text-align: center;"| • 1 * USB3.0支持Device或HOST模式

• 1 * USB3.0 HOST

• 2 * USB2.0 HOST

|-
| style="text-align: center;"| 40pin扩展排针
| style="text-align: center;"| 用于扩展UART、PWM、I2C、SPI、CAN和GPIO接口
|-
| style="text-align: center;"| 调试串口
| style="text-align: center;"| 包含在40PIN扩展口内
|-
| style="text-align: center;"| LED灯
| style="text-align: center;"| RGB LED三色指示灯
|-
| style="text-align: center;"| 按键
| style="text-align: center;"| 1 * MaskROM键,1 * 开关机键
|-
| style="text-align: center;"| 供电
| style="text-align: center;"| Type-C接口供电 5V/5A
|-
| style="text-align: center;"| 支持的操作系统
| style="text-align: center;"| Orange Pi OS(Droid)、Orange Pi OS(Arch)、Android13、Debian 11、Debian12、Ubuntu20.04和Ubuntu22.04等操作系统
|-
| style="text-align: center;"| '''外观规格介绍'''
| style="text-align: center;"|
|-
| style="text-align: center;"| 产品尺寸
| style="text-align: center;"| 89mm*56mm
|-
| style="text-align: center;"| 重量
| style="text-align: center;"| 58g
|-
| style="text-align: center;"| [[File:Orange_Pi_5_Ultra-image1.%20png]]{width=“0.255 55555555555554in” h eight=“0.27638888 88888889in”}range Pi™ 是 深圳市迅龙软件有 限公司的注册商标
| style="text-align: center;"|
|}

<span id="orange-pi-5-ultra的顶层视图和底层视图"></span>
== Orange Pi 5 Ultra的顶层视图和底层视图 ==

'''顶层视图:'''

<div class="figure">

[[File:Orange_Pi_5_Ultra-image3.png|564x306px|_MG_3121]]

</div>
'''底层视图:'''

<div class="figure">

[[File:Orange_Pi_5_Ultra-image4.png|576x313px|_MG_3126]]

</div>
<span id="orange-pi-5-ultra的接口详情图"></span>
== Orange Pi 5 Ultra的接口详情图 ==

[[File:Orange_Pi_5_Ultra-image5.png|576x782px]]

[[File:Orange_Pi_5_Ultra-image6.png|572x246px]]

'''四个定位孔的直径都是2.7mm。'''

= '''开发板使用介绍''' =

== 准备需要的配件 ==

<ol style="list-style-type: decimal;">
<li><p>TF卡,最小16GB容量(推荐32GB或以上)的'''class10'''级或以上的高速闪迪卡。</p>
<p>[[File:Orange_Pi_5_Ultra-image7.png|124x96px]]</p></li>
<li><p>TF卡读卡器,用于将镜像烧录到TF卡中。</p>
<p>[[File:Orange_Pi_5_Ultra-image8.png|139x106px]]</p></li>
<li><p>HDMI接口的显示器。</p>
<p>[[File:Orange_Pi_5_Ultra-image9.png|256x195px]]</p></li>
<li><p>HDMI转HDMI连接线,用于将开发板连接到HDMI显示器或者电视进行显示。</p>
<p>[[File:Orange_Pi_5_Ultra-image10.png|199x129px]]</p>
<p>'''注意,如果想接4K或者8K显示器,请确保HDMI线支持4K或者8K视频输出。'''</p></li>
<li><p>10.1寸MIPI屏幕,用于显示开发板的系统界面(此屏幕包括转接板和OPi5Plus/OPi5B/OPi5/OPi5Pro/OPi5Max/OPi5Ultra通用)。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image11.jpeg|223x203px|IMG_7546]]

</div></li>
<li><p>电源适配器,Orange Pi 5 Ultra建议使用5V/5A的Type-C电源供电。</p>
<p>[[File:Orange_Pi_5_Ultra-image12.png|188x133px]]</p>
<p>'''开发板的Type-C电源接口不支持PD协商功能,只支持固定的5V电压输入。'''</p></li>
<li><p>USB接口的鼠标和键盘,只要是标准USB接口的鼠标和键盘都可以,鼠标和键盘可以用来控制Orange Pi开发板。</p>
<p>[[File:Orange_Pi_5_Ultra-image13.png|206x170px]]</p></li>
<li><p>USB摄像头。</p>
<p>[[File:Orange_Pi_5_Ultra-image14.png|255x148px]]</p></li>
<li><p>5V的散热风扇。如下图所示,开发板上有用于接散热风扇的接口,接口规格为'''2pin 1.25mm'''间距。</p>
<p>'''开发板上的风扇可以通过PWM来调节转速和开关。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image15.png|433x115px]]</p></li>
<li><p>百兆或者千兆网线,用于将开发板连接到因特网。</p>
<p>[[File:Orange_Pi_5_Ultra-image16.png|143x112px]]</p></li>
<li><p>USB2.0公对公数据线,用于烧录镜像和使用ADB等功能。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|158x155px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>1300万MIPI接口的OV13850摄像头。</p>
<p>[[File:Orange_Pi_5_Ultra-image18.png|197x111px]]</p></li>
<li><p>1300万MIPI接口的OV13855摄像头。</p>
<p>[[File:Orange_Pi_5_Ultra-image19.png|184x109px]]</p></li>
<li><p>'''3.3V'''的USB转TTL模块和杜邦线,使用串口调试功能时,需要USB转TTL模块和杜邦线来连接开发板和电脑。</p>
<p>[[File:Orange_Pi_5_Ultra-image20.png|217x89px|G7U7JZX(V`L$`A6864]38$P]] [[File:Orange_Pi_5_Ultra-image21.png|305x110px]]</p></li>
<li><p>安装有Ubuntu和Windows操作系统的个人电脑。</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| 1
| style="text-align: left;"| Ubuntu22.04 PC
| style="text-align: left;"| 可选,用于编译Linux源码
|-
| style="text-align: left;"| 2
| style="text-align: left;"| Windows PC
| style="text-align: left;"| 用于烧录Android和Linux镜像
|}

== 下载开发板的镜像和相关的资料 ==

# 中文版资料的下载网址为:

[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-5-Max.html '''http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-5-Ultra.html''']

[[File:Orange_Pi_5_Ultra-image22.png|548x534px]]

<ol start="2" style="list-style-type: decimal;">
<li><p>英文版资料的下载网址为:</p>
<p>[http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-5-Max.html '''http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-5-Ultra.html''']</p>
<p>[[File:Orange_Pi_5_Ultra-image23.png|533x683px]]</p></li>
<li><p>资料主要包含</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''Android源码''':保存在百度云盘和谷歌网盘上。</p></li>
<li><p>'''Linux源码''':保存在Github上。</p></li>
<li><p>'''用户手册和原理图:'''保存在百度云盘和谷歌网盘上。</p></li>
<li><p>'''官方工具:'''主要包括开发板使用过程中需要用到的软件。</p></li>
<li><p>'''Android镜像''':保存在百度云盘和谷歌网盘上。</p></li>
<li><p>'''Ubuntu镜像''':保存在百度云盘和谷歌网盘上。</p></li>
<li><p>'''Debian镜像''':保存在百度云盘和谷歌网盘上。</p></li>
<li><p>'''Orange Pi OS镜像''':保存在百度云盘和谷歌网盘上。</p></li>
<li><p>'''OpenWRT镜像''':保存在百度云盘和谷歌网盘上。</p></li></ol>
</li></ol>

<span id="基于windows-pc将linux镜像烧写到tf卡的方法"></span>
== 基于Windows PC将Linux镜像烧写到TF卡的方法 ==

'''注意,这里说的Linux镜像具体指的是从[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange Pi资料下载页面]下载的Debian、Ubuntu、OpenWRT或者OPi OS Arch这样的Linux发行版镜像。'''

<span id="使用balenaetcher烧录linux镜像的方法"></span>
=== '''使用'''balenaEtcher'''烧录Linux镜像的方法''' ===

# 首先准备一张16GB或更大容量的TF卡,TF卡的传输速度必须为'''class10'''级或'''class10'''级以上,建议使用闪迪等品牌的TF卡。
# 然后使用读卡器把TF卡插入电脑。
# 从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上。
# 然后下载Linux镜像的烧录软件——'''balenaEtcher''',下载地址为:

[https://www.balena.io/etcher/ '''https://www.balena.io/etcher/''']

<ol start="5" style="list-style-type: decimal;">
<li>进入balenaEtcher下载页面后,点击绿色的下载按钮会跳到软件下载的地方。</li></ol>

[[File:Orange_Pi_5_Ultra-image24.png|359x172px]]

<ol start="6" style="list-style-type: decimal;">
<li><p>然后可以选择下载balenaEtcher的Portable版本的软件,Portable版本无需安装,双击打开就可以使用。</p>
<p>[[File:Orange_Pi_5_Ultra-image25.png|382x141px]]</p></li>
<li><p>如果下载的是需要安装版本的balenaEtcher,请先安装再使用。如果下载的Portable版本balenaEtcher,直接双击打开即可,打开后的balenaEtcher界面如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image26.png|369x233px]]</p></li></ol>

'''打开balenaEtcher时如果提示下面的错误:'''

[[File:Orange_Pi_5_Ultra-image27.png|209x164px]]

'''请选择balenaEtcher后点击右键,然后选择以管理员身份运行。'''

[[File:Orange_Pi_5_Ultra-image28.png|273x37px]]

<ol start="8" style="list-style-type: decimal;">
<li><p>使用balenaEtcher烧录Linux镜像的具体步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先选择要烧录的Linux镜像文件的路径。</p></li>
<li><p>然后选择TF卡的盘符。</p></li>
<li><p>最后点击Flash就会开始烧录Linux镜像到TF卡中。</p>
<p>[[File:Orange_Pi_5_Ultra-image29.png|423x237px]]</p></li></ol>
</li>
<li><p>balenaEtcher烧录Linux镜像的过程显示的界面如下图所示,另外进度条显示紫色表示正在烧录Linux镜像到TF卡中。</p>
<p>[[File:Orange_Pi_5_Ultra-image30.png|428x268px]]</p></li>
<li><p>Linux镜像烧录完后,balenaEtcher默认还会对烧录到TF卡中的镜像进行校验,确保烧录过程没有出问题。如下图所示,显示绿色的进度条就表示镜像已经烧录完成,balenaEtcher正在对烧录完成的镜像进行校验。</p>
<p>[[File:Orange_Pi_5_Ultra-image31.png|427x267px]]</p></li>
<li><p>成功烧录完成后balenaEtcher的显示界面如下图所示,如果显示绿色的指示图标说明镜像烧录成功,此时就可以退出balenaEtcher,然后拔出TF卡插入到开发板的TF卡槽中使用了。</p>
<p>[[File:Orange_Pi_5_Ultra-image32.png|430x266px]]</p></li></ol>

<span id="使用rkdevtool烧录linux镜像到tf卡中的方法"></span>
=== 使用RKDevTool烧录Linux镜像到TF卡中的方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x129px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>还需要准备一张16GB或更大容量的TF卡,TF卡的传输速度必须为'''class10'''级或'''class10'''级以上,建议使用闪迪等品牌的TF卡。</p></li>
<li><p>然后将TF卡插入开发板的卡槽中。</p></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip'''和'''MiniLoader'''以及烧录工具'''RKDevTool_Release_v3.15.zip'''。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange Pi的资料下载页面]首先选择'''官方工具''',然后进入下面的文件夹中。</p>
<p>[[File:Orange_Pi_5_Ultra-image33.png|267x56px]]</p></li>
<li><p>然后下载下面的所有文件。</p>
<p>[[File:Orange_Pi_5_Ultra-image34.png|246x97px]]</p>
<p>'''注意,“MiniLoader-烧录Linux镜像才需要用到的东西”文件夹下文简称为MiniLoader文件夹。'''</p></li></ol>
</li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上。</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image35.png|464x136px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image36.png|245x129px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image37.png|254x132px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image38.png|448x132px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image39.png|402x189px]]</p></li>
<li><p>然后开始烧录Linux镜像到TF卡中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB公对公数据线连接好开发板与Windows电脑,开发板USB烧录口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>然后插入TF卡到开发板,并确保开发板没有连接电源。</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image41.png|397x105px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了。</p>
<p>[[File:Orange_Pi_5_Ultra-image42.png|379x102px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image43.png|454x213px]]</p></li>
<li><p>然后将鼠标光标放在下面的这片区域中。</p>
<p>[[File:Orange_Pi_5_Ultra-image44.png|452x212px]]</p></li>
<li><p>然后点击鼠标右键会弹出下图所示的选择界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image45.png|453x213px]]</p></li>
<li><p>然后选择'''导入配置'''选项。</p>
<p>[[File:Orange_Pi_5_Ultra-image46.png|458x215px]]</p></li>
<li><p>然后选择前面下载的'''MiniLoader'''文件夹中的'''rk3588_linux_tfcard.cfg'''配置文件,再点击'''打开'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image47.png|457x215px]]</p></li>
<li><p>然后点击'''确定'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image48.png|483x227px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image49.png|486x228px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中'''MiniLoaderAll.bin''',再点击'''打开'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image50.png|486x228px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image51.png|493x232px]]</p></li>
<li><p>然后选择想要烧录的linux镜像的路径,再点击'''打开'''。</p>
<p>'''在烧录镜像前,建议将要烧录的linux镜像重命名为orangepi.img或者其它比较短的名字,这样在烧录镜像的时候就能看到烧录进度的百分比数值。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image52.png|499x234px]]</p></li>
<li><p>然后请勾选上'''强制按地址写'''选项。</p>
<p>[[File:Orange_Pi_5_Ultra-image53.png|497x234px]]</p></li>
<li><p>再点击执行按钮就会开始烧录linux镜像到开发板的tf卡中。</p>
<p>[[File:Orange_Pi_5_Ultra-image54.png|497x233px]]</p></li>
<li><p>linux镜像烧录完后的显示log如下图所示:</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image55.png|492x231px|%O4~FPPAT$0RH{3S~CGJ@@Q(1)]]

</div></li>
<li><p>烧录完linux镜像到tf卡中后,linux系统会自动启动。</p></li></ol>
</li></ol>

<span id="基于ubuntu-pc将linux镜像烧写到tf卡的方法"></span>
== 基于Ubuntu PC将Linux镜像烧写到TF卡的方法 ==

'''注意,这里说的Linux镜像具体指的是从[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange Pi资料下载页面]下载的Debian、Ubuntu、OpenWRT或者OPi OS Arch这样的Linux发行版镜像,Ubuntu PC指的是安装了Ubuntu系统的个人电脑。'''

# 首先准备一张16GB或更大容量的TF卡,TF卡的传输速度必须为'''class10'''级或'''class10'''级以上,建议使用闪迪等品牌的TF卡。
# 然后使用读卡器把TF卡插入电脑。
# 下载balenaEtcher软件,下载地址为:

[https://www.balena.io/etcher/ '''https://www.balena.io/etcher/''']

<ol start="4" style="list-style-type: decimal;">
<li>进入balenaEtcher下载页面后,点击绿色的下载按钮会跳到软件下载的地方。</li></ol>

[[File:Orange_Pi_5_Ultra-image24.png|434x208px]]

<ol start="5" style="list-style-type: decimal;">
<li><p>然后选择下载Linux版本的软件即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image56.png|430x163px]]</p></li>
<li><p>从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上。</p>
<p>'''注意,如果下载的是OpenWRT镜像,在OpenWRT镜像的下载链接中会看到下面两种类型的镜像,请选择”TF卡、eMMC和NVME SSD启动镜像”文件夹中的镜像文件。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image57.png|234x66px]]</p>
<p>7z结尾的压缩包的解压命令如下所示:</p>
<p>test@test:~$ '''7z x orangepi5ultra_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160.7z'''</p>
<p>test@test:~$ '''ls orangepi5ultra_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160.*'''</p>
<p>orangepi5ultra_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160.7z orangepi5ultra_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160.sha #校验和文件</p>
<p>orangepi5ultra_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160.img #镜像文件</p></li>
<li><p>解压镜像后可以先用'''sha256sum -c *.sha'''命令计算下校验和是否正确,如果提示'''成功'''说明下载的镜像没有错,可以放心的烧录到TF卡,如果提示'''校验和不匹配'''说明下载的镜像有问题,请尝试重新下载。</p>
<p>test@test:~$ '''sha256sum -c *.sha'''</p>
<p>orangepi5ultra_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160.img: OK</p></li>
<li><p>然后在Ubuntu PC的图形界面双击'''balenaEtcher-1.5.109-x64.AppImage'''即可打开balenaEtcher('''无需安装'''),balenaEtcher打开后的界面显示如下图所示。</p>
<p>[[File:Orange_Pi_5_Ultra-image58.png|423x251px]]</p></li>
<li><p>使用balenaEtcher烧录Linux镜像的具体步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先选择要烧录的Linux镜像文件的路径。</p></li>
<li><p>然后选择TF卡的盘符。</p></li>
<li><p>最后点击Flash就会开始烧录Linux镜像到TF卡中。</p>
<p>[[File:Orange_Pi_5_Ultra-image59.png|431x278px]]</p></li></ol>
</li>
<li><p>balenaEtcher烧录Linux镜像的过程显示的界面如下图所示,另外进度条显示紫色表示正在烧录Linux镜像到TF卡中。</p>
<p>[[File:Orange_Pi_5_Ultra-image60.png|429x184px]]</p></li></ol>

<!-- -->
<ol start="12" style="list-style-type: decimal;">
<li><p>Linux镜像烧录完后,balenaEtcher默认还会对烧录到TF卡中的镜像进行校验,确保烧录过程没有出问题。如下图所示,显示绿色的进度条就表示镜像已经烧录完成,balenaEtcher正在对烧录完成的镜像进行校验。</p>
<p>[[File:Orange_Pi_5_Ultra-image61.png|436x190px]]</p></li>
<li><p>成功烧录完成后balenaEtcher的显示界面如下图所示,如果显示绿色的指示图标说明镜像烧录成功,此时就可以退出balenaEtcher,然后拔出TF卡插入到开发板的TF卡槽中使用了。</p>
<p>[[File:Orange_Pi_5_Ultra-image62.png|435x257px]]</p></li></ol>

<span id="烧录linux镜像到emmc中的方法"></span>
== 烧录Linux镜像到eMMC中的方法 ==

<span id="使用rkdevtool烧录linux镜像到emmc中的方法"></span>
=== 使用RKDevTool烧录Linux镜像到eMMC中的方法 ===

'''注意,下面所有的操作都是在Windows电脑中进行的。'''

'''注意,这里说的Linux镜像具体指的是从[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange Pi资料下载页面]下载的Debian、Ubuntu、OpenWRT或者OPi OS Arch这样的Linux发行版镜像。'''

<ol style="list-style-type: decimal;">
<li><p>开发板预留了eMMC模块的扩展接口,烧录系统到eMMC前,首先需要购买一个与开发板eMMC接口相匹配的eMMC模块。然后将eMMC模块安装到开发板上。eMMC模块和插入开发板的方法如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image63.png|115x84px]] [[File:Orange_Pi_5_Ultra-image64.png|120x87px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image65.png|279x185px]]</p></li>
<li><p>还需要准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip'''和'''MiniLoader'''以及烧录工具'''RKDevTool_Release_v3.15.zip'''。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange Pi的资料下载页面]首先选择官方工具,然后进入下面的文件夹中。</p>
<p>[[File:Orange_Pi_5_Ultra-image33.png|366x77px]]</p></li>
<li><p>然后下载下面的所有文件。</p>
<p>[[File:Orange_Pi_5_Ultra-image34.png|315x125px]]</p>
<p>'''注意,“MiniLoader-烧录Linux镜像才需要用到的东西”文件夹下文简称为MiniLoader文件夹。'''</p></li></ol>
</li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上。</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image35.png|496x146px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image36.png|284x149px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image37.png|296x154px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image38.png|484x143px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image39.png|442x208px]]</p></li>
<li><p>然后开始烧录Linux镜像到eMMC中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB烧录口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源。</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image41.png|397x105px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了。</p>
<p>[[File:Orange_Pi_5_Ultra-image42.png|379x102px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image43.png|457x215px]]</p></li>
<li><p>然后将鼠标光标放在下面的这片区域中。</p>
<p>[[File:Orange_Pi_5_Ultra-image44.png|458x215px]]</p></li>
<li><p>然后点击鼠标右键会弹出下图所示的选择界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image45.png|460x216px]]</p></li>
<li><p>然后选择'''导入配置'''选项。</p>
<p>[[File:Orange_Pi_5_Ultra-image46.png|458x215px]]</p></li>
<li><p>然后选择前面下载的'''MiniLoader'''文件夹中的'''rk3588_linux_emmc.cfg'''配置文件,再点击'''打开'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image66.png|466x219px]]</p></li>
<li><p>然后点击'''确定'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image67.png|468x220px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image68.png|462x217px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中'''MiniLoaderAll.bin''',再点击'''打开'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image69.png|463x217px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image70.png|459x216px]]</p></li>
<li><p>然后选择想要烧录的linux镜像的路径,再点击'''打开'''。</p>
<p>'''在烧录镜像前,建议将要烧录的linux镜像重命名为orangepi.img或者其它比较短的名字,这样在烧录镜像的时候就能看到烧录进度的百分比数值。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image52.png|499x234px]]</p></li>
<li><p>然后请勾选上'''强制按地址写'''选项。</p>
<p>[[File:Orange_Pi_5_Ultra-image71.png|501x235px]]</p></li>
<li><p>再点击执行按钮就会开始烧录linux镜像到开发板的eMMC中。</p>
<p>[[File:Orange_Pi_5_Ultra-image72.png|502x236px]]</p></li>
<li><p>linux镜像烧录完后的显示log如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image73.png|500x235px]]</p></li>
<li><p>烧录完linux镜像到eMMC中后,linux系统会自动启动。</p></li></ol>
</li></ol>

<span id="使用dd命令烧录linux镜像到emmc中的方法"></span>
=== 使用dd命令烧录Linux镜像到eMMC中的方法 ===

'''注意,这里说的Linux镜像具体指的是从Orange Pi资料下载页面下载的Debian、Ubuntu、OpenWRT或者OPi OS Arch这样的Linux发行版镜像。'''

<ol style="list-style-type: decimal;">
<li><p>开发板预留了eMMC模块的扩展接口,烧录系统到eMMC前,首先需要购买一个与开发板eMMC接口相匹配的eMMC模块。然后将eMMC模块安装到开发板上。eMMC模块和插入开发板的方法如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image63.png|115x84px]] [[File:Orange_Pi_5_Ultra-image64.png|120x87px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image65.png|279x185px]]</p></li>
<li><p>使用dd命令烧录linux镜像到eMMC中需要借助TF卡来完成,所以首先需要将linux镜像烧录到TF卡上,然后使用TF卡启动开发板进入linux系统。烧录Linux镜像到TF卡的方法请见[[#基于windows-pc将linux镜像烧写到tf卡的方法|'''基于Windows PC将Linux镜像烧录到TF卡的方法''']]和[[#基于ubuntu-pc将linux镜像烧写到tf卡的方法|'''基于Ubuntu PC将Linux镜像烧录到TF卡的方法''']]两小节的说明。</p></li>
<li><p>使用TF卡启动linux系统后,我们首先将解压后的linux镜像文件(从官网下载的Debian、Ubuntu镜像或者OPi Arch镜像)上传到TF卡中。上传linux镜像文件到开发板中的方法请参考[[#上传文件到开发板linux系统中的方法|'''上传文件到开发板Linux系统中的方法''']]小节的说明。</p></li>
<li><p>上传完镜像到开发板的linux系统中后,我们再在开发板linux系统的命令行中进入镜像文件的存放路径,比如,我将开发板的linux镜像存放在'''/home/orangepi/Desktop'''目录下了,然后进入'''/home/orangepi/Desktop'''目录就能看到上传的镜像文件了。</p>
<p>orangepi@orangepi:~$ '''cd /home/orangepi/Desktop'''</p>
<p>orangepi@orangepi:~/Desktop$ '''ls'''</p>
<p>orangepi5ultra_x.x.x_debian_bullseye_desktop_xfce_linux5.10.160.img</p>
<p>'''怎么进入开发板linux系统的命令行?'''</p></li></ol>

<!-- -->
# '''使用串口登录终端的方法请参考[[#调试串口的使用方法|调试串口的使用方法]]一小节的说明。'''
# '''使用ssh远程登录linux系统请参考[[#ssh远程登录开发板|SSH远程登录开发板]]一小节的说明。'''
# '''如果接了HDMI、LCD等显示屏幕,可以在桌面中打开一个命令行终端。'''

<!-- -->
<ol start="5" style="list-style-type: decimal;">
<li><p>接下来,我们先使用下面的命令确认下eMMC的设备节点。</p>
<p>orangepi@orangepi:~/Desktop$ '''ls /dev/mmcblk*boot0 | cut -c1-12'''</p>
<p>'''/dev/mmcblk1'''</p></li>
<li><p>然后我们可以使用dd命令清空下eMMC,注意'''of='''参数后面请填入上面命令输出的结果。</p>
<p>orangepi@orangepi:~/Desktop$ '''sudo dd bs=1M if=/dev/zero of=/dev/mmcblk1 count=1000 status=progress'''</p>
<p>orangepi@orangepi:~/Desktop$ '''sudo sync'''</p></li>
<li><p>然后就可以使用dd命令烧录开发板的linux镜像到eMMC中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>下面的命令中 '''if=''' 参数后面是要填写linux镜像存放的完整路径+Linux镜像的名字(比如'''/home/orangepi/Desktop/Linux镜像的名字''')。因为上面我们已经进入linux镜像的路径下了,所以只需要填写Linux镜像的名字的即可。</p></li>
<li><p>下面命令中的linux镜像名请不要照抄,要替换为实际的镜像名(因为镜像的版本号可能会更新)。</p>
<p>'''sudo dd bs=1M if=orangepi5ultra_x.x.x_debian_bullseye_desktop_xfce_linux5.10.160.img of=/dev/mmcblk1 status=progress'''</p>
<p>'''sudo''' '''sync'''</p>
<p>'''注意,如果上传的是 .7z或者.xz 结尾linux镜像压缩文件,使用dd命令烧录前请记得先解压。'''</p>
<p>'''dd命令的所有参数的详细说明和更多用法可以在linux系统中执行man dd命令来查看。'''</p></li></ol>
</li>
<li><p>当成功烧录开发板的linux镜像到eMMC后,此时就可以使用'''poweroff'''命令关机了。然后请拔出TF卡,再短按电源按键开机,此时就会启动eMMC中的linux系统了。</p></li></ol>

<span id="烧写linux镜像到spiflashnvme-ssd中的方法"></span>
== 烧写Linux镜像到SPIFlash+NVMe SSD中的方法 ==

'''注意,这里说的Linux镜像具体指的是从Orange Pi资料下载页面下载的Debian、Ubuntu、OpenWRT或者OPi OS Arch这样的Linux发行版镜像。'''

'''注意,下面所有的操作都是在Windows电脑中进行的。'''

<span id="使用rkdevtool烧录的方法"></span>
=== 使用RKDevTool烧录的方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一个NVMe SSD固态硬盘,开发板M.2插槽PCIe接口的规格为PCIe3.0x4。</p>
<p>[[File:Orange_Pi_5_Ultra-image74.png|306x89px]]</p></li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好。</p>
<p>[[File:Orange_Pi_5_Ultra-image75.png|307x202px]]</p></li>
<li><p>SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置。</p>
<p>[[File:Orange_Pi_5_Ultra-image76.png|252x166px]]</p></li>
<li><p>然后需要准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip'''和'''MiniLoader'''以及烧录工具'''RKDevTool_Release_v3.15.zip'''。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange Pi的资料下载页面]首先选择'''官方工具''',然后进入下面的文件夹中。</p>
<p>[[File:Orange_Pi_5_Ultra-image33.png|294x61px]]</p></li>
<li><p>然后下载下面的所有文件。</p>
<p>[[File:Orange_Pi_5_Ultra-image34.png|244x97px]]</p>
<p>'''注意,“MiniLoader-烧录Linux镜像才需要用到的东西”文件夹下文简称为MiniLoader文件夹。'''</p></li></ol>
</li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上。</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image35.png|446x131px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image36.png|253x133px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image37.png|269x140px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image38.png|402x119px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image39.png|402x189px]]</p></li>
<li><p>然后开始烧录Linux镜像到SSD中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB烧录口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>确保开发板没有连接电源和插入TF卡。</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image41.png|380x101px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了。</p>
<p>[[File:Orange_Pi_5_Ultra-image42.png|379x102px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image43.png|457x215px]]</p></li>
<li><p>然后将鼠标光标放在下面的这片区域中。</p>
<p>[[File:Orange_Pi_5_Ultra-image44.png|459x216px]]</p></li>
<li><p>然后点击鼠标右键会弹出下图所示的选择界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image45.png|453x213px]]</p></li>
<li><p>然后选择'''导入配置'''选项。</p>
<p>[[File:Orange_Pi_5_Ultra-image46.png|458x215px]]</p></li>
<li><p>然后进入前面下载的'''MiniLoader'''文件夹中,然后选择'''rk3588_linux_pcie.cfg'''配置文件,再点击'''打开'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image77.png|462x217px]]</p></li>
<li><p>然后点击'''确定'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image78.png|468x220px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image79.png|475x223px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中'''MiniLoaderAll.bin''',再点击'''打开'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image50.png|477x224px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image80.png|486x228px]]</p></li>
<li><p>然后进入前面下载的'''MiniLoader'''文件夹中,再选择'''rkspi_loader.img''',再点击'''打开'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image81.png|490x230px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image82.png|493x231px]]</p></li>
<li><p>然后选择想要烧录的linux镜像的路径,再点击'''打开'''。</p>
<p>'''在烧录镜像前,建议将要烧录的linux镜像重命名为orangepi.img或者其它比较短的名字,这样在烧录镜像的时候就能看到烧录进度的百分比数值。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image52.png|499x234px]]</p></li>
<li><p>然后请勾选上'''强制按地址写'''选项。</p>
<p>[[File:Orange_Pi_5_Ultra-image83.png|498x234px]]</p></li>
<li><p>再点击执行按钮就会开始烧录linux镜像到SSD中。</p>
<p>[[File:Orange_Pi_5_Ultra-image84.png|500x235px]]</p></li>
<li><p>linux镜像烧录完后的显示log如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image85.png|490x230px]]</p>
<p>'''如果烧录有问题,请先清空下SPIFlash然后再烧录试下。清空SPIFlash的方法请参考下[[#使用rkdevtool清空spiflash的方法|使用RKDevTool清空SPIFlash的方法]]一小节的说明。'''</p></li>
<li><p>镜像烧录完后会自动启动SPIFlash+PCIe SSD中的linux系统,如果没有正常启动,请重新上电试下。</p></li></ol>
</li></ol>

=== 使用dd命令烧录的方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一个NVMe SSD固态硬盘,开发板M.2插槽PCIe接口的规格为PCIe3.0x4。</p>
<p>[[File:Orange_Pi_5_Ultra-image74.png|306x89px]]</p></li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好。</p>
<p>[[File:Orange_Pi_5_Ultra-image75.png|307x202px]]</p></li>
<li><p>SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置。</p>
<p>[[File:Orange_Pi_5_Ultra-image76.png|312x205px]]</p></li>
<li><p>烧录linux镜像到SPIFlash+NVMe SSD中需要借助TF卡来完成,所以首先需要将linux镜像烧录到TF卡上,然后使用TF卡启动开发板进入linux系统。烧录Linux镜像到TF卡的方法请见[[#基于windows-pc将linux镜像烧写到tf卡的方法|'''基于Windows PC将Linux镜像烧写到TF卡的方法''']]和[[#基于ubuntu-pc将linux镜像烧写到tf卡的方法|'''基于Ubuntu PC将Linux镜像烧写到TF卡的方法''']]两小节的说明。</p></li>
<li><p>使用TF卡启动linux系统后,我们首先烧录u-boot镜像到SPI Flash中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''nand-sata-install''','''普通用户记得加sudo权限'''。</p>
<p>orangepi@orangepi:~$ '''sudo nand-sata-install'''</p></li>
<li><p>然后选择'''7 Install/Update ther bootloader on SPI Flash'''。</p></li></ol>
</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image86.png|355x174px|IMG_256]]

</div>
<ol start="3" style="list-style-type: lower-alpha;">
<li>然后选择'''&lt;Yes&gt;'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image87.png|356x179px|IMG_256]]

</div>
<ol start="4" style="list-style-type: lower-alpha;">
<li>然后请耐心等待烧录完成,烧录完成后显示如下所示(左下角会显示一个'''Done'''):</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image88.png|358x161px|IMG_256]]

</div>
'''OPi OS Arch系统中没有nand-sata-install这个脚本,请使用下面的命令将u-boot镜像到SPI Flash中:'''

[orangepi@orangepi ~]$ '''sudo dd if=/boot/rkspi_loader.img of=/dev/mtdblock0'''

<ol start="6" style="list-style-type: decimal;">
<li><p>然后将linux镜像文件(从官网下载的Debian、Ubuntu或者OpenWRT镜像)上传到TF卡中。上传linux镜像文件到开发板中的方法请参考[[#上传文件到开发板linux系统中的方法|'''上传文件到开发板Linux系统中的方法''']]小节的说明。</p>
<p>'''注意,如果下载的是OpenWRT镜像,在OpenWRT镜像的下载链接中会看到下面三种类型的镜像,请选择”TF卡、eMMC和NVME SSD启动镜像”文件夹中的镜像文件。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image57.png|232x64px]]</p></li>
<li><p>上传完镜像到开发板的linux系统中后,我们再在开发板linux系统的命令行中进入镜像文件的存放路径,比如,我将开发板的linux镜像存放在'''/home/orangepi/Desktop'''目录下了,然后进入'''/home/orangepi/Desktop'''目录就能看到上传的镜像文件了。</p>
<p>orangepi@orangepi:~$ '''cd /home/orangepi/Desktop'''</p>
<p>orangepi@orangepi:~/Desktop$ '''ls'''</p>
<p>orangepi5ultra_x.x.x_debian_bullseye_desktop_xfce_linux5.10.160.img</p>
<p>'''怎么进入开发板linux系统的命令行?'''</p></li></ol>

<!-- -->
<ol start="4" style="list-style-type: decimal;">
<li><p>'''使用串口登录终端的方法请参考[[#调试串口的使用方法|调试串口的使用方法]]一小节的说明。'''</p></li>
<li><p>'''使用ssh远程登录linux系统请参考[[#ssh远程登录开发板|SSH远程登录开发板]]一小节的说明。'''</p></li>
<li><p>'''如果接了HDMI、LCD等显示屏幕,可以在桌面中打开一个命令行终端。'''</p></li></ol>

<!-- -->
<ol start="8" style="list-style-type: decimal;">
<li><p>接下来,我们先确认下NVMe SSD已经被开发板的linux正常识别了。如果NVMe SSD正常识别了的话,使用'''sudo fdisk -l'''命令就能看到'''nvme'''相关的信息。</p>
<p>orangepi@orangepi:~/Desktop$ '''sudo fdisk -l | grep &quot;nvme0n1&quot;'''</p>
<p>Disk /dev/nvme0n1: 1.86 TiB, 2048408248320 bytes, 4000797360 sectors</p>
<p>使用'''lspci'''命令可以看到一个NVMe相关的PCI设备。</p>
<p>orangepi@orangepi:~/Desktop$ '''lspci'''</p>
<p>0004:40:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3588 (rev 01)</p>
<p>0004:41:00.0 Non-Volatile memory controller: MAXIO Technology (Hangzhou) Ltd. NVMe SSD Controller MAP1202 (rev 01)</p></li>
<li><p>然后我们可以使用dd命令清空下NVMe SSD(可选)。</p>
<p>orangepi@orangepi5ultra:~/Desktop$ '''sudo dd bs=1M if=/dev/zero of=/dev/nvme0n1 count=2000 status=progress'''</p>
<p>orangepi@orangepi5ultra:~/Desktop$ '''sudo sync'''</p></li>
<li><p>然后就可以使用dd命令烧录开发板的linux镜像到NVMe SSD中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>下面的命令中 '''if=''' 参数后面是要填写linux镜像存放的完整路径+Linux镜像的名字(比如'''/home/orangepi/Desktop/Linux镜像的名字''')。因为上面我们已经进入linux镜像的路径下了,所以只需要填写Linux镜像的名字的即可。</p></li>
<li><p>下面命令中的linux镜像名请不要照抄,要替换为实际的镜像名(因为镜像的版本号可能会更新)。</p>
<p>'''sudo dd bs=1M if=orangepi5ultra_x.x.x_debian_bullseye_desktop_xfce_linux5.10.160.img of=/dev/nvme0n1 status=progress'''</p>
<p>'''sudo''' '''sync'''</p>
<p>'''注意,如果上传的是 .7z或者.xz 或者.gz结尾linux镜像压缩文件,使用dd命令烧录前请记得先解压。'''</p>
<p>'''dd命令的所有参数的详细说明和更多用法可以在linux系统中执行man dd命令来查看。'''</p></li></ol>
</li>
<li><p>当成功烧录开发板的linux镜像到NVMe SSD后,此时就可以使用'''poweroff'''命令关机了。然后请拔出TF卡,再短按电源按键开机,此时就会启动SPIFlash+NVMe SSD中的linux系统了。</p></li>
<li><p>启动NVMe SSD中的系统后,使用'''df -h'''命令可以看到实际的硬盘容量。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>128GB NVMe SSD。</p>
<p>orangepi@orangepi:~$ '''df -h'''</p>
<p>Filesystem Size Used Avail Use% Mounted on</p>
<p>udev 3.8G 8.0K 3.8G 1% /dev</p>
<p>tmpfs 769M 1.4M 768M 1% /run</p>
<p>'''/dev/nvme0n1p2 118G 5.8G 111G 5% /'''</p>
<p>tmpfs 3.8G 0 3.8G 0% /dev/shm</p>
<p>tmpfs 5.0M 4.0K 5.0M 1% /run/lock</p>
<p>tmpfs 3.8G 16K 3.8G 1% /tmp</p>
<p>'''/dev/nvme0n1p1 256M 90M 166M 36% /boot'''</p>
<p>/dev/zram1 194M 9.9M 170M 6% /var/log</p>
<p>tmpfs 769M 60K 769M 1% /run/user/1000</p>
<p>tmpfs 769M 48K 769M 1% /run/user/0</p></li>
<li><p>2TB NVMe SSD。</p>
<p>orangepi@orangepi:~$ '''df -h'''</p>
<p>Filesystem Size Used Avail Use% Mounted on</p>
<p>udev 3.8G 8.0K 3.8G 1% /dev</p>
<p>tmpfs 769M 1.4M 768M 1% /run</p>
<p>'''/dev/nvme0n1p2 1.9T 4.1G 1.8T 1% /'''</p>
<p>tmpfs 3.8G 0 3.8G 0% /dev/shm</p>
<p>tmpfs 5.0M 4.0K 5.0M 1% /run/lock</p>
<p>/dev/zram2 3.7G 76K 3.5G 1% /tmp</p>
<p>'''/dev/nvme0n1p1 256M 90M 166M 36% /boot'''</p>
<p>/dev/zram1 194M 15M 165M 9% /var/log</p>
<p>tmpfs 769M 60K 769M 1% /run/user/1000</p>
<p>tmpfs 769M 48K 769M 1% /run/user/0</p></li></ol>
</li>
<li><p>当TF卡和NVMe SSD中烧录了一模一样的系统,'''如果TF卡和NVMe SSD都插在了开发板中,此时上电启动开发板,u-boot会优先启动TF卡中的系统'''。但由于TF卡和NVMe SSD中的系统一模一样,所以两个存储设备中的/'''boot'''分区和'''rootfs'''分区的UUID也一样,这样会导致TF卡启动的时候有可能会加载了NVMe SSD中的分区。运行下面的脚本可以解决这个问题。</p>
<p>orangepi@orangepi:~$ '''sudo fix_mmc_ssd.sh'''</p>
<p>'''一模一样的系统是指镜像名一字不差的意思。就算都是Debian11系统,版本不同也是不同的。'''</p></li></ol>

'''OPi OS Arch系统中没有fix_mmc_ssd.sh这个脚本。'''

<span id="使用balenaetcher软件烧录的方法"></span>
=== 使用balenaEtcher软件烧录的方法 ===

'''OPi OS Arch系统和OpenWRT系统请不要使用这种方法。'''

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一个NVMe SSD固态硬盘,开发板M.2插槽PCIe接口的规格为PCIe3.0x4。</p>
<p>[[File:Orange_Pi_5_Ultra-image74.png|306x89px]]</p></li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好。</p>
<p>[[File:Orange_Pi_5_Ultra-image75.png|307x202px]]</p></li>
<li><p>请确保开发板已经贴有SPI Flash,SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置。</p>
<p>[[File:Orange_Pi_5_Ultra-image76.png|312x205px]]</p></li>
<li><p>烧录linux镜像到SPIFlash+NVMe SSD中需要借助TF卡来完成,所以首先需要将linux镜像烧录到TF卡上,然后使用TF卡启动开发板进入linux系统。烧录Linux镜像到TF卡的方法请见[[#基于windows-pc将linux镜像烧写到tf卡的方法|'''基于Windows PC将Linux镜像烧写到TF卡的方法''']]和[[#基于ubuntu-pc将linux镜像烧写到tf卡的方法|'''基于Ubuntu PC将Linux镜像烧写到TF卡的方法''']]两小节的说明。</p></li>
<li><p>启动进入TF卡中的linux系统后,请先确认下NVMe SSD已经被开发板的linux正常识别了。如果NVMe SSD正常识别了的话,使用'''sudo fdisk -l'''命令就能看到'''nvme'''相关的信息。</p>
<p>orangepi@orangepi:~/Desktop$ '''sudo fdisk -l | grep &quot;nvme0n1&quot;'''</p>
<p>Disk /dev/nvme0n1: 1.86 TiB, 2048408248320 bytes, 4000797360 sectors</p>
<p>使用'''lspci'''命令可以看到一个NVMe相关的PCI设备。</p>
<p>orangepi@orangepi:~/Desktop$ '''lspci'''</p>
<p>0004:40:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3588 (rev 01)</p>
<p>0004:41:00.0 Non-Volatile memory controller: MAXIO Technology (Hangzhou) Ltd. NVMe SSD Controller MAP1202 (rev 01)</p></li>
<li><p>linux镜像中已经预装了balenaEtcher,打开方法如下所示:</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image89.png|506x249px|IMG_256]]

</div>
'''如果没有预装,balenaEtcher arm64版本的下载安装方法请参考[[#下载安装arm64版本balenaetcher的方法|下载安装arm64版本balenaEtcher的方法]]小节的说明。'''

<ol start="7" style="list-style-type: decimal;">
<li>balenaEtcher打开后的界面如下所示:</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image90.png|406x207px|IMG_256]]

</div>
<ol start="8" style="list-style-type: decimal;">
<li><p>使用balenaEtcher烧录u-boot到开发板SPI Flash中的方法如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li>首先打开balenaEtcher软件点击'''Flash from file'''。</li></ol>
</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image91.png|406x205px|IMG_256]]

</div>
<ol start="2" style="list-style-type: lower-alpha;">
<li>然后进入'''/usr/lib/linux-u-boot-legacy-orangepi5ultra_1.0.0_arm64/'''目录,再选择'''rkspi_loader.img''',再点击'''Open'''打开。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image92.png|563x110px|IMG_256]]

</div>
<ol start="3" style="list-style-type: lower-alpha;">
<li><p>打开'''rkspi_loader.img'''后的界面如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image93.png|379x181px]]</p></li>
<li><p>然后点击'''Select target'''。</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image94.png|379x171px|IMG_256]]

</div>
<ol start="5" style="list-style-type: lower-alpha;">
<li>然后点击'''Show 2 hidden'''打开更多存储设备的选项。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image95.png|385x155px|IMG_256]]

</div>
<ol start="6" style="list-style-type: lower-alpha;">
<li>然后选择SPI Flash的设备名'''/dev/mtdblock0''',然后点击'''Select'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image96.png|389x264px|IMG_256]]

</div>
<ol start="7" style="list-style-type: lower-alpha;">
<li>然后点击'''Flash'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image97.png|394x268px|IMG_256]]

</div>
<ol start="8" style="list-style-type: lower-alpha;">
<li>然后点击'''Yes, I’m sure'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image98.png|396x269px|IMG_256]]

</div>
<ol style="list-style-type: lower-roman;">
<li>然后输入开发板linux系统的密码'''orangepi''',就会开始烧录u-boot镜像到SPI Flash中。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image99.png|393x269px|IMG_256]]

</div>
<ol start="10" style="list-style-type: lower-alpha;">
<li>烧录过程的显示如下所示:</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image100.png|397x272px|IMG_256]]

</div>
<ol start="11" style="list-style-type: lower-alpha;">
<li>烧录完成后的显示如下所示:</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image101.png|395x225px|IMG_256]]

</div>
<ol start="9" style="list-style-type: decimal;">
<li><p>烧录TF卡中的linux系统到NVMe SSD中的方法(此方法相当于将TF卡中的系统克隆到NVMe SSD)。</p>
<ol style="list-style-type: lower-alpha;">
<li>首先点击'''Clone drive'''。</li></ol>
</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image102.png|386x204px|IMG_256]]

</div>
<ol start="2" style="list-style-type: lower-alpha;">
<li>然后选择TF卡的设备名'''/dev/mmcblk1'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image103.png|379x256px|IMG_256]]

</div>
<ol start="3" style="list-style-type: lower-alpha;">
<li>打开TF卡后的界面如下所示:</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image104.png|381x191px|IMG_256]]

</div>
<ol start="4" style="list-style-type: lower-alpha;">
<li>然后点击'''Select target'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image94.png|379x171px|IMG_256]]

</div>
<ol start="5" style="list-style-type: lower-alpha;">
<li>然后点击'''Show 2 hidden'''打开更多存储设备的选项。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image95.png|385x155px|IMG_256]]

</div>
<ol start="6" style="list-style-type: lower-alpha;">
<li>然后选择NVMe SSD的设备名'''/dev/nvme0n1''',然后点击'''Select'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image105.png|386x264px]]

<ol start="7" style="list-style-type: lower-alpha;">
<li>然后点击'''Flash'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image106.png|389x264px|IMG_256]]

</div>
<ol start="8" style="list-style-type: lower-alpha;">
<li>然后点击'''Yes, I’m sure'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image107.png|392x268px|IMG_256]]

</div>
<ol style="list-style-type: lower-roman;">
<li>然后输入开发板linux系统的密码orangepi,就会开始烧录linux镜像到SSD中。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image108.png|390x267px|IMG_256]]

</div>
<ol start="10" style="list-style-type: lower-alpha;">
<li>烧录过程的显示如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image109.png|393x212px]]

<div class="figure">

[[File:Orange_Pi_5_Ultra-image110.png|395x205px|IMG_256]]

</div>
<ol start="11" style="list-style-type: lower-alpha;">
<li>烧录完成后的显示如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image111.png|398x227px]]

<ol start="12" style="list-style-type: lower-alpha;">
<li><p>然后需要扩容下NVMe SSD中rootfs分区的容量,步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先打开'''GParted,'''如果系统没有预装Gparted,请使用apt命令安装下。</p>
<p>orangepi@orangepi:~$ '''sudo apt-get install -y gparted'''</p></li></ol>
</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image112.png|576x215px|IMG_256]]

</div>
<ol start="2" style="list-style-type: lower-alpha;">
<li>然后输入linux系统的密码'''orangepi''',再点击'''Authenticate'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image113.png|356x173px]]

<ol start="3" style="list-style-type: lower-alpha;">
<li><p>然后点击'''Fix'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image114.png|355x261px]]</p></li>
<li><p>然后选择NVMe SSD。</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image115.png|452x187px|IMG_256]]

</div>
<ol start="5" style="list-style-type: lower-alpha;">
<li>选择NVMe SSD后的显示界面如下所所示:</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image116.png|451x187px|IMG_256]]

</div>
<ol start="6" style="list-style-type: lower-alpha;">
<li>然后选择'''/dev/nvme0n1p2'''分区,再击点击右键,再选择'''Resize/Move'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image117.png|448x345px|IMG_256]]

</div>
<ol start="7" style="list-style-type: lower-alpha;">
<li><p>然后在下图所示的位置将容量拖动到最大。</p>
<p>[[File:Orange_Pi_5_Ultra-image118.png|339x210px]]</p></li>
<li><p>然后点击'''Resize/Move'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image119.png|339x212px]]</p></li>
<li><p>然后点击下图位置绿色的'''√'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image120.png|425x166px]]</p></li>
<li><p>再点击'''Apply'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image121.png|378x276px]]</p></li>
<li><p>然后点击'''Close'''关闭即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image122.png|383x234px]]</p></li></ol>

<!-- -->
<ol start="13" style="list-style-type: lower-alpha;">
<li>此时就可以使用'''sudo poweroff'''命令关机了。然后请拔出TF卡,再短按电源按键开机,此时就会启动SPIFlash+NVMe SSD中的linux系统了。</li></ol>

<!-- -->
<ol start="10" style="list-style-type: decimal;">
<li><p>第'''9)''' 步是克隆TF卡中的系统到NMVe SSD中,我们还可以直接烧录linux镜像文件到NVMe SSD中,这里大概说下步骤:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>上传linux镜像文件到开发板的linux系统中。</p></li>
<li><p>然后使用balenaEtcher烧录即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image123.png|463x291px]]</p></li>
<li><p>'''使用这种方法烧录镜像后无需手动扩容,第一次启动会自动扩容'''。</p></li></ol>
</li></ol>

<span id="烧写linux镜像到spiflashusb存储设备中的方法"></span>
== 烧写Linux镜像到SPIFlash+USB存储设备中的方法 ==

'''注意,这里说的Linux镜像具体指的是从Orange Pi资料下载页面下载的Debian、Ubuntu、OpenWRT或者OPi OS Arch这样的Linux发行版镜像。'''

# 首先需要准备一个USB存储设备,比如一个U盘。
# 然后请参考[[#基于windows-pc将linux镜像烧写到tf卡的方法|'''基于Windows PC将Linux镜像烧写到TF卡的方法''']]和[[#基于ubuntu-pc将linux镜像烧写到tf卡的方法|'''基于Ubuntu PC将Linux镜像烧写到TF卡的方法''']]两小节的说明将Linux镜像烧录到USB存储设备中。烧录Linux镜像到USB存储设备中和烧录Linux镜像到TF卡的方法是没有任何区别的(当TF卡插入读卡器后,其实此时的读卡器就相当于一个U盘了)。
# 然后把烧录好Linux系统的USB存储设备插入开发板的USB接口中,'''注意,只有下图所示的2个USB2.0接口才支持启动Linux系统,蓝色USB3.0接口不支持'''。

<div class="figure">

[[File:Orange_Pi_5_Ultra-image124.png|286x184px|IMG_256]]

</div>
<ol start="4" style="list-style-type: decimal;">
<li><p>SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置。</p>
<p>[[File:Orange_Pi_5_Ultra-image76.png|312x205px]]</p></li>
<li><p>烧录u-boot镜像到SPIFlash中需要借助TF卡来完成,所以首先需要将linux镜像烧录到TF卡上,然后使用TF卡启动开发板进入linux系统。烧录Linux镜像到TF卡的方法请见[[#基于windows-pc将linux镜像烧写到tf卡的方法|'''基于Windows PC将Linux镜像烧写到TF卡的方法''']]和[[#基于ubuntu-pc将linux镜像烧写到tf卡的方法|'''基于Ubuntu PC将Linux镜像烧写到TF卡的方法''']]两小节的说明。</p></li>
<li><p>使用TF卡启动linux系统后,就可以烧录u-boot镜像到SPI Flash中了。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''nand-sata-install''','''普通用户记得加sudo权限'''。</p>
<p>orangepi@orangepi:~$ '''sudo nand-sata-install'''</p></li>
<li><p>然后选择'''7 Install/Update ther bootloader on SPI Flash'''。</p></li></ol>
</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image86.png|355x174px|IMG_256]]

</div>
<ol start="3" style="list-style-type: lower-alpha;">
<li>然后选择'''&lt;Yes&gt;'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image87.png|356x179px|IMG_256]]

</div>
<ol start="4" style="list-style-type: lower-alpha;">
<li>然后请耐心等待烧录完成,烧录完成后显示如下所示(左下角会显示一个'''Done'''):</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image88.png|358x161px|IMG_256]]

</div>
'''OPi OS Arch系统中没有nand-sata-install这个脚本,请使用下面的命令将u-boot镜像到SPI Flash中:'''

[orangepi@orangepi ~]$ '''sudo dd if=/boot/rkspi_loader.img of=/dev/mtdblock0'''

<ol start="7" style="list-style-type: decimal;">
<li><p>此时就可以使用'''poweroff'''命令关机了。然后请拔出TF卡,再短按电源按键开机,此时就会启动SPIFlash+USB存储设备中的linux系统了。</p></li>
<li><p>启动USB存储设备中的系统后,使用'''df -h'''命令可以看到USB存储设备实际的容量大小。</p>
<p>orangepi@orangepi:~$ '''df -h'''</p>
<p>Filesystem Size Used Avail Use% Mounted on</p>
<p>udev 3.8G 8.0K 3.8G 1% /dev</p>
<p>tmpfs 769M 588K 769M 1% /run</p>
<p>'''/dev/sda2 15G 1.6G 13G 11% /'''</p>
<p>tmpfs 3.8G 0 3.8G 0% /dev/shm</p>
<p>tmpfs 5.0M 4.0K 5.0M 1% /run/lock</p>
<p>/dev/zram2 3.7G 60K 3.5G 1% /tmp</p>
<p>'''/dev/sda1 256M 111M 146M 44% /boot'''</p>
<p>/dev/zram1 194M 9.0M 171M 5% /var/log</p>
<p>tmpfs 769M 0 769M 0% /run/user/1000</p></li></ol>

<span id="烧录android镜像到tf卡中的方法"></span>
== 烧录Android镜像到TF卡中的方法 ==

<span id="使用rkdevtool烧录的方法-1"></span>
=== 使用RKDevTool烧录的方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip'''和烧录工具'''RKDevTool_Release_v3.15.zip'''。</p></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange '''Pi的资料下载页面''']下载Android的镜像,打开安卓镜像的下载链接后可以看到下面两种类型的安卓镜像,请选择'''TF卡和eMMC启动镜像'''文件夹中的镜像进行下载。</p>
<p>[[File:Orange_Pi_5_Ultra-image125.png|224x82px]]</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image35.png|446x131px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image36.png|253x133px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image37.png|269x140px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image38.png|402x119px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:Orange_Pi_5_Ultra-image39.png|402x189px]]</p></li>
<li><p>然后开始烧录Android镜像到TF卡中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB烧录口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>然后插入TF卡到开发板,并确保开发板没有连接电源。</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image41.png|378x100px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了。</p>
<p>[[File:Orange_Pi_5_Ultra-image42.png|379x102px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image43.png|457x215px]]</p></li>
<li><p>然后请选择'''高级功能'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image126.png|458x138px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image127.png|459x216px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中的'''MiniLoaderAll.bin''',再点击打开。</p>
<p>[[File:Orange_Pi_5_Ultra-image128.png|469x220px]]</p></li>
<li><p>然后点击'''下载'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image129.png|472x222px]]</p></li>
<li><p>下载完'''MiniLoaderAll.bin'''后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image130.png|474x227px]]</p></li>
<li><p>然后选择存储设备为'''SD''',再点击'''切换存储'''。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image131.jpeg|477x222px|D~T2CO%X~K2@ELR98)BVP~2]]

</div></li>
<li><p>切换成功的显示如下图所示:</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image132.jpeg|474x223px|QFVLTK~19N32OK2UGH{D{AK]]

</div></li>
<li><p>然后点击烧录工具的”'''升级固件'''”一栏。</p>
<p>[[File:Orange_Pi_5_Ultra-image133.png|477x224px]]</p></li>
<li><p>接着点击”'''固件'''”按钮选择需要烧录的Android镜像的路径。</p>
<p>[[File:Orange_Pi_5_Ultra-image134.png|444x209px]]</p></li>
<li><p>最后点击”'''升级'''”按钮就会开始烧录,烧录过程中的log如下图所示。烧录完成后Android系统会自动启动。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image135.png|450x210px|0A1B5FA8F878763A4E93DAC69813064B]]

</div></li></ol>
</li></ol>

<span id="烧录android镜像到emmc中的方法"></span>
== 烧录Android镜像到eMMC中的方法 ==

<span id="使用rkdevtool烧录的方法-2"></span>
=== 使用RKDevTool烧录的方法 ===

'''注意,下面所有的操作都是在Windows电脑中进行的。'''

<ol style="list-style-type: decimal;">
<li><p>开发板预留了eMMC的扩展接口,烧录系统到eMMC前,首先需要购买一个与开发板eMMC接口相匹配的eMMC模块。然后将eMMC模块安装到开发板上。</p>
<p>eMMC模块和插入开发板的方法如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image63.png|115x84px]] [[File:Orange_Pi_5_Ultra-image64.png|120x87px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image65.png|279x185px]]</p></li>
<li><p>还需要准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip'''和烧录工具'''RKDevTool_Release_v3.15.zip'''。</p></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载Android的镜像,打开Android镜像的下载链接后可以看到下面两种类型的安卓镜像,请选择'''TF卡和eMMC启动镜像'''文件夹中的镜像进行下载。</p>
<p>[[File:Orange_Pi_5_Ultra-image125.png|224x82px]]</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image35.png|446x131px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image36.png|253x133px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image37.png|269x140px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image38.png|402x119px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image39.png|402x189px]]</p></li>
<li><p>然后开始烧录安卓镜像到eMMC中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB烧录口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>确保开发板没有连接电源和插入TF卡。</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image41.png|375x99px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了。</p>
<p>[[File:Orange_Pi_5_Ultra-image42.png|379x102px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image43.png|457x215px]]</p></li>
<li><p>然后点击烧录工具的”'''升级固件'''”一栏。</p>
<p>[[File:Orange_Pi_5_Ultra-image133.png|442x208px]]</p></li>
<li><p>接着点击”'''固件'''”按钮选择需要烧录的Android镜像的路径。</p>
<p>[[File:Orange_Pi_5_Ultra-image134.png|444x209px]]</p></li>
<li><p>最后点击”'''升级'''”按钮就会开始烧录,烧录过程中的log如下图所示。烧录完成后Android系统会自动启动。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image135.png|446x207px|0A1B5FA8F878763A4E93DAC69813064B]]

</div></li></ol>
</li></ol>

<span id="烧录android镜像到spiflashnvme-ssd中的方法"></span>
== 烧录Android镜像到SPIFlash+NVMe SSD中的方法 ==

'''注意,下面所有的操作都是在Windows电脑中进行的。'''

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一个NVMe SSD固态硬盘。</p>
<p>[[File:Orange_Pi_5_Ultra-image74.png|306x89px]]</p></li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好。</p>
<p>[[File:Orange_Pi_5_Ultra-image75.png|307x202px]]</p></li>
<li><p>请确保开发板已经贴有SPI Flash,SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置。</p>
<p>[[File:Orange_Pi_5_Ultra-image76.png|312x205px]]</p></li>
<li><p>还需要准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip'''和烧录工具'''RKDevTool_Release_v3.15.zip'''。</p></li>
<li><p>然后下载Android的镜像,打开Android镜像的下载链接后可以看到下面两种类型的安卓镜像,请选择'''SPIFlash-NVME SSD'''文件夹中的镜像进行下载。</p>
<p>[[File:Orange_Pi_5_Ultra-image136.png|195x65px]]</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image35.png|407x120px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image36.png|286x150px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image37.png|296x154px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image38.png|413x122px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image39.png|402x189px]]</p></li>
<li><p>然后开始烧录Android镜像到SPIFlash+NVMe SSD中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB烧录口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源。</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image41.png|376x99px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了。</p>
<p>[[File:Orange_Pi_5_Ultra-image42.png|379x102px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image43.png|443x208px]]</p></li>
<li><p>然后点击烧录工具的”'''升级固件'''”一栏。</p>
<p>[[File:Orange_Pi_5_Ultra-image133.png|442x208px]]</p></li>
<li><p>接着点击”'''固件'''”按钮选择需要烧录的Android镜像。</p>
<p>[[File:Orange_Pi_5_Ultra-image134.png|444x209px]]</p></li>
<li><p>最后点击”'''升级'''”按钮就会开始烧录,烧录的过程如下图所示,可以看到,首先会烧录固件到SPIFlash中,然后烧录固件到PCIE中。烧录完成后Android系统会自动启动。</p>
<p>[[File:Orange_Pi_5_Ultra-image137.png|452x211px]]</p></li></ol>
</li></ol>

<span id="烧录orange-pi-os-droid镜像到tf卡中的方法"></span>
== 烧录Orange Pi OS (Droid)镜像到TF卡中的方法 ==

'''注意,下面所有的操作都是在Windows电脑中进行的。'''

<ol style="list-style-type: decimal;">
<li><p>首先准备一张8GB或更大容量的TF卡,TF卡的传输速度必须为'''class10'''或以上,建议使用闪迪等品牌的TF卡。</p></li>
<li><p>然后使用读卡器把TF卡插入电脑。</p></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载SDDiskTool烧写工具,'''请确保SDDiskTool工具的版本为最新的v1.72'''。</p></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载Orange Pi OS (Droid)的镜像。</p></li>
<li><p>然后使用解压软件解压下载的Orange Pi OS (Droid)镜像的压缩包,解压后的文件中,以”.img” 结尾的文件就是Orange Pi OS (Droid)镜像文件,大小在1GB以上。</p></li>
<li><p>然后使用解压软件解压'''SDDiskTool_v1.72.zip''',此软件无需安装,在解压后的文件夹中找到'''SD_Firmware_Tool.exe'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image138.png|477x114px]]</p></li>
<li><p>打开'''SDDiskTool'''后,如果TF卡识别正常,会在”'''选择可移动磁盘设备'''”一栏中显示插入的磁盘设备,'''请务必确认显示的磁盘设备和你想烧录的TF卡的盘符是一致的''',如果没有显示可以尝试拔插下TF卡。</p>
<p>[[File:Orange_Pi_5_Ultra-image139.png|246x210px]]</p></li>
<li><p>确认完盘符后,可以先格式化下TF卡,点击'''SDDiskTool'''中的'''恢复磁盘'''按钮即可,也可使用前面提到的'''SD Card Formatter'''进行TF卡的格式化。</p>
<p>[[File:Orange_Pi_5_Ultra-image140.png|253x217px]]</p></li>
<li><p>然后开始将Orange Pi OS (Droid)镜像写入TF卡。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先在”'''选择功能模式'''”中勾选”'''SD启动'''”。</p></li>
<li><p>然后在”'''选择升级固件'''”一栏中选择Orange Pi OS (Droid)镜像的路径。</p></li>
<li><p>最后点击”'''开始创建'''”按钮就会开始烧录Orange Pi OS (Droid)镜像到TF卡中。</p>
<p>[[File:Orange_Pi_5_Ultra-image141.png|255x215px]]</p></li></ol>
</li>
<li><p>烧录完后即可退出SDDiskTool软件,然后就可以把TF卡从电脑中拔出来插到开发板中启动了。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image142.png|260x221px]]

<span id="烧录orange-pi-os-droid镜像到spiflashnvme-ssd中"></span>
== 烧录Orange Pi OS (Droid)镜像到SPIFlash+NVMe SSD中 ==

'''注意,下面所有的操作都是在Windows电脑中进行的。'''

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一个NVMe SSD固态硬盘。</p>
<p>[[File:Orange_Pi_5_Ultra-image74.png|306x89px]]</p></li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好。</p>
<p>[[File:Orange_Pi_5_Ultra-image75.png|307x202px]]</p></li>
<li><p>请确保开发板已经贴有SPI Flash,SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置。</p>
<p>[[File:Orange_Pi_5_Ultra-image76.png|312x205px]]</p></li>
<li><p>还需要准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip''',烧录工具'''RKDevTool_Release_v3.15.zip'''。</p></li>
<li><p>然后下载Orange Pi OS (Droid)的镜像。</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image35.png|445x131px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image36.png|280x147px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image37.png|295x153px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image38.png|423x125px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image39.png|402x189px]]</p></li>
<li><p>然后开始烧录Orange Pi OS (Droid)镜像到SPIFlash+NVMe SSD中。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB烧录口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源。</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image41.png|382x101px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了。</p>
<p>[[File:Orange_Pi_5_Ultra-image42.png|379x102px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image43.png|442x208px]]</p></li>
<li><p>然后点击烧录工具的”'''升级固件'''”一栏。</p>
<p>[[File:Orange_Pi_5_Ultra-image133.png|442x208px]]</p></li>
<li><p>接着点击”'''固件'''”按钮选择需要烧录的Orange Pi OS (Droid)镜像。</p>
<p>[[File:Orange_Pi_5_Ultra-image134.png|447x210px]]</p></li>
<li><p>最后点击”'''升级'''”按钮就会开始烧录,烧录的过程如下图所示,可以看到,首先会烧录固件到SPIFlash中,然后烧录固件到PCIE中。烧录完成后Orange Pi OS (Droid)系统会自动启动。</p>
<p>[[File:Orange_Pi_5_Ultra-image137.png|452x211px]]</p></li></ol>
</li></ol>

<span id="使用rkdevtool清空spiflash的方法"></span>
== 使用RKDevTool清空SPIFlash的方法 ==

<ol style="list-style-type: decimal;">
<li><p>SPI Flash在开发板上的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image76.png|312x205px]]</p></li>
<li><p>首先需要准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>然后从[http://www.orangepi.cn/html/serviceAndSupport/index.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip'''和'''MiniLoader'''以及烧录工具'''RKDevTool_Release_v3.15.zip'''。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange Pi的资料下载页面]首先选择'''官方工具''',然后进入下面的文件夹中。</p>
<p>[[File:Orange_Pi_5_Ultra-image33.png|366x77px]]</p></li>
<li><p>然后下载下面的所有文件。</p>
<p>[[File:Orange_Pi_5_Ultra-image34.png|315x125px]]</p>
<p>'''注意,“MiniLoader-烧录Linux镜像才需要用到的东西”文件夹下文简称为MiniLoader文件夹。'''</p></li></ol>
</li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image35.png|472x139px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image36.png|276x145px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image37.png|292x151px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image38.png|467x138px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image39.png|402x189px]]</p></li>
<li><p>然后就可以开始清空SPI FLASH中的内容。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB接口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源。</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image41.png|386x102px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了。</p>
<p>[[File:Orange_Pi_5_Ultra-image42.png|379x102px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”。</p>
<p>[[File:Orange_Pi_5_Ultra-image43.png|457x215px]]</p></li>
<li><p>然后请选择'''高级功能'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image126.png|458x138px]]</p></li>
<li><p>然后点击下图所示的位置。</p>
<p>[[File:Orange_Pi_5_Ultra-image127.png|459x216px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中的'''MiniLoaderAll.bin''',再点击打开。</p>
<p>[[File:Orange_Pi_5_Ultra-image128.png|469x220px]]</p></li>
<li><p>然后点击'''下载'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image129.png|472x222px]]</p></li>
<li><p>下载完'''MiniLoaderAll.bin'''后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image143.png|474x223px]]</p></li>
<li><p>然后选择存储设备为'''SPINOR'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image144.png|467x220px]]</p></li>
<li><p>然后点击'''切换存储'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image145.png|464x218px]]</p></li>
<li><p>然后点击'''擦除所有'''就会开始擦除SPIFlash了。</p>
<p>[[File:Orange_Pi_5_Ultra-image146.png|467x220px]]</p></li>
<li><p>擦除SPIFlash后的显示log如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image147.png|460x216px]]</p></li></ol>
</li></ol>

== 启动香橙派开发板 ==

# 将烧录好镜像的TF卡插入香橙派开发板的TF卡插槽中。如果SPIFlash+NVMe SSD或者eMMC模块已经烧录好镜像了,那么就不需要插入TF卡了,只需确保NVMe SSD或者eMMC模块正常插入到开发板中即可。
# 开发板有HDMI接口,可以通过HDMI转HDMI连接线把开发板连接到电视或者HDMI显示器。如果有购买LCD屏幕,也可以使用LCD屏幕来显示开发板的系统界面。
# 接上USB鼠标和键盘,用于控制香橙派开发板。
# 开发板有以太网口,可以插入网线用来上网。
# 连接一个5V/4A或者5V/5A的USB Type-C接口的'''高品质'''的电源适配。

'''切记不要插入电压输出大于5V的电源适配器,会烧坏开发板。'''

'''系统上电启动过程中很多不稳定的现象基本都是供电有问题导致的,所以一个靠谱的电源适配器很重要。如果启动过程中发现有不断重启的现象,请更换下电源或者Type-C数据线再试下。'''

'''Type-C电源接口是不支持PD协商的。'''

'''另外请不要接到电脑的USB接口来给开发板供电。'''

<ol start="6" style="list-style-type: decimal;">
<li><p>然后打开电源适配器的开关,如果一切正常,此时HDMI显示器或者LCD屏幕就能看到系统的启动画面了。</p></li>
<li><p>如果想通过调试串口查看系统的输出信息,请使用串口线将开发板连接到电脑,串口的连接方法请参看[[#调试串口的使用方法|'''调试串口的使用方法''']]一节。</p></li></ol>

== 调试串口的使用方法 ==

=== 调试串口的连接说明 ===

# 首先需要准备一个'''3.3V'''的USB转TTL模块,然后将USB转TTL模块的USB接口一端插入到电脑的USB接口中。

'''为了更好的兼容性,推荐使用CH340 USB转TTL模块,请不要使用CP2102、PL2303类型的USB转TTL模块。'''

'''购买USB转TTL模块前,请确认模块支持1500000速率的波特率。'''

[[File:Orange_Pi_5_Ultra-image148.png|569x114px]]

<ol start="2" style="list-style-type: decimal;">
<li><p>开发板的调试串口GND、RXD和TXD引脚的对应关系如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image149.png|569x135px]]</p></li>
<li><p>USB转TTL模块GND、TXD和RXD引脚需要通过杜邦线连接到开发板的调试串口上。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>USB转TTL模块的GND接到开发板的GND上。</p></li>
<li><p>USB转TTL模块的'''RX接到开发板的TX上'''。</p></li>
<li><p>USB转TTL模块的'''TX接到开发板的RX上'''。</p></li></ol>
</li>
<li><p>USB转TTL模块连接电脑和Orange Pi开发板的示意图如下所示:</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image150.jpeg|572x207px|54707e6bc871767675ef2afa59b03cf4]]

</div>
<p>'''串口的TX和RX是需要交叉连接的,如果不想仔细区分TX和RX的顺序,可以把串口的TX和RX先随便接上,如果测试没有输出再交换下TX和RX的顺序,这样就总有一种顺序是对的'''</p></li></ol>

<span id="ubuntu平台调试串口的使用方法"></span>
=== Ubuntu平台调试串口的使用方法 ===

'''Linux下可以使用的串口调试软件有很多,如putty、minicom等,下面演示putty的使用方法。'''

<ol style="list-style-type: decimal;">
<li><p>首先将USB转TTL模块插入Ubuntu电脑的USB接口,如果USB转TTL模块连接识别正常,在Ubuntu PC的'''/dev'''下就可以看到对应的设备节点名,记住这个节点名,后面设置串口软件时会用到。</p>
<p>test@test:~$ '''ls /dev/ttyUSB*'''</p>
<p>/dev/ttyUSB0</p></li>
<li><p>然后使用下面的命令在Ubuntu PC上安装下putty。</p>
<p>test@test:~$ '''sudo apt-get update'''</p>
<p>test@test:~$ '''sudo apt-get install -y putty'''</p></li>
<li><p>然后运行putty,'''记得加sudo权限'''。</p>
<p>test@test:~$ '''sudo putty'''</p></li>
<li><p>执行putty命令后会弹出下面的界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image151.png|367x321px]]</p></li>
<li><p>首先选择串口的设置界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image152.png|359x352px]]</p></li>
<li><p>然后设置串口的参数。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>设置'''Serial line to connect to'''为'''/dev/ttyUSB0'''(修改为对应的节点名,一般为'''/dev/ttyUSB0''')。</p></li>
<li><p>设置'''Speed(baud)'''为'''1500000'''(串口的波特率)。</p></li>
<li><p>设置'''Flow control'''为'''None'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image153.png|316x312px]]</p></li></ol>
</li>
<li><p>在串口的设置界面设置完后,再回到Session界面。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先选择'''Connection type'''为Serial。</p></li>
<li><p>然后点击'''Open'''按钮连接串口。</p>
<p>[[File:Orange_Pi_5_Ultra-image154.png|345x340px]]</p></li></ol>
</li>
<li><p>启动开发板后,就能从打开的串口终端中看到系统输出的Log信息了。</p>
<p>[[File:Orange_Pi_5_Ultra-image155.png|468x340px]]</p></li></ol>

<span id="windows平台调试串口的使用方法"></span>
=== Windows平台调试串口的使用方法 ===

'''Windows下可以使用的串口调试软件有很多,如SecureCRT、MobaXterm等,下面演示MobaXterm的使用方法,这款软件有免费版本,无需购买序列号即可使用。'''

<ol style="list-style-type: decimal;">
<li><p>下载MobaXterm。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>下载MobaXterm网址如下:</p>
<p>[https://mobaxterm.mobatek.net/ '''https://mobaxterm.mobatek.net''']</p></li>
<li><p>进入MobaXterm下载网页后点击'''GET XOBATERM NOW!'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image156.png|576x334px]]</p></li>
<li><p>然后选择下载Home版本。</p>
<p>[[File:Orange_Pi_5_Ultra-image157.png|353x231px]]</p></li>
<li><p>然后选择Portable便携式版本,下载完后无需安装,直接打开就可以使用。</p>
<p>[[File:Orange_Pi_5_Ultra-image158.png|575x259px]]</p></li></ol>
</li>
<li><p>下载完后使用解压缩软件解压下载的压缩包,即可得到MobaXterm的可执软件,然后双击打开。</p>
<p>[[File:Orange_Pi_5_Ultra-image159.png|576x81px]]</p></li>
<li><p>打开软件后,设置串口连接的步骤如下:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>打开会话的设置界面。</p></li>
<li><p>选择串口类型。</p></li>
<li><p>选择串口的端口号(根据实际的情况选择对应的端口号),如果看不到端口号,请使用[http://weishi.360.cn/qudongdashi/ '''360驱动大师''']扫描安装USB转TTL串口芯片的驱动。</p></li>
<li><p>选择串口的波特率为'''1500000'''。</p></li>
<li><p>最后点击”'''OK'''”按钮完成设置。</p></li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image160.png|575x438px]]

<ol start="4" style="list-style-type: decimal;">
<li><p>点击”'''OK'''”按钮后会进入下面的界面,此时启动开发板就能看到串口的输出信息了。</p>
<p>[[File:Orange_Pi_5_Ultra-image161.png|575x291px]]</p></li></ol>

== 使用开发板40pin接口中的5v引脚供电说明 ==

'''我们推荐的开发板的供电方式是使用5V/5A的Type C接口的电源线插到开发板的Type-C电源接口来供电的。如果需要使用40pin接口中的5V引脚来给开发板供电,请确保使用的电源线和电源适配器能满足开发板的供电需求。如果有使用不稳定的情况,请换回Type-C电源供电。'''

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一根下图所示的电源线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image162.jpeg|216x154px|4ff86e49b6624616f9498fe44c366f29]]

</div>
<p>'''上图所示的电源线在淘宝可以买到,请自行搜索购买。'''</p></li>
<li><p>使用40pin接口中的5V引脚来给开发板供电,电源线的接法如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>上图所示的电源线USB A口需要插到5V/5A的电源适配器接头上('''请不要插到电脑的USB接口来供电''')。</p></li>
<li><p>红色的杜邦线需要插到开发板40pin的5V引脚上。</p></li>
<li><p>黑色的杜邦线需要插到40pin接口的GND引脚上。</p></li>
<li><p>40pin接口5V引脚和GND引脚在开发板中的位置如下图所示,'''切记不要接反了'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image163.png|576x142px]]</p></li></ol>
</li></ol>

<span id="ubuntudebian-server和xfce桌面系统使用说明"></span>
= Ubuntu/Debian Server和Xfce桌面系统使用说明 =

'''本章内容是基于Linux服务器版本的镜像和Xfce桌面版本镜像编写的。'''

'''如果使用的是OPi OS Arch镜像,请查看[[#orange-pi-os-arch系统使用说明|Orange Pi OS Arch系统使用说明]]一章的内容。'''

<span id="已支持的linux镜像类型和内核版本"></span>
== 已支持的Linux镜像类型和内核版本 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''Linux镜像类型'''
| style="text-align: center;"| '''内核版本'''
| style="text-align: center;"| '''服务器版'''
| style="text-align: center;"| '''桌面版'''
|-
| style="text-align: center;"| '''Debian 11 - Bullseye'''
| style="text-align: center;"| '''Linux5.10'''
| style="text-align: center;"| '''支持'''
| style="text-align: center;"| '''支持'''
|-
| style="text-align: center;"| '''Debian 12 - Bookworm'''
| style="text-align: center;"| '''Linux5.10'''
| style="text-align: center;"| '''支持'''
| style="text-align: center;"| '''支持'''
|-
| style="text-align: center;"| '''Ubuntu 20.04 - Focal'''
| style="text-align: center;"| '''Linux5.10'''
| style="text-align: center;"| '''支持'''
| style="text-align: center;"| '''支持'''
|-
| style="text-align: center;"| '''Ubuntu 22.04 - Jammy'''
| style="text-align: center;"| '''Linux5.10'''
| style="text-align: center;"| '''支持'''
| style="text-align: center;"| '''支持'''
|-
| style="text-align: center;"| '''Debian 12 - Bookworm'''
| style="text-align: center;"| '''Linux6.1'''
| style="text-align: center;"| '''支持'''
| style="text-align: center;"| '''支持'''
|-
| style="text-align: center;"| '''Ubuntu 22.04 - Jammy'''
| style="text-align: center;"| '''Linux6.1'''
| style="text-align: center;"| '''支持'''
| style="text-align: center;"| '''支持'''
|}

<span id="linux-5.10系统适配情况"></span>
== Linux 5.10系统适配情况 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''功能'''
| style="text-align: center;"| '''Debian11'''
| style="text-align: center;"| '''Debian12'''
| style="text-align: center;"| '''Ubuntu20.04'''
| style="text-align: center;"| '''Ubuntu22.04'''
|-
| style="text-align: center;"| '''HDMI TX视频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI TX音频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI RX视频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI RX音频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB2.0x2'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB3.0x2'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''2.5G网口'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''网口状态灯'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''WIFI'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''蓝牙'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''调试串口'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''RTC芯片'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''FAN风扇接口'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''eMMC扩展接口'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''GPIO(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''UART(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''SPI(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''I2C(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''CAN(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''PWM(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''OV13850摄像头'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''OV13855摄像头'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''SPI+NVME启动'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''LCD'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''MIC'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''耳机播放'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''耳机录音'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''三色LED 灯'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''GPU'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''NPU'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''VPU'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''开关机按键'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''看门狗测试'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''Chromium硬解视频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|}

<span id="linux-6.1系统适配情况"></span>
== Linux 6.1系统适配情况 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''功能'''
| style="text-align: center;"| '''Debian12'''
| style="text-align: center;"| '''Ubuntu22.04'''
|-
| style="text-align: center;"| '''HDMI TX视频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI TX音频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI RX视频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI RX音频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB2.0 x 2'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB3.0 x 2'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''千兆网口'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''网口状态灯'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''WIFI'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''蓝牙'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''调试串口'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''RTC芯片'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''FAN风扇接口'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''eMMC扩展接口'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''GPIO(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''UART(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''SPI(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''I2C(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''CAN(40pin)'''
| style="text-align: center;"| '''NO'''
| style="text-align: center;"| '''NO'''
|-
| style="text-align: center;"| '''PWM(40pin)'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''OV13850摄像头'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''OV13855摄像头'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''SPI+NVME启动'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''LCD'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''MIC'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''耳机播放'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''耳机录音'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''三色LED 灯'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''GPU'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''NPU'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''VPU'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''开关机按键'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''看门狗测试'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''Chromium硬解视频'''
| style="text-align: center;"| '''OK'''
| style="text-align: center;"| '''OK'''
|}

== 本手册linux命令格式说明 ==

<ol style="list-style-type: decimal;">
<li><p>本手册中所有需要在Linux系统中输入的命令都会使用下面的方框框起来。</p>
<p>如下所示,黄色方框里内容表示需要特别注意的内容,这里面的命令除外。</p></li>
<li><p>命令前面的提示符类型说明。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>命令前面提示符指的是下面方框内红色部分的内容,这部分内容不是linux命令的一部分,所以在linux系统中输入命令时,请不要把红色字体部分的内容也输入进去。</p>
<p>'''orangepi@orangepi:~$ sudo apt update'''</p>
<p>'''root@orangepi:~#''' '''vim /boot/boot.cmd'''</p>
<p>'''test@test:~$ ssh [mailto:root@192.168.1.36 root@192.168.1.]xxx'''</p>
<p>'''root@test:~# ls'''</p></li>
<li><p>'''root@orangepi:~$''' 提示符表示这个命令是在'''开发板的linux系统'''中输入的, 提示符最后的 '''$''' 表示系统当前用户为普通用户,当执行特权命令时,需要加上'''sudo'''。</p></li>
<li><p>'''root@orangepi:~#''' 提示符表示这个命令是在'''开发板的linux系统'''中输入的, 提示符最后的 '''#''' 表示系统当前用户为root用户,可以执行任何想要执行的命令。</p></li>
<li><p>'''test@test:~$''' 提示符表示这个命令是在Ubuntu PC或者Ubuntu虚拟机中输入的,而不是开发板的linux系统中。提示符最后的 '''$''' 表示系统当前用户为普通用户,当执行特权命令时,需要加上'''sudo'''。</p></li>
<li><p>'''root@test:~#''' 提示符表示这个命令是在Ubuntu PC或者Ubuntu虚拟机中输入的,而不是开发板的linux系统中。提示符最后的 '''#''' 表示系统当前用户为root用户,可以执行任何想要执行的命令。</p></li></ol>
</li>
<li><p>哪些是需要输入的命令?</p>
<ol style="list-style-type: lower-alpha;">
<li><p>如下所示,'''黑色加粗部分'''是需要输入的命令,命令下面的是输出的内容(有些命令有输出,有些可能没有输出),这部分内容是不需要输入的。</p>
<p>root@orangepi:~# '''cat /boot/orangepiEnv.txt'''</p>
<p>'''verbosity=7'''</p>
<p>bootlogo=false</p>
<p>'''console=serial'''</p></li>
<li><p>如下所示,有些命令一行写不下会放到下一行,只要黑色加粗的部分就都是需要输入的命令。当这些命令输入到一行的时候,每行最后的”'''\'''”是需要去掉的,这个不是命令的一部分。另外命令的不同部分都是有空格的,请别漏了。</p>
<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>

== linux系统登录说明 ==

=== linux系统默认登录账号和密码 ===

{| class="wikitable"
|-
| style="text-align: left;"| '''账号'''
| style="text-align: left;"| '''密码'''
|-
| style="text-align: left;"| '''root'''
| style="text-align: left;"| '''orangepi'''
|-
| style="text-align: left;"| '''orangepi'''
| style="text-align: left;"| '''orangepi'''
|}

'''注意,输入密码的时候,屏幕上是不会显示输入的密码的具体内容的,请不要以为是有什么故障,输入完后直接回车即可。'''

'''当输入密码提示错误,或者ssh连接有问题,请注意,只要使用的是Orange Pi提供的Linux镜像,就请不要怀疑上面的密码不对,而是要找其它的原因。'''

=== 设置linux系统终端自动登录的方法 ===

<ol style="list-style-type: decimal;">
<li><p>linux系统默认就是自动登录终端的,默认登录的用户名是'''orangepi'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image164.png|484x319px]]</p></li>
<li><p>使用下面的命令可以设置root用户自动登录终端。</p>
<p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh root'''</p></li>
<li><p>使用下面的命令可以禁止自动登录终端。</p>
<p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh -d'''</p></li>
<li><p>使用下面的命令可以再次设置orangepi用户自动登录终端。</p>
<p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh orangepi'''</p></li></ol>

=== linux桌面版系统自动登录说明 ===

<ol style="list-style-type: decimal;">
<li><p>桌面版系统启动后会自动登录进入桌面,无需输入密码。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image165.png|576x324px|1]]

</div></li>
<li><p>运行下面的命令可以禁止桌面版系统自动登录桌面。</p>
<p>orangepi@orangepi:~$ '''sudo disable_desktop_autologin.sh'''</p></li>
<li><p>然后重启系统就会出现登录对话框,此时需要输入[[#linux系统默认登录账号和密码|'''密码''']]才能进入系统。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image166.png|569x312px|IMG_256]]

</div></li></ol>

<span id="linux桌面版系统root用户自动登录的设置方法"></span>
=== Linux桌面版系统root用户自动登录的设置方法 ===

<ol style="list-style-type: decimal;">
<li><p>执行下面的命令可以设置桌面版系统使用root用户自动登录。</p>
<p>orangepi@orangepi:~$ '''sudo desktop_login.sh root'''</p></li>
<li><p>然后重启系统,就会自动使用root用户登录桌面了。</p>
<p>[[File:Orange_Pi_5_Ultra-image167.png|448x187px]]</p>
<p>'''注意,如果使用root用户登录桌面系统,是无法使用右上角的pulseaudio来管理音频设备的。'''</p>
<p>'''另外请注意这并不是一个bug,因为pulseaudio本来就不允许在root用户下运行。'''</p></li>
<li><p>执行下面的命令可以再次设置桌面版系统使用orangepi用户自动登录。</p>
<p>orangepi@orangepi:~$ '''sudo desktop_login.sh orangepi'''</p></li></ol>

<span id="linux桌面版系统禁用桌面的方法"></span>
=== Linux桌面版系统禁用桌面的方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先在命令行中输入下面的命令,'''请记得加sudo权限'''。</p>
<p>orangepi@orangepi:~$ '''sudo systemctl disable lightdm.service'''</p></li>
<li><p>然后重启Linux系统就会发现不会显示桌面了。</p>
<p>orangepi@orangepi:~$ '''sudo reboot'''</p></li>
<li><p>重新打开桌面的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先在命令行中输入下面的命令,'''请记得加sudo权限'''。</p>
<p>orangepi@orangepi:~$ '''sudo systemctl start lightdm.service'''</p>
<p>orangepi@orangepi:~$ '''sudo systemctl enable lightdm.service'''</p></li>
<li><p>选择完后显示器就会显示桌面了。</p></li></ol>
</li></ol>

<span id="板载led灯测试说明"></span>
== 板载LED灯测试说明 ==

<ol style="list-style-type: decimal;">
<li><p>开发板上有一个红绿蓝三色灯,所在位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image168.png|315x87px]]</p></li>
<li><p>'''只要开发板打开了电源,红色的LED灯就会常亮,这是由硬件控制的,软件无法关闭。通过红色的LED灯可以确定开发板的电源是否已正常开启'''。</p></li>
<li><p>绿色和蓝色的的LED灯在内核启动后会一直闪烁,这是由软件控制的。</p></li>
<li><p>设置绿灯亮灭和闪烁的方法如下所示:</p>
<p>'''注意,下面的操作请在root用户下进行。'''</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先进入绿灯的设置目录。</p>
<p>root@orangepi:~# '''cd /sys/class/leds/green_led'''</p></li>
<li><p>设置绿灯停止闪烁的命令如下:</p>
<p>root@orangepi:/sys/class/leds/green_led# '''echo none &gt; trigger'''</p></li>
<li><p>设置绿灯常亮的命令如下:</p>
<p>root@orangepi:/sys/class/leds/green_led# '''echo default-on &gt; trigger'''</p></li>
<li><p>设置绿灯闪烁的命令如下:</p>
<p>root@orangepi:/sys/class/leds/green_led# '''echo heartbeat &gt; trigger'''</p></li></ol>
</li>
<li><p>使用命令设置蓝灯亮灭和闪烁的方法如下所示:</p>
<p>'''注意,下面的操作请在root用户下进行。'''</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先进入蓝灯的设置目录。</p>
<p>root@orangepi:~# '''cd /sys/class/leds/blue_led'''</p></li>
<li><p>设置蓝灯停止闪烁的命令如下:</p>
<p>root@orangepi:/sys/class/leds/blue_led# '''echo none &gt; trigger'''</p></li>
<li><p>设置蓝灯常亮的命令如下:</p>
<p>root@orangepi:/sys/class/leds/blue_led# '''echo default-on &gt; trigger'''</p></li>
<li><p>设置蓝灯闪烁的命令如下:</p>
<p>root@orangepi:/sys/class/leds/blue_led# '''echo heartbeat &gt; trigger'''</p></li></ol>
</li>
<li><p>如果开机后不需要LED灯闪烁,可以使用下面的方法来关闭绿灯和蓝灯。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限。</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|356x185px]]</p></li>
<li><p>然后选择'''Hardware'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image170.png|364x174px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中'''opi5ultra-disable-leds'''配置。</p>
<p>[[File:Orange_Pi_5_Ultra-image171.png|371x22px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存。</p>
<p>[[File:Orange_Pi_5_Ultra-image172.png|357x107px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image173.png|361x112px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效。</p>
<p>[[File:Orange_Pi_5_Ultra-image174.png|360x165px]]</p></li>
<li><p>重启后就可以看到开发板上只有红灯常亮了,绿灯和蓝灯都不会闪烁了。</p></li></ol>
</li></ol>

== 网络连接测试 ==

=== 以太网口测试 ===

<ol style="list-style-type: decimal;">
<li><p>首先将网线的一端插入开发板的以太网接口,网线的另一端接入路由器,并确保网络是畅通的。</p></li>
<li><p>系统启动后会通过'''DHCP'''自动给以太网卡分配IP地址,'''不需要其他任何配置'''。</p></li>
<li><p>在开发板的Linux系统中查看IP地址的命令如下所示:</p>
<p>orangepi@orangepi:~$ '''ip addr show'''</p>
<p>1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000</p>
<p>link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</p>
<p>inet 127.0.0.1/8 scope host lo</p>
<p>valid_lft forever preferred_lft forever</p>
<p>inet6 ::1/128 scope host</p>
<p>valid_lft forever preferred_lft forever</p>
<p>2: '''enP3p49s0''': &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000</p>
<p>link/ether 00:e0:4c:68:00:0f brd ff:ff:ff:ff:ff:ff</p>
<p>inet '''10.31.2.249'''/16 brd 10.31.255.255 scope global dynamic noprefixroute enP3p49s0</p>
<p>valid_lft 42670sec preferred_lft 42670sec</p>
<p>inet6 fe80::d5aa:9a6:cd41:942e/64 scope link noprefixroute</p>
<p>valid_lft forever preferred_lft forever</p>
<p>3: wlan0: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state DORMANT group default qlen 1000</p>
<p>link/ether 50:41:1c:f1:0f:7e brd ff:ff:ff:ff:ff:ff</p>
<p>'''当使用ifconfig查看IP地址时,如果提示下面的信息,是因为没有加sudo导致的,正确的命令是:sudo ifconfig'''。</p>
<p>orangepi@orangepi:~$ '''ifconfig'''</p>
<p>Command 'ifconfig' is available in the following places</p>
<p>* /sbin/ifconfig</p>
<p>* /usr/sbin/ifconfig</p>
<p>The command could not be located because '/sbin:/usr/sbin' is not included in the PATH environment variable.</p>
<p>This is most likely caused by the lack of administrative privileges associated with your user account.</p>
<p>ifconfig: command not found</p></li></ol>

'''开发板启动后查看IP地址有三种方法:'''

# '''接HDMI显示器,然后登录系统使用ip addr show命令查看IP地址'''。
# '''在调试串口终端输入ip addr show命令来查看IP地址'''。
# '''如果没有调试串口,也没有HDMI显示器,还可以通过路由器的管理界面来查看开发板网口的IP地址。不过这种方法经常有人会无法正常看到开发板的IP地址。如果看不到,调试方法如下所示:'''

<!-- -->
<ol style="list-style-type: upper-alpha;">
<li><p>'''首先检查Linux系统是否已经正常启动,如果开发板的三色灯在闪烁了,一般是正常启动了,如果只亮红灯,说明系统都没正常启动;'''</p></li>
<li><p>'''检查网线有没有插紧,或者换根网线试下;'''</p></li>
<li><p>'''换个路由器试下(路由器的问题有遇到过很多,比如路由器无法正常分配IP地址,或者已正常分配IP地址但在路由器中看不到);'''</p></li>
<li><p>'''如果没有路由器可换就只能连接HDMI显示器或者使用调试串口来查看IP地址。'''</p>
<p>'''另外需要注意的是开发板DHCP自动分配IP地址是不需要任何设置的。'''</p></li></ol>

<!-- -->
<ol start="4" style="list-style-type: decimal;">
<li><p>测试网络连通性的命令如下,'''ping'''命令可以通过'''Ctrl+C'''快捷键来中断运行。</p>
<p>orangepi@orangepi:~$ '''ping www.baidu.com -I enP3p49s0'''</p>
<p>PING www.a.shifen.com (183.2.172.185) from 10.31.2.249 enP3p49s0: 56(84) bytes of data.</p>
<p>64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=53 time=39.5 ms</p>
<p>64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=53 time=33.1 ms</p>
<p>64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=3 ttl=53 time=32.4 ms</p>
<p>64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=4 ttl=56 time=7.27 ms</p>
<p>^C</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连接测试"></span>
=== WIFI连接测试 ===

'''请不要通过修改/etc/network/interfaces配置文件的方式来连接WIFI,通过这种方式连接WIFI网络使用会有问题。'''

<span id="服务器版镜像通过命令连接wifi"></span>
==== 服务器版镜像通过命令连接WIFI ====

'''当开发板没有连接以太网,没有连接HDMI显示器,只连接了串口时,推荐使用此小节演示的命令来连接WIFI网络。因为nmtui在某些串口软件(如minicom)中只能显示字符,无法正常显示图形界面。当然,如果开发板连接了以太网或者HDMI显示屏,也可以使用此小节演示的命令来连接WIFI网络的。'''

<ol style="list-style-type: decimal;">
<li><p>先登录linux系统,有下面三种方式:</p>
<ol style="list-style-type: lower-alpha;">
<li>如果开发板连接了网线,可以通过[[#ssh远程登录开发板|'''ssh远程登录linux系统''']]。</li></ol>

<!-- -->
<ol style="list-style-type: lower-alpha;">
<li><p>如果开发板连接好了调试串口,可以使用串口终端登录linux系统。</p></li>
<li><p>如果连接了开发板到HDMI显示器,可以通过HDMI显示的终端登录到linux系统。</p></li></ol>
</li></ol>

<!-- -->
<ol style="list-style-type: decimal;">
<li><p>首先使用'''nmcli dev wifi'''命令扫描周围的WIFI热点。</p>
<p>orangepi@orangepi:~$ '''nmcli dev wifi'''</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image175.png|575x250px|选区_011]]

</div></li>
<li><p>然后使用'''nmcli''' 命令连接扫描到的WIFI热点,其中:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''wifi_name'''需要换成想连接的WIFI热点的名字。</p></li>
<li><p>'''wifi_passwd'''需要换成想连接的WIFI热点的密码。</p>
<p>orangepi@orangepi:~$ '''sudo nmcli dev wifi connect wifi_name password wifi_passwd'''</p>
<p>Device 'wlan0' successfully activated with 'cf937f88-ca1e-4411-bb50-61f402eef293'.</p></li></ol>
</li>
<li><p>通过'''ip addr show wlan0'''命令可以查看wifi的IP地址。</p>
<p>orangepi@orangepi:~$ '''ip addr show 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 '''192.168.1.11'''/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>使用'''ping'''命令可以测试wifi网络的连通性,'''ping'''命令可以通过'''Ctrl+C'''快捷键来中断运行。</p>
<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>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=1 ttl=52 time=43.5 ms</p>
<p>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=2 ttl=52 time=41.3 ms</p>
<p>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=3 ttl=52 time=44.9 ms</p>
<p>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=4 ttl=52 time=45.6 ms</p>
<p>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=5 ttl=52 time=48.8 ms</p>
<p>^C</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="服务器版镜像通过图形化方式连接wifi"></span>
==== 服务器版镜像通过图形化方式连接WIFI ====

<ol style="list-style-type: decimal;">
<li><p>先登录linux系统,有下面三种方式:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>如果开发板连接了网线,可以通过[[#ssh远程登录开发板|'''ssh远程登录linux系统''']]。</p></li>
<li><p>如果开发板连接好了调试串口,可以使用串口终端登录linux系统(串口软件请使用MobaXterm,使用minicom无法显示图形界面)。</p></li>
<li><p>如果连接了开发板到HDMI显示器,可以通过HDMI显示的终端登录到linux系统。</p></li></ol>
</li>
<li><p>然后在命令行中输入nmtui命令打开wifi连接的界面。</p>
<p>orangepi@orangepi:~$ '''sudo nmtui'''</p></li>
<li><p>输入nmtui命令打开的界面如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image176.png|345x215px]]</p></li>
<li><p>选择'''Activate a connect'''后回车。</p>
<p>[[File:Orange_Pi_5_Ultra-image177.png|349x216px]]</p></li>
<li><p>然后就能看到所有搜索到的WIFI热点。</p>
<p>[[File:Orange_Pi_5_Ultra-image178.png|360x229px]]</p></li>
<li><p>选择想要连接的WIFI热点后再使用Tab键将光标定位到'''Activate'''后回车。</p>
<p>[[File:Orange_Pi_5_Ultra-image179.png|366x230px]]</p></li>
<li><p>然后会弹出输入密码的对话框,在'''Password'''内输入对应的密码然后回车就会开始连接WIFI。</p>
<p>[[File:Orange_Pi_5_Ultra-image180.png|352x225px]]</p></li>
<li><p>WIFI连接成功后会在已连接的WIFI名称前显示一个”*”</p>
<p>[[File:Orange_Pi_5_Ultra-image181.png|349x223px]]</p></li>
<li><p>通过'''ip addr show wlan0'''命令可以查看wifi的IP地址。</p>
<p>orangepi@orangepi:~$ '''ip addr show wlan0'''</p>
<p>3: 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 '''192.168.1.11'''/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>使用'''ping'''命令可以测试wifi网络的连通性,'''ping'''命令可以通过'''Ctrl+C'''快捷键来中断运行。</p>
<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>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=1 ttl=52 time=43.5 ms</p>
<p>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=2 ttl=52 time=41.3 ms</p>
<p>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=3 ttl=52 time=44.9 ms</p>
<p>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=4 ttl=52 time=45.6 ms</p>
<p>64 bytes from 182.92.236.130 (182.92.236.130): icmp_seq=5 ttl=52 time=48.8 ms</p>
<p>^C</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>

==== 桌面版镜像的测试方法 ====

<ol style="list-style-type: decimal;">
<li><p>点击桌面右上角的网络配置图标(测试WIFI时请不要连接网线)。</p>
<p>[[File:Orange_Pi_5_Ultra-image182.png|377x166px]]</p></li>
<li><p>在弹出的下拉框中点击'''More networks'''可以看到所有扫描到的WIFI热点,然后选择想要连接的WIFI热点。</p>
<p>[[File:Orange_Pi_5_Ultra-image183.png|576x353px]]</p></li>
<li><p>然后输入WIFI热点的密码,再点击'''Connect'''就会开始连接WIFI。</p>
<p>[[File:Orange_Pi_5_Ultra-image184.png|320x163px]]</p></li>
<li><p>连接好WIFI后,可以打开浏览器查看是否能上网,浏览器的入口如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image185.png|576x308px]]</p></li>
<li><p>打开浏览器后如果能打开其他网页说明WIFI连接正常。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image186.png|576x273px|5]]

</div></li></ol>

<span id="设置静态ip地址的方法"></span>
=== 设置静态IP地址的方法 ===

'''请不要通过修改/etc/network/interfaces配置文件的方式来设置静态IP地址。'''

<span id="使用nmtui命令来设置静态ip地址"></span>
==== 使用nmtui命令来设置静态IP地址 ====

<ol style="list-style-type: decimal;">
<li><p>首先运行'''nmtui'''命令。</p>
<p>orangepi@orangepi:~$ '''sudo nmtui'''</p></li>
<li><p>然后选择'''Edit a connection'''并按下回车键。</p>
<p>[[File:Orange_Pi_5_Ultra-image187.png|227x247px]]</p></li>
<li><p>然后选择需要设置静态IP地址的网络接口,比如设置'''Ethernet'''接口的静态IP地址选择'''Wired connection 1'''就可以了。</p>
<p>[[File:Orange_Pi_5_Ultra-image188.png|310x149px]]</p></li>
<li><p>然后通过'''Tab'''键选择'''Edit'''并按下回车键。</p>
<p>[[File:Orange_Pi_5_Ultra-image189.png|316x144px]]</p></li>
<li><p>然后通过Tab键将光标移动到下图所示的'''&lt;Automatic&gt;'''位置进行IPv4的配置。</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image190.png|575x230px|IMG_256]]

</div>
<ol start="6" style="list-style-type: decimal;">
<li>然后回车,通过上下方向键选择'''Manual''',然后回车确定。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image191.png|578x222px|IMG_256]]

</div>
<ol start="7" style="list-style-type: decimal;">
<li><p>选择完后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image192.png|575x226px]]</p></li>
<li><p>然后通过Tab键将光标移动到'''&lt;Show&gt;'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image193.png|576x221px]]</p></li>
<li><p>然后回车,回车后会弹出下面的设置界面。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image194.png|576x414px|9A479EA6-D960-4308-9528-4A9B6E78605E]]

</div></li>
<li><p>然后就可以在下图所示的位置设置IP地址(Addresses)、网关(Gateway)和DNS服务器的地址(里面还有很多其他设置选项,请自行探索),'''请根据自己的具体需求来设置,下图中设置的值只是一个示例'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image195.png|576x218px]]</p></li>
<li><p>设置完后将光标移动到右下角的'''&lt;OK&gt;''',然后回车确认。</p>
<p>[[File:Orange_Pi_5_Ultra-image196.png|576x116px]]</p></li>
<li><p>然后点击'''&lt;Back&gt;'''回退到上一级选择界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image197.png|330x325px]]</p></li>
<li><p>然后选择'''Activate a connection''',再将光标移动到'''&lt;OK&gt;''',最后点击回车。</p>
<p>[[File:Orange_Pi_5_Ultra-image198.png|331x248px]]</p></li>
<li><p>然后选择需要设置的网络接口,比如'''Wired connection 1''',然后将光标移动到'''&lt;Deactivate&gt;''',再按下回车键禁用'''Wired connection 1'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image199.png|576x224px]]</p></li>
<li><p>然后请不要移动光标,再按下回车键重新使能'''Wired connection 1''',这样前面设置的静态IP地址就会生效了。</p>
<p>[[File:Orange_Pi_5_Ultra-image200.png|576x224px]]</p></li>
<li><p>然后通过'''&lt;Back&gt;'''和'''Quit'''按钮就可以退出'''nmtui'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image201.png|300x253px]] [[File:Orange_Pi_5_Ultra-image202.png|227x252px]]</p></li>
<li><p>然后通过'''ip addr show enP3p49s0'''就能看到网口的IP地址已经变成前面设置的静态IP地址了。</p>
<p>orangepi@orangepi:~$ '''ip addr show enP3p49s0'''</p>
<p>2: enP3p49s0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000</p>
<p>link/ether 00:e0:4c:68:00:0f brd ff:ff:ff:ff:ff:ff</p>
<p>inet '''192.168.1.177'''/24 brd 192.168.1.255 scope global noprefixroute enP3p49s0</p>
<p>valid_lft forever preferred_lft forever</p>
<p>inet6 fe80::d5aa:9a6:cd41:942e/64 scope link noprefixroute</p>
<p>valid_lft forever preferred_lft forever</p></li>
<li><p>然后就可以测试网络的连通性来检查IP地址是否配置OK了,'''ping'''命令可以通过'''Ctrl+C'''快捷键来中断运行。</p>
<p>orangepi@orangepi:~$ '''ping 192.168.1.47 -I enP3p49s0'''</p>
<p>PING 192.168.1.47 (192.168.1.47) from 192.168.1.188 eth0: 56(84) bytes of data.</p>
<p>64 bytes from 192.168.1.47: icmp_seq=1 ttl=64 time=0.233 ms</p>
<p>64 bytes from 192.168.1.47: icmp_seq=2 ttl=64 time=0.263 ms</p>
<p>64 bytes from 192.168.1.47: icmp_seq=3 ttl=64 time=0.273 ms</p>
<p>64 bytes from 192.168.1.47: icmp_seq=4 ttl=64 time=0.269 ms</p>
<p>64 bytes from 192.168.1.47: icmp_seq=5 ttl=64 time=0.275 ms</p>
<p>^C</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="通过create_ap创建wifi热点的方法"></span>
=== 通过create_ap创建WIFI热点的方法 ===

'''create_ap是一个帮助快速创建Linux上的WIFI热点的脚本,并且支持bridge和NAT模式,能够自动结合hostapd, dnsmasq和iptables完成WIFI热点的设置,避免了用户进行复杂的配置,github地址如下:'''

[https://github.com/oblique/create_ap '''https://github.com/oblique/create_ap''']

'''如果使用的是最新的镜像,那么就已经预装了create_ap脚本,可以通过create_ap命令来创建WIFI热点,create_ap的基本命令格式如下所示:'''

'''create_ap [options] &lt;wifi-interface&gt; [&lt;interface-with-internet&gt;] [&lt;access-point-name&gt; [&lt;passphrase&gt;]]'''

'''* options:可以通过该参数指定加密方式、WIFI热点的频段、频宽模式、网络共享方式等,具体可以通过create_ap -h获取到有哪些option'''

'''* wifi-interface:无线网卡的名称'''

'''* interface-with-internet:可以联网的网卡名称,一般是eth0'''

'''* access-point-name:热点名称'''

'''* passphrase:热点的密码'''

<span id="create_ap以nat模式创建wifi热点的方法"></span>
==== create_ap以NAT模式创建WIFI热点的方法 ====

# 输入下面的命令以NAT模式创建名称为'''orangepi'''、密码为'''orangepi'''的WIFI热点。

orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 enP3p49s0 orangepi orangepi'''

<ol start="2" style="list-style-type: decimal;">
<li><p>如果有下面的信息输出,说明WIFI热点创建成功。</p>
<p>orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 enP3p49s0 orangepi orangepi'''</p>
<p>Config dir: /tmp/create_ap.wlan0.conf.Ks6HobEw</p>
<p>PID: 5405</p>
<p>Network Manager found, set ap0 as unmanaged device... DONE</p>
<p>Creating a virtual WiFi interface... ap0 created.</p>
<p>Sharing Internet using method: nat</p>
<p>hostapd command-line interface: hostapd_cli -p /tmp/create_ap.wlan0.conf.Ks6HobEw/hostapd_ctrl</p>
<p>ap0: interface state UNINITIALIZED-&gt;ENABLED</p>
<p>ap0: AP-ENABLED</p></li>
<li><p>此时拿出手机,在搜索到的WIFI列表中就能找到开发板创建的名为'''orangepi'''的WIFI热点,然后可以点击 '''orangepi'''连接热点,密码就是上面设置的'''orangepi'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image203.png|230x183px]]</p></li>
<li><p>连接成功后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image204.png|233x111px]]</p></li>
<li><p>在NAT模式下,连接到开发板热点的无线设备是向开发板的DHCP服务请求IP地址的,所以会有两个不同的网段,如这里开发板的IP是192.168.1.X。</p>
<p>orangepi@orangepi:~$ '''ifconfig enP3p49s0'''</p>
<p>enP3p49s0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500</p>
<p>inet '''192.168.1.150''' 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>而开发板的DHCP服务默认会给接入热点的设备分配'''192.168.12.0/24'''的IP地址,这时点击已经连接的WIFI热点'''orangepi''',然后就可以看到手机的IP地址是'''192.168.12.X'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image204.png|271x129px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image205.png|274x155px]]</p></li>
<li><p>如果想要为接入的设备指定不同的网段,可以通过-g参数指定,如通过-g参数指定接入点AP的网段为192.168.2.1。</p>
<p>orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 enP3p49s0 orangepi orangepi -g 192.168.2.1'''</p></li></ol>

此时通过手机连接到热点后,点击已经连接的WIFI热点'''orangepi''',然后可以看到手机的IP地址是'''192.168.2.X'''。

[[File:Orange_Pi_5_Ultra-image204.png|286x137px]]

[[File:Orange_Pi_5_Ultra-image206.png|302x174px]]

<ol start="7" style="list-style-type: decimal;">
<li>在不指定'''--freq-band'''参数的情况下,默认创建的热点是2.4G频段的,如果想要创建5G频段的热点可以通过'''--freq-band 5'''参数指定,具体命令如下:</li></ol>

orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 enP3p49s0 orangepi orangepi --freq-band 5'''

<ol start="8" style="list-style-type: decimal;">
<li>如果需要隐藏SSID,可以指定'''--hidden'''参数,具体命令如下:</li></ol>

orangepi@orangepi:~$ '''sudo create_ap -m nat wlan0 enP3p49s0 orangepi orangepi --hidden'''

此时手机是搜索不到WIFI热点的,需要手动指定WIFI热点名称,并输入密码来连接WIFI热点。

[[File:Orange_Pi_5_Ultra-image207.png|237x198px]]

<span id="create_ap以bridge模式创建wifi热点的方法"></span>
==== create_ap以bridge模式创建WIFI热点的方法 ====

# 输入下面的命令以bridge模式创建名称为'''orangepi'''、密码为'''orangepi'''的WIFI热点。

orangepi@orangepi:~$ '''sudo create_ap -m bridge wlan0 enP3p49s0 orangepi orangepi'''

<ol start="2" style="list-style-type: decimal;">
<li><p>如果有下面的信息输出,说明WIFI热点创建成功。</p>
<p>orangepi@orangepi:~$ '''sudo create_ap -m bridge wlan0 enP3p49s0 orangepi orangepi'''</p>
<p>[sudo] password for orangepi:</p>
<p>Config dir: /tmp/create_ap.wlan0.conf.fg9U5Xgt</p>
<p>PID: 3141</p>
<p>Network Manager found, set ap0 as unmanaged device... DONE</p>
<p>Creating a virtual WiFi interface... ap0 created.</p>
<p>Sharing Internet using method: bridge</p>
<p>Create a bridge interface... br0 created.</p>
<p>hostapd command-line interface: hostapd_cli -p /tmp/create_ap.wlan0.conf.fg9U5Xgt/hostapd_ctrl</p>
<p>ap0: interface state UNINITIALIZED-&gt;ENABLED</p>
<p>ap0: AP-ENABLED</p></li>
<li><p>此时拿出手机,在搜索到的WIFI列表中就能找到开发板创建的名为'''orangepi'''的WIFI热点,然后可以点击'''orangepi'''连接热点,密码就是上面设置的'''orangepi'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image203.png|265x211px]]</p></li>
<li><p>连接成功后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image204.png|273x130px]]</p></li>
<li><p>在bridge模式下,连接到开发板热点的无线设备也是向主路由(开发板连接的路由器)的DHCP服务请求IP地址的,如这里开发板的IP是'''192.168.1.X'''。</p>
<p>orangepi@orangepi:~$ '''ifconfig enP3p49s0'''</p>
<p>enP3p49s0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500</p>
<p>inet '''192.168.1.150''' 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>而接入WIFI热点的设备的IP也是由主路由分配的,所以连接WIFI热点的手机和开发板处于相同的网段,这时点击已经连接的WIFI热点'''orangepi''',然后就可以看到手机的IP地址也是'''192.168.1.X'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image204.png|284x136px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image208.png|282x159px]]</p></li>
<li><p>在不指定'''--freq-band'''参数的情况下,默认创建的热点是2.4G频段的,如果想要创建5G频段的热点可以通过'''--freq-band 5'''参数指定,具体命令如下:</p></li></ol>

orangepi@orangepi:~$ '''sudo create_ap -m bridge wlan0 enP3p49s0 orangepi orangepi --freq-band 5'''

<ol start="7" style="list-style-type: decimal;">
<li>如果需要隐藏SSID,可以指定'''--hidden'''参数,具体命令如下:</li></ol>

orangepi@orangepi:~$ '''sudo create_ap -m bridge wlan0 enP3p49s0 orangepi orangepi --hidden'''

此时手机是搜索不到WIFI热点的,需要手动指定WIFI热点名称,并输入密码来连接WIFI热点。

[[File:Orange_Pi_5_Ultra-image207.png|228x191px]]

<span id="ssh远程登录开发板"></span>
== SSH远程登录开发板 ==

'''Linux系统默认都开启了ssh远程登录,并且允许root用户登录系统。ssh登录前首先需要确保以太网或者wifi网络已连接,然后使用ip addr命令或者通过查看路由器的方式获取开发板的IP地址。'''

<span id="ubuntu下ssh远程登录开发板"></span>
=== Ubuntu下SSH远程登录开发板 ===

# 获取开发板的IP地址。
# 然后就可以通过ssh命令远程登录linux系统。

test@test:~$ '''ssh [mailto:root@192.168.1.36 root@192.168.x.]xxx''' #需要替换为开发板的IP地址

root@192.168.x.xx's password: #在这里输入密码,默认密码为orangepi

'''注意,输入密码的时候,屏幕上是不会显示输入的密码的具体内容的,请不要以为是有什么故障,输入完后直接回车即可。'''

'''如果提示拒绝连接,只要使用的是Orange Pi提供的镜像,就请不要怀疑orangepi这个密码是不是不对,而是要找其他原因。'''

<ol start="3" style="list-style-type: decimal;">
<li><p>成功登录系统后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image209.png|474x253px]]</p>
<p>'''如果ssh无法正常登陆linux系统,首先请检查下开发板的IP地址是否能ping通,如果ping通没问题的话,可以通过串口或者HDMI显示器登录linux系统然后在开发板上输入下面的命令后再尝试是否能连接:'''</p></li></ol>

root@orangepi:~# '''reset_ssh.sh'''

'''如果还不行,请重烧系统试下。'''

<span id="windows下ssh远程登录开发板"></span>
=== Windows下SSH远程登录开发板 ===

<ol style="list-style-type: decimal;">
<li><p>首先获取开发板的IP地址。</p></li>
<li><p>在windows下可以使用MobaXterm远程登录开发板,首先新建一个ssh会话。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>打开'''Session'''。</p></li>
<li><p>然后在'''Session Setting'''中选择'''SSH'''。</p></li>
<li><p>然后在'''Remote host'''中输入开发板的IP地址。</p></li>
<li><p>然后在'''Specify username'''中输入linux系统的用户名'''root'''或'''orangepi'''。</p></li>
<li><p>最后点击'''OK'''即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image210.png|576x292px]]</p></li></ol>
</li>
<li><p>然后会提示输入密码,默认root和orangepi用户的密码都为orangepi。</p>
<p>'''注意,输入密码的时候,屏幕上是不会显示输入的密码的具体内容的,请不要以为是有什么故障,输入完后直接回车即可。'''</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image211.png|578x150px|IMG_256]]

</div>
<ol start="4" style="list-style-type: decimal;">
<li>成功登录系统后的显示如下图所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image212.png|576x319px]]

<span id="adb的使用方法"></span>
== ADB的使用方法 ==

=== 网络adb的使用方法 ===

<ol style="list-style-type: decimal;">
<li><p>系统启动后请先确认下'''adbd'''已经启动了。</p>
<p>orangepi@orangepi:~$ '''ps -ax | grep &quot;adbd&quot;'''</p>
<p>808 ? Sl 0:00 /usr/bin/adbd</p>
<p>3707 ttyFIQ0 S+ 0:00 grep --color=auto adbd</p></li>
<li><p>然后查看下开发板的IP地址,并记下来。</p></li>
<li><p>然后在Ubuntu PC上安装adb工具。</p>
<p>test@test:~$ '''sudo apt-get update'''</p>
<p>test@test:~$ '''sudo apt-get install -y adb'''</p></li>
<li><p>然后使用下面的命令连接网络adb。</p></li></ol>

test@test:~$ '''adb connect 192.168.1.xx:5555 #IP地址请替换为开发板的IP地址'''

* daemon not running; starting now at tcp:5037

* daemon started successfully

connected to 192.168.1.xx:5555

test@test:~$ '''adb devices'''

List of devices attached

'''192.168.1.xx:5555 device'''

<ol start="5" style="list-style-type: decimal;">
<li>然后使用下面的命令就可以登录开发板的linux系统。</li></ol>

test@test:~$ '''adb shell'''

'''root@orangepi5ultra:/# &lt;--- 看到这个提示符后说明已成功登录开发板'''

<ol start="6" style="list-style-type: decimal;">
<li><p>使用adb上传文件到开发板的命令如下所示:</p>
<p>test@test:~$ '''adb push filename /root'''</p>
<p>filename: 1 file pushed. 3.7 MB/s (1075091 bytes in 0.277s)</p></li>
<li><p>使用adb重启开发板的命令如下所示:</p>
<p>test@test:~$ '''adb reboot'''</p></li></ol>

'''如果您的Windows系统中没有adb工具,可以使用RKDevTool软件([[#烧录android镜像到spiflashnvme-ssd中的方法|烧录Android镜像到SPIFlash+NVMe SSD中的方法]]一小节有用到这个软件)中的adb程序。'''

[[File:Orange_Pi_5_Ultra-image213.png|576x131px]]

'''在Windows中使用adb的示例如下所示:'''

[[File:Orange_Pi_5_Ultra-image214.png|576x335px]]

<span id="使用usb公对公数据线连接adb"></span>
=== 使用USB公对公数据线连接adb ===

<ol style="list-style-type: decimal;">
<li><p>首先准备一根品质良好的USB公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li>
<li><p>然后通过USB公对公数据线连接好开发板与Ubuntu PC,开发板支持device功能的USB接口的位置如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]</p></li>
<li><p>然后运行下面的命令将USB接口设置为'''device'''模式。</p>
<p>orangepi@orangepi:~$ '''sudo set_device.sh'''</p>
<p>如果linux系统中不存在'''set_device.sh'''脚本,请直接使用下面的命令:</p>
<p>orangepi@orangepi:~$ '''sudo bash -c &quot;echo device &gt; /sys/kernel/debug/usb/fc000000.usb/mode&quot;'''</p>
<p>orangepi@orangepi:~$ '''sudo systemctl restart usbdevice'''</p></li>
<li><p>然后请确认下adbd已经启动了。</p>
<p>orangepi@orangepi:~$ '''ps -ax | grep &quot;adbd&quot;'''</p>
<p>808 ? Sl 0:00 /usr/bin/adbd</p>
<p>3707 ttyFIQ0 S+ 0:00 grep --color=auto adbd</p></li>
<li><p>然后在Ubuntu PC上安装下adb工具。</p>
<p>test@test:~$ '''sudo apt-get update'''</p>
<p>test@test:~$ '''sudo apt-get install -y adb'''</p></li>
<li><p>然后使用下面的命令查看下有没有识别到adb设备。</p></li></ol>

test@test:~$ '''adb devices'''

List of devices attached

'''e0f9f71bc343c305 device'''

<ol start="8" style="list-style-type: decimal;">
<li>然后使用下面的命令就可以登录开发板的linux系统。</li></ol>

test@test:~$ '''adb shell'''

'''root@orangepi5ultra:/# &lt;--- 看到这个提示符后说明已成功登录开发板'''

<ol start="9" style="list-style-type: decimal;">
<li><p>使用adb上传文件到开发板的命令如下所示:</p>
<p>test@test:~$ '''adb push filename /root'''</p>
<p>filename: 1 file pushed. 3.7 MB/s (1075091 bytes in 0.277s)</p></li></ol>

'''如果您的Windows系统中没有adb工具,可以使用RKDevTool软件([[#烧录android镜像到spiflashnvme-ssd中的方法|烧录Android镜像到SPIFlash+NVMe SSD中的方法]]一小节有用到这个软件)中的adb程序。'''

[[File:Orange_Pi_5_Ultra-image213.png|427x97px]]

'''在Windows中使用adb的示例如下所示:'''

[[File:Orange_Pi_5_Ultra-image215.png|576x304px]]

<span id="上传文件到开发板linux系统中的方法"></span>
== 上传文件到开发板Linux系统中的方法 ==

<span id="在ubuntu-pc中上传文件到开发板linux系统中的方法"></span>
=== 在Ubuntu PC中上传文件到开发板Linux系统中的方法 ===

==== 使用scp命令上传文件的方法 ====

<ol style="list-style-type: decimal;">
<li><p>使用scp命令可以在Ubuntu PC中上传文件到开发板的Linux系统中,具体命令如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''file_path:'''需要替换为要上传文件的路径。</p></li>
<li><p>'''orangepi:'''为开发板linux系统的用户名,也可以替换成其它的,比如root。</p></li>
<li><p>'''192.168.xx.xx:''' 为开发板的IP地址,请根据实际情况进行修改。</p></li>
<li><p>'''/home/orangepi:''' 开发板linux系统中的路径,也可以修改为其它的路径。</p>
<p>test@test:~$ '''scp file_path orangepi@192.168.xx.xx:/home/orangepi/'''</p></li></ol>
</li>
<li><p>如果要上传文件夹,需要加上-r参数。</p>
<p>test@test:~$ '''scp -r dir_path orangepi@192.168.xx.xx:/home/orangepi/'''</p></li>
<li><p>scp还有更多的用法,请使用下面的命令查看man手册。</p></li></ol>

test@test:~$ '''man scp'''

==== 使用filezilla上传文件的方法 ====

<ol style="list-style-type: decimal;">
<li><p>首先在Ubuntu PC中安装filezilla。</p>
<p>test@test:~$ '''sudo apt install -y filezilla'''</p></li>
<li><p>然后使用下面的命令打开filezilla。</p>
<p>test@test:~$ '''filezilla'''</p></li>
<li><p>filezilla打开后的界面如下所示,此时右边远程站点下面显示的是空的。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image216.png|576x453px|截图 2022-12-03 19-04-40]]

</div></li>
<li><p>连接开发板的方法如下图所示:</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image217.png|577x128px|IMG_256]]

</div>
<ol start="5" style="list-style-type: decimal;">
<li><p>然后选择'''保存密码''',再点击'''确定'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image218.png|249x181px]]</p></li>
<li><p>然后选择'''总是信任该主机''',再点击'''确定'''。</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image219.png|278x150px|IMG_256]]

</div>
<ol start="7" style="list-style-type: decimal;">
<li>连接成功后在filezilla软件的右边就可以看到开发板linux文件系统的目录结构了。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image220.png|533x330px|IMG_256]]

</div>
<ol start="8" style="list-style-type: decimal;">
<li>然后在filezilla软件的右边选择要上传到开发板中的路径,再在filezilla软件的左边选中Ubuntu PC中要上传的文件,再点击鼠标右键,再点击上传选项就会开始上传文件到开发板中了。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image221.png|529x414px|IMG_256]]

</div>
<ol start="9" style="list-style-type: decimal;">
<li><p>上传完成后就可以去开发板linux系统中的对应路径中查看上传的文件了。</p></li>
<li><p>上传文件夹的方法和上传文件的方法是一样的,这里就不再赘述了。</p></li></ol>

<span id="在windows-pc中上传文件到开发板linux系统中的方法"></span>
=== 在Windows PC中上传文件到开发板Linux系统中的方法 ===

<span id="使用filezilla上传文件的方法-1"></span>
==== 使用filezilla上传文件的方法 ====

# 首先下载filezilla软件Windows版本的安装文件,下载链接如下所示:

[https://filezilla-project.org/download.php?type=client '''https://filezilla-project.org/download.php?type=client'''][[File:Orange_Pi_5_Ultra-image222.png|472x171px|IMG_256]]

[[File:Orange_Pi_5_Ultra-image223.png|384x276px]]

<ol start="2" style="list-style-type: decimal;">
<li><p>下载的安装包如下所示,然后双击直接安装即可。</p>
<p>'''FileZilla_Server_1.5.1_win64-setup.exe'''</p></li></ol>

安装过程中,下面的安装界面请选择'''Decline''',然后再选择'''Next&gt;'''。

<div class="figure">

[[File:Orange_Pi_5_Ultra-image224.png|319x251px|IMG_256]]

</div>
<ol start="3" style="list-style-type: decimal;">
<li>filezilla打开后的界面如下所示,此时右边远程站点下面显示的是空的。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image225.png|451x357px|IMG_256]]

</div>
<ol start="4" style="list-style-type: decimal;">
<li>连接开发板的方法如下图所示:</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image226.png|522x108px|IMG_256]]

</div>
<ol start="5" style="list-style-type: decimal;">
<li>然后选择'''保存密码''',再点击'''确定'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image227.png|207x146px|IMG_256]]

</div>
<ol start="6" style="list-style-type: decimal;">
<li>然后选择'''总是信任该主机''',再点击'''确定'''。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image228.png|221x109px|IMG_256]]

</div>
<ol start="7" style="list-style-type: decimal;">
<li>连接成功后在filezilla软件的右边就可以看到开发板linux文件系统的目录结构了。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image229.png|537x397px|IMG_256]]

</div>
<ol start="8" style="list-style-type: decimal;">
<li>然后在filezilla软件的右边选择要上传到开发板中的路径,再在filezilla软件的左边选中Windows PC中要上传的文件,再点击鼠标右键,再点击上传选项就会开始上传文件到开发板中了。</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image230.png|535x394px|IMG_256]]

</div>
<ol start="9" style="list-style-type: decimal;">
<li><p>上传完成后就可以去开发板linux系统中的对应路径中查看上传的文件了。</p></li>
<li><p>上传文件夹的方法和上传文件的方法是一样的,这里就不再赘述了。</p></li></ol>

<span id="hdmi测试"></span>
== HDMI测试 ==

<span id="hdmi显示测试"></span>
=== HDMI显示测试 ===

<ol style="list-style-type: decimal;">
<li><p>使用HDMI转HDMI线连接Orange Pi开发板和HDMI显示器。</p>
<p>[[File:Orange_Pi_5_Ultra-image10.png|199x129px]]</p></li>
<li><p>启动linux系统后如果HDMI显示器有图像输出说明HDMI接口使用正常。</p></li></ol>

'''注意,很多笔记本电脑虽然带有HDMI接口,但是笔记本的HDMI接口一般只有输出功能,并没有HDMI in的功能,也就是说并不能将其他设备的HDMI输出显示到笔记本的屏幕上。'''

'''当想把开发板的HDMI接到笔记本电脑HDMI接口时,请先确认清楚您的笔记本是支持HDMI in的功能。'''

'''当HDMI没有显示的时候,请先检查下HDMI线有没有插紧,确认接线没问题后,可以换一个不同的屏幕试下有没有显示。'''

<span id="hdmi分辨率设置方法"></span>
=== HDMI分辨率设置方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先在'''Settings'''中打开'''Display'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image231.png|576x370px]]</p></li>
<li><p>然后就能看到系统当前的分辨率。</p>
<p>[[File:Orange_Pi_5_Ultra-image232.png|382x254px]]</p></li>
<li><p>点击Resolution(分辨率)的下拉框,就可以看到显示器当前支持的所有分辨率。</p>
<p>[[File:Orange_Pi_5_Ultra-image233.png|415x274px]]</p></li>
<li><p>然后选择想要设置的分辨率,再点击'''Apply'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image234.png|415x277px]]</p></li>
<li><p>等新的分辨率设置完后再选择'''Keep the configuration'''即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image235.png|447x243px]]</p></li></ol>

<span id="hdmi-rx的测试方法"></span>
=== HDMI RX的测试方法 ===

<ol style="list-style-type: decimal;">
<li><p>开发板HDMI RX接口的所在位置如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image236.png|312x118px]]</p></li>
<li><p>首先使用下图所示的HDMI转HDMI线将其它设备的HDMI输出接到开发板的HDMI RX接口上</p>
<p>[[File:Orange_Pi_5_Ultra-image10.png|199x121px]]</p></li>
<li><p>然后在桌面上打开一个终端,然后运行下'''test_hdmiin.sh'''脚本</p>
<p>[orangepi@orangepi ~]$ '''sudo test_hdmiin.sh'''</p></li>
<li><p>然后就能看到HDMI RX的输入画面了(下图中HDMI RX显示的是opi5开发板HDMI输出的画面,此时正在播放一个视频)。'''test_hdmiin.sh'''脚本默认会将HDMI RX输入的音频播放到开发板的HDMI_TX和耳机中去。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image237.png|576x324px|1]]

</div></li></ol>

== 蓝牙使用方法 ==

<span id="桌面版镜像的测试方法-1"></span>
=== 桌面版镜像的测试方法 ===

<ol style="list-style-type: decimal;">
<li><p>点击桌面右上角的蓝牙图标。</p>
<p>[[File:Orange_Pi_5_Ultra-image238.png|330x128px]]</p></li>
<li><p>然后选择适配器。</p>
<p>[[File:Orange_Pi_5_Ultra-image239.png|375x165px]]</p></li>
<li><p>如果有提示下面的界面,请选择'''Yes'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image240.png|248x85px]]</p></li>
<li><p>然后在蓝牙的适配器设置界面中设置'''Visibility Setting'''为'''Always visible''',然后关闭即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image241.png|258x244px]]</p></li>
<li><p>然后打开蓝牙设备的配置界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image242.png|438x179px]]</p></li>
<li><p>点击'''Search'''即可开始扫描周围的蓝牙设备。</p>
<p>[[File:Orange_Pi_5_Ultra-image243.png|322x217px]]</p></li></ol>

<!-- -->
<ol start="6" style="list-style-type: decimal;">
<li><p>然后选择想要连接的蓝牙设备,再点击鼠标右键就会弹出对此蓝牙设备的操作界面,选择'''Pair'''即可开始配对,这里演示的是和Android手机配对。</p>
<p>[[File:Orange_Pi_5_Ultra-image244.png|338x263px]]</p></li>
<li><p>配对时,桌面的右上角会弹出配对确认框,选择'''Confirm'''确认即可,此时手机上也同样需要进行确认。</p>
<p>[[File:Orange_Pi_5_Ultra-image245.png|417x152px]]</p></li>
<li><p>和手机配对完后,可以选择已配对的蓝牙设备,然后右键选择'''Send a File'''即可开始给手机发送一张图片。</p>
<p>[[File:Orange_Pi_5_Ultra-image246.png|439x259px]]</p></li>
<li><p>发送图片的界面如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image247.png|437x253px]]</p></li></ol>

<span id="usb接口测试"></span>
== USB接口测试 ==

'''USB接口是可以接USB hub来扩展USB接口的数量的。'''

<span id="连接usb鼠标或键盘测试"></span>
=== 连接USB鼠标或键盘测试 ===

# 将USB接口的键盘插入Orange Pi开发板的USB接口中
# 连接Orange Pi开发板到HDMI显示器
# 如果鼠标或键盘能正常操作系统说明USB接口使用正常(鼠标只有在桌面版的系统中才能使用)

<span id="连接usb存储设备测试"></span>
=== 连接USB存储设备测试 ===

# 首先将U盘或者USB移动硬盘插入Orange Pi开发板的USB接口中
# 执行下面的命令如果能看到sdX的输出说明U盘识别成功

orangepi@orangepi:~$ '''cat /proc/partitions | grep &quot;sd*&quot;'''

major minor #blocks name

8 0 30044160 '''sda'''

8 1 30043119 '''sda1'''

<ol start="3" style="list-style-type: decimal;">
<li>使用mount命令可以将U盘挂载到'''/mnt'''中,然后就能查看U盘中的文件了</li></ol>

orangepi@orangepi:~$ '''sudo mount /dev/sda1 /mnt/'''

orangepi@orangepi:~$ '''ls /mnt/'''

test.txt

<ol start="4" style="list-style-type: decimal;">
<li>挂载完后通过'''df -h'''命令就能查看U盘的容量使用情况和挂载点</li></ol>

orangepi@orangepi:~$ '''df -h | grep &quot;sd&quot;'''

/dev/sda1 29G 208K 29G 1% /mnt

<span id="usb无线网卡测试"></span>
=== USB无线网卡测试 ===

目前'''测试过的'''能用的USB无线网卡如下所示,其他型号的USB无线网卡请自行测试,如果无法使用就需要移植对应的USB无线网卡驱动

{| class="wikitable"
|-
| 序号
| 型号
|
|-
| 1
| RTL8723BU

支持2.4G WIFI+BT4.0

| [[File:Orange_Pi_5_Ultra-image2%2048.png]]
|-
| 2
| RTL8811

支持2.4G +5G WIFI

| [[File:Orange_Pi_5_Ultra-image2%2049.png]]
|-
| 3
| RTL8821CU

支持2.4G +5G WIFI

支持BT 4.2

| <div class="figure">

[[File:Orange_Pi_5_Ultra-image25%200.jpeg|tb_image_ share_167083320112 3]]

</div>
|}

<span id="rtl8723bu测试"></span>
==== RTL8723BU测试 ====

<ol style="list-style-type: decimal;">
<li><p>首先将RTL8723BU无线网卡模块插入开发板的USB接口中</p></li>
<li><p>然后linux系统会自动加载RTL8723BU蓝牙和WIFI相关的内核模块,通过lsmod命令可以看到下面内核模块已自动加载</p>
<p>orangepi@orangepi:~$ '''lsmod'''</p>
<p>Module Size Used by</p>
<p>rfcomm 57344 16</p>
<p>rtl8xxxu 106496 0</p>
<p>rtk_btusb 61440 0</p></li>
<li><p>通过dmesg命令可以看到RTL8723BU模块的加载信息</p>
<p>orangepi@orangepi:~$ '''dmesg'''</p>
<p>......</p>
<p>[ 83.438901] usb 2-1: new high-speed USB device number 2 using ehci-platform</p>
<p>[ 83.588375] usb 2-1: New USB device found, idVendor=0bda, idProduct=b720, bcdDevice= 2.00</p>
<p>[ 83.588403] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3</p>
<p>[ 83.588422] usb 2-1: Product: 802.11n WLAN Adapter</p>
<p>[ 83.588443] usb 2-1: Manufacturer: Realtek</p>
<p>[ 83.588460] usb 2-1: SerialNumber: 00e04c000001</p>
<p>[ 83.601974] Bluetooth: hci0: RTL: examining hci_ver=06 hci_rev=000b lmp_ver=06 lmp_subver=8723</p>
<p>[ 83.603894] Bluetooth: hci0: RTL: rom_version status=0 version=1</p>
<p>[ 83.603920] Bluetooth: hci0: RTL: loading rtl_bt/rtl8723b_fw.bin</p>
<p>[ 83.610108] Bluetooth: hci0: RTL: loading rtl_bt/rtl8723b_config.bin</p>
<p>[ 83.611274] Bluetooth: hci0: RTL: cfg_sz 68, total sz 22564</p>
<p>[ 83.658494] rtk_btusb: Realtek Bluetooth USB driver ver 3.1.6d45ddf.20220519-142432</p>
<p>[ 83.658651] usbcore: registered new interface driver rtk_btusb</p>
<p>[ 83.667124] usb 2-1: This Realtek USB WiFi dongle (0x0bda:0xb720) is untested!</p>
<p>[ 83.667137] usb 2-1: Please report results to Jes.Sorensen@gmail.com</p>
<p>[ 83.890140] usb 2-1: Vendor: Realtek</p>
<p>[ 83.890153] usb 2-1: Product: 802.11n WLAN Adapter</p>
<p>[ 83.890159] usb 2-1: rtl8723bu_parse_efuse: dumping efuse (0x200 bytes):</p>
<p>......</p>
<p>[ 83.890412] usb 2-1: RTL8723BU rev E (SMIC) 1T1R, TX queues 3, WiFi=1, BT=1, GPS=0, HI PA=0</p>
<p>[ 83.890417] usb 2-1: RTL8723BU MAC: 00:13:ef:f4:58:ae</p>
<p>[ 83.890421] usb 2-1: rtl8xxxu: Loading firmware rtlwifi/rtl8723bu_nic.bin</p>
<p>[ 83.895289] usb 2-1: Firmware revision 35.0 (signature 0x5301)</p>
<p>[ 84.050893] Bluetooth: hci0: RTL: fw version 0x0e2f9f73</p>
<p>[ 84.266905] Bluetooth: RFCOMM TTY layer initialized</p>
<p>[ 84.266949] Bluetooth: RFCOMM socket layer initialized</p>
<p>[ 84.266999] Bluetooth: RFCOMM ver 1.11</p>
<p>[ 84.884270] usbcore: registered new interface driver rtl8xxxu</p>
<p>[ 84.912046] rtl8xxxu 2-1:1.2 wlx0013eff458ae: renamed from wlan0</p></li>
<li><p>然后通过'''sudo ifconfig'''命令可以看到RTL8723BU WIFI的设备节点,WIFI的连接和测试方法请参看[[#wifi连接测试|'''WIFI连接测试''']]一节,这里不再赘述</p>
<p>orangepi@orangepi:~$ '''sudo ifconfig wlx0013eff458ae'''</p>
<p>wlx0013eff458ae: flags=4099&lt;UP,BROADCAST,MULTICAST&gt; mtu 1500</p>
<p>ether 00:13:ef:f4:58:ae txqueuelen 1000 (Ethernet)</p>
<p>RX packets 0 bytes 0 (0.0 B)</p>
<p>RX errors 0 dropped 0 overruns 0 frame 0</p>
<p>TX packets 0 bytes 0 (0.0 B)</p>
<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p></li>
<li><p>然后通过'''hciconfig'''命令可以看到USB的蓝牙设备</p>
<p>orangepi@orangepi:~$ '''sudo apt update &amp;&amp; sudo apt -y install bluez'''</p>
<p>orangepi@orangepi:~$ '''hciconfig'''</p>
<p>hci0: Type: Primary Bus: '''USB'''</p>
<p>BD Address: 00:13:EF:F4:58:AE ACL MTU: 820:8 SCO MTU: 255:16</p>
<p>DOWN</p>
<p>RX bytes:1252 acl:0 sco:0 events:125 errors:0</p>
<p>TX bytes:23307 acl:0 sco:0 commands:125 errors:0</p></li>
<li><p>在桌面中也可以看到出现了蓝牙图标,此时蓝牙还未打开,所以会显示一个红色的'''x'''</p>
<p>[[File:Orange_Pi_5_Ultra-image251.png|576x157px]]</p></li>
<li><p>点击'''Turn Bluetooth On'''可以打开蓝牙</p>
<p>[[File:Orange_Pi_5_Ultra-image252.png|576x262px]]</p></li>
<li><p>打开蓝牙后的显示如下所示</p>
<p>[[File:Orange_Pi_5_Ultra-image253.png|576x164px]]</p></li>
<li><p>蓝牙的测试方法请参看[[#蓝牙使用方法|'''蓝牙使用方法''']]一节,这里不再赘述</p></li></ol>

<span id="rtl8811测试"></span>
==== RTL8811测试 ====

<ol style="list-style-type: decimal;">
<li><p>首先将RTL8811无线网卡模块插入开发板的USB接口中</p></li>
<li><p>然后linux系统会自动加载RTL8811 WIFI相关的内核模块,通过lsmod命令可以看到下面内核模块已自动加载</p>
<p>orangepi@orangepi:~$ '''lsmod'''</p>
<p>Module Size Used by</p>
<p>8821cu 1839104 0</p></li>
<li><p>通过dmesg命令可以看到RTL8811模块的加载信息</p>
<p>orangepi@orangepi:~$ '''dmesg'''</p>
<p>[ 118.618194] usb 2-1: new high-speed USB device number 2 using ehci-platform</p>
<p>[ 118.767152] usb 2-1: New USB device found, idVendor=0bda, idProduct=c811, bcdDevice= 2.00</p>
<p>[ 118.767181] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3</p>
<p>[ 118.767199] usb 2-1: Product: 802.11ac NIC</p>
<p>[ 118.767219] usb 2-1: Manufacturer: Realtek</p>
<p>[ 118.767235] usb 2-1: SerialNumber: 123456</p>
<p>[ 119.500530] usbcore: registered new interface driver rtl8821cu</p>
<p>[ 119.525498] rtl8821cu 2-1:1.0 wlx1cbfced9d260: renamed from wlan0</p></li>
<li><p>然后通过'''sudo ifconfig'''命令可以看到WIFI的设备节点,WIFI的连接和测试方法请参看[[#wifi连接测试|'''WIFI连接测试''']]一节,这里不再赘述</p>
<p>orangepi@orangepi:~$ '''sudo ifconfig wlx1cbfced9d260'''</p>
<p>wlx1cbfced9d260: flags=4099&lt;UP,BROADCAST,MULTICAST&gt; mtu 1500</p>
<p>ether 1c:bf:ce:d9:d2:60 txqueuelen 1000 (Ethernet)</p>
<p>RX packets 0 bytes 0 (0.0 B)</p>
<p>RX errors 0 dropped 0 overruns 0 frame 0</p>
<p>TX packets 0 bytes 0 (0.0 B)</p>
<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p></li></ol>

<span id="rtl8821cu测试"></span>
==== RTL8821CU测试 ====

<ol style="list-style-type: decimal;">
<li><p>首先将rtl8821cu 无线网卡模块插入开发板的usb 接口中</p></li>
<li><p>然后使用'''lsusb'''命令就可以看到rtl8821cu usb wifi模块的设备信息,请确保USB模块没有处于Driver CDROM Mode</p>
<p>orangepi@orangepi:~$ '''lsusb | grep &quot;Realtek&quot;'''</p>
<p>Bus 002 Device 003: ID 0bda:c820 Realtek Semiconductor Corp. 802.11ac NIC</p></li></ol>

orangepi@orangepi:~$ '''lsusb | grep &quot;Realtek&quot;'''

Bus 002 Device 002: ID 0bda:1a2b Realtek Semiconductor Corp. RTL8188GU 802.11n WLAN Adapter ('''Driver CDROM Mode''')

'''如果lsusb命令看到的USB WIFI模块处于Driver CDROM Mode,请重新拔插下USB WIFI模块。如果还不行,请手动执行下面的命令切换下模式:'''

orangepi@orangepi:~$ '''sudo usb_modeswitch -KW -v 0bda -p 1a2b'''

<ol start="3" style="list-style-type: decimal;">
<li><p>linux系统会自动加载rtl8821cu蓝牙和wifi相关的内核模块,通过lsmod命令可以看到下面内核模块已自动加载</p>
<p>orangepi@orangepi:~$ '''lsmod'''</p>
<p>Module Size Used by</p>
<p>8821cu 1839104 0</p>
<p>rtk_btusb 61440 0</p></li>
<li><p>通过dmesg命令可以看到rtl8821cu模块的加载信息</p>
<p>orangepi@orangepi:~$ '''dmesg'''</p>
<p>......</p>
<p>[ 57.083693] usb 2-1: new high-speed USB device number 2 using ehci-platform</p>
<p>[ 57.231888] usb 2-1: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 2.00</p>
<p>[ 57.231916] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0</p>
<p>[ 57.231937] usb 2-1: Product: DISK</p>
<p>[ 57.231956] usb 2-1: Manufacturer: Realtek</p>
<p>[ 57.242594] usb-storage 2-1:1.0: USB Mass Storage device detected</p>
<p>[ 57.245674] scsi host0: usb-storage 2-1:1.0</p>
<p>[ 58.069172] usb 2-1: USB disconnect, device number 2</p>
<p>[ 58.440025] usb 2-1: new high-speed USB device number 3 using ehci-platform</p>
<p>[ 58.587819] usb 2-1: New USB device found, idVendor=0bda, idProduct=c820, bcdDevice= 2.00</p>
<p>[ 58.587827] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3</p>
<p>[ 58.587833] usb 2-1: Product: 802.11ac NIC</p>
<p>[ 58.587838] usb 2-1: Manufacturer: Realtek</p>
<p>[ 58.587844] usb 2-1: SerialNumber: 123456</p>
<p>[ 58.610463] rtk_btusb: Realtek Bluetooth USB driver ver 3.1.6d45ddf.20220519-142432</p>
<p>[ 58.610656] usbcore: registered new interface driver rtk_btusb</p>
<p>[ 58.634631] Bluetooth: hci0: RTL: examining hci_ver=08 hci_rev=000c lmp_ver=08 lmp_subver=8821</p>
<p>[ 58.636729] Bluetooth: hci0: RTL: rom_version status=0 version=1</p>
<p>[ 58.636740] Bluetooth: hci0: RTL: loading rtl_bt/rtl8821c_fw.bin</p>
<p>[ 58.664190] Bluetooth: hci0: RTL: loading rtl_bt/rtl8821c_config.bin</p>
<p>[ 58.664746] Bluetooth: hci0: RTL: cfg_sz 10, total sz 31990</p>
<p>[ 59.122471] Bluetooth: hci0: RTL: fw version 0x829a7644</p>
<p>[ 59.265513] usbcore: registered new interface driver rtl8821cu</p>
<p>[ 59.280119] rtl8821cu 2-1:1.2 wlx90de80521825: renamed from wlan0</p></li>
<li><p>然后通过'''sudo ifconfig'''命令可以看到rtl8821cu wifi的设备节点,wifi的连接和测试方法请参看[[#wifi连接测试|'''WIFI连接测试''']]一节,这里不再赘述</p>
<p>orangepi@orangepi:~$ '''sudo ifconfig wlx90de80521825'''</p>
<p>wlx90de80521825: flags=4099&lt;UP,BROADCAST,MULTICAST&gt; mtu 1500</p>
<p>ether 00:13:ef:f4:58:ae txqueuelen 1000 (Ethernet)</p>
<p>RX packets 0 bytes 0 (0.0 B)</p>
<p>RX errors 0 dropped 0 overruns 0 frame 0</p>
<p>TX packets 0 bytes 0 (0.0 B)</p>
<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p></li>
<li><p>然后通过'''hciconfig'''命令可以看到USB的蓝牙设备</p>
<p>orangepi@orangepi:~$ '''sudo apt-get update &amp;&amp; sudo apt-get install -y bluez'''</p>
<p>orangepi@orangepi:~$ '''hciconfig'''</p>
<p>hci0: Type: Primary Bus: '''USB'''</p>
<p>BD Address: 00:13:EF:F4:58:AE ACL MTU: 820:8 SCO MTU: 255:16</p>
<p>DOWN</p>
<p>RX bytes:1252 acl:0 sco:0 events:125 errors:0</p>
<p>TX bytes:23307 acl:0 sco:0 commands:125 errors:0</p></li>
<li><p>在桌面中也可以看到出现了蓝牙图标,此时蓝牙还未打开,所以会显示一个红色的'''x'''</p>
<p>[[File:Orange_Pi_5_Ultra-image251.png|576x157px]]</p></li>
<li><p>点击'''Turn Bluetooth On'''可以打开蓝牙</p>
<p>[[File:Orange_Pi_5_Ultra-image252.png|576x262px]]</p></li>
<li><p>打开蓝牙后的显示如下所示</p>
<p>[[File:Orange_Pi_5_Ultra-image253.png|576x164px]]</p></li>
<li><p>蓝牙的测试方法请参看[[#桌面版镜像的测试方法-1|'''蓝牙使用方法''']]一节,这里不再赘述</p></li></ol>

<span id="usb摄像头测试"></span>
=== USB摄像头测试 ===

<ol style="list-style-type: decimal;">
<li><p>首先需要准备一个下图所示的或者类似的支持UVC协议的USB摄像头,然后将USB摄像头插入到Orange Pi开发板的USB接口中</p>
<p>[[File:Orange_Pi_5_Ultra-image14.png|259x150px]]</p></li>
<li><p>通过v4l2-ctl命令可以看到USB摄像头的设备节点信息为'''/dev/video0'''</p>
<p>orangepi@orangepi:~$ '''v4l2-ctl --list-devices'''</p>
<p>Q8 HD Webcam: Q8 HD Webcam ('''usb'''-fc880000.usb-1):</p>
<p>'''/dev/video0'''</p>
<p>/dev/video1</p>
<p>/dev/media0</p>
<p>'''注意v4l2中的l是小写字母l,不是数字1。'''</p>
<p>'''另外video的序号不一定都是video0,请以实际看到的为准。'''</p></li>
<li><p>在桌面系统中可以使用Cheese直接打开USB摄像头,Cheese打开方法如下图所示:</p>
<p>'''如果cheese没有预装,可以使用下面的命令安装一下:'''</p>
<p>orangepi@orangepi:~$ '''sudo apt-get install -y cheese'''</p>
<p>[[File:Orange_Pi_5_Ultra-image254.png|474x302px]]</p>
<p>Cheese打开USB摄像头后的界面如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image255.png|473x277px]]</p></li>
<li><p>使用fswebcam测试USB摄像头的方法</p>
<ol style="list-style-type: lower-alpha;">
<li><p>安装fswebcam</p>
<p>orangepi@orangepi:~$ '''sudo''' '''apt update'''</p>
<p>orangepi@orangepi:~$ '''sudo apt-get install -y fswebcam'''</p></li>
<li><p>安装完fswebcam后可以使用下面的命令来拍照</p>
<ol style="list-style-type: lower-alpha;">
<li><p>-d 选项用于指定USB摄像头的设备节点</p></li>
<li><p>--no-banner用于去除照片的水印</p></li>
<li><p>-r 选项用于指定照片的分辨率</p></li>
<li><p>-S 选项用设置于跳过前面的帧数</p></li>
<li><p>./image.jpg 用于设置生成的照片的名字和路径</p>
<p>orangepi@orangepi:~$ '''sudo''' '''fswebcam -d /dev/video0 \'''</p>
<p>'''--no-banner -r 1280x720 -S 5 ./image.jpg'''</p></li></ol>
</li>
<li><p>在服务器版的linux系统中,拍完照后可以使用scp命令将拍好的图片传到Ubuntu PC上镜像观看</p>
<p>orangepi@orangepi:~$ '''scp image.jpg [mailto:test@192.168.1.55:/home/test test@192.168.1.55:/home/test] (根据实际情况修改IP地址和路径)'''</p></li>
<li><p>在桌面版的linux系统中,可以通过HDMI显示器直接查看拍摄的图片</p></li></ol>
</li></ol>

== 音频测试 ==

=== 在桌面系统中测试音频方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先打开文件管理器。</p>
<p>[[File:Orange_Pi_5_Ultra-image256.png|357x176px]]</p></li>
<li><p>然后找到下面这个文件(如果系统中没有这个音频文件,可以自己上传一个音频文件到系统中)。</p>
<p>[[File:Orange_Pi_5_Ultra-image257.png|283x225px]]</p></li>
<li><p>然后选中audio.wav文件,右键选择使用vlc或者mpv打开就可以开始播放。</p>
<p>[[File:Orange_Pi_5_Ultra-image258.png|328x260px]]</p></li>
<li><p>切换HDMI播放和耳机播放等不同音频设备的方法。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先打开音量控制界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image259.png|308x169px]]</p></li>
<li><p>播放音频的时候,在'''Playback'''中会显示播放软件可以使用的音频设备选项,如下图所示,在这里可以设置需要播放到哪个音频设备。</p>
<p>[[File:Orange_Pi_5_Ultra-image260.png|424x235px]]</p>
<p>'''如果看不到HDMI的音频设备选项,可以尝试拔插下HDMI线。'''</p></li></ol>
</li></ol>

=== 使用命令播放音频的方法 ===

==== 耳机接口播放音频测试 ====

<ol style="list-style-type: decimal;">
<li><p>首先将耳机插入开发板的耳机孔中。</p>
<p>[[File:Orange_Pi_5_Ultra-image261.png|348x84px]]</p></li>
<li><p>然后可以通过'''aplay -l'''命令可以查看下linux系统支持的声卡设备,从下面的输出可知,'''card 2'''为es8388的声卡设备,也就是耳机的声卡设备。</p>
<p>orangepi@orangepi:~$ '''aplay -l'''</p>
<p>**** List of PLAYBACK Hardware Devices ****</p>
<p>card 0: rockchiphdmi1 [rockchip-hdmi1], device 0: rockchip-hdmi1 i2s-hifi-0 [rockchip-hdmi1 i2s-hifi-0]</p>
<p>Subdevices: 1/1</p>
<p>Subdevice #0: subdevice #0</p>
<p>'''card 2: rockchipes8388 [rockchip,es8388], device 0: dailink-multicodecs ES8323.7-0011-0 [dailink-multicodecs ES8323.7-0011-0]'''</p>
<p>'''Subdevices: 1/1'''</p>
<p>'''Subdevice #0: subdevice #0'''</p></li>
<li><p>然后使用'''aplay'''命令播放下系统自带的音频文件,如果耳机能听到声音说明硬件能正常使用。</p>
<p>orangepi@orangepi:~$ '''aplay -D hw:2,0 /usr/share/sounds/alsa/audio.wav'''</p>
<p>Playing WAVE 'audio.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p></li></ol>

<span id="hdmi音频播放测试"></span>
==== HDMI音频播放测试 ====

<ol style="list-style-type: decimal;">
<li><p>首先使用HDMI 转HDMI线将Orange Pi开发板连接到电视机上(其他的HDMI显示器需要确保可以播放音频)</p></li>
<li><p>然后查看下HDMI的声卡序号,从下面的输出可以知道HDMI TX的声卡为'''card 0'''</p>
<p>orangepi@orangepi:~$ '''aplay -l'''</p>
<p>**** List of PLAYBACK Hardware Devices ****</p>
<p>'''card 0: rockchiphdmi1 [rockchip-hdmi1], device 0: rockchip-hdmi1 i2s-hifi-0 [rockchip-hdmi1 i2s-hifi-0]'''</p>
<p>'''Subdevices: 1/1'''</p>
<p>'''Subdevice #0: subdevice #0'''</p>
<p>......</p></li>
<li><p>然后使用'''aplay'''命令播放下系统自带的音频文件,如果HDMI显示器或者电视能听到声音说明硬件能正常使用</p>
<p>orangepi@orangepi:~$ '''aplay -D hw:0,0 /usr/share/sounds/alsa/audio.wav'''</p></li></ol>

=== 使用命令测试录音的方法 ===

<ol style="list-style-type: decimal;">
<li><p>开发板上有板载MIC,位置如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image262.png|390x110px]]</p></li>
<li><p>运行'''test_record.sh main'''命令会通过板载MIC录制一段音频,然后播放到HDMI和耳机。</p>
<p>orangepi@orangepi:~$ '''test_record.sh main'''</p>
<p>Start recording: /tmp/test.wav</p>
<p>Recording WAVE '/tmp/test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p>
<p>Start playing</p>
<p>Playing WAVE '/tmp/test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p>
<p>Playing WAVE '/tmp/test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p></li>
<li><p>除了板载MIC,我们还可以通过带MIC功能的耳机来录制音频。将带MIC功能的耳机插入开发板后,运行'''test_record.sh headset'''命令会通过耳机录制一段音频,然后播放到HDMI和耳机。</p>
<p>orangepi@orangepi:~$ '''test_record.sh headset'''</p>
<p>Start recording: /tmp/test.wav</p>
<p>Recording WAVE '/tmp/test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p>
<p>Start playing</p>
<p>Playing WAVE '/tmp/test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p>
<p>Playing WAVE '/tmp/test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p></li></ol>

== 温度传感器 ==

# 查看系统温度传感器的命令为:

orangepi@orangepi:~$ '''sensors'''

gpu_thermal-virtual-0

Adapter: Virtual device

temp1: +47.2°C

littlecore_thermal-virtual-0

Adapter: Virtual device

temp1: +47.2°C

bigcore0_thermal-virtual-0

Adapter: Virtual device

temp1: +47.2°C

tcpm_source_psy_6_0022-i2c-6-22

Adapter: rk3x-i2c

in0: 0.00 V (min = +0.00 V, max = +0.00 V)

curr1: 0.00 A (max = +0.00 A)

npu_thermal-virtual-0

Adapter: Virtual device

temp1: +47.2°C

center_thermal-virtual-0

Adapter: Virtual device

temp1: +47.2°C

bigcore1_thermal-virtual-0

Adapter: Virtual device

temp1: +47.2°C

soc_thermal-virtual-0

Adapter: Virtual device

temp1: +47.2°C (crit = +115.0°C)

<ol start="2" style="list-style-type: decimal;">
<li><p>查看nvme ssd固态硬盘当前温度的命令为:</p>
<p>orangepi@orangepi:~$ '''sudo smartctl -a /dev/nvme0 | grep &quot;Temperature:&quot;'''</p>
<p>Temperature: '''40 Celsius'''</p></li></ol>

<span id="pin接口引脚说明"></span>
== 40 Pin接口引脚说明 ==

<ol style="list-style-type: decimal;">
<li><p>Orange Pi 5 Ultra开发板40 pin接口引脚的顺序请参考下图</p>
<p>[[File:Orange_Pi_5_Ultra-image263.png|575x165px]]</p></li>
<li><p>Orange Pi 5 Ultra开发板40 pin接口引脚的功能如下表所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>下面是40pin完整的引脚图</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>下面的表格是上面完整表格左半边部分的图,能看得清楚点</p>
<p>[[File:Orange_Pi_5_Ultra-image265.png|574x340px]]</p></li>
<li><p>下面的表格是上面完整表格右半边部分的图,能看得清楚点</p>
<p>[[File:Orange_Pi_5_Ultra-image266.png|576x438px]]</p>
<p>'''上面表格中pwm都标出了对应的寄存器的基地址,在查看/sys/class/pwm/中哪个pwmchip对应40pin排针中哪个pwm引脚时很有用。'''</p></li></ol>
</li>
<li><p>40pin接口中总共有'''28'''个GPIO口,所有GPIO口的电压都是'''3.3v'''</p></li></ol>

<span id="安装wiringop的方法"></span>
== 安装wiringOP的方法 ==

'''注意,Orange Pi发布的linux镜像中已经预装了wiringOP,除非wiringOP的代码有更新,否则无需重新下载编译安装,直接使用即可。'''

'''编译好的wiringOP的deb包在orangepi-build中的存放路径为:'''

'''orangepi-build/external/cache/debs/arm64/wiringpi_x.xx.deb'''

'''进入系统后可以运行下gpio readall命令,如果能看到下面的输出,说明wiringOP已经预装并且能正常使用。'''

[[File:Orange_Pi_5_Ultra-image267.png|575x379px]]

<ol style="list-style-type: decimal;">
<li><p>下载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>'''注意,Orange Pi 5 Ultra需要下载wiringOP next分支的代码,请别漏了-b next这个参数。'''</p>
<p>'''如果从GitHub下载代码有问题,可以直接使用Linux镜像中自带的wiringOP源码,存放位置为:/usr/src/wiringOP。'''</p></li>
<li><p>编译安装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>测试gpio readall命令的输出如下</p>
<p>[[File:Orange_Pi_5_Ultra-image267.png|575x379px]]</p></li></ol>

<span id="pin接口gpioi2cuartspican和pwm测试"></span>
== 40pin接口GPIO、I2C、UART、SPI、CAN和PWM测试 ==

<span id="pin-gpio口测试"></span>
=== 40pin GPIO口测试 ===

'''Orange Pi发布的linux系统中有预装一个blink_all_gpio程序,这个程序会设置40pin中的所有28个GPIO口不停的切换高低电平。'''

'''运行blink_all_gpio程序后,当用万用表去测量GPIO口的电平时,会发现GPIO引脚会在0和3.3v之间不停的切换。使用这个程序我们可以来测试GPIO口是否能正常工作。'''

'''运行blink_all_gpio程序的方式如下所示:'''

orangepi@orangepi:~$ '''sudo blink_all_gpio''' #记得加sudo权限

[sudo] password for orangepi: #在这里需要输入密码

<ol style="list-style-type: decimal;">
<li><p>开发板40pin中总共有'''28'''个GPIO口可以使用,下面以7号引脚——对应GPIO为GPIO1_A7 ——对应wPi序号为2——为例演示如何设置GPIO口的高低电平</p>
<p>[[File:Orange_Pi_5_Ultra-image268.png|575x123px]]</p></li>
<li><p>首先设置GPIO口为输出模式,其中第三个参数需要输入引脚对应的wPi的序号</p>
<p>root@orangepi:~/wiringOP# '''gpio mode 2 out'''</p></li>
<li><p>然后设置GPIO口输出低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为0v,说明设置低电平成功</p>
<p>root@orangepi:~/wiringOP# '''gpio write 2 0'''</p>
<p>使用gpio readall可以看到7号引脚的值(V)变为了0</p>
<p>[[File:Orange_Pi_5_Ultra-image269.png|575x121px]]</p></li>
<li><p>然后设置GPIO口输出高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为3.3v,说明设置高电平成功</p>
<p>root@orangepi:~/wiringOP# '''gpio write 2 1'''</p>
<p>使用gpio readall可以看到7号引脚的值(V)变为了1</p>
<p>[[File:Orange_Pi_5_Ultra-image270.png|575x120px]]</p></li>
<li><p>其他引脚的设置方法类似,只需修改wPi的序号为引脚对应的序号即可</p></li></ol>

<span id="pin-gpio口上下拉电阻的设置方法"></span>
=== 40pin GPIO口上下拉电阻的设置方法 ===

'''注意,Orange Pi 5 Ultra下面10个GPIO引脚因为外部有3.3V上拉,所以设置下拉是无效的。'''

[[File:Orange_Pi_5_Ultra-image271.png|575x305px]]

<ol style="list-style-type: decimal;">
<li><p>下面以11号引脚——对应GPIO为GPIO1_A0 ——对应wPi序号为5——为例演示如何设置GPIO口的上下拉电阻</p>
<p>[[File:Orange_Pi_5_Ultra-image272.png|567x109px]]</p></li>
<li><p>首先需要设置GPIO口为输入模式,其中第三个参数需要输入引脚对应的wPi的序号</p>
<p>root@orangepi:~# '''gpio mode 5 in'''</p></li>
<li><p>设置为输入模式后,执行下面的命令可以设置GPIO口为上拉模式</p>
<p>root@orangepi:~# '''gpio mode 5 up'''</p></li>
<li><p>然后输入下面的命令读取GPIO口的电平,如果电平为1,说明上拉模式设置成功</p>
<p>root@orangepi:~# '''gpio read 5'''</p>
<p>'''1'''</p></li>
<li><p>然后执行下面的命令可以设置GPIO口为下拉模式</p>
<p>root@orangepi:~# '''gpio mode 5 down'''</p></li>
<li><p>然后输入下面的命令读取GPIO口的电平,如果电平为0,说明下拉模式设置成功</p>
<p>root@orangepi:~# '''gpio read 5'''</p>
<p>'''0'''</p></li></ol>

<span id="pin-spi测试"></span>
=== 40pin SPI测试 ===

<ol style="list-style-type: decimal;">
<li><p>由下图可知,Orange Pi 5 Ultra可用的spi为spi0、spi1和spi4</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>SPI0、SPI1和SPI4在40pin中对应的引脚如下表所示。</p></li></ol>

{| class="wikitable"
|-
|
| '''S PI0_M2对应40pin'''
| '''S PI1_M1对应40pin'''
| '''S PI4_M2对应40pin'''
|-
| * *MOSI**

| '''19号引脚'''
| '''40号引脚'''
| '''13号引脚'''
|-
| * *MISO**

| '''21号引脚'''
| '''38号引脚'''
| '''11号引脚'''
|-
| '''CLK'''
| '''23号引脚'''
| '''29号引脚'''
| '''15号引脚'''
|-
| '''CS0'''
| '''24号引脚'''
| '''35号引脚'''
| '''16号引脚'''
|-
| '''CS1'''
| '''26号引脚'''
| '''无'''
| '''无'''
|-
| '''dtb o配置'''
| '''spi 0-m2-cs0-spidev'''

'''spi 0-m2-cs1-spidev'''

'''spi0-m2 -cs0-cs1-spidev'''

| '''spi 1-m1-cs0-spidev'''
| '''spi 4-m2-cs0-spidev'''
|}

<ol start="3" style="list-style-type: decimal;">
<li><p>在linux系统中,40 pin中的SPI默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|391x203px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|389x169px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的SPI的配置</p>
<p>[[File:Orange_Pi_5_Ultra-image274.png|384x157px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image275.png|402x116px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image276.png|404x123px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|332x146px]]</p></li></ol>
</li>
<li><p>重启后进入系统先查看下linux系统中是否存在'''spidevx.x'''的设备节点,如果存在,说明SPI已经设置好了,可以直接使用。</p>
<p>orangepi@orangepi:~$ '''ls /dev/spidev*'''</p>
<p>/dev/spidev0.0 /dev/spidev0.1 /dev/spidev1.0 /dev/spidev4.0</p>
<p>'''上面是打开spi0-m2-cs0-cs1-spidev、spi1-m1-cs0-spidev和spi4-m2-cs0-spidev后显示的结果。'''</p></li>
<li><p>先不短接SPI0或者SPI1或者SPI4的mosi和miso两个引脚,运行spidev_test的输出结果如下所示,可以看到TX和RX的数据不一致</p>
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev0.0 #spi0的命令'''</p>
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev1.0 #spi1的命令'''</p>
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev4.0 #spi4的命令'''</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>然后短接SPI0或者SPI4的mosi和miso两个引脚再运行spidev_test的输出如下,可以看到发送和接收的数据一样</p>
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev0.0 #spi0的命令'''</p>
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev1.0 #spi1的命令'''</p>
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev4.0 #spi4的命令'''</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 '''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></ol>

<span id="pin-i2c测试"></span>
=== 40pin I2C测试 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的i2c为i2c2、i2c4、i2c5和i2c8共四组 i2c总线</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>4组I2C总线在40pin中对应的引脚如下表所示。I2C2_M0和I2C2_M4同一时间只能使用其中一组,不能同时使用,它们都是同一个I2C,只是接到不同的引脚上去了而已,请不要以为它们是两组不同的I2C总线。</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''I2C总线'''
| style="text-align: left;"| '''SDA对应40pin'''
| style="text-align: left;"| '''SCL对应40pin'''
| style="text-align: left;"| '''dtbo对应配置'''
|-
| style="text-align: left;"| '''I2C2_M0'''
| style="text-align: left;"| '''3号引脚'''
| style="text-align: left;"| '''5号引脚'''
| style="text-align: left;"| '''i2c2-m0'''
|-
| style="text-align: left;"| '''I2C2_M4'''
| style="text-align: left;"| '''11号引脚'''
| style="text-align: left;"| '''13号引脚'''
| style="text-align: left;"| '''i2c2-m4'''
|-
| style="text-align: left;"| '''I2C4_M3'''
| style="text-align: left;"| '''15号引脚'''
| style="text-align: left;"| '''16号引脚'''
| style="text-align: left;"| '''i2c4-m3'''
|-
| style="text-align: left;"| '''I2C5_M2'''
| style="text-align: left;"| '''37号引脚'''
| style="text-align: left;"| '''12号引脚'''
| style="text-align: left;"| '''i2c5-m2'''
|-
| style="text-align: left;"| '''I2C8_M3'''
| style="text-align: left;"| '''27号引脚'''
| style="text-align: left;"| '''28号引脚'''
| style="text-align: left;"| '''i2c8-m3'''
|}

<ol start="3" style="list-style-type: decimal;">
<li><p>在linux系统中,40 pin中的I2C总线默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|391x203px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|401x174px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的I2C的配置</p>
<p>[[File:Orange_Pi_5_Ultra-image278.png|397x235px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image275.png|380x109px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image276.png|355x108px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|323x142px]]</p></li></ol>
</li>
<li><p>启动linux系统后,先确认下'''/dev'''下存在需要使用I2C的设备节点</p>
<p>orangepi@orangepi:~$ '''ls /dev/i2c-*'''</p></li>
<li><p>然后在40pin接头的i2c引脚上接一个i2c设备</p></li>
<li><p>然后使用'''i2cdetect -y'''命令如果能检测到连接的i2c设备的地址,就说明i2c能正常使用</p>
<p>orangepi@orangepi:~$ '''sudo i2cdetect -y 2''' #i2c2的命令</p>
<p>orangepi@orangepi:~$ '''sudo i2cdetect -y 4''' #i2c4的命令</p>
<p>orangepi@orangepi:~$ '''sudo i2cdetect -y 5''' #i2c5的命令</p>
<p>orangepi@orangepi:~$ '''sudo i2cdetect -y 8''' #i2c8的命令</p>
<p>[[File:Orange_Pi_5_Ultra-image279.png|415x195px]]</p></li></ol>

<span id="pin的uart测试"></span>
=== 40pin的UART测试 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的uart为uart3、uart4和uart6共三组uart总线,uart2用于调试串口功能没有计算在里面。</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>四组UART总线在40pin中对应的引脚如下表所示。</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''UART总线'''
| style="text-align: left;"| '''RX对应40pin'''
| style="text-align: left;"| '''TX对应40pin'''
| style="text-align: left;"| '''dtbo对应配置'''
|-
| style="text-align: left;"| '''UART3_M1'''
| style="text-align: left;"| '''33号引脚'''
| style="text-align: left;"| '''31号引脚'''
| style="text-align: left;"| '''uart3-m1'''
|-
| style="text-align: left;"| '''UART4_M2'''
| style="text-align: left;"| '''19号引脚'''
| style="text-align: left;"| '''23号引脚'''
| style="text-align: left;"| '''uart4-m2'''
|-
| style="text-align: left;"| '''UART6_M1'''
| style="text-align: left;"| '''11号引脚'''
| style="text-align: left;"| '''13号引脚'''
| style="text-align: left;"| '''uart6-m1'''
|}

<ol start="3" style="list-style-type: decimal;">
<li><p>在linux系统中,40 pin中的UART默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|391x203px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|413x179px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的UART的配置</p>
<p>[[File:Orange_Pi_5_Ultra-image280.png|409x178px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image275.png|405x117px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image276.png|401x122px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|320x141px]]</p></li></ol>
</li>
<li><p>进入linux系统后,先确认下'''/dev'''下是否存在对应uart的设备节点</p>
<p>orangepi@orangepi:~$ '''ls /dev/ttyS*'''</p></li>
<li><p>然后开始测试uart接口,先使用杜邦线短接要测试的uart接口的rx和tx</p></li>
<li><p>使用'''gpio serial'''命令测试串口的回环功能如下所示,如果能看到下面的打印,说明串口通信正常(ttySX需要替换为对应uart的节点名,请不要照抄)</p>
<p>orangepi@orangepi:~$ '''sudo gpio serial /dev/ttySX'''</p>
<p>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: -&gt; 4</p>
<p>Out: 5: -&gt; 5^C</p></li></ol>

<span id="使用sysclasspwm测试pwm的方法"></span>
=== 使用/sys/class/pwm测试PWM的方法 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的pwm有pwm0、pwm1、pwm3、pwm6、pwm12、pwm13和pwm14共七路pwm</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>PWM在40pin中对应的引脚如下表所示。PWM0_M0和PWM0_M2、PWM1_M0和PWM1_M2同一时间只能使用其中一个,不能同时使用,它们都是同一个PWM,只是接到不同的引脚上去了而已,请不要以为它们是两个不同的PWM总线。</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''PWM总线'''
| style="text-align: left;"| '''对应40pin'''
| style="text-align: left;"| '''dtbo对应配置'''
|-
| style="text-align: left;"| '''PWM0_M0'''
| style="text-align: left;"| '''5号引脚'''
| style="text-align: left;"| '''pwm0-m0'''
|-
| style="text-align: left;"| '''PWM0_M2'''
| style="text-align: left;"| '''15号引脚'''
| style="text-align: left;"| '''pwm0-m2'''
|-
| style="text-align: left;"| '''PWM1_M0'''
| style="text-align: left;"| '''3号引脚'''
| style="text-align: left;"| '''pwm1-m0'''
|-
| style="text-align: left;"| '''PWM1_M2'''
| style="text-align: left;"| '''16号引脚'''
| style="text-align: left;"| '''pwm1-m2'''
|-
| style="text-align: left;"| '''PWM3_M3'''
| style="text-align: left;"| '''7号引脚'''
| style="text-align: left;"| '''pwm3-m3'''
|-
| style="text-align: left;"| '''PWM6_M1'''
| style="text-align: left;"| '''27号引脚'''
| style="text-align: left;"| '''pwm6-m1'''
|-
| style="text-align: left;"| '''PWM12_M0'''
| style="text-align: left;"| '''31号引脚'''
| style="text-align: left;"| '''pwm12-m0'''
|-
| style="text-align: left;"| '''PWM13_M0'''
| style="text-align: left;"| '''33号引脚'''
| style="text-align: left;"| '''pwm13-m0'''
|-
| style="text-align: left;"| '''PWM14_M0'''
| style="text-align: left;"| '''35号引脚'''
| style="text-align: left;"| '''pwm14-m0'''
|}

<ol start="3" style="list-style-type: decimal;">
<li><p>在linux系统中,40 pin中的PWM默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|391x203px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|457x198px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的PWM的配置</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image281.png|347x306px|D951DCEC-17F8-4bf7-9571-7EBB8E542E8E]]

</div></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image275.png|368x106px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image276.png|370x112px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|303x133px]]</p></li></ol>
</li>
<li><p>当打开一个pwm后,在'''/sys/class/pwm/'''中就会多出一个pwmchipX(X为具体的的数字),比如打开pwm3后,查看'''/sys/class/pwm/'''下的pwmchipX会由两个变成了三个</p>
<p>orangepi@orangepi:~$ '''ls /sys/class/pwm/'''</p>
<p>pwmchip0 pwmchip1 pwmchip2</p></li>
<li><p>上面哪个pwmchip对应pwm3呢,我们先查看下 '''ls /sys/class/pwm/ -l'''命令的输出,如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image282.png|575x76px]]</p></li>
<li><p>然后由下表可知,pwm3寄存器的基地址为fd8b0030,再看 '''ls /sys/class/pwm/ -l'''命令的输出,可以看到pwmchip0中链接到了fd8b0030.pwm,所以pwm3对应pwmchip为pwmchip0</p>
<p>[[File:Orange_Pi_5_Ultra-image283.png|475x280px]]</p></li>
<li><p>然后使用下面的命令可以让pwm3输出一个50Hz的方波(请先切换到root用户,再执行下面的命令)</p></li></ol>

root@orangepi:~# '''echo 0 &gt; /sys/class/pwm/pwmchip0/export'''

root@orangepi:~# '''echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm0/period'''

root@orangepi:~# '''echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm0/duty_cycle'''

root@orangepi:~# '''echo 1 &gt; /sys/class/pwm/pwmchip0/pwm0/enable'''

[[File:Orange_Pi_5_Ultra-image284.png|575x346px]]

<ol start="8" style="list-style-type: decimal;">
<li>上面演示的pwm3的测试方法,其他pwm测试方法都是类似的。</li></ol>

<span id="can的测试方法"></span>
=== CAN的测试方法 ===

'''只有Linux5.10内核的镜像才支持CAN功能,Linux6.1内核的镜像不支持。'''

<span id="打开can的方法"></span>
==== 打开CAN的方法 ====

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的CAN总线为CAN0和CAN1</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>在linux系统中,40 pin中的CAN默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|391x203px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|370x160px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的的配置</p>
<p>[[File:Orange_Pi_5_Ultra-image285.png|335x32px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image275.png|332x96px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image276.png|341x103px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|283x125px]]</p></li></ol>
</li>
<li><p>进入linux系统后,使用'''sudo ifconfig -a'''命令如果能看到CAN的设备,就说明CAN已正确打开了</p>
<p>orangepi@orangepi:~$ '''sudo ifconfig -a'''</p>
<p>can0: flags=128&lt;NOARP&gt; mtu 16</p>
<p>unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)</p>
<p>RX packets 0 bytes 0 (0.0 B)</p>
<p>RX errors 0 dropped 0 overruns 0 frame 0</p>
<p>TX packets 0 bytes 0 (0.0 B)</p>
<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p>
<p>device interrupt 91</p>
<p>can1: flags=128&lt;NOARP&gt; mtu 16</p>
<p>unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)</p>
<p>RX packets 0 bytes 0 (0.0 B)</p>
<p>RX errors 0 dropped 0 overruns 0 frame 0</p>
<p>TX packets 0 bytes 0 (0.0 B)</p>
<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p>
<p>device interrupt 92</p></li>
<li><p>CAN0和CAN1对应的引脚为</p></li></ol>

{| class="wikitable"
|-
|
| style="text-align: left;"| '''CAN0'''
| style="text-align: left;"| '''CAN1'''
|-
| '''TX引脚'''
| style="text-align: left;"| '''对应5号引脚'''
| style="text-align: left;"| '''对应33号引脚'''
|-
| '''RX引脚'''
| style="text-align: left;"| '''对应3号引脚'''
| style="text-align: left;"| '''对应31号引脚'''
|}

<span id="使用canalyst-ii分析仪测试收发消息"></span>
==== 使用CANalyst-II分析仪测试收发消息 ====

<ol style="list-style-type: decimal;">
<li><p>测试使用的CANalyst-II分析仪如下图所示</p>
<p>[[File:Orange_Pi_5_Ultra-image286.png|222x181px]]</p></li>
<li><p>CANalyst-II分析仪资料下载链接</p>
<p>[https://www.zhcxgd.com/3.html '''https://www.zhcxgd.com/3.html''']</p></li>
<li><p>首先要安装USBCANToolSetup这个软件</p>
<p>[[File:Orange_Pi_5_Ultra-image287.png|553x94px]]</p></li>
<li><p>USBCANToolSetup安装后的快捷方式为</p>
<p>[[File:Orange_Pi_5_Ultra-image288.png|77x105px]]</p></li>
<li><p>另外还需要安装一下USB驱动程序</p>
<p>[[File:Orange_Pi_5_Ultra-image289.png|553x112px]]</p></li>
<li><p>CANalyst-II分析仪的USB接口那端需要接到电脑的USB接口中</p>
<p>[[File:Orange_Pi_5_Ultra-image290.png|137x121px]]</p></li>
<li><p>测试CAN功能还需要准备一个下图所示的CAN收发器,CAN收发器主要功能是将CAN控制器的TTL信号转换成CAN总线的差分信号</p>
<ol style="list-style-type: lower-alpha;">
<li><p>CAN收发器的3.3V引脚需要接开发板40pin中的3.3V引脚</p></li>
<li><p>CAN收发器的GND引脚需要接开发板40pin中的GND引脚</p></li>
<li><p>CAN收发器的CAN TX引脚需要接开发板40pin中CAN总线的TX引脚</p></li>
<li><p>CAN收发器的CAN RX引脚需要接开发板40pin中CAN总线的RX引脚</p></li>
<li><p>CAN收发器的CANH引脚需要接分析仪的H接口</p></li>
<li><p>CAN收发器的CANL引脚需要接分析仪的L接口</p>
<p>[[File:Orange_Pi_5_Ultra-image291.png|352x113px]]</p></li></ol>
</li>
<li><p>然后可以打开USB-CAN软件</p>
<p>[[File:Orange_Pi_5_Ultra-image292.png|553x267px]]</p></li>
<li><p>然后点击启动设备</p>
<p>[[File:Orange_Pi_5_Ultra-image293.png|553x238px]]</p></li>
<li><p>然后点击确定</p>
<p>[[File:Orange_Pi_5_Ultra-image294.png|279x110px]]</p></li>
<li><p>再设置波特率为1000k bps</p>
<p>[[File:Orange_Pi_5_Ultra-image295.png|322x268px]]</p></li>
<li><p>成功打开后USB-CAN软件会显示序列号等信息</p>
<p>[[File:Orange_Pi_5_Ultra-image296.png|553x262px]]</p></li>
<li><p>开发板接收CAN消息测试</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先在开发板的Linux系统中设置下CAN总线的波特率为'''1000kbps'''</p>
<p>orangepi@orangepi:~$ '''sudo ip link set can0 down'''</p>
<p>orangepi@orangepi:~$ '''sudo ip link set can0 type can bitrate 1000000'''</p>
<p>orangepi@orangepi:~$ '''sudo ip link set can0 up'''</p></li>
<li><p>然后运行'''candump can0'''命令准备接收消息</p>
<p>orangepi@orangepi:~$ '''sudo candump can0'''</p></li>
<li><p>然后在USB-CAN软件中发送一个消息给开发板</p>
<p>[[File:Orange_Pi_5_Ultra-image297.png|553x188px]]</p></li>
<li><p>如果开发板中可以接收到分析仪发送的消息说明CAN总线能正常使用</p>
<p>orangepi@orangepi5ultra:~$ '''sudo candump can0'''</p>
<p>'''can0 001 [8] 01 02 03 04 05 06 07 08'''</p></li></ol>
</li>
<li><p>开发板发送CAN消息测试</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先在Linux系统中设置下CAN的波特率为'''1000kbps'''</p>
<p>orangepi@orangepi:~$ '''sudo ip link set can0 down'''</p>
<p>orangepi@orangepi:~$ '''sudo ip link set can0 type can bitrate 1000000'''</p>
<p>orangepi@orangepi:~$ '''sudo ip link set can0 up'''</p></li>
<li><p>再开发板中执行'''cansend'''命令,发送一个消息</p>
<p>orangepi@orangepi:~$ '''sudo cansend can0 123#1122334455667788'''</p></li>
<li><p>如果USB-CAN软件可以接收到开发板发过来的消息说明通信成功</p>
<p>[[File:Orange_Pi_5_Ultra-image298.png|575x449px]]</p></li></ol>
</li></ol>

<span id="wiringop硬件pwm的使用方法"></span>
== wiringOP硬件PWM的使用方法 ==

'''使用wiringOP操作PWM前,请确保Linux系统已经安装了wiringOP。如果gpio readall命令能正常使用,说明wiringOP已经安装了。如果提示找不到命令,请参考[[#安装wiringop的方法|安装wiringOP的方法]]一小节的说明先安装下wiringOP。'''

<span id="使用wiringop的gpio命令设置pwm的方法"></span>
=== 使用wiringOP的gpio命令设置PWM的方法 ===

<span id="设置对应引脚为pwm模式"></span>
==== 设置对应引脚为PWM模式 ====

<ol style="list-style-type: decimal;">
<li><p>如下表所示,开发板可以使用PWM0、PWM1、PWM3、PWM6、PWM12、PWM13和PWM14共七路PWM。PWM0_M0和PWM0_M2、PWM1_M0和PWM1_M2同一时间只能使用其中一个,不能同时使用,它们都是同一个PWM,只是接到不同的引脚上去了而已,请不要以为它们是两个不同的PWM总线。</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>PWM引脚对应的wPi序号如下所示:</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''PWM引脚'''
| style="text-align: left;"| '''wPi序号'''
| style="text-align: left;"| '''引脚序号'''
| style="text-align: left;"| '''GPIO序号'''
|-
| style="text-align: left;"| '''PWM0_M0'''
| style="text-align: left;"| '''1'''
| style="text-align: left;"| '''5'''
| style="text-align: left;"| '''15'''
|-
| style="text-align: left;"| '''PWM0_M2'''
| style="text-align: left;"| '''8'''
| style="text-align: left;"| '''15'''
| style="text-align: left;"| '''34'''
|-
| style="text-align: left;"| '''PWM1_M0'''
| style="text-align: left;"| '''0'''
| style="text-align: left;"| '''3'''
| style="text-align: left;"| '''16'''
|-
| style="text-align: left;"| '''PWM1_M2'''
| style="text-align: left;"| '''9'''
| style="text-align: left;"| '''16'''
| style="text-align: left;"| '''35'''
|-
| style="text-align: left;"| '''PWM3_M3'''
| style="text-align: left;"| '''2'''
| style="text-align: left;"| '''7'''
| style="text-align: left;"| '''39'''
|-
| style="text-align: left;"| '''PWM6_M1'''
| style="text-align: left;"| '''17'''
| style="text-align: left;"| '''27'''
| style="text-align: left;"| '''145'''
|-
| style="text-align: left;"| '''PWM12_M0'''
| style="text-align: left;"| '''20'''
| style="text-align: left;"| '''31'''
| style="text-align: left;"| '''109'''
|-
| style="text-align: left;"| '''PWM13_M0'''
| style="text-align: left;"| '''22'''
| style="text-align: left;"| '''33'''
| style="text-align: left;"| '''110'''
|-
| style="text-align: left;"| '''PWM14_M0'''
| style="text-align: left;"| '''23'''
| style="text-align: left;"| '''35'''
| style="text-align: left;"| '''114'''
|}

<ol start="3" style="list-style-type: decimal;">
<li><p>设置引脚为PWM模式的命令如下,以PWM0_M0为例,其中第三个参数需要输入PWM0_M0引脚对应的wPi的序号。</p>
<p>orangepi@orangepi:~$ '''gpio mode 1 pwm'''</p></li>
<li><p>引脚设置为PWM模式后,默认会输出一个频率为200Hz,周期为5ms,占空比为50%的方波,此时,我们使用示波器测量对应的PWM引脚,就可以看到下面的波形。</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image299.jpeg|552x310px|b28817696b0928a7130a75f26805871(1)]]

</div>
<span id="调节pwm频率的方法"></span>
==== 调节PWM频率的方法 ====

'''PWM频率的计算公式如下所示:'''

'''PWM频率 = 时钟频率 / (分频系数 * 周期寄存器的值)'''

'''其中:'''

# '''时钟频率的默认值是24000000Hz。'''
# '''分频系数的取值范围是2 ~ 512之间的偶数,默认值是120。如果设置的分频系数为奇数,则实际的分频系数为设置值减一。'''
# '''周期寄存器的默认值是1000。'''
# '''PWM频率的默认值是24000000 / (120 * 1000) = 200Hz。'''

<span id="通过设置分频系数来调节pwm频率的方法"></span>
===== 通过设置分频系数来调节PWM频率的方法 =====

<ol style="list-style-type: decimal;">
<li><p>我们可以使用下面的命令设置PWM0_M0引脚的分频系数为4。</p>
<p>orangepi@orangepi:~$ '''gpio pwmc 1 4'''</p></li>
<li><p>根据上面的公式得到PWM频率的计算值为6000Hz, 通过示波器可以观察到PWM频率测量值为6010Hz,误差可以忽略。</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image300.jpeg|553x330px|0af55f8236282f830dfaa384d2f8c68(1)]]

</div>
<span id="直接设置pwm频率的方法"></span>
===== 直接设置PWM频率的方法 =====

<ol style="list-style-type: decimal;">
<li><p>我们可以使用'''gpio pwmTone'''命令来设置PWM引脚的频率,比如使用下面的命令可以设置PWM0_M0引脚的PWM频率为500Hz。</p>
<p>orangepi@orangepi:~$ '''gpio pwmTone 1 500'''</p>
<p>'''在设置PWM频率时,需要保证:'''</p>
<p>'''设置的频率值 &lt; 24000000 / (分频系数 * 2)。'''</p>
<p>'''比如,默认的分频系数为120,在没有修改分频系数的情况下,设置的频率值应小于100000Hz。'''</p>
<p>'''如果设置值过大,会出现如下报错:'''</p>
<p>'''gpio: The PWM frequency you set is too high to be possible'''</p></li>
<li><p>然后通过示波器可以观察到PWM频率变为500Hz了。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image301.jpeg|552x315px|8c39c810a28e1789f0ac9a8f96ac4e7]]

</div></li></ol>

<span id="调节pwm占空比的方法"></span>
==== 调节PWM占空比的方法 ====

<ol style="list-style-type: decimal;">
<li><p>PWM占空比的计算公式如下所示,我们可以通过设置占空比寄存器的值和周期寄存器的值来调节PWM占空比。</p>
<p>'''PWM占空比 = 占空比寄存器的值 / 周期寄存器的值'''</p>
<p>'''其中:'''</p>
<p>'''占空比寄存器的默认值是500。'''</p>
<p>'''周期寄存器的默认值是1000。'''</p>
<p>'''需要注意的是,占空比寄存器的值需要小于周期寄存器的值,因为占空比不能大于1。'''</p>
<p>'''当设置占空比寄存器的值 &gt; 周期寄存器的值时,会提示如下错误信息:'''</p>
<p>'''gpio: CCR should be less than or equal to ARR (XXX)'''</p>
<p>'''当设置周期寄存器的值 &lt; 占空比寄存器的值时,会提示如下错误信息:'''</p>
<p>'''gpio: ARR should be greater than or equal to CRR (XXX)'''</p></li>
<li><p>我们可以使用下面的命令设置PWM0_M0引脚的周期寄存器的值为2000。</p>
<p>orangepi@orangepi:~$ '''gpio pwmr 1 2000'''</p></li>
<li><p>运行上面的命令后,通过示波器可以观察到PWM占空比从默认的50%(500/1000)变为25%(500/2000)。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image302.jpeg|553x312px|71e77326fdb2aa50162c02bf8aafea4(1)]]

</div></li>
<li><p>我们可以使用下面的命令设置PWM0_M0引脚的占空比寄存器的值为1000。</p>
<p>orangepi@orangepi:~$ '''gpio pwm 1 1000'''</p></li>
<li><p>运行上面的命令后,通过示波器可以观察到PWM占空比从25%(500/2000)变为50%(1000/2000)。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image303.jpeg|552x329px|6c0a68c0a1dfe233d31ba3a7cac34b1(1)]]

</div></li></ol>

<span id="pwm测试程序的使用方法"></span>
=== PWM测试程序的使用方法 ===

<ol style="list-style-type: decimal;">
<li><p>在wiringOP的example目录下,有一个名为pwm.c的程序,此程序演示了使用wiringOP中PWM相关的API来操作PWM的方法。</p>
<p>orangepi@orangepi:~$ '''cd /usr/src/wiringOP/examples/'''</p>
<p>orangepi@orangepi:/usr/src/wiringOP/examples$ '''ls pwm.c'''</p>
<p>pwm.c</p></li>
<li><p>编译'''pwm.c'''为可执行程序的命令如下所示:</p>
<p>orangepi@orangepi:/usr/src/wiringOP/examples$ '''gcc -o pwm pwm.c -lwiringPi'''</p></li>
<li><p>然后就可以执行PWM测试程序了,在执行PWM测试程序时,需要指定PWM引脚,比如可以使用下面的命令对PWM0_M0引脚进行测试:</p>
<p>orangepi@orangepi:/usr/src/wiringOP/examples$ '''sudo ./pwm 1'''</p></li>
<li><p>pwm程序执行后会对以下内容依次进行测试:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>通过设置周期寄存器的值来调节PWM占空比。</p></li>
<li><p>通过设置占空比寄存器的值调节PWM占空比。</p></li>
<li><p>通过设置分频系数调节PWM频率。</p></li>
<li><p>直接设置PWM频率。</p></li></ol>
</li>
<li><p>在每完成一项测试后,会停止输出pwm波形5秒钟,在完成所有测试内容后,会重新开始新一轮测试。</p></li>
<li><p>PWM测试程序的详细执行过程如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>通过设置周期寄存器的值调节PWM占空比:通过示波器可以观察到PWM波形每隔0.5秒产生变化,在变化了8次后,PWM占空比从50%变为25%,保持5秒,然后PWM波形每隔0.5秒产生变化,在变化了8次后,PWM占空比从25%变为50%,保持5秒。</p></li>
<li><p>通过设置占空比寄存器的值调节PWM占空比:通过示波器可以观察到PWM波形每隔0.5秒产生变化,在变化了8次后,PWM占空比从50%变为100%,保持5秒,然后PWM波形每隔0.5秒产生变化,在变化了8次后,PWM占空比从100%变为50%,保持5秒。</p></li>
<li><p>通过设置分频系数调节PWM频率:通过示波器可以观察到PWM波形每隔0.5秒产生变化,在变化了9次后,PWM频率会从2000hz变成200hz,保持5秒,然后PWM波形每隔0.5秒产生变化,在变化了9次后,PWM频率又会变为2000Hz,保持5秒。</p></li>
<li><p>直接设置PWM频率:通过示波器可以观察到PWM频率首先变为2000Hz,然后每隔两秒PWM频率增加2000Hz,在变化了9次后,PWM频率变为20000Hz,保持5秒。</p></li></ol>
</li></ol>

<span id="wiringop-python的安装使用方法"></span>
== wiringOP-Python的安装使用方法 ==

'''wiringOP-Python是wiringOP的Python语言版本的库,用于在Python程序中操作开发板的GPIO、I2C、SPI和UART等硬件资源。'''

'''另外请注意下面部分命令是在root用户下操作的。'''

<span id="wiringop-python的安装方法"></span>
=== wiringOP-Python的安装方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先安装依赖包</p>
<p>root@orangepi:~# '''sudo apt-get update'''</p>
<p>root@orangepi:~# '''sudo apt-get -y install git swig python3-dev python3-setuptools'''</p></li>
<li><p>然后使用下面的命令下载wiringOP-Python的源码</p></li></ol>

'''注意,下面的git clone--recursive命令会自动下载wiringOP的源码,因为wiringOP-Python是依赖wiringOP的。请确保下载过程没有因为网络问题而报错。'''

'''如果从GitHub下载代码有问题,可以直接使用Linux镜像中自带的wiringOP-Python源码,存放位置为:/usr/src/wiringOP-Python'''。

root@orangepi:~# '''git clone --recursive https://github.com/orangepi-xunlong/wiringOP-Python -b next'''

root@orangepi:~# '''cd wiringOP-Python'''

root@orangepi:~/wiringOP-Python# '''git submodule update --init --remote'''

<ol start="3" style="list-style-type: decimal;">
<li><p>然后使用下面的命令编译wiringOP-Python并将其安装到开发板的Linux系统中</p>
<p>root@orangepi:~# '''cd wiringOP-Python'''</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>然后输入下面的命令,如果有帮助信息输出,说明wiringOP-Python安装成功,按下'''q'''键可以退出帮助信息的界面</p></li></ol>

root@orangepi:~/wiringOP-Python# '''python3 -c &quot;import wiringpi; help(wiringpi)&quot;'''

Help on module wiringpi:

NAME

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.

<ol start="5" style="list-style-type: decimal;">
<li><p>在python命令行下测试wiringOP-Python是否安装成功的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li>首先使用python3命令进入python3的命令行模式</li></ol>
</li></ol>

root@orangepi:~# '''python3'''

<ol start="2" style="list-style-type: lower-alpha;">
<li>然后导入wiringpi的python模块</li></ol>

&gt;&gt;&gt; '''import wiringpi;'''

<ol start="3" style="list-style-type: lower-alpha;">
<li>最后输入下面的命令可以查看下wiringOP-Python的帮助信息,按下'''q'''键可以退出帮助信息的界面</li></ol>

&gt;&gt;&gt; '''help(wiringpi)'''

Help on module wiringpi:

NAME

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口测试-1"></span>
=== 40pin GPIO口测试 ===

'''wiringOP-Python跟wiringOP一样,也是可以通过指定wPi号来确定操作哪一个GPIO引脚,因为wiringOP-Python中没有查看wPi号的命令,所以只能通过wiringOP中的gpio命令来查看板子wPi号与物理引脚的对应关系。'''

[[File:Orange_Pi_5_Ultra-image267.png|575x379px]]

<ol style="list-style-type: decimal;">
<li><p>下面以7号引脚——对应GPIO为GPIO1_A7 ——对应wPi序号为2——为例演示如何设置GPIO口的高低电平</p>
<p>[[File:Orange_Pi_5_Ultra-image268.png|575x76px]]</p></li>
<li><p>直接用命令测试的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先设置GPIO口为输出模式,其中'''pinMode'''函数的第一个参数是引脚对应的wPi的序号,第二个参数是GPIO的模式</p>
<p>root@orangepi:~/wiringOP-Python# '''python3 -c &quot;import wiringpi; \'''</p>
<p>'''from wiringpi import GPIO; wiringpi.wiringPiSetup() ; \'''</p>
<p>'''wiringpi.pinMode(2, GPIO.OUTPUT) ; &quot;'''</p></li>
<li><p>然后设置GPIO口输出低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为0v,说明设置低电平成功</p>
<p>root@orangepi:~/wiringOP-Python# '''python3 -c &quot;import wiringpi; \'''</p>
<p>'''from wiringpi import GPIO; wiringpi.wiringPiSetup() ;\'''</p>
<p>'''wiringpi.digitalWrite(2, GPIO.LOW)&quot;'''</p></li>
<li><p>然后设置GPIO口输出高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为3.3v,说明设置高电平成功</p>
<p>root@orangepi:~/wiringOP-Python# '''python3 -c &quot;import wiringpi; \'''</p>
<p>'''from wiringpi import GPIO; wiringpi.wiringPiSetup() ;\'''</p>
<p>'''wiringpi.digitalWrite(2, GPIO.HIGH)&quot;'''</p></li></ol>
</li>
<li><p>在python3的命令行中测试的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先使用python3命令进入python3的命令行模式</p>
<p>root@orangepi:~# '''python3'''</p></li>
<li><p>然后导入wiringpi的python模块</p>
<p>&gt;&gt;&gt; '''import wiringpi'''</p>
<p>&gt;&gt;&gt; '''from wiringpi import GPIO'''</p></li>
<li><p>然后设置GPIO口为输出模式,其中'''pinMode'''函数的第一个参数是引脚对应的wPi的序号,第二个参数是GPIO的模式</p>
<p>&gt;&gt;&gt; '''wiringpi.wiringPiSetup()'''</p>
<p>0</p>
<p>&gt;&gt;&gt; '''wiringpi.pinMode(2, GPIO.OUTPUT)'''</p></li>
<li><p>然后设置GPIO口输出低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为0v,说明设置低电平成功</p>
<p>&gt;&gt;&gt; '''wiringpi.digitalWrite(2, GPIO.LOW)'''</p></li>
<li><p>然后设置GPIO口输出高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为3.3v,说明设置高电平成功</p>
<p>&gt;&gt;&gt; '''wiringpi.digitalWrite(2, GPIO.HIGH)'''</p></li></ol>
</li>
<li><p>wiringOP-Python在python代码中设置GPIO高低电平的方法可以参考下examples中的'''blink.py'''测试程序,'''blink.py'''测试程序会设置开发板26 pin中所有的GPIO口的电压不断的高低变化</p>
<p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p>
<p>root@orangepi:~/wiringOP-Python/examples# '''ls blink.py'''</p>
<p>'''blink.py'''</p>
<p>root@orangepi:~/wiringOP-Python/examples'''# python3 blink.py'''</p></li></ol>

<span id="pin-spi测试-1"></span>
=== 40pin SPI测试 ===

<ol style="list-style-type: decimal;">
<li><p>由下图可知,Orange Pi 5 Ultra可用的spi为spi0、spi1和spi4</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>SPI0、SPI1和SPI4在40pin中对应的引脚如下表所示。</p></li></ol>

{| class="wikitable"
|-
|
| '''S PI0_M2对应40pin'''
| '''S PI1_M1对应40pin'''
| '''S PI4_M2对应40pin'''
|-
| * *MOSI**

| '''19号引脚'''
| '''40号引脚'''
| '''13号引脚'''
|-
| * *MISO**

| '''21号引脚'''
| '''38号引脚'''
| '''11号引脚'''
|-
| '''CLK'''
| '''23号引脚'''
| '''29号引脚'''
| '''15号引脚'''
|-
| '''CS0'''
| '''24号引脚'''
| '''35号引脚'''
| '''16号引脚'''
|-
| '''CS1'''
| '''26号引脚'''
| '''无'''
| '''无'''
|-
| '''dtb o配置'''
| '''spi 0-m2-cs0-spidev'''

'''spi 0-m2-cs1-spidev'''

'''spi0-m2 -cs0-cs1-spidev'''

| '''spi 1-m1-cs0-spidev'''
| '''spi 4-m2-cs0-spidev'''
|}

<ol start="3" style="list-style-type: decimal;">
<li><p>在linux系统中,40 pin中的SPI默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|391x203px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|389x169px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的SPI的配置</p>
<p>[[File:Orange_Pi_5_Ultra-image274.png|399x164px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image275.png|391x113px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image276.png|404x123px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|332x146px]]</p></li></ol>
</li>
<li><p>重启后进入系统先查看下linux系统中是否存在'''spidevx.x'''的设备节点,如果存在,说明SPI已经设置好了,可以直接使用。</p>
<p>orangepi@orangepi:~$ '''ls /dev/spidev*'''</p>
<p>/dev/spidev0.0 /dev/spidev0.1 /dev/spidev4.0</p>
<p>'''上面是打开spi0-m2-cs0-cs1-spidev和spi4-m2-cs0-spidev后显示的结果。'''</p></li>
<li><p>然后可以使用examples中的'''spidev_test.py'''程序测试下SPI的回环功能,'''spidev_test.py'''程序需要指定下面的两个参数:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''--channel''':指定SPI的通道号</p></li>
<li><p>'''--port''':指定SPI的端口号</p></li></ol>
</li>
<li><p>先不短接 SPI 的 mosi 和 miso 两个引脚,运行 spidev_test.py 的输出结果如下所示,可以看到 TX 和 RX 的数据不一致</p>
<p>'''--channel和--port参数后面的x需要替换为具体SPI的通道号和SPI的端口号。'''</p>
<p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p></li></ol>

root@orangepi:~/wiringOP-Python/examples# '''python3 spidev_test.py --channel x --port x'''

spi mode: 0x0

max speed: 500000 Hz (500 KHz)

Opening device /dev/spidev0.0

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="7" style="list-style-type: decimal;">
<li><p>然后使用杜邦线短接SPI的txd和rxd两个引脚再运行spidev_test.py的输出如下,可以看到发送和接收的数据一样,说明SPI回环测试正常</p>
<p>'''--channel和--port参数后面的x需要替换为具体SPI的通道号和SPI的端口号。'''</p>
<p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p></li></ol>

root@orangepi:~/wiringOP-Python/examples# '''python3 spidev_test.py --channel x --port x'''

spi mode: 0x0

max speed: 500000 Hz (500 KHz)

Opening device /dev/spidev0.0

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测试-1"></span>
=== 40pin I2C测试 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的i2c为i2c2、i2c4、i2c5和i2c8共四组 i2c总线</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>4组I2C总线在40pin中对应的引脚如下表所示。I2C2_M0和I2C2_M4同一时间只能使用其中一组,不能同时使用,它们都是同一个I2C,只是接到不同的引脚上去了而已,请不要以为它们是两组不同的I2C总线。</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''I2C总线'''
| style="text-align: left;"| '''SDA对应40pin'''
| style="text-align: left;"| '''SCL对应40pin'''
| style="text-align: left;"| '''dtbo对应配置'''
|-
| style="text-align: left;"| '''I2C2_M0'''
| style="text-align: left;"| '''3号引脚'''
| style="text-align: left;"| '''5号引脚'''
| style="text-align: left;"| '''i2c2-m0'''
|-
| style="text-align: left;"| '''I2C2_M4'''
| style="text-align: left;"| '''11号引脚'''
| style="text-align: left;"| '''13号引脚'''
| style="text-align: left;"| '''i2c2-m4'''
|-
| style="text-align: left;"| '''I2C4_M3'''
| style="text-align: left;"| '''15号引脚'''
| style="text-align: left;"| '''16号引脚'''
| style="text-align: left;"| '''i2c4-m3'''
|-
| style="text-align: left;"| '''I2C5_M2'''
| style="text-align: left;"| '''37号引脚'''
| style="text-align: left;"| '''12号引脚'''
| style="text-align: left;"| '''i2c5-m2'''
|-
| style="text-align: left;"| '''I2C8_M3'''
| style="text-align: left;"| '''27号引脚'''
| style="text-align: left;"| '''28号引脚'''
| style="text-align: left;"| '''i2c8-m3'''
|}

<ol start="3" style="list-style-type: decimal;">
<li><p>在linux系统中,40 pin中的I2C总线默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|391x203px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|401x174px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的I2C的配置</p>
<p>[[File:Orange_Pi_5_Ultra-image278.png|397x235px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image275.png|380x109px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image276.png|355x108px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|323x142px]]</p></li></ol>
</li>
<li><p>启动linux系统后,先确认下'''/dev'''下存在i2c的设备节点</p>
<p>orangepi@orangepi:~$ '''ls /dev/i2c-*'''</p></li>
<li><p>然后在40pin接头的i2c引脚上接一个i2c设备,这里以ds1307 RTC模块为例</p>
<p>[[File:Orange_Pi_5_Ultra-image304.png|117x88px]]</p></li>
<li><p>然后使用'''i2cdetect -y'''命令如果能检测到连接的i2c设备的地址,就说明i2c能正常使用</p>
<p>orangepi@orangepi:~$ '''sudo i2cdetect -y 2''' #i2c2的命令</p>
<p>orangepi@orangepi:~$ '''sudo i2cdetect -y 4''' #i2c4的命令</p>
<p>orangepi@orangepi:~$ '''sudo i2cdetect -y 5''' #i2c5的命令</p>
<p>orangepi@orangepi:~$ '''sudo i2cdetect -y 8''' #i2c8的命令</p></li></ol>

[[File:Orange_Pi_5_Ultra-image279.png|415x195px]]

<ol start="7" style="list-style-type: decimal;">
<li><p>然后可以运行'''examples'''中的'''ds1307.py'''测试程序读取RTC的时间</p>
<p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p>
<p>root@orangepi:~/wiringOP-Python/examples# '''python3 ds1307.py --device /dev/i2c-2'''</p>
<p>Thu 2023-01-05 14:57:55</p>
<p>Thu 2023-01-05 14:57:56</p>
<p>Thu 2023-01-05 14:57:57</p>
<p>^C</p>
<p>exit</p></li></ol>

<span id="pin的uart测试-1"></span>
=== 40pin的UART测试 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的uart为uart3、uart4和uart6共三组uart总线,uart2用于调试串口功能没有计算在里面。</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>四组UART总线在40pin中对应的引脚如下表所示:</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''UART总线'''
| style="text-align: left;"| '''RX对应40pin'''
| style="text-align: left;"| '''TX对应40pin'''
| style="text-align: left;"| '''dtbo对应配置'''
|-
| style="text-align: left;"| '''UART3_M1'''
| style="text-align: left;"| '''33号引脚'''
| style="text-align: left;"| '''31号引脚'''
| style="text-align: left;"| '''uart3-m1'''
|-
| style="text-align: left;"| '''UART4_M2'''
| style="text-align: left;"| '''19号引脚'''
| style="text-align: left;"| '''23号引脚'''
| style="text-align: left;"| '''uart4-m2'''
|-
| style="text-align: left;"| '''UART6_M1'''
| style="text-align: left;"| '''11号引脚'''
| style="text-align: left;"| '''13号引脚'''
| style="text-align: left;"| '''uart6-m1'''
|}

<ol start="3" style="list-style-type: decimal;">
<li><p>在linux系统中,40 pin中的UART默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|411x213px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|413x179px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的UART的配置</p>
<p>[[File:Orange_Pi_5_Ultra-image280.png|409x178px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image275.png|405x117px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image276.png|401x122px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|320x141px]]</p></li></ol>
</li>
<li><p>进入linux系统后,先确认下'''/dev'''下是否存在对应uart的设备节点</p>
<p>orangepi@orangepi:~$ '''ls /dev/ttyS*'''</p></li>
<li><p>然后开始测试uart接口,先使用杜邦线短接要测试的uart接口的rx和tx</p></li>
<li><p>使用examples中的'''serialTest.py'''程序测试串口的回环功能如下所示,如果能看到下面的打印,说明串口通信正常</p>
<p>'''/dev/ttySX中的X需要替换为具体的uart设备节点的序号。'''</p>
<p>root@orangepi:~/wiringOP-Python/examples# '''python3 serialTest.py --device /dev/ttySX'''</p>
<p>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></ol>

== 硬件看门狗测试 ==

Orange Pi发布的linux系统中预装了watchdog_test程序,可以直接测试。

运行watchdog_test程序的方法如下所示:

<ol style="list-style-type: lower-alpha;">
<li><p>第二个参数10表示看门狗的计数时间,如果这个时间内没有喂狗,系统会重启</p></li>
<li><p>我们可以通过按下键盘上的任意键(ESC除外)来喂狗,喂狗后,程序会打印一行keep alive表示喂狗成功</p>
<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>

<span id="查看rk3588芯片的序列号"></span>
== 查看RK3588芯片的序列号 ==

查看RK3588芯片序列号的命令如下所示,每个芯片的序列号都是不同的,所以可以使用序列号来区分多个开发板。

orangepi@orangepi:~$ '''cat_serial.sh'''

Serial : '''1404a7682e86830c'''

<span id="安装docker的方法"></span>
== 安装Docker的方法 ==

<ol style="list-style-type: decimal;">
<li><p>Orange Pi提供的linux镜像已经预装了Docker,只是Docker服务默认没有打开</p></li>
<li><p>使用'''enable_docker.sh'''脚本可以使能docker服务,然后就可以开始使用docker命令了,并且在下次启动系统时也会自动启动docker服务</p>
<p>orangepi@orangepi:~$ '''enable_docker.sh'''</p></li>
<li><p>然后可以使用下面的命令测试下docker,如果能运行hello-world说明docker能正常使用了</p>
<p>orangepi@orangepi:~$ '''sudo docker run hello-world'''</p>
<p>Unable to find image 'hello-world:latest' locally</p>
<p>latest: Pulling from library/hello-world</p>
<p>256ab8fe8778: Pull complete</p>
<p>Digest: sha256:7f0a9f93b4aa3022c3a4c147a449ef11e0941a1fd0bf4a8e6c9408b2600777c5</p>
<p>Status: Downloaded newer image for hello-world:latest</p>
<p>'''Hello from Docker!'''</p>
<p>'''This message shows that your installation appears to be working correctly.'''</p>
<p>.….</p></li></ol>

<span id="下载安装arm64版本balenaetcher的方法"></span>
== 下载安装arm64版本balenaEtcher的方法 ==

<ol style="list-style-type: decimal;">
<li><p>balenaEtcher arm64版本的下载地址为:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>deb安装包的下载地址如下所示,需要安装才能使用</p>
<p>[https://github.com/Itai-Nelken/BalenaEtcher-arm/releases/download/v1.7.9/balena-etcher-electron_1.7.9+5945ab1f_arm64.deb '''https://github.com/Itai-Nelken/BalenaEtcher-arm/releases/download/v1.7.9/balena-etcher-electron_1.7.9+5945ab1f_arm64.deb''']</p></li>
<li><p>无需安装的AppImage版本的下载地址如下所示:</p>
<p>[https://github.com/Itai-Nelken/BalenaEtcher-arm/releases/download/v1.7.9/balenaEtcher-1.7.9+5945ab1f-arm64.AppImage '''https://github.com/Itai-Nelken/BalenaEtcher-arm/releases/download/v1.7.9/balenaEtcher-1.7.9+5945ab1f-arm64.AppImage''']</p></li></ol>
</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image305.png|527x211px|IMG_256]]

</div>
<ol start="2" style="list-style-type: decimal;">
<li><p>deb版本balenaEtcher的安装使用方法:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>deb版本的balenaEtcher安装命令如下所示:</p>
<p>orangepi@orangepi:~$ '''sudo apt install -y --fix-broken ./balena-etcher-electron_1.7.9+5945ab1f_arm64.deb'''</p></li>
<li><p>deb版本的balenaEtcher安装完成后,在Application中就可以打开了</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image89.png|507x249px|IMG_256]]

</div></li>
<li><p>balenaEtcher打开后的界面如下所示:</p></li></ol>
</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image306.png|429x263px|IMG_256]]

</div>
<ol start="3" style="list-style-type: decimal;">
<li><p>AppImage版本的balenaEtcher的使用方法:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先给balenaEtcher添加权限</p>
<p>orangepi@orangepi:~/Desktop$ '''chmod +x balenaEtcher-1.7.9+5945ab1f-arm64.AppImage'''</p></li>
<li><p>然后选中AppImage版本balenaEtcher,再点击鼠标右键,再点击Execute就可以打开balenaEtcher了</p>
<p>[[File:Orange_Pi_5_Ultra-image307.png|145x118px]]</p></li></ol>
</li></ol>

<span id="宝塔linux面板的安装方法"></span>
== 宝塔Linux面板的安装方法 ==

'''宝塔Linux面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能(摘抄自[https://www.bt.cn/ 宝塔官网])'''

<ol style="list-style-type: decimal;">
<li><p>宝塔Linux系统兼容性推荐的顺序为</p>
<p>'''Debian11 &gt; Ubuntu 22.04 &gt; Debian12'''</p></li>
<li><p>然后在linux系统中输入下面的命令就可以开始宝塔的安装</p>
<p>orangepi@orangepi:~$ '''sudo install_bt_panel.sh'''</p></li>
<li><p>然后宝塔安装程序会提醒是否安装'''Bt-Panel'''到'''/www'''文件夹,此时输入'''y'''即可</p>
<p>+----------------------------------------------------------------------</p>
<p>| Bt-WebPanel FOR CentOS/Ubuntu/Debian</p>
<p>+----------------------------------------------------------------------</p>
<p>| Copyright © 2015-2099 BT-SOFT(http://www.bt.cn) All rights reserved.</p>
<p>+----------------------------------------------------------------------</p>
<p>| The WebPanel URL will be http://SERVER_IP:8888 when installed.</p>
<p>+----------------------------------------------------------------------</p>
<p>Do you want to install Bt-Panel to the /www directory now?(y/n): '''y'''</p></li>
<li><p>然后要做的就是耐心等待,当看到终端输出下面的打印信息时,说明宝塔已经安装完成,整个安装过程大约耗时6分钟,根据网络速度的不同可能会有一些差别</p>
<p>==================================================================</p>
<p>Congratulations! Installed successfully!</p>
<p>=============注意:首次打开面板浏览器将提示不安全=================</p>
<p>请选择以下其中一种方式解决不安全提醒</p>
<p>1、下载证书,地址:https://dg2.bt.cn/ssl/baota_root.pfx,双击安装,密码【www.bt.cn】</p>
<p>2、点击【高级】-【继续访问】或【接受风险并继续】访问</p>
<p>教程:https://www.bt.cn/bbs/thread-117246-1-1.html</p>
<p>mac用户请下载使用此证书:https://dg2.bt.cn/ssl/mac.crt</p>
<p>========================面板账户登录信息==========================</p>
<p>【云服务器】请在安全组放行 31402 端口</p>
<p>外网面板地址: https://183.17.125.22:31402/d1f7cff0</p>
<p>内网面板地址: https://10.31.2.175:31402/d1f7cff0</p>
<p>username: a8vazvbh</p>
<p>password: bc7bb4b7</p>
<p>浏览器访问以下链接,添加宝塔客服</p>
<p>https://www.bt.cn/new/wechat_customer</p>
<p>==================================================================</p>
<p>Time consumed: 14 Minute!</p></li>
<li><p>此时在浏览器中输入上面显示的'''面板地址'''就可以打开宝塔Linux面板的登录界面,然后在对应的位置输入上图显示的'''username'''和'''password'''就可以登录进宝塔</p>
<p>[[File:Orange_Pi_5_Ultra-image308.png|576x241px]]</p></li>
<li><p>成功登录宝塔后的会弹出下面的欢迎界面,首先请将中间的用户须知阅读完拖到最下面,然后就可以选择”我已同意并阅读《用户协议》“,接着点击”进入面板”就可以进入宝塔了</p>
<p>[[File:Orange_Pi_5_Ultra-image309.png|576x213px]]</p></li>
<li><p>进入宝塔后首先会提示需要绑定宝塔官网的账号,如果没有账号可以去宝塔的官网('''https://www.bt.cn''')注册一个</p>
<p>[[File:Orange_Pi_5_Ultra-image310.png|576x218px]]</p></li>
<li><p>最终显示的界面如下图所示,可以很直观的看到开发板Linux系统的一些状态信息,比如负载状态、CPU的使用率、内存使用率和存储空间的使用情况等</p>
<p>[[File:Orange_Pi_5_Ultra-image311.png|575x287px]]</p></li>
<li><p>测试宝塔的SSH终端登录</p>
<ol style="list-style-type: lower-alpha;">
<li><p>打开宝塔的SSH终端后首先会提示需要输入开发板系统的密码,此时在密码框中输入'''orangepi'''(默认密码,如果有修改请填写修改后的)即可</p>
<p>[[File:Orange_Pi_5_Ultra-image312.png|575x400px]]</p></li>
<li><p>成功登录后的显示如下图所示</p>
<p>[[File:Orange_Pi_5_Ultra-image313.png|576x249px]]</p></li></ol>
</li>
<li><p>在宝塔的软件商店中可以安装Apache、MySQL和PHP等软件,也可以一键部署各种应用程序,这部分功能请自行探索,这里就不一一演示了</p>
<p>[[File:Orange_Pi_5_Ultra-image314.png|575x279px]]</p></li>
<li><p>宝塔的更多功能可以参考下面资料自行探索</p>
<p>使用手册:[http://docs.bt.cn '''http://docs.bt.cn''']</p>
<p>论坛地址:[https://www.bt.cn/bbs '''https://www.bt.cn/bbs''']</p>
<p>GitHub链接:'''https://github.com/aaPanel/BaoTa'''</p></li></ol>

== 设置中文环境以及安装中文输入法 ==

'''注意,安装中文输入法前请确保开发板使用的Linux系统为桌面版系统。'''

<span id="debian系统的安装方法"></span>
=== Debian系统的安装方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先设置默认'''locale'''为中文</p>
<ol style="list-style-type: lower-alpha;">
<li><p>输入下面的命令可以开始配置'''locale'''</p>
<p>orangepi@orangepi:~$ '''sudo dpkg-reconfigure locales'''</p></li>
<li><p>然后在弹出的界面中选择'''zh_CN.UTF-8 UTF-8'''(通过键盘上的上下方向按键来上下移动,通过空格键来选择,最后通过Tab键可以将光标移动到'''&lt;OK&gt;''',然后回车即可)</p>
<p>[[File:Orange_Pi_5_Ultra-image315.png|575x296px]]</p></li>
<li><p>然后设置默认'''locale'''为'''zh_CN.UTF-8'''</p>
<p>[[File:Orange_Pi_5_Ultra-image316.png|575x160px]]</p></li>
<li><p>退出界面后就会开始'''locale'''的设置,命令行显示的输出如下所示</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>然后打开'''Input Method'''</p>
<p>[[File:Orange_Pi_5_Ultra-image317.png|575x361px]]</p></li>
<li><p>然后选择'''OK'''</p>
<p>[[File:Orange_Pi_5_Ultra-image318.png|295x212px]]</p></li>
<li><p>然后选择'''Yes'''</p>
<p>[[File:Orange_Pi_5_Ultra-image319.png|303x192px]]</p></li>
<li><p>然后选择'''fcitx'''</p>
<p>[[File:Orange_Pi_5_Ultra-image320.png|307x220px]]</p></li>
<li><p>然后选择'''OK'''</p>
<p>[[File:Orange_Pi_5_Ultra-image321.png|305x216px]]</p></li>
<li><p>'''然后重启Linux系统才能使配置生效'''</p></li>
<li><p>然后打开'''Fcitx configuration'''</p>
<p>[[File:Orange_Pi_5_Ultra-image322.png|575x376px]]</p></li>
<li><p>然后点击下图所示位置的'''+'''号</p>
<p>[[File:Orange_Pi_5_Ultra-image323.png|280x187px]]</p></li>
<li><p>然后搜索'''Google Pinyin'''再点击'''OK'''</p>
<p>[[File:Orange_Pi_5_Ultra-image324.png|291x196px]]</p></li></ol>

'''注意,如果看不到Google Pinyin选项,请尝试把Only Show Current Languageq前的√去掉试下。'''

<ol start="11" style="list-style-type: decimal;">
<li><p>然后将'''Google Pinyin'''放到最前面</p>
<p>[[File:Orange_Pi_5_Ultra-image325.png|299x202px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image326.png|300x202px]]</p></li>
<li><p>然后打开'''Geany'''这个编辑器测试下中文输入法</p>
<p>[[File:Orange_Pi_5_Ultra-image327.png|349x212px]]</p></li>
<li><p>中文输入法测试如下所示</p>
<p>[[File:Orange_Pi_5_Ultra-image328.png|575x325px]]</p></li>
<li><p>通过'''Ctrl+Space'''快捷键可以切换中英文输入法</p></li>
<li><p>如果需要整个系统都显示为中文,可以将'''/etc/default/locale'''中的变量都设置为'''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>然后'''重启系统'''就能看到系统显示为中文了</p>
<p>[[File:Orange_Pi_5_Ultra-image329.png|576x356px]]</p></li></ol>

<span id="ubuntu-20.04系统的安装方法"></span>
=== Ubuntu 20.04系统的安装方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先打开'''Language Support'''</p>
<p>[[File:Orange_Pi_5_Ultra-image330.png|575x351px]]</p></li>
<li><p>然后找到'''汉语(中国)'''选项</p>
<p>[[File:Orange_Pi_5_Ultra-image331.png|318x311px]]</p></li>
<li><p>然后请使用鼠标左键选中'''汉语(中国)'''并按住不动,然后往上将其拖到最开始的位置,拖完后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image332.png|324x320px]]</p></li></ol>

'''注意,这一步不是很好拖动的,请耐心多试几次。'''

<ol start="4" style="list-style-type: decimal;">
<li><p>然后选择'''Apply System-Wide'''将中文设置应用到整个系统</p>
<p>[[File:Orange_Pi_5_Ultra-image333.png|321x316px]]</p></li>
<li><p>然后设置'''Keyboard input method system'''为'''fcitx'''</p>
<p>[[File:Orange_Pi_5_Ultra-image334.png|327x320px]]</p></li>
<li><p>'''然后重启Linux系统使配置生效'''</p></li>
<li><p>重新进入系统后,在下面的界面请选择'''不要再次询问我''',然后请根据自己的喜好决定标准文件夹是否也要更新为中文</p>
<p>[[File:Orange_Pi_5_Ultra-image335.png|303x247px]]</p></li>
<li><p>然后可以看到桌面都显示为中文了</p>
<p>[[File:Orange_Pi_5_Ultra-image336.png|575x383px]]</p></li>
<li><p>然后我们可以打开'''Geany'''测试下中文输入法,打开方式如下图所示</p>
<p>[[File:Orange_Pi_5_Ultra-image337.png|576x292px]]</p></li>
<li><p>打开'''Geany'''后,默认还是英文输入法,我们可以通过'''Ctrl+Space'''快捷键来切换成中文输入法,然后就能输入中文了</p>
<p>[[File:Orange_Pi_5_Ultra-image338.png|575x308px]]</p></li></ol>

<span id="ubuntu-22.04系统的安装方法"></span>
=== Ubuntu 22.04系统的安装方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先打开'''Language Support'''</p>
<p>[[File:Orange_Pi_5_Ultra-image330.png|575x351px]]</p></li>
<li><p>然后找到'''汉语(中国)'''选项</p>
<p>[[File:Orange_Pi_5_Ultra-image339.png|335x326px]]</p></li>
<li><p>然后请使用鼠标左键选中'''汉语(中国)'''并按住不动,然后往上将其拖到最开始的位置,拖完后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image340.png|337x331px]]</p></li></ol>

'''注意,这一步不是很好拖动的,请耐心多试几次。'''

<ol start="4" style="list-style-type: decimal;">
<li><p>然后选择'''Apply System-Wide'''将中文设置应用到整个系统</p>
<p>[[File:Orange_Pi_5_Ultra-image341.png|336x330px]]</p></li>
<li><p>'''然后重启Linux系统使配置生效'''</p></li>
<li><p>重新进入系统后,在下面的界面请选择'''不要再次询问我''',然后请根据自己的喜好决定标准文件夹是否也要更新为中文</p>
<p>[[File:Orange_Pi_5_Ultra-image335.png|303x247px]]</p></li>
<li><p>然后可以看到桌面都显示为中文了</p>
<p>[[File:Orange_Pi_5_Ultra-image336.png|575x383px]]</p></li>
<li><p>然后打开Fcitx5配置程序</p>
<p>[[File:Orange_Pi_5_Ultra-image342.png|575x349px]]</p></li>
<li><p>然后选择使用拼音输入法</p>
<p>[[File:Orange_Pi_5_Ultra-image343.png|366x289px]]</p></li>
<li><p>选择后的界面如下所示,再点击确定即可</p>
<p>[[File:Orange_Pi_5_Ultra-image344.png|366x290px]]</p></li>
<li><p>然后我们可以打开'''Geany'''测试下中文输入法,打开方式如下图所示</p>
<p>[[File:Orange_Pi_5_Ultra-image337.png|576x292px]]</p></li>
<li><p>打开'''Geany'''后,默认还是英文输入法,我们可以通过'''Ctrl+Space'''快捷键来切换成中文输入法,然后就能输入中文了</p>
<p>[[File:Orange_Pi_5_Ultra-image345.png|576x408px]]</p></li></ol>

<span id="远程登录linux系统桌面的方法"></span>
== 远程登录Linux系统桌面的方法 ==

'''Ubuntu Gnome Wayland镜像不支持使用此处介绍的Nomachine和VNC来远程登录桌面。'''

<span id="使用nomachine远程登录"></span>
=== 使用NoMachine远程登录 ===

'''请确保开发板安装的Ubuntu或者Debian系统为桌面版本的系统。另外NoMachine也提供了详细的使用文档,强烈建议通读此文档来熟悉NoMachine的使用,文档链接如下所示:'''

[https://knowledgebase.nomachine.com/DT10R00166 '''https://knowledgebase.nomachine.com/DT10R00166''']

'''NoMachine支持Windows、Mac、Linux、iOS和安卓平台,所以我们可以在多种设备上通过NoMachine来远程登录控制Orange Pi开发板。下面演示下在Windows中通过NoMachine来远程登录Orange Pi开发板的Linux系统桌面。其他平台的安装方法请参考下NoMachine的官方文档。'''

'''操作前请先确保Windwos电脑和开发板在同一局域网内,并且能正常ssh登录开发板的Ubuntu或者Debian系统。'''

<ol style="list-style-type: decimal;">
<li><p>首先下载NoMachine软件Linux '''arm64''' deb版本的安装包,然后安装到开发板的Linux系统中</p>
<ol style="list-style-type: lower-alpha;">
<li>由于RK3588是ARMv8架构的SOC,我们使用的系统为Ubuntu或者Debian,所以这里需要下载'''NoMachine for ARM ARMv8 DEB'''安装包,下载链接如下所示:</li></ol>
</li></ol>

'''注意,这个下载链接可能会变,请认准Armv8/Arm64版本的deb包。'''

[https://downloads.nomachine.com/download/?id=114&distro=ARM '''https://downloads.nomachine.com/download/?id=114&amp;distro=ARM'''][[File:Orange_Pi_5_Ultra-image346.png|575x227px]]

<ol start="2" style="list-style-type: lower-alpha;">
<li><p>另外在'''官方工具'''中也可以下载到'''NoMachine'''的安装包</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先打开开发板的资料下载页面,进入'''官方工具'''中</p>
<p>[[File:Orange_Pi_5_Ultra-image347.png|86x106px]]</p></li>
<li><p>先进入'''远程登录软件-NoMachine'''文件夹</p>
<p>[[File:Orange_Pi_5_Ultra-image348.png|256x46px]]</p></li>
<li><p>然后下载arm64版本的deb安装包</p>
<p>[[File:Orange_Pi_5_Ultra-image349.png|180x109px]]</p></li></ol>
</li>
<li><p>然后将下载的'''nomachine_x.x.x_x_arm64.deb'''上传到开发板的Linux系统中</p></li>
<li><p>然后使用下面的命令在开发板的Linux系统中安装'''NoMachine'''</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>然后下载NoMachine软件Windows版本的安装包,下载地址如下所示</li></ol>

'''注意,这个下载链接可能会变。'''

'''https://downloads.nomachine.com/download/?id=9'''

[[File:Orange_Pi_5_Ultra-image350.png|575x163px]]

<ol start="3" style="list-style-type: decimal;">
<li><p>然后在Windows中安装NoMachine,'''安装完后请重启下电脑'''</p></li>
<li><p>然后在Window中打开'''NoMachine'''</p>
<p>[[File:Orange_Pi_5_Ultra-image351.png|76x66px]]</p></li>
<li><p>NoMachine启动后会自动扫描局域网内其他安装有NoMachine的设备,进入NoMachine的主界面后就可以看到开发板已经在可连接的设备列表里了,然后点击下图红色方框所示的位置即可开始登录开发板的Linux系统桌面</p>
<p>[[File:Orange_Pi_5_Ultra-image352.png|321x92px]]</p></li>
<li><p>然后点击'''OK'''</p>
<p>[[File:Orange_Pi_5_Ultra-image353.png|402x275px]]</p></li>
<li><p>然后在下图对应的位置输入开发板Linux系统的用户名和密码,再点击'''OK'''开始登陆</p>
<p>[[File:Orange_Pi_5_Ultra-image354.png|406x274px]]</p></li>
<li><p>然后在接下来的界面中都点击OK</p></li>
<li><p>最后就能看到开发板Linux系统的桌面了</p>
<p>[[File:Orange_Pi_5_Ultra-image355.png|411x246px]]</p></li></ol>

<span id="使用vnc远程登录"></span>
=== 使用VNC远程登录 ===

'''操作前请先确保Windwos电脑和开发板在同一局域网内,并且能正常ssh登录开发板的Ubuntu或者Debian系统。'''

'''Ubuntu20.04测试VNC很多问题,请不要使用这种方法。'''

<ol style="list-style-type: decimal;">
<li><p>首先运行'''set_vnc.sh'''脚本设置下vnc,'''记得加sudo权限'''</p>
<p>orangepi@orangepi:~$ '''sudo set_vnc.sh'''</p>
<p>You will require a password to access your desktops.</p>
<p>Password: '''#在这里设置vnc的密码,8位字符'''</p>
<p>Verify: '''#在这里设置vnc的密码,8位字符'''</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 orangepi5ultra: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/orangepi5ultra:1.log</p>
<p>Killing Xtightvnc process ID 3047</p>
<p>New 'X' desktop is orangepi5ultra:1</p>
<p>Starting applications specified in /root/.vnc/xstartup</p>
<p>Log file is /root/.vnc/orangepi5ultra:1.log</p></li>
<li><p>使用MobaXterm软件连接开发板linux系统桌面的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li>首先点击Session,然后选择VNC,再填写开发板的IP地址和端口,最后点击OK确认</li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image356.png|576x410px]]

<ol start="2" style="list-style-type: lower-alpha;">
<li><p>然后输入前面设置的VNC的密码</p>
<p>[[File:Orange_Pi_5_Ultra-image357.png|274x131px]]</p></li>
<li><p>登录成功后的界面显示如下图所示,然后就可以远程操作开发板linux系统的桌面了</p>
<p>[[File:Orange_Pi_5_Ultra-image358.png|405x293px]]</p></li></ol>

<span id="linux系统支持的部分编程语言测试"></span>
== Linux系统支持的部分编程语言测试 ==

<span id="debian-bullseye系统"></span>
=== Debian Bullseye系统 ===

<ol style="list-style-type: decimal;">
<li><p>Debian Bullseye默认安装有gcc编译工具链,可以直接在开发板的Linux系统中编译C语言的程序</p>
<ol style="list-style-type: lower-alpha;">
<li><p>gcc的版本如下所示</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>编写C语言的'''hello_world.c'''程序</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>然后编译运行'''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默认安装有Python3</p>
<ol style="list-style-type: lower-alpha;">
<li><p>Python具体版本如下所示</p>
<p>orangepi@orangepi:~$ '''python3'''</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></li>
<li><p>编写Python语言的'''hello_world.py'''程序</p>
<p>orangepi@orangepi:~$ '''vim hello_world.py'''</p>
<p>print('Hello World!')</p></li>
<li><p>运行'''hello_world.py'''的结果如下所示</p>
<p>orangepi@orangepi:~$ '''python3 hello_world.py'''</p>
<p>Hello World!</p></li></ol>
</li>
<li><p>Debian Bullseye默认没有安装Java的编译工具和运行环境</p>
<ol style="list-style-type: lower-alpha;">
<li><p>可以使用下面的命令安装openjdk,Debian Bullseye中最新版本为openjdk-17</p>
<p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdk'''</p></li>
<li><p>安装完后可以查看下Java的版本</p>
<p>orangepi@orangepi:~$ '''java --version'''</p></li>
<li><p>编写Java版本的'''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>然后编译运行'''hello_world.java'''</p>
<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="debian-bookworm系统"></span>
=== Debian Bookworm系统 ===

<ol style="list-style-type: decimal;">
<li><p>Debian Bookworm默认安装有gcc编译工具链,可以直接在开发板的Linux系统中编译C语言的程序</p>
<ol style="list-style-type: lower-alpha;">
<li><p>gcc的版本如下所示</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 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>编写C语言的'''hello_world.c'''程序</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>然后编译运行'''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 Bookworm默认安装有Python3</p>
<ol style="list-style-type: lower-alpha;">
<li><p>Python具体版本如下所示</p>
<p>orangepi@orangepi:~$ '''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.</p>
<p>&gt;&gt;&gt;</p>
<p>'''使用Ctrl+D快捷键可退出python的交互模式。'''</p></li>
<li><p>编写Python语言的'''hello_world.py'''程序</p>
<p>orangepi@orangepi:~$ '''vim hello_world.py'''</p>
<p>print('Hello World!')</p></li>
<li><p>运行'''hello_world.py'''的结果如下所示</p>
<p>orangepi@orangepi:~$ '''python3 hello_world.py'''</p>
<p>Hello World!</p></li></ol>
</li>
<li><p>Debian Bookworm默认没有安装Java的编译工具和运行环境</p>
<ol style="list-style-type: lower-alpha;">
<li><p>可以使用下面的命令安装openjdk,Debian Bookworm中最新版本为openjdk-17</p>
<p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdk'''</p></li>
<li><p>安装完后可以查看下Java的版本</p>
<p>orangepi@orangepi:~$ '''java --version'''</p></li>
<li><p>编写Java版本的'''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>然后编译运行'''hello_world.java'''</p>
<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="ubuntu-focal系统"></span>
=== Ubuntu Focal系统 ===

<ol style="list-style-type: decimal;">
<li><p>Ubuntu Focal默认安装有gcc编译工具链,可以直接在开发板的Linux系统中编译C语言的程序</p>
<ol style="list-style-type: lower-alpha;">
<li><p>gcc的版本如下所示</p>
<p>orangepi@orangepi:~$ '''gcc --version'''</p>
<p>gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 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>编写C语言的'''hello_world.c'''程序</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>然后编译运行'''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 Focal默认安装有Python3</p>
<ol style="list-style-type: lower-alpha;">
<li><p>Python3具体版本如下所示</p>
<p>orangepi@orangepi:~$ '''python3'''</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></li>
<li><p>编写Python语言的'''hello_world.py'''程序</p>
<p>orangepi@orangepi:~$ '''vim hello_world.py'''</p>
<p>print('Hello World!')</p></li>
<li><p>运行'''hello_world.py'''的结果如下所示</p>
<p>orangepi@orangepi:~$ '''python3 hello_world.py'''</p>
<p>Hello World!</p></li></ol>
</li>
<li><p>Ubuntu Focal默认没有安装Java的编译工具和运行环境</p>
<ol style="list-style-type: lower-alpha;">
<li><p>可以使用下面的命令安装openjdk-17</p>
<p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdk'''</p></li>
<li><p>安装完后可以查看下Java的版本</p>
<p>orangepi@orangepi:~$ '''java --version'''</p>
<p>openjdk 17.0.12 2024-07-16</p>
<p>OpenJDK Runtime Environment (build 17.0.12+7-Ubuntu-1ubuntu220.04)</p>
<p>OpenJDK 64-Bit Server VM (build 17.0.12+7-Ubuntu-1ubuntu220.04, mixed mode, sharing)</p></li>
<li><p>编写Java版本的'''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>然后编译运行'''hello_world.java'''</p>
<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="ubuntu-jammy系统"></span>
=== Ubuntu Jammy系统 ===

<ol start="4" style="list-style-type: decimal;">
<li><p>Ubuntu Jammy默认安装有gcc编译工具链,可以直接在开发板的Linux系统中编译C语言的程序</p>
<ol style="list-style-type: lower-alpha;">
<li><p>gcc的版本如下所示</p>
<p>orangepi@orangepi:~$ '''gcc --version'''</p>
<p>gcc (Ubuntu 11.4.0-1ubuntu1~22.04) '''11.4.0'''</p>
<p>Copyright (C) 2021 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>编写C语言的'''hello_world.c'''程序</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>然后编译运行'''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默认安装有Python3</p>
<ol style="list-style-type: lower-alpha;">
<li><p>Python3具体版本如下所示</p>
<p>orangepi@orangepi:~$ '''python3'''</p>
<p>Python '''3.10.12''' (main, Jul 29 2024, 16:56:48) [GCC 11.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></li>
<li><p>编写Python语言的'''hello_world.py'''程序</p>
<p>orangepi@orangepi:~$ '''vim hello_world.py'''</p>
<p>print('Hello World!')</p></li>
<li><p>运行'''hello_world.py'''的结果如下所示</p>
<p>orangepi@orangepi:~$ '''python3 hello_world.py'''</p>
<p>Hello World!</p></li></ol>
</li>
<li><p>Ubuntu Jammy默认没有安装Java的编译工具和运行环境</p>
<ol style="list-style-type: lower-alpha;">
<li><p>可以使用下面的命令安装openjdk-18</p>
<p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-18-jdk'''</p></li>
<li><p>安装完后可以查看下Java的版本</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>编写Java版本的'''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>然后编译运行'''hello_world.java'''</p>
<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="qt的安装方法"></span>
== QT的安装方法 ==

<ol style="list-style-type: decimal;">
<li><p>使用下面的脚本可以安装QT5和QT Creator</p>
<p>orangepi@orangepi:~$ '''install_qt.sh'''</p></li>
<li><p>安装完后会自动打印QT的版本号</p>
<ol style="list-style-type: lower-alpha;">
<li><p>Ubuntu20.04自带的qt版本为'''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>Ubuntu22.04自带的QT版本为'''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>Debian11自带的QT版本为'''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>Debian12自带的QT版本为'''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-gnu</p></li></ol>
</li>
<li><p>然后在'''Applications'''中就可以看到QT Creator的启动图标</p>
<p>[[File:Orange_Pi_5_Ultra-image359.png|576x270px]]</p>
<p>也可以使用下面的命令打开QT Creator</p>
<p>orangepi@orangepi:~$ '''qtcreator'''</p>
<p>'''在QT和QT应用的启动过程中,如果提示下面的错误,请直接忽略,此错误对应用的运行不会有影响。'''</p>
<p>'''libGL error: failed to create dri screen'''</p>
<p>'''libGL error: failed to load driver: rockchip'''</p>
<p>'''libGL error: failed to create dri screen'''</p>
<p>'''libGL error: failed to load driver: rockchip'''</p></li>
<li><p>QT Creator打开后的界面如下所示</p>
<p>[[File:Orange_Pi_5_Ultra-image360.png|418x222px]]</p></li>
<li><p>QT Creator的版本如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>QT Creator在'''Ubuntu20.04'''中的默认版本如下所示</p>
<p>[[File:Orange_Pi_5_Ultra-image361.png|419x224px]]</p></li>
<li><p>QT Creator在'''Ubuntu22.04'''中的默认版本如下所示</p>
<p>[[File:Orange_Pi_5_Ultra-image362.png|443x237px]]</p></li>
<li><p>QT Creator在'''Debian11'''中的默认版本如下所示</p>
<p>[[File:Orange_Pi_5_Ultra-image363.png|444x238px]]</p></li>
<li><p>QT Creator在'''Debian12'''中的默认版本如下所示</p>
<p>[[File:Orange_Pi_5_Ultra-image364.png|449x277px]]</p></li></ol>
</li>
<li><p>然后设置下QT</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先打开'''Help'''-&gt;'''About Plugins...'''</p>
<p>[[File:Orange_Pi_5_Ultra-image365.png|573x164px]]</p></li>
<li><p>然后去掉'''ClangCodeModel'''的那个勾</p>
<p>[[File:Orange_Pi_5_Ultra-image366.png|408x254px]]</p></li>
<li><p>'''设置完后需要重启下QT Creator'''</p></li>
<li><p>然后确保QT Creator使用的GCC编译器,如果默认为Clang,请修改为GCC</p>
<p>'''Debian12请跳过这步。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image367.png|576x315px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image368.png|575x307px]]</p></li></ol>
</li>
<li><p>然后就可以打开一个示例代码</p>
<p>[[File:Orange_Pi_5_Ultra-image369.png|575x312px]]</p></li>
<li><p>点击示例代码后会自动打开对应的说明文档,可以仔细看下其中的使用说明</p>
<p>[[File:Orange_Pi_5_Ultra-image370.png|576x218px]]</p></li>
<li><p>然后点击下'''Configure Project'''</p>
<p>[[File:Orange_Pi_5_Ultra-image371.png|575x304px]]</p></li>
<li><p>然后点击左下角的绿色三角形编译运行下示例代码</p>
<p>[[File:Orange_Pi_5_Ultra-image372.png|575x312px]]</p></li>
<li><p>等待一段时间后,会弹出下图所示的界面,此时就说明QT能正常编译运行</p>
<p>[[File:Orange_Pi_5_Ultra-image373.png|576x308px]]</p></li>
<li><p>参考资料</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安装方法"></span>
== ROS安装方法 ==

<span id="ubuntu20.04安装ros-1-noetic的方法"></span>
=== Ubuntu20.04安装ROS 1 Noetic的方法 ===

# ROS 1当前活跃的版本如下所示,推荐版本为'''Noetic Ninjemys'''

[[File:Orange_Pi_5_Ultra-image374.png|345x235px]]

[[File:Orange_Pi_5_Ultra-image375.png|576x210px]]

[http://docs.ros.org/ '''http://docs.ros.org''']

'''https://wiki.ros.org/Distributions'''

<ol start="2" style="list-style-type: decimal;">
<li><p>ROS 1 '''Noetic Ninjemys'''官方安装文档链接如下所示:</p>
<p>[http://wiki.ros.org/noetic/Installation/Ubuntu '''http://wiki.ros.org/noetic/Installation/Ubuntu''']</p></li>
<li><p>ROS '''Noetic Ninjemys'''官方安装文档中Ubuntu推荐使用Ubuntu20.04,所以请确保开发板使用的系统为'''Ubuntu20.04桌面版系统'''</p>
<p>[http://wiki.ros.org/noetic/Installation '''http://wiki.ros.org/noetic/Installation''']</p>
<p>[[File:Orange_Pi_5_Ultra-image376.png|312x176px]]</p></li>
<li><p>然后使用下面的脚本安装ros1</p>
<p>orangepi@orangepi5ultra:~$ '''install_ros.sh ros1'''</p></li>
<li><p>使用ROS工具前,首先需要初始化下rosdep,然后编译源码时就能快速的安装一些系统依赖和一些ROS中的核心组件</p></li></ol>

'''注意,运行下面的命令需要确保开发板能正常访问github,否则会由于网络问题而报错。'''

'''install_ros.sh脚本会尝试修改/etc/hosts并自动运行下面的命令。但是这种方法无法保证每次都能正常访问github,如果install_ros.sh安装完ros1后有提示下面的错误,请自己想其它办法让开发板的linux系统能正常访问github,然后再手动运行下面的命令。'''

'''https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml'''

'''Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml'''

'''ERROR: error loading sources list:'''

'''The read operation timed out'''

orangepi@orangepi:~$ '''source /opt/ros/noetic/setup.bash'''

orangepi@orangepi:~$ '''sudo rosdep init'''

Wrote /etc/ros/rosdep/sources.list.d/20-default.list

Recommended: please run

rosdep update

orangepi@orangepi:~$ '''rosdep update'''

reading in sources list data from /etc/ros/rosdep/sources.list.d

Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml

Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml

Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml

Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml

Hit https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml

Query rosdistro index https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml

Skip end-of-life distro &quot;ardent&quot;

Skip end-of-life distro &quot;bouncy&quot;

Skip end-of-life distro &quot;crystal&quot;

Skip end-of-life distro &quot;dashing&quot;

Skip end-of-life distro &quot;eloquent&quot;

Add distro &quot;foxy&quot;

Add distro &quot;galactic&quot;

Skip end-of-life distro &quot;groovy&quot;

Add distro &quot;humble&quot;

Skip end-of-life distro &quot;hydro&quot;

Skip end-of-life distro &quot;indigo&quot;

Skip end-of-life distro &quot;jade&quot;

Skip end-of-life distro &quot;kinetic&quot;

Skip end-of-life distro &quot;lunar&quot;

Add distro &quot;melodic&quot;

Add distro &quot;noetic&quot;

Add distro &quot;rolling&quot;

updated cache in /home/orangepi/.ros/rosdep/sources.cache

<ol start="6" style="list-style-type: decimal;">
<li><p>然后在'''桌面'''中打开一个命令行终端窗口,再使用'''test_ros.sh'''脚本可以启动一个小海龟的例程来测试下ROS是否能正常使用</p>
<p>orangepi@orangepi:~$ '''test_ros.sh'''</p></li>
<li><p>运行完'''test_ros.sh'''脚本后,会弹出下图所示的一个小海龟</p>
<p>[[File:Orange_Pi_5_Ultra-image377.png|576x276px]]</p></li>
<li><p>然后请保持刚才打开终端窗口在最上面</p></li></ol>

[[File:Orange_Pi_5_Ultra-image378.png|576x275px]]

<ol start="9" style="list-style-type: decimal;">
<li><p>此时按下键盘上的方向按键就可以控制小海龟上下左右移动了</p>
<p>[[File:Orange_Pi_5_Ultra-image379.png|575x296px]]</p></li></ol>

<span id="ubuntu20.04安装ros-2-galactic的方法"></span>
=== Ubuntu20.04安装ROS 2 Galactic的方法 ===

<ol style="list-style-type: decimal;">
<li><p>ROS 2当前活跃的版本如下所示,推荐版本为'''Galactic Geochelone'''</p>
<p>[[File:Orange_Pi_5_Ultra-image380.png|576x271px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image381.png|575x265px]]</p>
<p>[http://docs.ros.org/ '''http://docs.ros.org''']</p>
<p>'''http://docs.ros.org/en/galactic/Releases.html'''</p></li>
<li><p>ROS 2 '''Galactic Geochelone'''官方安装文档链接如下所示:</p>
<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>ROS 2 '''Galactic Geochelone'''官方安装文档中Ubuntu Linux推荐使用Ubuntu20.04,所以请确保开发板使用的系统为'''Ubuntu20.04桌面版系统'''。安装ROS 2有几种方法,下面演示下通过'''Debian packages'''的方式来安装ROS 2 '''Galactic Geochelone'''</p></li>
<li><p>使用'''install_ros.sh'''脚本可以安装ros2</p>
<p>orangepi@orangepi:~$ '''install_ros.sh ros2'''</p></li>
<li><p>'''install_ros.sh'''脚本安装完ros2后会自动运行下'''ros2 -h'''命令,如果能看到下面的打印,说明ros2安装完成</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>
<p>optional arguments:</p>
<p>-h, --help show this help message and exit</p>
<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>
<p>Call `ros2 &lt;command&gt; -h` for more detailed usage.</p></li>
<li><p>然后可以使用 '''test_ros.sh'''脚本测试下ROS 2是否安装成功,如果能看到下面的打印,说明ROS 2能正常运行</p>
<p>orangepi@orangepi5ultra:~$ '''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>运行下面的命令可以打开rviz2</p>
<p>orangepi@orangepi:~$ '''source /opt/ros/galactic/setup.bash'''</p>
<p>orangepi@orangepi:~$ '''ros2 run rviz2 rviz2'''</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image382.png|576x324px|1]]

</div></li>
<li><p>ROS的使用方法请参考下ROS 2的文档</p>
<p>[http://docs.ros.org/en/galactic/Tutorials.html '''http://docs.ros.org/en/galactic/Tutorials.html''']</p></li></ol>

<span id="ubuntu22.04安装ros-2-humble的方法"></span>
=== Ubuntu22.04安装ROS 2 Humble的方法 ===

<ol style="list-style-type: decimal;">
<li><p>使用'''install_ros.sh'''脚本可以安装ros2</p>
<p>orangepi@orangepi:~$ '''install_ros.sh ros2'''</p></li>
<li><p>'''install_ros.sh'''脚本安装完ros2后会自动运行下'''ros2 -h'''命令,如果能看到下面的打印,说明ros2安装完成</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>
<p>optional arguments:</p>
<p>-h, --help show this help message and exit</p>
<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>
<p>Call `ros2 &lt;command&gt; -h` for more detailed usage.</p></li>
<li><p>然后可以使用 '''test_ros.sh'''脚本测试下ROS 2是否安装成功,如果能看到下面的打印,说明ROS 2能正常运行</p>
<p>orangepi@orangepi5ultra:~$ '''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>运行下面的命令可以打开rviz2</p>
<p>orangepi@orangepi:~$ '''source /opt/ros/humble/setup.bash'''</p>
<p>orangepi@orangepi:~$ '''ros2 run rviz2 rviz2'''</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image383.png|576x324px|1]]

</div></li>
<li><p>参考文档</p>
<p>'''http://docs.ros.org/en/humble/index.html'''</p>
<p>[http://docs.ros.org/en/galactic/Tutorials.html '''http://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html''']</p></li></ol>

== 安装内核头文件的方法 ==

<ol style="list-style-type: decimal;">
<li><p>OPi发布的Linux镜像默认自带了内核头文件的deb包,存放的位置为'''/opt/'''</p>
<p>'''不同内核版本的内核头文件的deb包的名字可能不同,请以实际看到的为准。'''</p>
<p>orangepi@orangepi:~$ '''ls /opt/linux-headers*'''</p>
<p>/opt/linux-headers-legacy-rockchip-rk3588_x.x.x_arm64.deb</p></li>
<li><p>使用下面的命令可以安装内核头文件的deb包</p>
<p>'''内核头文件deb包的名字需要替换为实际的名字,请不要照抄。'''</p>
<p>orangepi@orangepi:~$ '''sudo dpkg -i /opt/linux-headers-legacy-rockchip-rk3588_1.x.x_arm64.deb'''</p></li>
<li><p>安装完后在'''/usr/src'''下就能看到内核头文件所在的文件夹</p>
<p>orangepi@orangepi:~$ '''ls /usr/src'''</p>
<p>linux-headers-5.10.160-rockchip-rk3588</p></li>
<li><p>然后可以编写一个hello内核模块测试下内核头文件</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先编写hello内核模块的代码,如下所示:</p>
<p>orangepi@orangepi:~$ '''vim hello.c'''</p>
<p>#include &lt;linux/init.h&gt;</p>
<p>#include &lt;linux/module.h&gt;</p>
<p>static int hello_init(void)</p>
<p>{</p>
<p>printk(&quot;Hello Orange Pi -- init\n&quot;);</p>
<p>return 0;</p>
<p>}</p>
<p>static void hello_exit(void)</p>
<p>{</p>
<p>printk(&quot;Hello Orange Pi -- exit\n&quot;);</p>
<p>return;</p>
<p>}</p>
<p>module_init(hello_init);</p>
<p>module_exit(hello_exit);</p>
<p>MODULE_LICENSE(&quot;GPL&quot;);</p></li>
<li><p>然后编写编译hello内核模块的Makefile文件,如下所示:</p>
<p>orangepi@orangepi:~$ '''vim Makefile'''</p>
<p>ifneq ($(KERNELRELEASE),)</p>
<p>obj-m:=hello.o</p>
<p>else</p>
<p>KDIR :=/lib/modules/$(shell uname -r)/build</p>
<p>PWD :=$(shell pwd)</p>
<p>all:</p>
<p>make -C $(KDIR) M=$(PWD) modules</p>
<p>clean:</p>
<p>rm -f *.ko *.o *.mod.o *.mod *.symvers *.cmd *.mod.c *.order</p>
<p>endif</p></li>
<li><p>然后使用make命令编译hello内核模块,编译过程的输出如下所示:</p>
<p>'''如果复制的代码这里编译如果有问题,可以直接使用linux系统中预装的源码,hello源码的路径为:/usr/src/hello。'''</p>
<p>orangepi@orangepi:~$ '''sudo make'''</p>
<p>make -C /lib/modules/5.10.160-rockchip-rk3588/build M=/home/orangepi modules</p>
<p>make[1]: Entering directory '/usr/src/linux-headers-5.10.160-rockchip-rk3588'</p>
<p>CC [M] /home/orangepi/hello.o</p>
<p>MODPOST /home/orangepi/Module.symvers</p>
<p>CC [M] /home/orangepi/hello.mod.o</p>
<p>LD [M] /home/orangepi/hello.ko</p>
<p>make[1]: Leaving directory '/usr/src/linux-headers-5.10.160-rockchip-rk3588'</p></li>
<li><p>编译完后会生成'''hello.ko'''内核模块</p>
<p>orangepi@orangepi:~$ '''ls *.ko'''</p>
<p>hello.ko</p></li>
<li><p>使用'''insmod'''命令可以将'''hello.ko'''内核模块插入内核中</p>
<p>orangepi@orangepi:~$ '''sudo insmod hello.ko'''</p></li>
<li><p>然后使用'''demsg'''命令可以查看下'''hello.ko'''内核模块的输出,如果能看到下面的输出说明'''hello.ko'''内核模块加载正确</p>
<p>orangepi@orangepi:~$ '''dmesg | grep &quot;Hello&quot;'''</p>
<p>[ 2871.893988] '''Hello Orange Pi -- init'''</p></li>
<li><p>使用'''rmmod'''命令可以卸载'''hello.ko'''内核模块</p>
<p>orangepi@orangepi:~$ '''sudo rmmod hello'''</p>
<p>orangepi@orangepi:~$ '''dmesg | grep &quot;Hello&quot;'''</p>
<p>[ 2871.893988] Hello Orange Pi -- init</p>
<p>[ 3173.800892] '''Hello Orange Pi -- exit'''</p></li></ol>
</li></ol>

<span id="寸mipi-lcd屏幕的使用方法"></span>
== 10.1寸MIPI LCD屏幕的使用方法 ==

<span id="寸mipi-屏幕的组装方法"></span>
=== 10.1寸MIPI 屏幕的组装方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先准备需要的配件</p>
<ol style="list-style-type: lower-alpha;">
<li><p>10.1寸MIPI LCD显示屏+触摸屏</p>
<p>[[File:Orange_Pi_5_Ultra-image384.png|264x204px]]</p></li>
<li><p>屏幕转接板+31pin转40pin排线</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image385.png|170x147px|DD9A8F44-0D8F-4f06-9473-B539DEED850C]]

</div></li>
<li><p>30pin MIPI排线</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image386.png|487x45px|C2164119-6EC3-49ae-9A95-BE323F51FAE1]]

</div></li>
<li><p>12pin 触摸屏排线</p>
<p>[[File:Orange_Pi_5_Ultra-image387.png|296x43px]]</p></li></ol>
</li>
<li><p>按照下图将12pin 触摸屏排线、31pin转40pin排线、30pin MIPI排线接到屏幕转接板上,注意'''触摸屏排线蓝色的绝缘面朝下''',其它两根排线绝缘面朝上,如果接错会导致无显示或者不能触摸的问题</p>
<p>[[File:Orange_Pi_5_Ultra-image388.png|574x142px]]</p></li>
<li><p>按照下图将连接好排线的转接板置于MIPI LCD屏上面,并通过31pin转40pin排线连接MIPI LCD屏与转接板</p></li></ol>

[[File:Orange_Pi_5_Ultra-image389.png|253x372px]]

<ol start="4" style="list-style-type: decimal;">
<li><p>然后通过12pin触摸屏排线连接触摸屏与转接板,注意绝缘面的朝向</p>
<p>[[File:Orange_Pi_5_Ultra-image390.png|159x101px]]</p></li>
<li><p>最后通过30pin MIPI排线连接到开发板的LCD接口上</p>
<p>[[File:Orange_Pi_5_Ultra-image391.png|410x250px]]</p></li></ol>

<span id="打开10.1寸mipi-lcd屏幕配置的方法"></span>
=== 打开10.1寸MIPI LCD屏幕配置的方法 ===

# linux镜像默认是没有打开mipi lcd屏幕的配置的,如果需要使用mipi lcd屏幕,需要手动打开才行。
# 开发板上mipi lcd屏幕的接口的位置如下图所示:

<div class="figure">

[[File:Orange_Pi_5_Ultra-image392.png|326x207px|IMG_256]]

</div>
<ol start="3" style="list-style-type: decimal;">
<li><p>打开mipi lcd配置的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|361x188px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image393.png|362x167px]]</p></li>
<li><p>然后使用键盘的方向键定位到'''opi5ultra-lcd''',再使用'''空格'''选中</p>
<p>[[File:Orange_Pi_5_Ultra-image394.png|354x53px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image395.png|263x123px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image396.png|264x116px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image397.png|265x123px]]</p>
<p>'''上面的设置最终会在/boot/orangepiEnv.txt中加入overlays=opi5ultra-lcd。设置完后可以先检查下。如果不存在这行配置,那么设置就是有问题。'''</p>
<p>'''如果觉得使用orangepi-config比较麻烦,也可以使用vim编辑器打开/boot/orangepiEnv.txt,然后加入overlays=opi5ultra-lcd这行配置也是可以。'''</p>
<p>orangepi@orangepi:~$ '''cat /boot/orangepiEnv.txt | grep &quot;lcd&quot;'''</p>
<p>'''overlays=opi5ultra-lcd #示例配置'''</p></li></ol>
</li>
<li><p>启动后可以看到lcd屏幕的显示如下所示(默认为竖屏):</p></li></ol>

[[File:Orange_Pi_5_Ultra-image398.png|192x277px]]

=== 服务器版镜像旋转显示方向的方法 ===

<ol style="list-style-type: decimal;">
<li><p>在'''/boot/orangepiEnv.txt'''中加入'''extraargs=fbcon=rotate:要旋转的方向'''这行配置就可以设置服务器版本的linux系统显示的方向,其中'''fbcon=rotate:'''后面的数字可以设置为:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>0: 正常屏(默认为竖屏)</p></li>
<li><p>1: 顺时钟转90度</p></li>
<li><p>2: 翻转180度</p></li>
<li><p>3: 顺时钟转270度</p>
<p>orangepi@orangepi:~$ '''sudo vim /boot/orangepiEnv.txt'''</p>
<p>'''extraargs=cma=128M fbcon=rotate:3'''</p>
<p>overlays=opi5ultra-disable-leds</p>
<p>'''注意,/boot/orangepiEnv.txt中如果默认有extraargs=cma=128M这行配置,fbcon=rotate:3这个配置添加到extraargs=cma=128M的后面即可(需要用空格隔开)。'''</p></li></ol>
</li>
<li><p>然后'''重启'''linux系统就能看到lcd屏幕显示的方向已经旋转了</p></li></ol>

=== 桌面版镜像旋转显示和触摸方向的方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先在linux系统中打开'''Display'''设置</p>
<p>[[File:Orange_Pi_5_Ultra-image399.png|298x206px]]</p></li>
<li><p>然后在'''Rotation'''中选择想要旋转的方向</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''None''': 不旋转</p></li>
<li><p>'''Left''': 向左旋转90度</p></li>
<li><p>'''Inverted''': 上下翻转,相当于旋转180度</p></li>
<li><p>'''Right''': 向右旋转90度</p>
<p>[[File:Orange_Pi_5_Ultra-image400.png|286x180px]]</p></li></ol>
</li>
<li><p>然后点击'''Apply'''</p>
<p>[[File:Orange_Pi_5_Ultra-image401.png|330x207px]]</p></li>
<li><p>然后选择'''Keep this configuration'''</p>
<p>[[File:Orange_Pi_5_Ultra-image402.png|374x210px]]</p></li>
<li><p>此时屏幕显示就已旋转完成,然后关闭掉'''Display'''程序即可</p></li>
<li><p>上面的步骤只会选择显示方向,并不会旋转触摸的方向,使用'''set_lcd_rotate.sh'''脚本可以旋转下触摸的方向,此脚本设置完后会自动重启,然后就可以测试触摸是否已经能正常使用了</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''None''': 不旋转</p>
<p>orangepi@orangepi:~$ '''set_lcd_rotate.sh none'''</p></li>
<li><p>'''Left''': 向左旋转90度</p>
<p>orangepi@orangepi:~$ '''set_lcd_rotate.sh left'''</p></li>
<li><p>'''Inverted''': 上下翻转,相当于旋转180度</p>
<p>orangepi@orangepi:~$ '''set_lcd_rotate.sh inverted'''</p></li>
<li><p>'''Right''': 向右旋转90度</p>
<p>orangepi@orangepi:~$ '''set_lcd_rotate.sh right'''</p>
<p>'''set_lcd_rotate.sh脚本主要做四件事:'''</p></li></ol>
</li></ol>

<!-- -->
<ol style="list-style-type: decimal;">
<li><p>'''旋转framebuffer显示的方向'''</p></li>
<li><p>'''旋转触摸的方向'''</p></li>
<li><p>'''关闭开机logo'''</p></li>
<li><p>'''重启系统'''</p>
<p>'''旋转触摸的方向是通过在/usr/share/X11/xorg.conf.d/40-libinput.conf中加入Option &quot;TransformationMatrix&quot; &quot;x x x x x x x x x&quot;这行配置来实现的。其中&quot;x x x x x x x x x&quot;不同的方向配置不同。'''</p></li></ol>

<!-- -->
<ol start="7" style="list-style-type: decimal;">
<li><p>触摸旋转参考资料</p>
<p>[https://wiki.ubuntu.com/X/InputCoordinateTransformation '''https://wiki.ubuntu.com/X/InputCoordinateTransformation''']</p></li></ol>

== 开关机logo使用说明 ==

<ol style="list-style-type: decimal;">
<li><p>开关机logo默认只在桌面版的系统中才会显示</p></li>
<li><p>在'''/boot/orangepiEnv.txt'''中设置'''bootlogo'''变量为'''false'''可以关闭开关机logo</p>
<p>orangepi@orangepi:~$ '''vim /boot/orangepiEnv.txt'''</p>
<p>verbosity=1</p>
<p>'''bootlogo=false'''</p></li>
<li><p>在'''/boot/orangepiEnv.txt'''中设置'''bootlogo'''变量为'''true'''可以开启开关机logo</p>
<p>orangepi@orangepi:~$ '''vim /boot/orangepiEnv.txt'''</p>
<p>verbosity=1</p>
<p>'''bootlogo=true'''</p></li>
<li><p>开机logo图片在linux系统中的位置为</p>
<p>'''/usr/share/plymouth/themes/orangepi/watermark.png'''</p></li>
<li><p>替换开机logo图片后需要运行下命令才能生效</p>
<p>orangepi@orangepi:~$ '''sudo update-initramfs -u'''</p></li></ol>

<span id="ov13850和ov13855-mipi摄像头的测试方法"></span>
== OV13850和OV13855 MIPI摄像头的测试方法 ==

'''请注意,在Linux 系统中,为了确保3A服务能够正常运行并获取正常的摄像头图像,需要禁用Docker服务。如果Docker服务未被禁用,摄像头捕捉的图像将不包含3A效果,呈现为偏暗的图像。禁用Docker服务的方法如下所示:'''

orangepi@orangepi:~$ '''sudo systemctl disable docker.socket docker.service containerd.service'''

orangepi@orangepi:~$ '''sudo reboot'''

目前开发板支持两款MIPI摄像头,OV13850和OV13855,具体的图片如下所示:

<ol style="list-style-type: lower-alpha;">
<li><p>1300万MIPI接口的OV13850摄像头</p>
<p>[[File:Orange_Pi_5_Ultra-image18.png|184x103px]]</p></li>
<li><p>1300万MIPI接口的OV13855摄像头</p>
<p>[[File:Orange_Pi_5_Ultra-image19.png|173x102px]]</p>
<p>OV13850和OV13855摄像头使用的转接板和FPC排线是一样的,只是两款摄像头接在转接板上的位置不一样。FPC排线如下图所示,请注意FPC排线是有方向的,标注'''TO MB'''那端需要插到开发板的摄像头接口中,标注'''TO CAMERA'''那端需要插到摄像头转接板上。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image403.png|343x72px]]

摄像头转接板上总共有3个摄像头的接口,同一时间只能接一个使用,如下图所示,其中:

<ol style="list-style-type: lower-alpha;">
<li><p>'''1号接口接OV13850摄像头'''</p></li>
<li><p>'''2号接口接OV13855摄像头'''</p></li>
<li><p>3号接口未使用,忽略即可</p></li></ol>

[[File:Orange_Pi_5_Ultra-image404.png|240x143px]]

Orange Pi 5 Ultra开发板上总共有3个摄像头接口,我们定义Cam0、Cam1和Cam2的位置如下图所示:

[[File:Orange_Pi_5_Ultra-image405.png|243x158px]] [[File:Orange_Pi_5_Ultra-image406.png|239x159px]]

摄像头插在开发板的Cam0接口的方法如下所示:

[[File:Orange_Pi_5_Ultra-image407.png|300x156px]]

摄像头插在开发板的Cam1接口的方法如下所示:

[[File:Orange_Pi_5_Ultra-image408.png|291x219px]]

摄像头插在开发板的Cam2接口的方法如下所示:

[[File:Orange_Pi_5_Ultra-image409.png|296x290px]]

连接好摄像头到开发板上后,我们可以使用下面的方法来测试下摄像头:

<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
<p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:Orange_Pi_5_Ultra-image169.png|407x211px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:Orange_Pi_5_Ultra-image273.png|403x174px]]</p></li>
<li><p>然后使用使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的摄像头,其中'''opi5ultra-cam0'''表示在开发板的Cam0接口中使用ov13850或ov13855摄像头,'''opi5ultra-cam1'''表示在开发板的Cam1接口中使用ov13850或ov13855摄像头,'''opi5ultra-cam2'''表示在开发板的Cam2接口中使用ov13850或ov13855摄像头。</p>
<p>[[File:Orange_Pi_5_Ultra-image410.png|410x62px]]</p></li>
<li><p>然后选择'''&lt;Save&gt;'''保存</p>
<p>[[File:Orange_Pi_5_Ultra-image411.png|410x132px]]</p></li>
<li><p>然后选择'''&lt;Back&gt;'''</p>
<p>[[File:Orange_Pi_5_Ultra-image412.png|412x105px]]</p></li>
<li><p>然后选择'''&lt;Reboot&gt;'''重启系统使配置生效</p>
<p>[[File:Orange_Pi_5_Ultra-image277.png|322x142px]]</p></li>
<li><p>然后在桌面系统中打开一个终端,再运行下面的脚本</p>
<p>orangepi@orangepi:~$ '''test_camera.sh'''</p></li>
<li><p>然后就能看到摄像头的预览画面了</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image413.png|576x324px|1]]

</div>
<p>除了单摄外, 我们还可以同时使用两个摄像头或者三个摄像头(支持ov13850和ov13855混搭)。接好三摄后,然后和前面步骤一样,通过'''orangepi-config'''打开Cam0+Cam1+Cam2的配置,再重启系统,然后在桌面中打开终端运行'''test_camera.sh'''脚本即可看到三个摄像头的预览画面,如下图所示:</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image414.png|576x324px|Screenshot_2024-03-28_17-19-32]]

</div></li></ol>

<span id="zfs文件系统的使用方法"></span>
== ZFS文件系统的使用方法 ==

<span id="安装zfs的方法"></span>
=== 安装ZFS的方法 ===

'''安装zfs前,请先确保使用的linux镜像为最新版本。另外,如果系统中已经安装了zfs,就无需重复安装了。'''

安装zfs前首先需要安装内核头文件,安装内核头文件的方法请参考[[#安装内核头文件的方法|'''安装内核头文件的方法''']]小节的说明。

在Ubuntu20.04、Ubuntu22.04和Debian11系统中,zfs是无法通过apt直接安装的,这是因为默认的apt源中zfs版本低于2.1.6,存在和rk linux5.10内核不兼容的问题,这个问题在zfs的2.1.6及以后的版本中得到了修复。

为了解决这个问题,我们提供了能正常安装的zfs的deb包,可以从开发板的[http://www.orangepi.cn/html/serviceAndSupport/index.html '''官方工具''']中下载到。打开'''官方工具''',然后进入'''Ubuntu和Debian系统使用的zfs相关的deb包'''文件夹后,可以看到Ubuntu20.04、Ubuntu22.04和Debian11三种类型的deb包,请下载需要的版本。

[[File:Orange_Pi_5_Ultra-image415.png|232x136px]]

下载完对应版本的zfs deb包后,请将它们上传到开发板的Linux系统中。上传方法请参考[[#上传文件到开发板linux系统中的方法|'''上传文件到开发板Linux系统中的方法''']]小节的说明。

上传完成后,再在开发板linux系统的命令行中使用'''cd'''命令进入deb包的目录,然后使用下面的命令就可以安装zfs的deb包。

orangepi@orangepi:~$ '''sudo apt -y install ./*.deb'''

然后重启下linux系统就能看到zfs内核模块会自动加载了:

orangepi@orangepi:~$ '''lsmod | grep &quot;zfs&quot;'''

zfs 2801664 0

zunicode 327680 1 zfs

zzstd 471040 1 zfs

zlua 139264 1 zfs

zcommon 69632 1 zfs

znvpair 61440 2 zfs,zcommon

zavl 16384 1 zfs

icp 221184 1 zfs

spl 77824 6 zfs,icp,zzstd,znvpair,zcommon,zavl

在Debian12中,zfs的默认版本为2.1.11,所以我们可以通过下面的命令直接安装zfs,再次提醒下,安装前需要确保系统已安装内核头文件的deb包。

orangepi@orangepi:~$ '''sudo apt install -y zfsutils-linux zfs-dkms'''

<span id="创建zfs池的方法"></span>
=== 创建ZFS池的方法 ===

'''ZFS是基于存储池的,我们可以将多个物理存储设备添加到池中,然后从这个池中分配存储空间。'''

'''下面的内容是基于开发板接了一个NVMe SSD和一个U盘来演示的。'''

<ol style="list-style-type: decimal;">
<li><p>首先我们可以通过'''lsblk'''命令查看下开发板所有的存储设备,当前开发板接了一个NVMe SSD以及一个U盘,输出如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image416.png|379x227px]]</p></li>
<li><p>然后输入下面的命令可以创建一个ZFS池,包含NVMe SSD和U盘两个存储设备</p>
<p>orangepi@orangepi:~$ '''sudo zpool create -f pool1 /dev/nvme0n1 /dev/sda'''</p></li>
<li><p>然后使用'''zpool list'''命令可以看到系统已经创建了一个名为'''pool1'''的ZFS池,并且ZFS池pool1的大小是NVME SSD的大小加上U盘的大小</p>
<p>[[File:Orange_Pi_5_Ultra-image417.png|576x37px]]</p></li>
<li><p>然后执行'''df -h'''可以看到'''pool1'''被挂载到了'''/pool1'''目录</p>
<p>orangepi@orangepi:~$ '''df -h'''</p>
<p>Filesystem Size Used Avail Use% Mounted on</p>
<p>tmpfs 1.6G 18M 1.6G 2% /run</p>
<p>/dev/mmcblk0p2 29G 6.0G 22G 22% /</p>
<p>tmpfs 7.7G 46M 7.7G 1% /dev/shm</p>
<p>tmpfs 5.0M 4.0K 5.0M 1% /run/lock</p>
<p>tmpfs 7.7G 944K 7.7G 1% /tmp</p>
<p>/dev/mmcblk0p1 1022M 115M 908M 12% /boot</p>
<p>/dev/zram1 188M 4.5M 169M 3% /var/log</p>
<p>tmpfs 1.6G 80K 1.6G 1% /run/user/1000</p>
<p>'''pool1 489G 9.3M 489G 1% /pool1'''</p></li>
<li><p>使用下面的命令可以看到pool1的文件系统类型为zfs</p>
<p>orangepi@orangepi:~$ '''mount | grep pool1'''</p>
<p>pool1 on /pool1 type '''zfs''' (rw,xattr,noacl)</p></li>
<li><p>然后我们可以测试下拷贝一个文件到ZFS池中</p>
<p>orangepi@orangepi:~$ '''sudo cp -v /usr/local/test.mp4 /pool1/'''</p>
<p>'/usr/local/test.mp4' -&gt; '/pool1/test.mp4'</p></li></ol>

<span id="测试zfs的数据去重功能"></span>
=== 测试ZFS的数据去重功能 ===

<ol style="list-style-type: decimal;">
<li><p>ZFS的数据去重功能默认是关闭的,我们需要执行下面的命令打开</p>
<p>orangepi@orangepi:~$ '''sudo zfs set dedup=on pool1'''</p></li>
<li><p>然后做一个简单的测试,首先进入pool1中,再执行下面的命令生成1个1G大小的随机文件</p>
<p>orangepi@orangepi:~$ '''cd /pool1/'''</p>
<p>root@orangepi:/pool1$ '''sudo dd if=/dev/urandom of=test.1g bs=1M count=1024'''</p>
<p>1024+0 records in</p>
<p>1024+0 records out</p>
<p>1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.04367 s, 213 MB/s</p></li>
<li><p>然后使用下面的命令将1G大小的随机文件拷贝1000份</p></li></ol>

root@orangepi:/pool1$ '''for ((i=0; i&lt;1000; i++)); do sudo cp test.1g $i.test.1g; done'''

<ol start="4" style="list-style-type: decimal;">
<li>然后用'''du -lh'''可以看到目前池中总共有1002G的数据,但实际上ZFS池的大小只有'''504GB'''(SSD+U盘的总容量),是装不下那么大的数据的</li></ol>

root@orangepi:/pool1$ '''du -lh'''

1002G

<ol start="5" style="list-style-type: decimal;">
<li><p>然后用'''zpool list'''命令可以看到实际只占用了1.01G,因为这1001个文件都是重复的,说明数据去重功能有效。</p>
<p>[[File:Orange_Pi_5_Ultra-image418.png|576x36px]]</p></li></ol>

<span id="测试zfs的数据压缩功能"></span>
=== 测试ZFS的数据压缩功能 ===

# 因为存储的数据不同,压缩节省的磁盘空间也会有所不同,所以我们选择压缩比较大的纯文本文件来进行压缩测试,执行下面的命令将'''/var/log/'''和'''/etc/'''目录打包成tar包

orangepi@orangepi:~$ '''cd /pool1/'''

root@orangepi:/pool1$ '''sudo tar -cf text.tar /var/log/ /etc/'''

<ol start="2" style="list-style-type: decimal;">
<li><p>然后通过'''ls -lh'''命令可以看到的文件大小以及在ZFS池中占用的空间都是'''27M'''</p>
<p>[[File:Orange_Pi_5_Ultra-image419.png|576x90px]]</p></li>
<li><p>然后我们在ZFS池pool1中启用压缩功能</p>
<p>root@orangepi:/pool1$ '''sudo zfs set compression=lz4 pool1'''</p></li>
<li><p>然后再次执行下面的命令将'''/var/log/'''和'''/etc/'''目录打包成tar包</p></li></ol>

root@orangepi:/pool1$ '''sudo tar -cf text.tar /var/log/ /etc/'''

<ol start="5" style="list-style-type: decimal;">
<li>这时可以看到'''text.tar'''文件大小还是27M,但是在ZFS池中只占用9.47M的空间,说明文件被压缩了</li></ol>

[[File:Orange_Pi_5_Ultra-image420.png|576x79px]]

<span id="casaos安装和使用方法"></span>
== CasaOS安装和使用方法 ==

'''CasaOS是一个基于Docker生态系统的开源家庭云系统,它可以让您在自己的开发板上运行各种各样的家庭应用程序,例如NAS、家庭自动化、媒体服务器等。'''

<span id="casaos的安装方法"></span>
=== CasaOS的安装方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先需要安装docker,Orangepi Pi发布的系统中已经预装了docker,这步可以跳过,可以使用下面的命令查看安装的docker的版本</p>
<p>orangepi@orangepi:~$ '''docker --version'''</p></li>
<li><p>然后在linux系统中输入下面的命令就可以开始CasaOS的安装</p></li></ol>

orangepi@orangepi:~$ '''curl -fsSL https://get.casaos.io | sudo bash'''

<ol start="3" style="list-style-type: decimal;">
<li><p>当看到终端输出下面的打印信息时,说明CasaOS已经安装完成</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image421.png|552x305px|2023-10-10 17-42-14屏幕截图]]

</div></li></ol>

<span id="casaos的使用方法"></span>
=== CasaOS的使用方法 ===

<ol style="list-style-type: decimal;">
<li><p>安装完CasaOS后,在浏览器中输入'''http://开发板的IP地址'''就可以打开CasaOS</p></li>
<li><p>打开CasaOS后会弹出下面的欢迎界面,点击”Go”进入下一步</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image422.png|552x304px|Screenshot from 2023-10-10 17-29-31]]

</div></li>
<li><p>当第一次登录CasaOS时,登录界面是设置账号密码的界面,以后再登录时,就只会出现输入账号密码的界面了,在设置好账号密码后,点击”Create”进入下一步</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image423.png|552x304px|Screenshot from 2023-10-10 17-29-38]]

</div></li>
<li><p>在下面的界面中直接点击”Accept”进入下一步</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image424.png|552x304px|Screenshot from 2023-10-10 17-30-09]]

</div></li>
<li><p>现在就进入到CasaOS的主页面了,左上角有三个图标,可以进行功能设置,左边是性能面板,可以显示当前时间以及显示CPU、RAM、存储、网络的状态信息,右边是功能面板,有搜索、应用推荐、应用商店和文件管理等功能</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image425.png|552x304px|Screenshot from 2023-10-10 17-30-24(1)]]

</div></li>
<li><p>可以点击左上角的第一个图标修改账号和密码</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image426.png|552x304px|Screenshot from 2023-10-10 17-31-01]]

</div></li>
<li><p>可以点击第二个图标进行基本功能的设置</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image427.png|552x304px|Screenshot from 2023-10-10 17-31-15]]

</div></li>
<li><p>左上角的第三个图标主要有两个功能,分别是切换到命令行模式和打印日志信息,在切换到命令行模式时,需要输入账号和密码,这里的账号和密码是指开发板Linux系统的账号和密码,端口系统默认选择22号</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image428.png|552x304px|Screenshot from 2023-10-10 17-32-05]]

</div></li>
<li><p>然后点击”Connect”,就可以进入命令行界面:</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image429.png|552x304px|Screenshot from 2023-10-10 17-32-14]]

</div></li>
<li><p>在第三个图标下另一个功能是打印CasaOS的日志,点击”Logs”即可进入,界面如下所示:</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image430.png|552x304px|Screenshot from 2023-10-10 17-32-19]]

</div></li>
<li><p>点击左下角的”Widget settings”,可以设置在主页面是否显示性能面板的小部件</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image431.png|552x304px|Screenshot from 2023-10-10 17-38-43]]

</div></li>
<li><p>点击主界面中”APP Store”可以打开应用商店,目前在应用商店中总共有70+款APP可以使用</p>
<p>[[File:Orange_Pi_5_Ultra-image432.png|552x304px]]</p></li>
<li><p>这里以Home Assistant为例进行下载,在APP Store中找到Home Assistant,然后点击对应的”install”</p>
<p>[[File:Orange_Pi_5_Ultra-image433.png|553x304px]]</p></li>
<li><p>下载完成后HostAssitant会出现在主页面中</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image434.png|552x304px|Screenshot from 2023-10-10 17-43-47]]

</div></li>
<li><p>点击主界面中的”Files”可以打开CasaOS自带的文件系统,然后就可以上传并保存文件</p>
<p>'''请确保其他设备和开发板在同一局域网内。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image435.png|552x304px]]</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image436.png|552x304px|Screenshot from 2023-10-10 17-34-38]]

</div></li>
<li><p>上传文件时需要切换到目标文件夹下,然后拖拽本地文件到图中指示区域,或者点击右上角的”Upload or Create”选择文件进行上传</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image437.png|552x304px|44_1696988339_hd]]

</div></li>
<li><p>如果想要卸载CasaOS,可以使用下面的命令:</p>
<p>orangepi@orangepi:~$ '''sudo casaos-uninstall'''</p></li></ol>

<span id="使用npu的方法"></span>
== 使用NPU的方法 ==

=== 准备工具 ===

# 一台装有Ubuntu20.04操作系统的PC

'''根据RKNN-Toolkit2的官方文档,RKNN-Toolkit2目前版本支持的操作系统如下所示:'''

'''a. Ubuntu18.04 (x64)'''

'''b. Ubuntu20.04 (x64)'''

'''c. Ubuntu22.04 (x64)'''

'''在本文档中我们使用Ubuntu20.04 (x64)操作系统进行演示,其他版本的操作系统请自行测试。'''

<ol start="2" style="list-style-type: decimal;">
<li><p>一块装有Debian 11系统的RK3588开发板</p></li>
<li><p>准备一根品质良好的USB2.0公对公数据线,用于使用adb功能</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|146x124px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li></ol>

<span id="在ubuntu-pc端安装rknn-toolkit2"></span>
=== 在Ubuntu PC端安装RKNN-Toolkit2 ===

'''Toolkit2是一款在Ubuntu PC平台上使用的开发套件,用户使用该工具提供的Python接口可以便捷地完成模型转换、推理和性能评估等功能。'''

<ol style="list-style-type: decimal;">
<li><p>在Ubuntu PC端,打开一个命令行窗口,然后输入以下命令来安装python3和pip3</p>
<p>test@test:~$ '''sudo apt-get install -y python3 python3-dev python3-pip'''</p></li>
<li><p>可以使用以下命令来查看已安装的python3的版本</p>
<p>test@test:~$ '''python3 --version'''</p>
<p>Python 3.8.10</p></li>
<li><p>然后输入以下命令来安装RKNN-Toolkit2的依赖包</p>
<p>test@test:~$ '''sudo apt-get update'''</p>
<p>test@test:~$ '''sudo apt-get -y install libxslt1-dev zlib1g-dev libglib2.0 \'''</p>
<p>'''libsm6 libgl1-mesa-glx libprotobuf-dev gcc'''</p></li>
<li><p>然后输入以下命令来下载1.5.2版本的RKNN-Toolkit2</p>
<p>test@test:~$ '''git clone https://github.com/airockchip/rknn-toolkit2 -b v1.5.2'''</p></li>
<li><p>然后输入以下命令安装python3相应版本的依赖包,这个命令将使用pip3安装文件requirements_cp38-1.5.2.txt中列出的依赖项。如果依赖安装不全的话就不指定安装源单独安装里面的每个包。</p>
<p>test@test:~$ '''pip3 install -r rknn-toolkit2/doc/requirements_cp38-1.5.2.txt -i https://mirror.baidu.com/pypi/simple'''</p></li>
<li><p>然后输入以下命令使用pip3来安装RKNN-Toolkit2软件包,安装完成后就可以使用RKNN-Toolkit2了</p>
<p>test@test:~$ '''pip3 install -r rknn-toolkit2/doc/requirements_cp38-1.5.2.txt -i https://pypi.tuna.tsinghua.edu.cn/simple'''</p></li></ol>

<span id="使用rknn-toolkit2进行模型转换和模型推理"></span>
=== 使用RKNN-Toolkit2进行模型转换和模型推理 ===

'''RKNN-Toolkit2支持将Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch等模型转为RKNN模型,然后在Ubuntu PC端通过仿真或使用开发板的NPU运行RKNN模型来进行推理。'''

'''在RKNN-Toolkit2的example文件夹中提供了相关的示例,以帮助用户更好地理解如何操作,我们以具有yolov5功能的ONNX模型为例进行说明。'''

<span id="在ubuntu-pc端仿真运行模型"></span>
==== 在Ubuntu PC端仿真运行模型 ====

'''RKNN-Toolkit2搭载了内置模拟器,可以让用户在Ubuntu PC端模拟模型在Rockchip NPU上的推理过程。'''

'''这样模型转换和推理均可以在Ubuntu PC端完成,从而帮助用户更快地测试和验证他们的模型。'''

# 首先切换到rknn-toolkit2/examples/onnx/yolov5目录

test@test:~$ '''cd rknn-toolkit2/examples/onnx/yolov5/'''

<ol start="2" style="list-style-type: decimal;">
<li>然后运行test.py脚本,该脚本首先将yolov5s_relu.onnx模型转换为可以在模拟器上运行的RKNN模型,然后使用模拟器仿真运行该模型对当前目录下的bus.jpg图片进行推理</li></ol>

test@test:~/rknn-toolkit2/examples/onnx/yolov5$ '''python3 test.py'''

<ol start="3" style="list-style-type: decimal;">
<li>test.py脚本成功运行后将看到如下打印信息,表明该模型在bus.jpg图片中成功检测到了四个人和一辆公交车</li></ol>

done

--&gt; Running model

W inference: The 'data_format' has not been set and defaults is nhwc!

done

class: person, score: 0.884139358997345

box coordinate left,top,right,down: [209.1040009856224, 244.4304337501526, 286.5742521882057, 506.7466902732849]

class: person, score: 0.8676778078079224

box coordinate left,top,right,down: [478.5757632255554, 238.58572268486023, 559.5273861885071, 526.479279756546]

class: person, score: 0.8246847987174988

box coordinate left,top,right,down: [110.57257843017578, 238.58099019527435, 230.54625701904297, 534.0008579492569]

class: person, score: 0.3392542004585266

box coordinate left,top,right,down: [79.96397459506989, 354.9062474966049, 122.13020265102386, 516.2529321908951]

class: bus , score: 0.7012234926223755

box coordinate left,top,right,down: [94.43931484222412, 129.53470361232758, 553.1492471694946, 468.0852304697037]

D NPUTransfer: Transfer client closed, fd = 3

<ol start="4" style="list-style-type: decimal;">
<li><p>转换得到的模型文件yolov5s_relu.rknn和推理的图片结果result.jpg保存在当前目录下</p></li>
<li><p>result.jpg图片展示了使用yolov5s_relu.rknn模型在bus.jpg图片中检测到的物体类别和置信率</p>
<p>[[File:Orange_Pi_5_Ultra-image438.png|260x346px]]</p></li></ol>

<span id="在ubuntu-pc端使用开发板的npu运行模型"></span>
==== 在Ubuntu PC端使用开发板的NPU运行模型 ====

'''RKNN-Toolkit2为用户提供了通过adb使用开发板的NPU进行推理的Python接口,可以让用户在Ubuntu PC端使用开发板的NPU来运行模型进行推理。'''

'''这样Ubuntu PC端可以根据模型在开发板的NPU上运行时的实际效果,使用Python提供的机器学习库,对模型进行优化和调整。'''

<span id="使用usb公对公数据线连接adb-1"></span>
===== 使用USB公对公数据线连接adb =====

在Ubuntu PC端通过adb对开发板进行操作,adb的使用方法请见[[#adb的使用方法|'''ADB的使用方法''']]一小节的说明。

===== 更新开发板的rknn_server和librknnrt.so =====

'''librknnrt.so是一个板端的runtime库。'''

'''rknn_server是一个运行在开发板上的后台代理服务,用于接收PC通过USB传输过来的协议,然后执行板端runtime库中对应的接口,并返回结果给PC。'''

<ol style="list-style-type: decimal;">
<li><p>首先在Ubuntu PC端输入以下命令下载1.5.2版本的RKNPU2</p>
<p>test@test:~$ '''git clone https://github.com/rockchip-linux/rknpu2 -b v1.5.2'''</p></li>
<li><p>然后在Ubuntu PC端输入以下命令通过adb工具更新开发板的rknn_server</p>
<p>test@test:~$ '''adb push rknpu2/runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/* /usr/bin'''</p></li>
<li><p>然后在Ubuntu PC端输入以下命令通过adb工具更新开发板的librknnrt.so库</p>
<p>test@test:~$ '''adb push rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/lib'''</p></li>
<li><p>通过adb工具打开开发板的终端</p>
<p>test@test:~$ '''adb shell'''</p></li>
<li><p>打开开发板的rknn_server服务</p>
<p>root@orangepi:/# '''sudo''' '''restart_rknn.sh'''</p>
<p>root@orangepi:/# start rknn server,version:1.5.2(8babfeabuild@2023-08-25T10:30:31)</p>
<p>I NPUTransfer: Starting NPU TransferServer,Transfer version 2.1.0(b5861e7@2020-11-23T11:50:51)</p></li>
<li><p>可以使用下面的命令检查下,如果出现rknn_server的进程id,说明rknn_server已经打开,这样开发板的运行环境就搭建好了</p>
<p>root@orangepi:/# '''pgrep rknn_server'''</p>
<p>3131</p></li></ol>

===== 修改示例中的参数 =====

<ol style="list-style-type: decimal;">
<li><p>在Ubuntu PC端通过下面的命令可以查看到连接到Ubuntu PC的开发板的设备ID,这个ID在下面会用到</p>
<p>test@test:~$ '''adb devices'''</p>
<p>List of devices attached</p>
<p>4f9f859e5a120324 device</p></li>
<li><p>切换到rknn-toolkit2/examples/onnx/yolov5目录</p></li></ol>

test@test:~$ '''cd rknn-toolkit2/examples/onnx/yolov5/'''

<ol start="3" style="list-style-type: decimal;">
<li>使用vim编辑器对test.py文件进行修改</li></ol>

test@test:~/rknn-toolkit2/examples/onnx/yolov5$ '''vim test.py'''

<ol start="4" style="list-style-type: decimal;">
<li><p>在test.py文件中,我们需要对以下内容进行修改:</p>
<ol style="list-style-type: lower-alpha;">
<li>在预处理配置中,将目标平台修改为rk3588,这样模型转换后得到的是适用于RK3588开发板的NPU的RKNN模型</li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image439.png|553x74px]]

<ol start="2" style="list-style-type: lower-alpha;">
<li>在初始化运行环境中,增加对目标平台和设备ID的说明,目标平台是rk3588,设备ID是前面通过adb得到的开发板的设备ID,运行模型进行推理的操作将会在RK3588开发板的NPU上进行</li></ol>

[[File:Orange_Pi_5_Ultra-image440.png|553x169px]]

<ol start="3" style="list-style-type: lower-alpha;">
<li>修改完毕后,保存退出</li></ol>

<span id="在ubuntu-pc端运行示例"></span>
===== 在Ubuntu PC端运行示例 =====

# 输入以下命令运行test.py脚本,该脚本首先转换yolov5s_relu.onnx模型为RKNN模型,然后加载该模型到开发板的NPU上来对当前目录下的out.jpg图片进行推理

test@test:~/rknn-toolkit2/examples/onnx/yolov5$ '''python3 test.py'''

<ol start="2" style="list-style-type: decimal;">
<li>在打印信息中,我们可以看到Ubuntu PC通过adb工具使用开发板的NPU运行模型进行推理</li></ol>

--&gt; Init runtime environment

I target set by user is: rk3588

I Check RK3588 board npu runtime version

I Starting ntp or adb, target is RK3588

I Device [4f9f859e5a120324] not found in ntb device list.

I Start adb...

I Connect to Device success!

I NPUTransfer: Starting NPU Transfer Client, Transfer version 2.1.0 (b5861e7@2020-11-23T11:50:36)

<ol start="3" style="list-style-type: decimal;">
<li><p>test.py脚本成功运行后,转换得到的模型文件yolov5s_relu.rknn和推理的图片结果result.jpg保存在当前目录下</p></li>
<li><p>运行的结果和[[#在ubuntu-pc端仿真运行模型|'''在Ubuntu PC端仿真运行模型''']]一小节是一样的</p></li></ol>

<span id="调用c接口部署rknn模型到开发板上运行"></span>
=== 调用C接口部署RKNN模型到开发板上运行 ===

'''RKNPU2为带有Rockchip NPU的芯片平台提供C编程接口,能够帮助用户部署使用RKNN-Toolkit2导出的RKNN模型,加速AI应用的落地。'''

'''在RKNPU2的example文件夹中,提供了将不同功能的RKNN模型部署到开发板的示例,我们以部署具有yolov5功能的RKNN模型到RK3588 Debian11平台为例进行说明。'''

==== 下载交叉编译工具 ====

由于开发板运行的是Linux系统,因此需要使用gcc交叉编译器来编译。推荐使用gcc-9.3.0-x86_64_arrch64-linux-gnu这个版本的gcc。

输入以下命令即可下载该版本的gcc,下载后会得到一个名为gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu的文件夹。

test@test:~$ '''git clone https://github.com/airockchip/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu'''

==== 修改脚本中的编译工具路径 ====

<ol style="list-style-type: decimal;">
<li><p>切换到rknpu2/examples/rknn_yolov5_demo目录</p>
<p>test@test:~$ '''cd ~/rknpu2/examples/rknn_yolov5_demo'''</p></li>
<li><p>使用vim编辑器修改build-linux_RK3588.sh文件中的内容、</p></li></ol>

test@test:~/rknpu2/examples/rknn_yolov5_demo$ '''vim build-linux_RK3588.sh'''

<ol start="3" style="list-style-type: decimal;">
<li><p>在build-linux_RK3588.sh文件中,我们需要将变量TOOL_CHAIN的值更改为gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu文件夹的路径。这样,在运行build-android_RK3588.sh脚本时,会使用gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu文件夹中的交叉编译工具来进行编译。</p>
<p>[[File:Orange_Pi_5_Ultra-image441.png|458x129px]]</p></li>
<li><p>修改完毕后,保存退出。</p></li></ol>

==== 编译rknn_yolov5_demo ====

<ol style="list-style-type: decimal;">
<li><p>运行build-linux_RK3588.sh,该脚本通过交叉编译生成了适用于RK3588开发板并能够在其上运行RKNN模型进行推理的程序</p>
<p>test@test:~/rknpu2/examples/rknn_yolov5_demo$ '''sudo apt install cmake'''</p>
<p>test@test:~/rknpu2/examples/rknn_yolov5_demo$ '''sudo apt-get install g++-aarch64-linux-gnu'''</p>
<p>test@test:~/rknpu2/examples/rknn_yolov5_demo$ '''./build-linux_RK3588.sh'''</p></li>
<li><p>运行build-linux_RK3588.sh完成后,在当前目录下会多出一个名为install的文件夹,该文件夹下的rknn_yoov5_demo_Linux文件夹中包含了通过交叉编译生成的程序以及与其相关的文件</p>
<p>test@test:~/rknpu2/examples/rknn_yolov5_demo$ '''ls install'''</p>
<p>rknn_yolov5_demo_Linux</p></li></ol>

==== 部署rknn_yolov5_demo到开发板 ====

在Ubuntu PC端,可以使用以下命令通过adb工具将rknn_yolov5_demo_Linux文件夹上传至开发板中,从而实现rknn_yolov5_demo在开发板上的部署。

test@test:~/rknpu2/examples/rknn_yolov5_demo$ '''adb push \'''

'''install/rknn_yolov5_demo_Linux /data/rknn_yolov5_demo_Linux'''

==== 在开发板上运行rknn_yolov5_demo ====

<ol style="list-style-type: decimal;">
<li><p>在Ubuntu PC端通过adb shell进入开发板的文件系统</p>
<p>test@test:~$ '''adb shell'''</p>
<p>root@orangepi:/#</p></li>
<li><p>切换到rknn_yolov5_demo_Linux目录</p>
<p>root@orangepi:/# '''cd /data/rknn_yolov5_demo_Linux/'''</p>
<p>root@orangepi:/data/rknn_yolov5_demo_Linux# '''ls'''</p>
<p>lib model rknn_yolov5_demo rknn_yolov5_video_demo</p></li>
<li><p>然后运行rknn_yolov5_demo程序来进行推理,在下面的命令中该程序使用yolov5s-640-640.rknn模型对bus.jpg图片进行推理,整个运行过程将在开发板上完成</p>
<p>root@orangepi:/data/rknn_yolov5_demo_Linux# '''./rknn_yolov5_demo \'''</p>
<p>'''./model/RK3588/yolov5s-640-640.rknn ./model/bus.jpg'''</p></li>
<li><p>运行完成后,推理的结果out.jpg图片保存在当前目录下</p>
<p>root@orangepi:/data/rknn_yolov5_demo_Linux# '''ls'''</p>
<p>lib model out.jpg rknn_yolov5_demo rknn_yolov5_video_demo</p></li>
<li><p>在Ubuntu PC端,我们可以使用以下命令通过adb工具下载out.jpg图片,然后使用图像查看器进行查看</p>
<p>test@test:~$ '''adb pull /data/rknn_yolov5_demo_Linux/out.jpg ~/Desktop/'''</p>
<p>/data/rknn_yolov5_demo_Linux/out.jpg: ...led. 1.9 MB/s (191507 bytes in 0.095s)</p></li>
<li><p>out.jpg图片展示了使用yolov5s-640-640.rknn模型在bus.jpg图片中检测到的物体类别和置信率</p>
<p>[[File:Orange_Pi_5_Ultra-image442.png|253x318px]]</p></li></ol>

<span id="rk3588使用百度飞浆的方法"></span>
== RK3588使用百度飞浆的方法 ==

'''在rk3588开发板上使用百度飞浆,包括在PC端转换pdmodel模型为rknn模型和在板端使用百度飞浆开发的FastDeploy部署工具部署rknn模型。以下内容是在PC端系统为Ubuntu22.04,板端系统为Debian 11的环境下实现的,其他环境请自行测试。'''

<span id="ubuntu-pc端环境搭建"></span>
=== Ubuntu PC端环境搭建 ===

在Ubuntu PC端需要安装的工具及用途如下所示

{| class="wikitable"
|-
| style="text-align: left;"| 工具名
| style="text-align: left;"| 用途
|-
| style="text-align: left;"| Anaconda3
| style="text-align: left;"| 用于创建和管理Python环境
|-
| style="text-align: left;"| Paddle2ONNX
| style="text-align: left;"| 用于转换pdmodel模型为ONNX模型
|-
| style="text-align: left;"| RKNN-Toolkit2
| style="text-align: left;"| 用于转换ONNX模型为RKNN模型
|}

<span id="pc端安装anaconda3"></span>
==== PC端安装Anaconda3 ====

# 在ubuntu PC端打开浏览器,在地址栏输入下面的网址下载安装Anaconda3的脚本,下载完成后将得到'''Anaconda3-2023.07-1-Linux-x86_64.sh'''文件

[https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.07-1-Linux-x86_64.sh '''https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.07-1-Linux-x86_64.sh''']

<ol start="2" style="list-style-type: decimal;">
<li>然后打开终端,运行'''Anaconda3-2023.07-1-Linux-x86_64.sh'''脚本安装Anaconda3</li></ol>

test@test:~/Downloads$ '''sh Anaconda3-2023.07-1-Linux-x86_64.sh'''

<ol start="3" style="list-style-type: decimal;">
<li>然后安装脚本会输出下面的提示信息,此时点击回车键继续安装</li></ol>

[[File:Orange_Pi_5_Ultra-image443.png|553x163px]]

<ol start="4" style="list-style-type: decimal;">
<li>在点击回车键后,会出现Anaconda3的一些介绍信息,一直点击”↓“键</li></ol>

[[File:Orange_Pi_5_Ultra-image444.png|553x465px]]

<ol start="5" style="list-style-type: decimal;">
<li>然后安装脚本会提醒是否接受许可证条款,此时输入yes按回车键既可</li></ol>

[[File:Orange_Pi_5_Ultra-image445.png|553x174px]]

<ol start="6" style="list-style-type: decimal;">
<li><p>然后安装脚本会提醒安装Anaconda3到家目录,此时按回车键确认</p>
<p>[[File:Orange_Pi_5_Ultra-image446.png|553x155px]]</p></li>
<li><p>然后安装脚本会提示是否初始化Anaconda3时,输入yes,然后按回车键</p></li></ol>

[[File:Orange_Pi_5_Ultra-image447.png|553x83px]]

<ol start="8" style="list-style-type: decimal;">
<li>当看到终端中出现如下打印时,说明已经成功安装Anaconda3了</li></ol>

[[File:Orange_Pi_5_Ultra-image448.png|553x115px]]

<span id="pc端安装rknn-toolkit2"></span>
==== PC端安装RKNN-Toolkit2 ====

# 在ubuntu PC端打开终端,通过Anaconda3工具创建python版本为3.8的环境

(base)test@test:~$ '''conda create -n fastdeploy python=3.8'''

<ol start="2" style="list-style-type: decimal;">
<li>激活刚才创建的python3.8的环境</li></ol>

(base)test@test:~$ '''conda activate fastdeploy'''

<ol start="3" style="list-style-type: decimal;">
<li>然后安装pip3开发工具和包管理工具</li></ol>

(fastdeploy)test@test:~$ '''sudo apt-get install python3-dev python3-pip'''

<ol start="4" style="list-style-type: decimal;">
<li>然后安装RKNN-Toolkit2的依赖包</li></ol>

(fastdeploy)test@test:~$ '''sudo apt-get install libxslt1-dev zlib1g-dev libglib2.0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc'''

<ol start="5" style="list-style-type: decimal;">
<li>rknn_toolkit2对numpy存在特定依赖,因此需要先安装numpy==1.16.6</li></ol>

(fastdeploy)test@test:~$ '''pip install numpy==1.16.6'''

<ol start="6" style="list-style-type: decimal;">
<li>安装git工具</li></ol>

(fastdeploy)test@test:~$ '''sudo apt install -y git'''

<ol start="7" style="list-style-type: decimal;">
<li>然后执行下面的命令下载RKNN-Toolkit2,下载完成后会得到rknn-toolkit2文件夹</li></ol>

(fastdeploy)test@test:~$ '''git clone https://github.com/rockchip-linux/rknn-toolkit2'''

<ol start="8" style="list-style-type: decimal;">
<li>然后执行下面的命令,即可安装python3.8版本对应的RKNN-Toolkit2了</li></ol>

(fastdeploy)test@test:~$ '''pip install rknn-toolkit2/rknn-toolkit2/packages/rknn_toolkit2-1.6.0+81f21f4d-cp38-cp38-linux_x86_64.whl'''

<span id="pc端安装paddle2onnx"></span>
==== PC端安装Paddle2ONNX ====

可以执行下面的命令安装paddle2onnx

(fastdeploy)test@test:~$ '''pip install paddle2onnx'''

=== 板端环境搭建 ===

在板端需要安装的工具及用途如下所示:

{| class="wikitable"
|-
| style="text-align: left;"| '''工具名'''
| style="text-align: left;"| '''用途'''
|-
| style="text-align: left;"| '''Anaconda3'''
| style="text-align: left;"| '''用于创建和管理Python环境'''
|-
| style="text-align: left;"| '''rknpu2'''
| style="text-align: left;"| '''rknpu2的基础驱动'''
|-
| style="text-align: left;"| '''FastDeploy'''
| style="text-align: left;"| '''编译后得到FastDeploy推理库'''
|}

<span id="板端安装anaconda3"></span>
==== 板端安装Anaconda3 ====

# 在板端打开浏览器,在地址栏输入下面的网址下载安装Anaconda3的脚本,下载完成后将得到'''Anaconda3-2023.07-1-Linux-aarch64.sh'''文件

[https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.07-1-Linux-x86_64.sh '''https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.07-1-Linux-aarch64.sh''']

<ol start="2" style="list-style-type: decimal;">
<li>打开终端,运行'''Anaconda3-2023.07-1-Linux-aarch64.sh'''脚本安装Anaconda3</li></ol>

orangepi@orangepi:~/Downloads$ '''sh Anaconda3-2023.07-1-Linux-aarch64.sh'''

<ol start="3" style="list-style-type: decimal;">
<li>然后安装脚本会输出下面的提示信息,点击回车键继续安装</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image449.png|552x60px|Screenshot_2024-01-24_21-06-51]]

</div>
<ol start="4" style="list-style-type: decimal;">
<li><p>在点击回车键后,会出现Anaconda3的一些介绍信息,一直点击”↓“键</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image450.png|551x285px|Screenshot_2024-01-19_10-34-02]]

</div></li>
<li><p>然后安装脚本会提醒是否接受许可证条款,此时输入yes按回车键既可</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image451.png|552x59px|Screenshot_2024-01-19_10-34-32]]

</div>
<ol start="6" style="list-style-type: decimal;">
<li>然后安装脚本会提醒安装Anaconda3到家目录,此时按回车键确认</li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image452.png|553x60px|Screenshot_2024-01-19_10-34-56]]

</div>
<ol start="7" style="list-style-type: decimal;">
<li><p>然后安装脚本会提示是否初始化Anaconda3时,输入yes,然后按回车键</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image453.png|553x33px|Screenshot_2024-01-19_10-40-42]]

</div></li>
<li><p>当看到终端中出现如下打印时,说明已经成功安装Anaconda3了</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image454.png|553x42px|Screenshot_2024-01-19_10-41-22]]

</div>
<ol start="9" style="list-style-type: decimal;">
<li>如果在终端使用conda命令,显示命令不存在,需要修改~/.bashrc文件</li></ol>

orangepi@orangepi:~$ '''vi ~/.bashrc'''

<ol start="10" style="list-style-type: decimal;">
<li>在~/.bashrc文件末尾加上下面一句代码</li></ol>

export PATH=/home/orangepi/anaconda3/bin:$PATH

<ol start="11" style="list-style-type: decimal;">
<li>然后在终端中输入下面的命令让刚才的修改生效</li></ol>

orangepi@orangepi:~$ '''source ~/.bashrc'''

<ol start="12" style="list-style-type: decimal;">
<li>然后在终端中输入下面的命令进行conda的初始化</li></ol>

(base)orangepi@orangepi:~$ '''conda init bash'''

<ol start="13" style="list-style-type: decimal;">
<li>然后关闭当前终端,重新打开一个终端,此时就可以正常使用conda命令了</li></ol>

==== 板端安装rknpu2驱动 ====

# 在板端打开终端,通过Anaconda3工具创建python版本为3.9的环境

(base)orangepi@orangepi:~$ '''conda create -n fastdeploy python=3.9'''

<ol start="2" style="list-style-type: decimal;">
<li>激活刚才创建的python3.9的环境</li></ol>

(base)orangepi@orangepi:~$ '''conda activate fastdeploy'''

<ol start="3" style="list-style-type: decimal;">
<li>通过wget下载rknpu2_device_install_1.4.0.zip文件</li></ol>

(fastdeploy)orangepi@orangepi:~$ '''wget https://bj.bcebos.com/fastdeploy/third_libs/rknpu2_device_install_1.4.0.zip'''

<ol start="4" style="list-style-type: decimal;">
<li>然后执行的下面的命令解压rknpu2_device_install_1.4.0.zip, 解压后会得到 rknpu2_device_install_1.4.0文件夹和__MACOSX文件夹</li></ol>

(fastdeploy)orangepi@orangepi:~$ '''unzip rknpu2_device_install_1.4.0.zip'''

<ol start="5" style="list-style-type: decimal;">
<li>切换到rknpu2_device_install_1.4.0目录下</li></ol>

(fastdeploy)orangepi@orangepi:~$ '''cd rknpu2_device_install_1.4.0/'''

<ol start="6" style="list-style-type: decimal;">
<li>在该目录下有rknn_install_rk3588.sh脚本,运行该脚本,即可完成板端rknpu2驱动的安装</li></ol>

(fastdeploy)orangepi@orangepi:~/rknpu2_device_install_1.4.0$ '''sudo bash rknn_install_rk3588.sh'''

<span id="板端编译fastdeploy-c-sdk"></span>
==== 板端编译FastDeploy C++ SDK ====

# 在编译时需要用到cmake命令,可以执行下面的命令安装cmake工具

(fastdeploy)orangepi@orangepi:~$ '''sudo apt-get install -y cmake'''

<ol start="2" style="list-style-type: decimal;">
<li>然后下载FastDeploy SDK,命令执行完成后会得到FastDeploy文件夹</li></ol>

(fastdeploy)orangepi@orangepi:~$ '''git clone https://github.com/PaddlePaddle/FastDeploy.git'''

<ol start="3" style="list-style-type: decimal;">
<li>切换到FastDeploy目录</li></ol>

(fastdeploy)orangepi@orangepi:~$ '''cd FastDeploy'''

<ol start="4" style="list-style-type: decimal;">
<li>创建编译目录build并切换build目录下</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy$ '''mkdir build &amp;&amp; cd build'''

<ol start="5" style="list-style-type: decimal;">
<li>在编译前需要使用cmake来配置需要编译的项目信息,执行完下面的命令后,当前目录下会多出一些文件,其中就有用来编译的Makefile文件</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/build$ '''cmake .. -DENABLE_ORT_BACKEND=ON \'''

'''-DENABLE_RKNPU2_BACKEND=ON \'''

'''-DENABLE_VISION=ON \'''

'''-DRKNN2_TARGET_SOC=RK3588 \'''

'''-DCMAKE_INSTALL_PREFIX=${PWD}/fastdeploy-0.0.3'''

<ol start="6" style="list-style-type: decimal;">
<li>执行下面的命令开始编译</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/build$ '''make -j8'''

<ol start="7" style="list-style-type: decimal;">
<li>编译完成后,使用下面的命令将编译得到的文件安装到指定的路径</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/build$ '''make install'''

<ol start="8" style="list-style-type: decimal;">
<li>编译完成后主要得到了fastdeploy-0.0.3文件夹,在该文件夹中,有配置环境变量的脚本文件fastdeploy_init.sh,使用该脚本配置环境变量后就可以使用编译得到的一些库文件了</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/build$ '''source fastdeploy-0.0.3/fastdeploy_init.sh'''

<span id="使用fastdeploy部署模型示例"></span>
=== 使用FastDeploy部署模型示例 ===

ResNet50_vd模型是一种用来进行目标分类的模型,下面以ResNet50_vd模型为例说明使用FastDeploy部署pdmodel模型的流程

<span id="ubuntu-pc端模型转换"></span>
==== Ubuntu PC端模型转换 ====

# 在PC端打开终端,激活之前使用Anaconda3创建的python3.8的环境

test@test:~$ '''conda activate fastdeploy'''

<ol start="2" style="list-style-type: decimal;">
<li>在模型转换的脚本中,需要导入yaml模块和six模块,可以执行下面的命令进行安装</li></ol>

(fastdeploy)test@test:~$ '''pip install pyyaml six'''

<ol start="3" style="list-style-type: decimal;">
<li>执行下面的命令,可以下载得到ResNet50_vd_infer.tgz文件</li></ol>

(fastdeploy)test@test:~$ '''wget https://bj.bcebos.com/paddlehub/fastdeploy/ResNet50_vd_infer.tgz'''

<ol start="4" style="list-style-type: decimal;">
<li>解压ResNet50_vd_infer.tgz文件后可以得到ResNet50_vd_infer文件夹,在这个文件夹中包含pdmodel模型文件inference.pdmodel以及其他相关的文件</li></ol>

(fastdeploy)test@test:~$ '''tar -xvf ResNet50_vd_infer.tgz'''

<ol start="5" style="list-style-type: decimal;">
<li>可以使用下面的命令通过paddle2onnx将pdmodel模型转换为onnx模型,执行完该命令后在ResNet50_vd_infer文件夹中会多出转换得到的onnx模型文件ResNet50_vd_infer.onnx</li></ol>

(fastdeploy)test@test:~$ '''paddle2onnx --model_dir ResNet50_vd_infer \'''

'''--model_filename inference.pdmodel \'''

'''--params_filename inference.pdiparams \'''

'''--save_file ResNet50_vd_infer/ResNet50_vd_infer.onnx \'''

'''--enable_dev_version True \'''

'''--opset_version 10'''

<ol start="6" style="list-style-type: decimal;">
<li>然后再使用下面的命令固定shape为[1,3,224,224],执行完命令后,会对ResNet50_vd_infer.onnx文件进行修改</li></ol>

(fastdeploy)test@test:~$ '''python -m paddle2onnx.optimize --input_model \'''

'''ResNet50_vd_infer/ResNet50_vd_infer.onnx \'''

'''--output_model ResNet50_vd_infer/ResNet50_vd_infer.onnx \'''

'''--input_shape_dict &quot;{'inputs':[1,3,224,224]}&quot;'''

<ol start="7" style="list-style-type: decimal;">
<li>onnx模型转换为rknn模型需要使用FastDeploy SDK中的脚本,执行下面的命令下载FastDeploy</li></ol>

(fastdeploy)test@test:~$ '''git clone https://github.com/PaddlePaddle/FastDeploy.git'''

<ol start="8" style="list-style-type: decimal;">
<li>然后转移ResNet50_vd_infer文件夹到FastDeploy的对应目录下</li></ol>

(fastdeploy)test@test:~$ '''mv ResNet50_vd_infer \'''

'''FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/'''

<ol start="9" style="list-style-type: decimal;">
<li>切换到进行模型转换的目录下</li></ol>

(fastdeploy)test@test:~$ '''cd FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/'''

<ol start="10" style="list-style-type: decimal;">
<li>执行下面的命令,就可以将onnx模型转换为rknn模型了,最终在ResNet50_vd_infer目录下得到了rknn模型文件ResNet50_vd_infer_rk3588_unquantized.rknn</li></ol>

(fastdeploy)test@test:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/$ '''python ./rknpu2_tools/export.py \'''

'''--config_path ./rknpu2_tools/config/ResNet50_vd_infer_rknn.yaml \'''

'''--target_platform rk3588'''

<ol start="11" style="list-style-type: decimal;">
<li>在板端部署时,使用的rknn模型文件名称为ResNet50_vd_infer_rk3588.rknn,所以需要将ResNet50_vd_infer_rk3588_unquantized.rknn文件改名为ResNet50_vd_infer_rk3588.rknn</li></ol>

(fastdeploy)test@test:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/$ '''mv ResNet50_vd_infer/ResNet50_vd_infer_rk3588_unquantized.rknn \'''

'''ResNet50_vd_infer/ResNet50_vd_infer_rk3588.rknn'''

==== 板端模型部署 ====

# 在板端打开终端,激活之前使用Anaconda3创建的python3.9的环境

orangepi@orangepi:~$ '''conda activate fastdeploy'''

<ol start="2" style="list-style-type: decimal;">
<li>运行fastdeploy_init.sh脚本配置环境</li></ol>

(fastdeploy)orangepi@orangepi:~$ '''source FastDeploy/build/fastdeploy-0.0.3/fastdeploy_init.sh'''

<ol start="3" style="list-style-type: decimal;">
<li>切换到FastDeploy中部署ResNet50模型的示例目录</li></ol>

(fastdeploy)orangepi@orangepi:~$ '''cd FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp'''

<ol start="4" style="list-style-type: decimal;">
<li>在该目录下创建目录结构</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp$ '''mkdir build images ppclas_model_dir thirdpartys'''

<ol start="5" style="list-style-type: decimal;">
<li>将编译得到的fastdeploy-0.0.3文件夹拷贝到thirdpartys文件夹</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp$ '''cp -r ~/FastDeploy/build/fastdeploy-0.0.3/ thirdpartys/'''

<ol start="6" style="list-style-type: decimal;">
<li><p>将PC端中的ResNet50_vd_infer文件夹中的文件拷贝到ppclas_model_dir目录下</p></li>
<li><p>切换到images目录</p></li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp$ '''cd images'''

<ol start="8" style="list-style-type: decimal;">
<li>通过wget在images目录下载测试图片</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp/images$ '''wget https://gitee.com/paddlepaddle/PaddleClas/raw/release/2.4/deploy/images/ImageNet/ILSVRC2012_val_00000010.jpeg'''

<ol start="9" style="list-style-type: decimal;">
<li>然后切换到编译目录build下</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp/images$ '''cd ../build/'''

<ol start="10" style="list-style-type: decimal;">
<li>使用cmake配置需要编译的内容,在执行完该命令后,当前目录下会出现一些文件,其中包括Makefile文件</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp/build$ '''cmake ..'''

<ol start="11" style="list-style-type: decimal;">
<li>执行下面的命令开始编译</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp/build$ '''make -j8'''

<ol start="12" style="list-style-type: decimal;">
<li>执行下面的命令将编译得到的文件安装到指定的路径,在执行完该命令后,在当前目录下会多出install目录</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp/build$ '''make install'''

<ol start="13" style="list-style-type: decimal;">
<li>切换到install目录,使用模型进行推理就是在这里完成的</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp/build$ '''cd install'''

<ol start="14" style="list-style-type: decimal;">
<li>使用下面的命令,便可以使用转换得到的rknn模型对ILSVRC2012_val_00000010.jpeg图片中的内容进行分类</li></ol>

(fastdeploy)orangepi@orangepi:~/FastDeploy/examples/vision/classification/paddleclas/rockchip/rknpu2/cpp/build/install$ '''./rknpu_test \'''

'''./ppclas_model_dir/ ./images/ILSVRC2012_val_00000010.jpeg'''

<ol start="15" style="list-style-type: decimal;">
<li>在执行完该命令后,回显信息中会出现如下打印,表示图片中物体的类别ID号为644,置信率为0.072998</li></ol>

'''ClassifyResult('''

'''label_ids: 644,'''

'''scores: 0.072998,'''

''')'''

<span id="rk3588运行rkllm大模型的方法"></span>
== RK3588运行RKLLM大模型的方法 ==

'''本小节中所使用的代码和模型都可以在开发板的官方工具中下载到。'''

<span id="rkllm介绍"></span>
=== RKLLM介绍 ===

'''更详细的RKLLM介绍资料可以参考[https://github.com/airockchip/rknn-llm/tree/main/doc 瑞芯微RKLLM官方资料]。'''

RKLLM可以帮助用户快速将LLM模型部署到RK3588开发板中,整体框架如下图所示:

[[File:Orange_Pi_5_Ultra-image455.png|553x264px]]

<span id="rkllm工具链介绍"></span>
==== RKLLM工具链介绍 ====

<span id="rkllm-toolkit-功能介绍"></span>
===== RKLLM-Toolkit 功能介绍 =====

RKLLM-Toolkit是为用户提供在计算机上进行大语言模型的量化、转换的开发套件。通过该工具提供的Python接口可以便捷地完成以下功能:

# 模型转换:支持将Hugging Face格式的大语言模型(Large Language Model, LLM)转换为RKLLM模型,目前我们测试能够运行的模型包括TinyLLAMA、Qwen、Qwen2、Phi-3、ChatGLM3、Gemma、InternLM2和MiniCPM,转换后的RKLLM模型能够在RK3588平台上加载使用。
# 量化功能:支持将浮点模型量化为定点模型,目前支持的量化类型为w8a8,w8a8表示权重和激活都被量化为8位宽度。

<span id="rkllm-runtime-功能介绍"></span>
===== RKLLM Runtime 功能介绍 =====

RKLLM Runtime主要负责加载RKLLM-Toolkit转换得到的RKLLM模型,并在RK3588 板端通过调用NPU驱动在RK3588 NPU上实现RKLLM模型的推理。在推理RKLLM模型时,用户可以自行定义RKLLM模型的推理参数设置,定义不同的文本生成方式,并通过预先定义的回调函数不断获得模型的推理结果。更详细的说明可以参考[https://github.com/airockchip/rknn-llm/tree/main/doc '''瑞芯微RKLLM官方资料''']。

<span id="rkllm开发流程介绍"></span>
==== RKLLM开发流程介绍 ====

RKLLM的整体开发步骤主要分为2个部分:模型转换和板端部署运行。

# '''在Ubuntu PC端进行模型转换'''。在这一阶段,用户提供的Hugging Face格式的大语言模型将会被转换为RKLLM格式,以便在RK3588开发板上进行高效的推理。这一步骤包括:

a. 搭建RKLLM-Toolkit环境:在Ubuntu PC端用Conda搭建RKLLM-Toolkit的运行环境。

b. 模型转换:用RKLLM-Toolkit对获取的Hugging Face格式的大语言模型,或是自行训练得到的大语言模型(注意,模型保存的结构要与Hugging Face平台上的模型结构一致。)转换成能在RK3588开发板上运行的.rkllm 格式文件。

c. 编译测试代码:用rkllm-runtime编译能运行在RK3588开发板上的推理程序。

在Ubuntu PC端进行模型转换的具体开发流程请见[[#ubuntu-pc端进行模型转换和编译源码的详细步骤|'''Ubuntu PC端进行模型转换和编译源码的详细步骤''']]小节的说明。

<ol start="2" style="list-style-type: decimal;">
<li>'''在开发板端部署运行'''。这个阶段涵盖了模型在RK3588开发板上的的实际部署和运行。它通常包括以下步骤:</li></ol>

a. 升级内核NPU版本:将开发板内核的NPU版本升级到v0.9.6。

b. 模型推理:将在Ubuntu PC端上用rkllm-runtime编译出来的推理程序和用RKLLM-Toolkit转换的.rkllm格式文件放在开发板上进行模型推理。可以在开发板上直接运行推理,具体开发流程请见本章的[[#开发板端部署运行的详细步骤|'''开发板端部署运行的详细步骤''']]小节。也可以在开发板上进行板端Server服务的部署,在同一网段下的Ubuntu PC就可以通过访问对应地址来调用RKLLM模型进行推理,具体开发流程请见本章的[[#开发板端server的部署运行的详细步骤|'''开发板端Server的部署运行的详细步骤''']]小节。

以上这两个步骤构成了完整的RKLLM开发流程,确保大语言模型能够成功转换、调试,并最终在RK3588 NPU上实现高效部署。

<span id="准备工具-1"></span>
=== 准备工具 ===

# 一台装有Ubuntu 22.04操作系统的PC。'''在本文档中我们使用Ubuntu22.04(x64)操作系统进行演示,其他版本的操作系统请自行测试。'''
# 一块RK3588开发板。

<span id="ubuntu-pc端进行模型转换和编译源码的详细步骤"></span>
=== Ubuntu PC端进行模型转换和编译源码的详细步骤 ===

<span id="搭建rkllm-toolkit环境"></span>
==== 搭建RKLLM-Toolkit环境 ====

# 首先下载RKLLM工具链。

test@test:~$ '''git clone https://github.com/airockchip/rknn-llm.git'''

<ol start="2" style="list-style-type: decimal;">
<li>下载后用ls命令检查下载的文件是否无误</li></ol>

test@test:~/test$ '''ls'''

rknn-llm

test@test:~$ '''cd rknn-llm'''

test@test:~/rknn-llm$ '''ls'''

CHANGELOG.md doc LICENSE README.md res rkllm-runtime rkllm-toolkit rknpu-driver

<ol start="3" style="list-style-type: decimal;">
<li>rknn-llm中具体的文件目录如下所示:</li></ol>

test@test:~/rknn-llm$ '''sudo apt install''' '''tree'''

test@test:~/rknn-llm$ '''tree'''

doc

└──Rockchip_RKLLM_SDK_CN.pdf # RKLLM SDK说明文档

rkllm-runtime

├──examples

│ └── rkllm_api_demo # 板端推理调用示例工程

│ └── rkllm_server_demo # RKLLM-Server部署示例工程

├──runtime

│ └── Android

│ └── librkllm_api

│ └──arm64-v8a

│ └── librkllmrt.so # RKLLM Runtime库

│ └──include

│ └── rkllm.h # Runtime头文件

│ └── Linux

│ └── librkllm_api

│ └──aarch64

│ └── librkllmrt.so # RKLLM Runtime库

│ └──include

│ └── rkllm.h # Runtime头文件

rkllm-toolkit

├──examples

│ └── huggingface

│ └── test.py

├──packages

│ └── md5sum.txt

│ └── rkllm_toolkit-x.x.x-cp38-cp38-linux_x86_64.whl

rknpu-driver

└──rknpu_driver_0.9.6_20240322.tar.bz2

<ol start="4" style="list-style-type: decimal;">
<li>然后下载安装miniforge3安装包。</li></ol>

test@test:~$ '''wget -c https://mirrors.bfsu.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-Linux-x86_64.sh'''

test@test:~$ '''chmod 777 Miniforge3-Linux-x86_64.sh'''

test@test:~$ '''bash Miniforge3-Linux-x86_64.sh'''

'''镜像网站有时候会崩溃,导致miniforge3包下载不了,在开发板的官方工具中已经给出了下载好的miniforge3安装包。'''

'''运行bash Miniforge3-Linux-x86_64.sh时所有的选项直接按Enter就可以了。'''

<ol start="5" style="list-style-type: decimal;">
<li>然后进入Conda base环境。</li></ol>

test@test:~$ '''source ~/miniforge3/bin/activate'''

(base) test@test:~$

<ol start="6" style="list-style-type: decimal;">
<li>然后创建一个Python3.8版本(建议版本)名为RKLLM-Toolkit的Conda环境。</li></ol>

(base) test@test:~$ '''conda create -n RKLLM-Toolkit python=3.8'''

<ol start="7" style="list-style-type: decimal;">
<li>然后进入RKLLM-Toolkit Conda环境。</li></ol>

(base) test@test:~$ '''conda activate RKLLM-Toolkit'''

(RKLLM-Toolkit) test@test:~$

<ol start="8" style="list-style-type: decimal;">
<li>然后使用pip命令安装之前下载的RKLLM工具链中的whl包,目录为:'''rknn-llm/rkllm-toolkit/packages/''' '''rkllm_toolkit-1.0.1-cp38-cp38-linux_x86_64.whl'''。在安装过程中,安装工具会自动下载 RKLLM-Toolkit 工具所需要的相关依赖包。</li></ol>

(base) test@test:~$ '''pip3 install rknn-llm/rkllm-toolkit/packages/rkllm_toolkit-1.0.1-cp38-cp38-linux_x86_64.whl'''

<ol start="9" style="list-style-type: decimal;">
<li>最后执行以下命令如果没有报错,则说明安装成功。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''python'''

&gt;&gt;&gt; from rkllm.api import RKLLM

==== 模型转换 ====

'''在此部分,我们提供了八种模型转换的示例供用户选择。若用户在从Hugging Face下载模型时遇到网络问题,我们的开发板官方工具中已经集成了下载的模型文件以及相应的.rkllm转换文件。'''

<span id="转换tinyllama模型"></span>
===== 转换TinyLLAMA模型 =====

# 先在Ubuntu操作系统上安装Git LFS,如果已安装可跳过这一步。

(RKLLM-Toolkit) test@test:~$ '''sudo apt update'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install curl git'''

(RKLLM-Toolkit) test@test:~$ '''curl -s''' '''https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install git-lfs'''

(RKLLM-Toolkit) test@test:~$ '''git lfs install'''

<ol start="2" style="list-style-type: decimal;">
<li>接着下载TinyLLAMA模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''git clone''' '''https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0'''

<ol start="3" style="list-style-type: decimal;">
<li><span id="修改rknn-llmrkllm-toolkitexampleshuggingfacetest.py里面的modelpath变量的值为下载的tinyllama-1.1b-chat-v1.0文件夹所在的绝对路径然后修改ret"></span>
= 修改rknn-llm/rkllm-toolkit/examples/huggingface/test.py里面的modelpath变量的值为下载的TinyLlama-1.1B-Chat-v1.0文件夹所在的绝对路径,然后修改ret =

llm.export_rkllm(&quot;./qwen.rkllm&quot;)括号中的值为要保存的.rkllm格式文件路径,我们将其修改为ret = llm.export_rkllm(&quot;./TinyLlama.rkllm&quot;)。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-toolkit/examples/huggingface/test.py'''

modelpath = &quot;'''/path/your/TinyLlama-1.1B-Chat-v1.0'''&quot; #填你自己的路径

ret = llm.export_rkllm(&quot;'''./TinyLlama.rkllm'''&quot;)

<ol start="4" style="list-style-type: decimal;">
<li>然后用python运行rknn-llm/rkllm-toolkit/examples/huggingface/test.py文件来转换大模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd ~/rknn-llm/rkllm-toolkit/examples/huggingface'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''python test.py'''

<ol start="5" style="list-style-type: decimal;">
<li>转换成功的输出如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image456.png|553x52px]]

<ol start="6" style="list-style-type: decimal;">
<li>最后转换成功会在当前目录下会得到TinyLlama.rkllm文件,大小约为1.09G。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''ls'''

test.py '''TinyLlama.rkllm'''

<span id="转换qwen模型"></span>
===== 转换Qwen模型 =====

# 先在Ubuntu操作系统上安装Git LFS,如果已安装可跳过这一步。

(RKLLM-Toolkit) test@test:~$ '''sudo apt update'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install curl git'''

(RKLLM-Toolkit) test@test:~$ '''curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install git-lfs'''

(RKLLM-Toolkit) test@test:~$ '''git lfs install'''

<ol start="2" style="list-style-type: decimal;">
<li>接着下载Qwen模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''git clone https://huggingface.co/Qwen/Qwen-1_8B-Chat'''

<ol start="3" style="list-style-type: decimal;">
<li><span id="修改rknn-llmrkllm-toolkitexampleshuggingfacetest.py里面的modelpath变量的值为下载的qwen-1_8b-chat文件夹所在的绝对路径然后修改ret"></span>
= 修改rknn-llm/rkllm-toolkit/examples/huggingface/test.py里面的modelpath变量的值为下载的Qwen-1_8B-Chat文件夹所在的绝对路径,然后修改ret =

llm.export_rkllm(&quot;./qwen.rkllm&quot;)括号中为要保存的.rkllm格式文件路径,我们将其修改为ret = llm.export_rkllm(&quot;./Qwen.rkllm&quot;)。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-toolkit/examples/huggingface/test.py'''

modelpath = &quot;/path/your/Qwen-1_8B-Chat&quot; #填你自己的路径

ret = llm.export_rkllm(&quot;./Qwen.rkllm&quot;)

<ol start="4" style="list-style-type: decimal;">
<li>然后用python运行rknn-llm/rkllm-toolkit/examples/huggingface/test.py文件来转换大模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd ~/rknn-llm/rkllm-toolkit/examples/huggingface'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''python test.py'''

<ol start="5" style="list-style-type: decimal;">
<li>转换成功的输出如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image457.png|553x55px]]

<ol start="6" style="list-style-type: decimal;">
<li>最后转换成功会在当前目录下得到Qwen.rkllm文件,大小约为2.01G。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''ls'''

test.py Qwen.rkllm

<span id="转换qwen2模型"></span>
===== 转换Qwen2模型 =====

# 先在Ubuntu操作系统上安装Git LFS,如果已安装可跳过这一步。

(RKLLM-Toolkit) test@test:~$ '''sudo apt update'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install curl git'''

(RKLLM-Toolkit) test@test:~$ '''curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install git-lfs'''

(RKLLM-Toolkit) test@test:~$ '''git lfs install'''

<ol start="2" style="list-style-type: decimal;">
<li>接着下载Qwen2模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''git clone https://huggingface.co/Qwen/Qwen1.5-0.5B'''

<ol start="3" style="list-style-type: decimal;">
<li><span id="修改rknn-llmrkllm-toolkitexampleshuggingfacetest.py里面的modelpath变量的值为下载的qwen1.5-0.5b文件夹所在的绝对路径然后修改ret"></span>
= 修改rknn-llm/rkllm-toolkit/examples/huggingface/test.py里面的modelpath变量的值为下载的Qwen1.5-0.5B文件夹所在的绝对路径,然后修改ret =

llm.export_rkllm(&quot;./qwen.rkllm&quot;)括号中为要保存的.rkllm格式文件路径,我们将其修改为ret = llm.export_rkllm(&quot;./Qwen2.rkllm&quot;)。</li></ol>

(RKLLM-Toolkit) test@test:~$ vim rknn-llm/rkllm-toolkit/examples/huggingface/test.py

modelpath = &quot;/path/your/Qwen1.5-0.5B&quot; #填你自己的路径

ret = llm.export_rkllm(&quot;./Qwen2.rkllm&quot;)

<ol start="4" style="list-style-type: decimal;">
<li>用python运行rknn-llm/rkllm-toolkit/examples/huggingface/test.py文件来转换大模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd ~/rknn-llm/rkllm-toolkit/examples/huggingface'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''python test.py'''

<ol start="5" style="list-style-type: decimal;">
<li>转换成功的输出如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image458.png|553x65px]]

<ol start="6" style="list-style-type: decimal;">
<li>最后转换成功会在当前目录下得到Qwen2.rkllm文件,大小约为746M。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''ls'''

test.py Qwen2.rkllm

<span id="转换phi-3模型"></span>
===== 转换Phi-3模型 =====

# 先在Ubuntu操作系统上安装Git LFS,如果已安装可跳过这一步。

(RKLLM-Toolkit) test@test:~$ '''sudo apt update'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install curl git'''

(RKLLM-Toolkit) test@test:~$ '''curl -s''' '''https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install git-lfs'''

(RKLLM-Toolkit) test@test:~$ '''git lfs install'''

<ol start="2" style="list-style-type: decimal;">
<li>接着下载Phi-3模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''git clone https://huggingface.co/microsoft/Phi-3-mini-4k-instruct'''

(RKLLM-Toolkit) test@test:~$ '''cd Phi-3-mini-4k-instruct'''

(RKLLM-Toolkit) test@test:~/Phi-3-mini-4k-instruct$ '''git reset --hard 291e9e30e38030c23497afa30f3af1f104837aa6'''

(RKLLM-Toolkit) test@test:~/Phi-3-mini-4k-instruct$ '''cd ..'''

<ol start="3" style="list-style-type: decimal;">
<li><span id="修改rknn-llmrkllm-toolkitexampleshuggingfacetest.py里面的modelpath变量的值为下载的phi-3-mini-4k-instruct文件夹所在的绝对路径然后修改ret"></span>
= 修改rknn-llm/rkllm-toolkit/examples/huggingface/test.py里面的modelpath变量的值为下载的Phi-3-mini-4k-instruct文件夹所在的绝对路径,然后修改ret =

llm.export_rkllm(&quot;./qwen.rkllm&quot;)括号中的值为要保存的.rkllm格式文件路径,我们将其修改为ret = llm.export_rkllm(&quot;./Phi3.rkllm&quot;)。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-toolkit/examples/huggingface/test.py'''

modelpath = &quot;'''/path/your/Phi-3-mini-4k-instruct'''&quot; #填你自己的路径

ret = llm.export_rkllm(&quot;'''./Phi3.rkllm'''&quot;)

<ol start="4" style="list-style-type: decimal;">
<li>然后用python运行rknn-llm/rkllm-toolkit/examples/huggingface/test.py文件来转换大模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd ~/rknn-llm/rkllm-toolkit/examples/huggingface'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''python test.py'''

<ol start="5" style="list-style-type: decimal;">
<li>转换成功的输出如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image459.png|552x107px]]

<ol start="6" style="list-style-type: decimal;">
<li>最后转换成功会在当前目录下会得到Phi3.rkllm文件,大小约为3.66G。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''ls'''

test.py '''Phi3.rkllm'''

<span id="转换chatglm3模型"></span>
===== 转换ChatGLM3模型 =====

# 先在Ubuntu操作系统上安装Git LFS,如果已安装可跳过这一步。

(RKLLM-Toolkit) test@test:~$ '''sudo apt update'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install curl git'''

(RKLLM-Toolkit) test@test:~$ '''curl -s''' '''https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install git-lfs'''

(RKLLM-Toolkit) test@test:~$ '''git lfs install'''

<ol start="2" style="list-style-type: decimal;">
<li>接着下载ChatGLM3模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''git clone https://huggingface.co/THUDM/chatglm3-6b'''

(RKLLM-Toolkit) test@test:~$ '''cd chatglm3-6b'''

(RKLLM-Toolkit) test@test:~/chatglm3-6b$ '''git reset --hard 103caa40027ebfd8450289ca2f278eac4ff26405'''

(RKLLM-Toolkit) test@test:~/chatglm3-6b$ '''cd ..'''

<ol start="3" style="list-style-type: decimal;">
<li><span id="修改rknn-llmrkllm-toolkitexampleshuggingfacetest.py里面的modelpath变量的值为下载的chatglm3-6b文件夹所在的绝对路径然后修改ret"></span>
= 修改rknn-llm/rkllm-toolkit/examples/huggingface/test.py里面的modelpath变量的值为下载的chatglm3-6b文件夹所在的绝对路径,然后修改ret =

llm.export_rkllm(&quot;./qwen.rkllm&quot;)括号中的值为要保存的.rkllm格式文件路径,我们将其修改为ret = llm.export_rkllm(&quot;./chatglm3.rkllm&quot;)。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-toolkit/examples/huggingface/test.py'''

modelpath = &quot;'''/path/your/chatglm3-6b'''&quot; #填你自己的路径

ret = llm.export_rkllm(&quot;'''./chatglm3.rkllm'''&quot;)

<ol start="4" style="list-style-type: decimal;">
<li>然后用python运行rknn-llm/rkllm-toolkit/examples/huggingface/test.py文件来转换大模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd ~/rknn-llm/rkllm-toolkit/examples/huggingface'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''python test.py'''

<ol start="5" style="list-style-type: decimal;">
<li>转换成功的输出如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image460.png|553x94px]]

<ol start="6" style="list-style-type: decimal;">
<li>最后转换成功会在当前目录下会得到chatglm3.rkllm文件,大小约为6.07G。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''ls'''

test.py '''chatglm3.rkllm'''

<span id="转换gemma模型"></span>
===== 转换Gemma模型 =====

# 先在Ubuntu操作系统上安装Git LFS,如果已安装可跳过这一步。

(RKLLM-Toolkit) test@test:~$ '''sudo apt update'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install curl git'''

(RKLLM-Toolkit) test@test:~$ '''curl -s''' '''https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install git-lfs'''

(RKLLM-Toolkit) test@test:~$ '''git lfs install'''

<ol start="2" style="list-style-type: decimal;">
<li>接着下载Gemma模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''git clone https://huggingface.co/google/gemma-2b-it'''

(RKLLM-Toolkit) test@test:~$ '''cd gemma-2b-it'''

(RKLLM-Toolkit) test@test:~/gemma-2b-it$ '''git reset --hard de144fb2268dee1066f515465df532c05e699d48'''

(RKLLM-Toolkit) test@test:~/gemma-2b-it$ '''cd ..'''

<ol start="3" style="list-style-type: decimal;">
<li><span id="修改rknn-llmrkllm-toolkitexampleshuggingfacetest.py里面的modelpath变量的值为下载的gemma-2b-it文件夹所在的绝对路径然后修改ret"></span>
= 修改rknn-llm/rkllm-toolkit/examples/huggingface/test.py里面的modelpath变量的值为下载的gemma-2b-it文件夹所在的绝对路径,然后修改ret =

llm.export_rkllm(&quot;./qwen.rkllm&quot;)括号中的值为要保存的.rkllm格式文件路径,我们将其修改为ret = llm.export_rkllm(&quot;./Gemma.rkllm&quot;)。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-toolkit/examples/huggingface/test.py'''

modelpath = &quot;'''/path/your/gemma-2b-it'''&quot; #填你自己的路径

ret = llm.export_rkllm(&quot;'''./Gemma.rkllm'''&quot;)

<ol start="4" style="list-style-type: decimal;">
<li>然后用python运行rknn-llm/rkllm-toolkit/examples/huggingface/test.py文件来转换大模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd ~/rknn-llm/rkllm-toolkit/examples/huggingface'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''python test.py'''

<ol start="5" style="list-style-type: decimal;">
<li>转换成功的输出如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image461.png|553x68px]]

<ol start="6" style="list-style-type: decimal;">
<li>最后转换成功会在当前目录下会得到Gemma.rkllm文件,大小约为3.81G。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''ls'''

test.py '''Gemma.rkllm'''

<span id="转换internlm2模型"></span>
===== 转换InternLM2模型 =====

# 先在Ubuntu操作系统上安装Git LFS,如果已安装可跳过这一步。

(RKLLM-Toolkit) test@test:~$ '''sudo apt update'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install curl git'''

(RKLLM-Toolkit) test@test:~$ '''curl -s''' '''https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install git-lfs'''

(RKLLM-Toolkit) test@test:~$ '''git lfs install'''

<ol start="2" style="list-style-type: decimal;">
<li>接着下载InternLM2模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''git clone https://huggingface.co/internlm/internlm2-chat-1_8b'''

(RKLLM-Toolkit) test@test:~$ '''cd internlm2-chat-1_8b'''

(RKLLM-Toolkit) test@test:~/internlm2-chat-1_8b$ '''git reset --hard ecccbb5c87079ad84e5788baa55dd6e21a9c614d'''

(RKLLM-Toolkit) test@test:~/internlm2-chat-1_8b$ '''cd ..'''

<ol start="3" style="list-style-type: decimal;">
<li><span id="修改rknn-llmrkllm-toolkitexampleshuggingfacetest.py里面的modelpath变量的值为下载的internlm2-chat-1_8b文件夹所在的绝对路径然后修改ret"></span>
= 修改rknn-llm/rkllm-toolkit/examples/huggingface/test.py里面的modelpath变量的值为下载的internlm2-chat-1_8b文件夹所在的绝对路径,然后修改ret =

llm.export_rkllm(&quot;./qwen.rkllm&quot;)括号中的值为要保存的.rkllm格式文件路径,我们将其修改为ret = llm.export_rkllm(&quot;./InternLM2.rkllm&quot;)。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-toolkit/examples/huggingface/test.py'''

modelpath = &quot;'''/path/your/internlm2-chat-1_8b'''&quot; #填你自己的路径

ret = llm.export_rkllm(&quot;'''./InternLM2.rkllm'''&quot;)

<ol start="4" style="list-style-type: decimal;">
<li>然后用python运行rknn-llm/rkllm-toolkit/examples/huggingface/test.py文件来转换大模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd ~/rknn-llm/rkllm-toolkit/examples/huggingface'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''python test.py'''

<ol start="5" style="list-style-type: decimal;">
<li>转换成功的输出如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image462.png|553x60px]]

<ol start="6" style="list-style-type: decimal;">
<li>最后转换成功会在当前目录下会得到InternLM2.rkllm文件,大小约为1.94G。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''ls'''

test.py '''InternLM2.rkllm'''

<span id="转换minicpm模型"></span>
===== 转换MiniCPM模型 =====

# 先在Ubuntu操作系统上安装Git LFS,如果已安装可跳过这一步。

(RKLLM-Toolkit) test@test:~$ '''sudo apt update'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install curl git'''

(RKLLM-Toolkit) test@test:~$ '''curl -s''' '''https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install git-lfs'''

(RKLLM-Toolkit) test@test:~$ '''git lfs install'''

<ol start="2" style="list-style-type: decimal;">
<li>接着下载MiniCPM模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''git clone https://huggingface.co/openbmb/MiniCPM-2B-sft-bf16'''

(RKLLM-Toolkit) test@test:~$ '''cd MiniCPM-2B-sft-bf16'''

(RKLLM-Toolkit) test@test:~/MiniCPM-2B-sft-bf16$ '''git reset --hard 79fbb1db171e6d8bf77cdb0a94076a43003abd9e'''

(RKLLM-Toolkit) test@test:~/MiniCPM-2B-sft-bf16$ '''cd ..'''

<ol start="3" style="list-style-type: decimal;">
<li><span id="修改rknn-llmrkllm-toolkitexampleshuggingfacetest.py里面的modelpath变量的值为下载的minicpm-2b-sft-bf16文件夹所在的绝对路径然后修改ret"></span>
= 修改rknn-llm/rkllm-toolkit/examples/huggingface/test.py里面的modelpath变量的值为下载的MiniCPM-2B-sft-bf16文件夹所在的绝对路径,然后修改ret =

llm.export_rkllm(&quot;./qwen.rkllm&quot;)括号中的值为要保存的.rkllm格式文件路径,我们将其修改为ret = llm.export_rkllm(&quot;./MiniCPM.rkllm&quot;)。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-toolkit/examples/huggingface/test.py'''

modelpath = &quot;'''/path/your/MiniCPM-2B-sft-bf16'''&quot; #填你自己的路径

ret = llm.export_rkllm(&quot;'''./MiniCPM.rkllm'''&quot;)

<ol start="4" style="list-style-type: decimal;">
<li>然后用python运行rknn-llm/rkllm-toolkit/examples/huggingface/test.py文件来转换大模型。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd ~/rknn-llm/rkllm-toolkit/examples/huggingface'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''python test.py'''

<ol start="5" style="list-style-type: decimal;">
<li>转换成功的输出如下所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image463.png|553x48px]]

<ol start="6" style="list-style-type: decimal;">
<li>最后转换成功会在当前目录下会得到MiniCPM.rkllm文件,大小约为3.07G。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''ls'''

test.py '''MiniCPM.rkllm'''

==== 编译测试代码 ====

# 首先切换回~目录然后下载交叉编译工具链并解压。

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-toolkit/examples/huggingface$ '''cd ~'''

(RKLLM-Toolkit) test@test:~$ '''sudo apt install cmake'''

(RKLLM-Toolkit) test@test:~$ '''wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz'''

(RKLLM-Toolkit) test@test:~$ '''tar -xJf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz'''

<ol start="2" style="list-style-type: decimal;">
<li>然后修改rknn-llm/rkllm-runtime/examples/rkllm_api_demo/build-linux.sh中的GCC_COMPILER_PATH为~/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-runtime/examples/rkllm_api_demo/build-linux.sh'''

[[File:Orange_Pi_5_Ultra-image464.png|553x134px]]

<ol start="3" style="list-style-type: decimal;">
<li>然后用rknn-llm/rkllm-runtime/examples/rkllm_api_demo/ build-linux.sh编译测试代码。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''cd rknn-llm/rkllm-runtime/examples/rkllm_api_demo'''

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-runtime/examples/rkllm_api_demo$ '''bash build-linux.sh'''

<ol start="4" style="list-style-type: decimal;">
<li>最后编译完查看生成的llm_demo文件。</li></ol>

(RKLLM-Toolkit) test@test:~/rknn-llm/rkllm-runtime/examples/rkllm_api_demo$ '''ls build/build_linux_aarch64_Release'''

CMakeCache.txt CMakeFiles cmake_install.cmake llm_demo Makefile

=== 开发板端部署运行的详细步骤 ===

==== 模型推理 ====

'''建议使用内存为8GB或8GB以上的开发板进行测试。内存为4GB的开发板可能因为内存不足而导致模型无法运行。'''

<span id="tinyllama模型推理"></span>
===== TinyLLAMA模型推理 =====

# 首先将在Ubuntu PC端编译好的llm_demo程序和TinyLlama.rkllm模型文件上传到开发板中。

orangepi@orangepi:~$ '''ls'''

llm_demo TinyLlama.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)。</li></ol>

orangepi@orangepi:~$ '''ulimit -HSn 102400'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行下面的命令来启动模型。</li></ol>

orangepi@orangepi:~$ '''chmod 777 llm_demo'''

orangepi@orangepi:~$ '''./llm_demo ./TinyLlama.rkllm'''

<ol start="4" style="list-style-type: decimal;">
<li>运行成功的话就会弹出以下界面。</li></ol>

[[File:Orange_Pi_5_Ultra-image465.png|553x182px]]

<ol start="5" style="list-style-type: decimal;">
<li>如果运行完弹出以下失败界面的话,reboot重启开发板就可以了。'''第四步运行成功的话则跳过这一步'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<ol start="6" style="list-style-type: decimal;">
<li>在交互界面输入问题后按回车,测试成功的结果如下:</li></ol>

'''注意,TinyLLAMA模型只支持英文问答,用中文提问的话模型会胡言乱语。在开发板端运行TinyLLAMA的话模型的回答比较随机,不能很好地交互。'''

[[File:Orange_Pi_5_Ultra-image467.png|553x90px]]

<ol start="7" style="list-style-type: decimal;">
<li>最后输入exit就可以退出了。</li></ol>

user: exit

[[File:Orange_Pi_5_Ultra-image468.png|267x56px]]

<span id="qwen模型推理"></span>
===== Qwen模型推理 =====

# 首先将在Ubuntu PC端编译好的llm_demo程序和Qwen.rkllm模型文件上传到开发板中。

orangepi@orangepi:~$ '''ls'''

llm_demo Qwen.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)。</li></ol>

orangepi@orangepi:~$ '''ulimit -HSn 102400'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行下面的命令来启动模型。</li></ol>

orangepi@orangepi:~$ '''chmod 777 llm_demo'''

orangepi@orangepi:~$ '''./llm_demo ./Qwen.rkllm'''

<ol start="4" style="list-style-type: decimal;">
<li>运行成功的话就会弹出以下界面。</li></ol>

[[File:Orange_Pi_5_Ultra-image465.png|553x182px]]

<ol start="5" style="list-style-type: decimal;">
<li>如果运行完弹出以下失败界面的话,reboot重启开发板就可以了。'''第四步运行成功的话则跳过这一步'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<ol start="6" style="list-style-type: decimal;">
<li>在交互界面输入问题后按回车,测试成功的结果如下:</li></ol>

[[File:Orange_Pi_5_Ultra-image469.png|553x136px]]

<ol start="7" style="list-style-type: decimal;">
<li>最后输入exit就可以退出了。</li></ol>

user: exit

[[File:Orange_Pi_5_Ultra-image468.png|267x56px]]

<span id="qwen2模型推理"></span>
===== Qwen2模型推理 =====

# 首先将在Ubuntu PC端编译好的llm_demo程序和Qwen2.rkllm模型文件上传到开发板中。

orangepi@orangepi:~$ '''ls'''

llm_demo Qwen2.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)。</li></ol>

orangepi@orangepi:~$ '''ulimit -HSn 102400'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行下面的命令来启动模型。</li></ol>

orangepi@orangepi:~$ '''chmod 777 llm_demo'''

orangepi@orangepi:~$ '''./llm_demo ./Qwen2.rkllm'''

<ol start="4" style="list-style-type: decimal;">
<li>运行成功的话就会弹出以下界面。</li></ol>

[[File:Orange_Pi_5_Ultra-image465.png|553x182px]]

<ol start="5" style="list-style-type: decimal;">
<li>如果运行完弹出以下失败界面的话,reboot重启开发板就可以了。'''第四步运行成功的话则跳过这一步'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<ol start="6" style="list-style-type: decimal;">
<li>在交互界面输入问题后按回车,测试成功的结果如下</li></ol>

[[File:Orange_Pi_5_Ultra-image470.png|553x74px]]

<ol start="7" style="list-style-type: decimal;">
<li>最后输入exit就可以退出了</li></ol>

user: exit

[[File:Orange_Pi_5_Ultra-image468.png|267x56px]]

<span id="phi-3模型推理"></span>
===== Phi-3模型推理 =====

# 首先将在Ubuntu PC端编译好的llm_demo程序和Phi3.rkllm模型文件上传到开发板中。

orangepi@orangepi:~$ '''ls'''

llm_demo Phi3.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)。</li></ol>

orangepi@orangepi:~$ '''ulimit -HSn 102400'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行下面的命令来启动模型。</li></ol>

orangepi@orangepi:~$ '''chmod 777 llm_demo'''

orangepi@orangepi:~$ '''./llm_demo ./Phi3.rkllm'''

<ol start="4" style="list-style-type: decimal;">
<li>运行成功的话就会弹出以下界面。</li></ol>

[[File:Orange_Pi_5_Ultra-image465.png|553x182px]]

<ol start="5" style="list-style-type: decimal;">
<li>如果运行完弹出以下失败界面的话,reboot重启开发板就可以了。'''第四步运行成功的话则跳过这一步'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<ol start="6" style="list-style-type: decimal;">
<li>在交互界面输入问题后按回车,测试成功的结果如下</li></ol>

[[File:Orange_Pi_5_Ultra-image471.png|552x115px]]

<ol start="7" style="list-style-type: decimal;">
<li>最后输入exit就可以退出了</li></ol>

user: exit

[[File:Orange_Pi_5_Ultra-image468.png|267x56px]]

<span id="chatglm3模型推理"></span>
===== ChatGLM3模型推理 =====

# 首先将在Ubuntu PC端编译好的llm_demo程序和chatglm3.rkllm模型文件上传到开发板中。

orangepi@orangepi:~$ '''ls'''

llm_demo chatglm3.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)。</li></ol>

orangepi@orangepi:~$ '''ulimit -HSn 102400'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行下面的命令来启动模型。</li></ol>

orangepi@orangepi:~$ '''chmod 777 llm_demo'''

orangepi@orangepi:~$ '''./llm_demo ./chatglm3.rkllm'''

<ol start="4" style="list-style-type: decimal;">
<li>运行成功的话就会弹出以下界面。</li></ol>

[[File:Orange_Pi_5_Ultra-image465.png|553x182px]]

<ol start="5" style="list-style-type: decimal;">
<li>如果运行完弹出以下失败界面的话,reboot重启开发板就可以了。'''第四步运行成功的话则跳过这一步'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<ol start="6" style="list-style-type: decimal;">
<li>在交互界面输入问题后按回车,测试成功的结果如下</li></ol>

[[File:Orange_Pi_5_Ultra-image472.png|552x138px]]

<ol start="7" style="list-style-type: decimal;">
<li>最后输入exit就可以退出了</li></ol>

user: exit

[[File:Orange_Pi_5_Ultra-image468.png|267x56px]]

<span id="gemma模型推理"></span>
===== Gemma模型推理 =====

# 首先将在Ubuntu PC端编译好的llm_demo程序和Gemma.rkllm模型文件上传到开发板中。

orangepi@orangepi:~$ '''ls'''

llm_demo Gemma.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)。</li></ol>

orangepi@orangepi:~$ '''ulimit -HSn 102400'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行下面的命令来启动模型。</li></ol>

orangepi@orangepi:~$ '''chmod 777 llm_demo'''

orangepi@orangepi:~$ '''./llm_demo ./Gemma.rkllm'''

<ol start="4" style="list-style-type: decimal;">
<li>运行成功的话就会弹出以下界面。</li></ol>

[[File:Orange_Pi_5_Ultra-image465.png|553x182px]]

<ol start="5" style="list-style-type: decimal;">
<li>如果运行完弹出以下失败界面的话,reboot重启开发板就可以了。'''第四步运行成功的话则跳过这一步'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<ol start="6" style="list-style-type: decimal;">
<li>在交互界面输入问题后按回车,测试成功的结果如下</li></ol>

[[File:Orange_Pi_5_Ultra-image473.png|553x111px]]

<ol start="7" style="list-style-type: decimal;">
<li>最后输入exit就可以退出了</li></ol>

user: exit

[[File:Orange_Pi_5_Ultra-image468.png|267x56px]]

<span id="internlm2模型推理"></span>
===== InternLM2模型推理 =====

# 首先将在Ubuntu PC端编译好的llm_demo程序和InternLM2.rkllm模型文件上传到开发板中。

orangepi@orangepi:~$ '''ls'''

llm_demo InternLM2.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)。</li></ol>

orangepi@orangepi:~$ '''ulimit -HSn 102400'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行下面的命令来启动模型。</li></ol>

orangepi@orangepi:~$ '''chmod 777 llm_demo'''

orangepi@orangepi:~$ '''./llm_demo ./InternLM2.rkllm'''

<ol start="4" style="list-style-type: decimal;">
<li>运行成功的话就会弹出以下界面。</li></ol>

[[File:Orange_Pi_5_Ultra-image465.png|553x182px]]

<ol start="5" style="list-style-type: decimal;">
<li>如果运行完弹出以下失败界面的话,reboot重启开发板就可以了。'''第四步运行成功的话则跳过这一步'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<ol start="6" style="list-style-type: decimal;">
<li>在交互界面输入问题后按回车,测试成功的结果如下</li></ol>

[[File:Orange_Pi_5_Ultra-image474.png|552x73px]]

<ol start="7" style="list-style-type: decimal;">
<li>最后输入exit就可以退出了</li></ol>

user: exit

[[File:Orange_Pi_5_Ultra-image468.png|267x56px]]

<span id="minicpm模型推理"></span>
===== MiniCPM模型推理 =====

# 首先将在Ubuntu PC端编译好的llm_demo程序和MiniCPM.rkllm模型文件上传到开发板中。

orangepi@orangepi:~$ '''ls'''

llm_demo MiniCPM.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)。</li></ol>

orangepi@orangepi:~$ '''ulimit -HSn 102400'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行下面的命令来启动模型。</li></ol>

orangepi@orangepi:~$ '''chmod 777 llm_demo'''

orangepi@orangepi:~$ '''./llm_demo ./MiniCPM.rkllm'''

<ol start="4" style="list-style-type: decimal;">
<li>运行成功的话就会弹出以下界面。</li></ol>

[[File:Orange_Pi_5_Ultra-image465.png|553x182px]]

<ol start="5" style="list-style-type: decimal;">
<li>如果运行完弹出以下失败界面的话,reboot重启开发板就可以了。'''第四步运行成功的话则跳过这一步'''。</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<ol start="6" style="list-style-type: decimal;">
<li>在交互界面输入问题后按回车,测试成功的结果如下</li></ol>

[[File:Orange_Pi_5_Ultra-image475.png|552x65px]]

<ol start="7" style="list-style-type: decimal;">
<li>最后输入exit就可以退出了</li></ol>

user: exit

[[File:Orange_Pi_5_Ultra-image468.png|267x56px]]

<span id="开发板端server的部署运行的详细步骤"></span>
=== 开发板端Server的部署运行的详细步骤 ===

'''运行此小节开发板和Ubuntu PC必须处于同一网段。'''

在使用RKLLM-Toolkit完成模型转换并得到RKLLM模型后,用户可以使用该模型在Linux开发板上进行板端Server服务的部署,即在Linux设备上设置服务端并向局域网内的所有人暴露网络接口,其他人通过访问对应地址即可调用RKLLM模型进行推理,实现高效简洁的交互。有两种不同的Server部署实现:

# 基于Flask搭建的RKLLM-Server-Flask,用户能够在客户端通过request请求的方式实现与服务端间的API访问。
# 基于Graio搭建的RKLLM-Server-Gradio,能够快速实现网页服务端的搭建,进行可视化交互。

<span id="基于-flask-搭建服务器"></span>
==== 基于 Flask 搭建服务器 ====

<span id="服务器端开发板端"></span>
===== 服务器端(开发板端) =====

# 首先将之前下载的RKLLM工具链rknn-llm中的rkllm-runtime/examples/rkllm_server_demo/rkllm_server文件夹和转换好的.rkllm模型文件上传到开发板中,想用哪个大模型就上传哪个.rkllm模型文件。

orangepi@orangepi:~$ '''ls'''

Qwen2.rkllm Qwen.rkllm rkllm_server TinyLlama.rkllm chatglm3.rkllm Gemma.rkllm InternLM2.rkllm MiniCPM.rkllm Phi3.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后将rkllm_server/flask_server.py文件中的rkllm_lib = ctypes.CDLL('lib/librkllmrt.so')修改为rkllm_lib = ctypes.CDLL('/usr/lib/librkllmrt.so'),将rknnllm_param.use_gpu= True修改为rknnllm_param.use_gpu = False。</li></ol>

orangepi@orangepi:~$ '''vim rkllm_server/flask_server.py'''

rkllm_lib = ctypes.CDLL('/usr/lib/librkllmrt.so')

rknnllm_param.use_gpu = False

<ol start="3" style="list-style-type: decimal;">
<li>然后在开发板上安装pip库和flask库。</li></ol>

'''如果使用的是Debian12系统,则需要将在命令pip install flask==2.2.2 Werkzeug==2.2.2 -i [https://pypi.tuna.tsinghua.edu.cn/simple后面加上--break-system-packages, https://pypi.tuna.tsinghua.edu.cn/simple后面加上--break-system-packages]'''

'''即以下命令:'''

'''pip install flask==2.2.2 Werkzeug==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple --break-system-packages'''

orangepi@orangepi:~$ '''sudo apt update'''

orangepi@orangepi:~$ '''sudo apt install python3-pip -y'''

orangepi@orangepi:~$ '''pip install flask==2.2.2 Werkzeug==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple'''

<ol start="4" style="list-style-type: decimal;">
<li>然后切换到rkllm_server目录下运行flask_server.py 启动服务</li></ol>

'''rkllm_model_path是转换后模型的绝对路径。'''

'''如果想使用TinyLlama就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/TinyLlama.rkllm。'''

'''如果想使用Qwen2就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/Qwen2.rkllm。'''

'''如果想使用Phi-3就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/Phi3.rkllm。'''

'''如果想使用ChatGLM3就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/chatglm3.rkllm。'''

'''如果想使用Gemma就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/Gemma.rkllm。'''

'''如果想使用InternLM2就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/InternLM2.rkllm。'''

'''如果想使用MiniCPM就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/MiniCPM.rkllm。'''

orangepi@orangepi:~$ '''cd rkllm_server'''

orangepi@orangepi:~/rkllm_server$ '''python3 flask_server.py --target_platform rk3588 --rkllm_model_path ~/Qwen.rkllm'''

<ol start="5" style="list-style-type: decimal;">
<li>成功的话就如下图所示,这个时候服务器端就配置好了。</li></ol>

[[File:Orange_Pi_5_Ultra-image476.png|553x123px]]

<ol start="6" style="list-style-type: decimal;">
<li>如果运行的时候弹出以下失败界面的话,reboot重启开发板就可以了。'''第五步运行成功的话则跳过这一步。'''</li></ol>

[[File:Orange_Pi_5_Ultra-image466.png|553x98px]]

orangepi@orangepi:~$ '''sudo reboot'''

<span id="客户端ubuntu-pc"></span>
===== 客户端(Ubuntu PC) =====

'''无论在开发板端用的是什么模型,客户端都不用修改对应的模型文件。'''

# 首先在ubuntu PC端用终端进入 RKLLM-Toolkit Conda环境。

test@test:~$ '''source ~/miniforge3/bin/activate'''

(base) test@test:~$ '''conda activate RKLLM-Toolkit'''

(RKLLM-Toolkit) test@test:~$

<ol start="2" style="list-style-type: decimal;">
<li><span id="然后将文件rknn-llmrkllm-runtimeexamplesrkllm_server_demochat_api_flask.py中server_url"></span>
= 然后将文件rknn-llm/rkllm-runtime/examples/rkllm_server_demo/chat_api_flask.py中server_url =

'http://172.16.10.102:8080/rkllm_chat'中的172.16.10.102修改为实际开发板的地址,用户需要根据自己部署的具体地址进行调整。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''vim rknn-llm/rkllm-runtime/examples/rkllm_server_demo/chat_api_flask.py'''

<ol start="3" style="list-style-type: decimal;">
<li>然后运行rknn-llm/rkllm-runtime/examples/rkllm_server_demo/chat_api_flask.py文件。</li></ol>

(RKLLM-Toolkit) test@test:~$ '''python rknn-llm/rkllm-runtime/examples/rkllm_server_demo/chat_api_flask.py'''

<ol start="4" style="list-style-type: decimal;">
<li>运行后输入自己的问题按回车就可以了</li></ol>

[[File:Orange_Pi_5_Ultra-image477.png|553x64px]]

<ol style="list-style-type: lower-alpha;">
<li><p>在开发板Server端使用TinyLLAMA模型,在Ubuntu PC端进行测试,如下图所示,TinyLLAMA只能用英文。</p>
<p>[[File:Orange_Pi_5_Ultra-image478.png|553x136px]]</p></li>
<li><p>在开发板Server端使用Qwen模型,在Ubuntu PC端进行测试,如下图所示:</p></li></ol>

[[File:Orange_Pi_5_Ultra-image479.png|553x56px]]

<ol start="3" style="list-style-type: lower-alpha;">
<li>在开发板Server端使用Qwen2模型,在Ubuntu PC端进行测试,如下图所示,有时候会出现其他的不相干的回答。</li></ol>

[[File:Orange_Pi_5_Ultra-image480.png|553x136px]]

<ol start="4" style="list-style-type: lower-alpha;">
<li><p>在开发板Server端使用Phi-3模型,在Ubuntu PC端进行测试,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image481.png|575x61px]]</p></li>
<li><p>在开发板Server端使用ChatGLM3模型,在Ubuntu PC端进行测试,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image482.png|576x97px]]</p></li>
<li><p>在开发板Server端使用Gemma模型,在Ubuntu PC端进行测试,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image483.png|576x151px]]</p></li>
<li><p>在开发板Server端使用InternLM2模型,在Ubuntu PC端进行测试,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image484.png|576x72px]]</p></li>
<li><p>在开发板Server端使用MiniCPM模型,在Ubuntu PC端进行测试,如下图所示:</p></li></ol>

<blockquote>'''MiniCPM使用这种方式效果很差,不推荐使用。'''
</blockquote>
[[File:Orange_Pi_5_Ultra-image485.png|576x95px]]

<span id="基于gradio搭建服务器"></span>
==== 基于Gradio搭建服务器 ====

<span id="服务器端开发板端-1"></span>
===== 服务器端(开发板端) =====

# 首先将之前下载的RKLLM工具链rknn-llm中的rkllm-runtime/examples/rkllm_server_demo/rkllm_server文件夹和转换好的.rkllm模型文件上传到开发板中,想用哪个大模型就上传哪个.rkllm模型文件。

orangepi@orangepi:~$ '''ls'''

Qwen2.rkllm Qwen.rkllm rkllm_server TinyLlama.rkllm

<ol start="2" style="list-style-type: decimal;">
<li>然后将rkllm_server/gradio_server.py文件中的rkllm_lib = ctypes.CDLL('lib/librkllmrt.so')修改为rkllm_lib = ctypes.CDLL('/usr/lib/librkllmrt.so'),将rknnllm_param.use_gpu= True修改为rknnllm_param.use_gpu = False。</li></ol>

orangepi@orangepi:~$ '''vim rkllm_server/gradio_server.py'''

rkllm_lib = ctypes.CDLL('/usr/lib/librkllmrt.so')

rknnllm_param.use_gpu = False

<ol start="3" style="list-style-type: decimal;">
<li>然后在开发板上安装pip库和gradio库。</li></ol>

'''如果使用的是Debian12系统,则需要将在命令pip3 install gradio&gt;=4.24.0 -i [https://pypi.tuna.tsinghua.edu.cn/simple后面加上--break-system-packages,即 https://pypi.tuna.tsinghua.edu.cn/simple后面加上--break-system-packages]'''

'''[https://pypi.tuna.tsinghua.edu.cn/simple后面加上--break-system-packages,即 即]以下命令:'''

'''pip3 install gradio&gt;=4.24.0 -i https://pypi.tuna.tsinghua.edu.cn/simple --break-system-packages'''

orangepi@orangepi:~$ '''sudo apt update'''

orangepi@orangepi:~$ '''sudo apt install python3-pip -y'''

orangepi@orangepi:~$ '''pip3 install gradio&gt;=4.24.0 -i https://pypi.tuna.tsinghua.edu.cn/simple'''

<ol start="4" style="list-style-type: decimal;">
<li>然后切换到rkllm_server目录下运行gradio_server.py启动服务。</li></ol>

'''rkllm_model_path是转换后模型的绝对路径。'''

'''如果想使用TinyLlama就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/TinyLlama.rkllm。'''

'''如果想使用Qwen2就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/Qwen2.rkllm。'''

'''如果想使用Phi-3就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/Phi3.rkllm。'''

'''如果想使用ChatGLM3就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/chatglm3.rkllm。'''

'''如果想使用Gemma就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/Gemma.rkllm。'''

'''如果想使用InternLM2就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/InternLM2.rkllm。'''

'''如果想使用MiniCPM就把--rkllm_model_path ~/Qwen.rkllm修改为--rkllm_model_path ~/MiniCPM.rkllm。'''

orangepi@orangepi:~$ '''cd rkllm_server'''

orangepi@orangepi:~/rkllm_server$ '''python3 gradio_server.py --target_platform rk3588 --rkllm_model_path ~/Qwen.rkllm'''

<ol start="5" style="list-style-type: decimal;">
<li>成功的话就如下图所示,这个时候服务器端就配置好了。</li></ol>

'''图中的'''http://0.0.0.0:8080'''不是表示IP地址是这个,真正需要用的IP地址是用户自己开发板的实际地址。'''

[[File:Orange_Pi_5_Ultra-image486.png|553x118px]]

===== 客户端 =====

# 首先在当前局域网下通过任意一台电脑打开浏览器,直接访问”开发板IP:8080”,打开的界面如下图:

[[File:Orange_Pi_5_Ultra-image487.png|553x334px]]

<ol start="2" style="list-style-type: decimal;">
<li>然后在inputTextBox输入框中输入问题后按回车。</li></ol>

[[File:Orange_Pi_5_Ultra-image488.png|553x308px]]

<ol style="list-style-type: lower-alpha;">
<li>在开发板Server端使用TinyLLAMA模型,在Ubuntu PC端进行测试,如下图所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image489.png|553x309px]]

<ol start="2" style="list-style-type: lower-alpha;">
<li>在开发板Server端使用Qwen模型,在Ubuntu PC端进行测试,如下图所示:</li></ol>

[[File:Orange_Pi_5_Ultra-image490.png|553x290px]]

<ol start="3" style="list-style-type: lower-alpha;">
<li>在开发板Server端使用Qwen2模型,在Ubuntu PC端进行测试,如下图所示,有时候会出现其他的不相干的回答。</li></ol>

[[File:Orange_Pi_5_Ultra-image491.png|553x239px]]

<ol start="4" style="list-style-type: lower-alpha;">
<li><p>在开发板Server端使用Phi-3模型,在Ubuntu PC端进行测试,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image492.png|576x339px]]</p></li>
<li><p>在开发板Server端使用ChatGLM3模型,在Ubuntu PC端进行测试,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image493.png|575x344px]]</p></li>
<li><p>在开发板Server端使用Gemma模型,在Ubuntu PC端进行测试,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image494.png|576x349px]]</p></li>
<li><p>在开发板Server端使用InternLM2模型,在Ubuntu PC端进行测试,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image495.png|576x344px]]</p></li>
<li><p>在开发板Server端使用MiniCPM模型,在Ubuntu PC端进行测试,如下图所示:</p></li></ol>

[[File:Orange_Pi_5_Ultra-image496.png|576x314px]]

<span id="rk3588运行rkllm大模型的性能测试结果"></span>
=== RK3588运行RKLLM大模型的性能测试结果 ===

<ol style="list-style-type: decimal;">
<li><p>为了进行大模型性能测试,首先需要在[http://www.orangepi.cn/html/serviceAndSupport/index.html '''官方工具''']中下载大模型性能测试文件'''main.cpp''',下载后,将其替换掉PC端用来编译测试代码的'''rknn-llm/rkllm-runtime/examples/rkllm_api_demo/src/main.cpp'''文件</p>
<p>[[File:Orange_Pi_5_Ultra-image497.png|369x211px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image498.png|374x111px]]</p></li>
<li><p>参考[[#编译测试代码|'''编译测试代码''']]小节重新编译llm_demo文件,然后根据[[#开发板端部署运行的详细步骤|'''开发板端部署运行的详细步骤''']]小节运行大模型。</p></li>
<li><p>在模型运行后输入问题,然后新开一个终端测试性能。性能测试是在模型回答问题的时候测试的。</p></li>
<li><p>NPU负载测试:使用另一个终端在模型回答问题的时候运行以下命令:</p></li></ol>

orangepi@orangepi:~$ '''sudo cat /sys/kernel/debug/rknpu/load'''

NPU load: Core0: 51%, Core1: 51%, Core2: 51%,

<ol start="5" style="list-style-type: decimal;">
<li>CPU负载、内存:使用另一个终端在模型回答问题的时候运行以下命令:</li></ol>

计算CPU负载的时候将llm_demo进程的CPU%值 / CPU数量

计算内存的时候用llm_demo进程的MEM%值 * MEM总量

可以在CPU的选项中点一下,界面就会根据CPU使用量从大到小进行排列显示。

[[File:Orange_Pi_5_Ultra-image499.png|502x227px]]

orangepi@orangepi:~$ '''htop'''

[[File:Orange_Pi_5_Ultra-image500.png|576x230px]]

<ol start="6" style="list-style-type: decimal;">
<li><p>推理:推理速度,简称为推理,在模型推理时输出的token数量/模型推理所用时间。在大模型运行的终端中有打印测试结果,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image501.png|575x156px]]</p></li>
<li><p>预填充:计算输入的token数量/从模型运行到输出第一个token的时间。采用我们给定的问题进行输入,在大模型运行的终端中有打印测试结果。</p></li></ol>

由于不同的大型语言模型在处理同一句话时,可能会采用不同的分词策略,导致生成的token数量存在差异,而实际输入的token数量在RKLLM中没有提供相应的获取渠道,所以我们采用GPT生成了具有256个token的问题作为输入。导致测试的结果存在一定误差。

问:在深度学习领域,卷积神经网络(CNN)和循环神经网络(RNN)在处理图像和时间序列数据方面有哪些关键差异?请详细解释每种网络结构的主要特点,包括它们在不同类型的任务中如何应用,例如图像识别、自然语言处理和时间序列预测。此外,讨论一下这些网络如何处理过拟合问题,以及如何使用正则化技术如dropout来提高模型的泛化能力。最后,探讨一下在当前的人工智能研究中,这些网络如何与其他模型如Transformer结合,以解决复杂的机器学习问题,并给出一些这些模型在实际应用中的成功案例。

[[File:Orange_Pi_5_Ultra-image502.png|575x104px]]

<ol start="8" style="list-style-type: decimal;">
<li>所有模型的测试结果如下表:</li></ol>

{| class="wikitable"
|-
| style="text-align: center;"| '''模型'''
| style="text-align: center;"| * *参 数 大 小 **

| style="text-align: center;"| '''d typ e'''
| style="text-align: center;"| '''性能'''
| style="text-align: center;"| ''' CPU'''

'''负 载'''

| style="text-align: center;"| '''N PU'''

'''负 载'''

| style="text-align: center;"| '''内存 占用'''
|-
| style="text-align: center;"| '''T inyLLAMA'''
| style="text-align: center;"| 1 .1B
| style="text-align: center;"| W 8a8
| style="text-align: center;"| 预填充:58.6157 token/s

推理:12.7262 token/s

| style="text-align: center;"| 15.9%
| style="text-align: center;"| 3<br />
*49%
| style="text-align: center;"| 1.376G
|-
| style="text-align: center;"| '''Qwen'''
| style="text-align: center;"| 1 .8B
| style="text-align: center;"| W 8a8
| style="text-align: center;"| 预填充:168.525 token/s

推理:10.8891 token/s

| style="text-align: center;"| 13.7%
| style="text-align: center;"| 3<br />
*50%
| style="text-align: center;"| 2.72G
|-
| style="text-align: center;"| '''Qwen2'''
| style="text-align: center;"| 0 .5B
| style="text-align: center;"| W 8a8
| style="text-align: center;"| 预填充:440.511 token/s

推理:17.4542 token/s

| style="text-align: center;"| 1 7.75%
| style="text-align: center;"| 3<br />
*34%
| style="text-align: center;"| 1.344G
|-
| style="text-align: center;"| '''Phi-3'''
| style="text-align: center;"| 3 .8B
| style="text-align: center;"| W 8a8
| style="text-align: center;"| 预填充:22.8119 token/s

推理:4.72983 token/s

| style="text-align: center;"| 1 3.13%
| style="text-align: center;"| 3<br />
*62%
| style="text-align: center;"| 4.288G
|-
| style="text-align: center;"| ''' ChatGLM3'''
| style="text-align: center;"| 6B
| style="text-align: center;"| W 8a8
| style="text-align: center;"| 预填充:48.8464 token/s

推理:3.80383 token/s

| style="text-align: center;"| 8.3%
| style="text-align: center;"| 3<br />
*75%
| style="text-align: center;"| 7.04G
|-
| style="text-align: center;"| '''Gemma'''
| style="text-align: center;"| 2B
| style="text-align: center;"| W 8a8
| style="text-align: center;"| 预填充:112.489 token/s

推理:6.41746 token/s

| style="text-align: center;"| 8.25%
| style="text-align: center;"| 3<br />
*64%
| style="text-align: center;"| 4.8G
|-
| style="text-align: center;"| '''I nternLM2'''
| style="text-align: center;"| 1 .8B
| style="text-align: center;"| W 8a8
| style="text-align: center;"| 预填充:117.099 token/s

推理:9.139 token/s

| style="text-align: center;"| 1 1.87%
| style="text-align: center;"| 3<br />
*57%
| style="text-align: center;"| 2.432G
|-
| style="text-align: center;"| * *MiniCPM**

| style="text-align: center;"| 2B
| style="text-align: center;"| W 8a8
| style="text-align: center;"| 预填充:77.4655 token/s

推理:6.16648 token/s

| style="text-align: center;"| 1 6.25%
| style="text-align: center;"| 3<br />
*52%
| style="text-align: center;"| 3.904G
|}

== 关机和重启开发板的方法 ==

<ol style="list-style-type: decimal;">
<li><p>在Linux系统运行的过程中,如果直接拔掉Type-C电源断电,可能会导致文件系统丢失某些数据或者损坏,所以在断电前请先使用'''poweroff'''命令关闭开发板的Linux系统,然后再拔掉电源。</p>
<p>orangepi@orangepi:~$ '''sudo poweroff'''</p></li>
<li><p>另外开发板配有开关机按键,还可以'''短按'''开发板上的开关机按键来关机。</p>
<p>[[File:Orange_Pi_5_Ultra-image503.png|343x87px]]</p></li></ol>

'''注意,Linux桌面版系统按下开关机按键后会弹出下图所示的确认框,需要点击Shut Down选项后才会关机。'''

[[File:Orange_Pi_5_Ultra-image504.png|207x193px]]

<ol start="3" style="list-style-type: decimal;">
<li><p>关机后短按开发板上的开关机按键即可开机。</p>
<p>[[File:Orange_Pi_5_Ultra-image503.png|343x87px]]</p></li>
<li><p>重启linux系统的命令为:</p>
<p>orangepi@orangepi:~$ '''sudo''' '''reboot'''</p></li></ol>

<span id="orange-pi-os-arch系统使用说明"></span>
= Orange Pi OS Arch系统使用说明 =

<span id="orange-pi-os-arch系统适配情况"></span>
== Orange Pi OS Arch系统适配情况 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''功能'''
| style="text-align: center;"| '''OPi OS Arch Gnome Wayland'''
|-
| style="text-align: center;"| '''HDMI TX视频'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI TX音频'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI RX视频'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI RX音频'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB2.0x2'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB3.0x2'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''2.5G网口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''网口状态灯'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''WIFI'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''蓝牙'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''调试串口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''RTC'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''FAN风扇接口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''eMMC扩展接口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''GPIO(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''UART(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''SPI(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''I2C(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''CAN(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''PWM(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''TF 卡启动'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''OV13850摄像头'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''OV13855摄像头'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''SPI+NVME启动'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''LCD'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''MIC'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''耳机播放'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''耳机录音'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''三色LED 灯'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''GPU'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''NPU'''
| style="text-align: center;"| '''NO'''
|-
| style="text-align: center;"| '''VPU'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''开关机按键'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''看门狗测试'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''MPV硬解视频'''
| style="text-align: center;"| '''OK'''
|}

<span id="寸mipi-lcd屏幕的使用方法-1"></span>
== 10.1寸MIPI LCD屏幕的使用方法 ==

<span id="寸mipi-屏幕的组装方法-1"></span>
=== 10.1寸MIPI 屏幕的组装方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先准备需要的配件</p>
<ol style="list-style-type: lower-alpha;">
<li><p>10.1寸MIPI LCD显示屏+触摸屏</p>
<p>[[File:Orange_Pi_5_Ultra-image384.png|288x222px]]</p></li>
<li><p>屏幕转接板+31pin转40pin排线</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image385.png|191x165px|DD9A8F44-0D8F-4f06-9473-B539DEED850C]]

</div></li>
<li><p>30pin MIPI排线</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image386.png|355x33px|C2164119-6EC3-49ae-9A95-BE323F51FAE1]]

</div></li>
<li><p>12pin 触摸屏排线</p>
<p>[[File:Orange_Pi_5_Ultra-image387.png|293x43px]]</p></li></ol>
</li>
<li><p>按照下图将12pin 触摸屏排线、31pin转40pin排线、30pin MIPI排线接到屏幕转接板上,注意'''触摸屏排线蓝色的绝缘面朝下''',其它两根排线绝缘面朝上,如果接错会导致无显示或者不能触摸的问题</p>
<p>[[File:Orange_Pi_5_Ultra-image388.png|487x120px]]</p></li>
<li><p>按照下图将连接好排线的转接板置于MIPI LCD屏上面,并通过31pin转40pin排线连接MIPI LCD屏与转接板</p></li></ol>

[[File:Orange_Pi_5_Ultra-image389.png|286x421px]]

<ol start="4" style="list-style-type: decimal;">
<li><p>然后通过12pin触摸屏排线连接触摸屏与转接板,注意绝缘面的朝向</p>
<p>[[File:Orange_Pi_5_Ultra-image390.png|204x130px]]</p></li>
<li><p>最后通过30pin MIPI排线连接到开发板的LCD接口上</p>
<p>[[File:Orange_Pi_5_Ultra-image391.png|410x250px]]</p></li></ol>

<span id="打开10.1寸mipi-lcd屏幕配置的方法-1"></span>
=== 打开10.1寸MIPI LCD屏幕配置的方法 ===

<ol style="list-style-type: decimal;">
<li><p>OPi OS Arch镜像默认是没有打开mipi lcd屏幕的配置的,如果需要使用mipi lcd屏幕,需要手动打开才行。</p></li>
<li><p>开发板上mipi lcd屏幕的接口如下图所示:</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image392.png|326x207px|IMG_256]]

</div></li>
<li><p>打开mipi lcd配置的方法如下所示:</p>
<p>[orangepi@orangepi ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''</p>
<p>LABEL Orange Pi</p>
<p>LINUX /Image</p>
<p>FDT /dtbs/rockchip/rk3588-orangepi-5-ultra.dtb</p>
<p>'''FDTOVERLAYS /dtbs/rockchip/overlay/rk3588-opi5ultra-lcd.dtbo #需要添加的配置'''</p></li>
<li><p>'''然后重启OPi OS Arch系统'''</p></li>
<li><p>重启后可以看到lcd屏幕的显示如下所示(默认为竖屏):</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image505.jpeg|261x391px|05f7b690281ce538ae272f9c076f2cf0]]

</div>
=== 旋转显示和触摸方向的方法 ===

<ol style="list-style-type: decimal;">
<li><p>首先点击桌面右上角的这块区域</p>
<p>[[File:Orange_Pi_5_Ultra-image506.png|256x163px]]</p></li>
<li><p>然后打开设置</p>
<p>[[File:Orange_Pi_5_Ultra-image507.png|288x238px]]</p></li>
<li><p>然后选择'''Displays'''</p>
<p>[[File:Orange_Pi_5_Ultra-image508.png|435x287px]]</p></li>
<li><p>然后在'''Displays'''的'''Orientation'''中选择想要旋转的方向</p>
<p>[[File:Orange_Pi_5_Ultra-image509.png|451x298px]]</p></li>
<li><p>然后选择'''Apply'''</p>
<p>[[File:Orange_Pi_5_Ultra-image510.png|447x297px]]</p></li>
<li><p>然后就能看到屏幕已经旋转好了,此时还需要选择'''Keep Changes'''来最后确定旋转</p>
<p>[[File:Orange_Pi_5_Ultra-image511.png|255x128px]]</p></li>
<li><p>LCD屏幕旋转90度后的显示如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image512.png|404x258px]]</p></li>
<li><p>'''OPi OS Arch系统LCD屏幕的触摸功能会随着显示方向的旋转而旋转,无需其他设置'''</p></li></ol>

<span id="ov13850和ov13855-mipi摄像头的测试方法-1"></span>
== OV13850和OV13855 MIPI摄像头的测试方法 ==

目前开发板支持两款MIPI摄像头,OV13850和OV13855,具体的图片如下所示:

<ol style="list-style-type: lower-alpha;">
<li><p>1300万MIPI接口的OV13850摄像头</p>
<p>[[File:Orange_Pi_5_Ultra-image18.png|232x131px]]</p></li>
<li><p>1300万MIPI接口的OV13855摄像头</p>
<p>[[File:Orange_Pi_5_Ultra-image19.png|208x123px]]</p>
<p>OV13850和OV13855摄像头使用的转接板和FPC排线是一样的,只是两款摄像头接在转接板上的位置不一样。FPC排线如下图所示,请注意FPC排线是有方向的,标注'''TO MB'''那端需要插到开发板的摄像头接口中,标注'''TO CAMERA'''那端需要插到摄像头转接板上。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image403.png|353x74px]]

摄像头转接板上总共有3个摄像头的接口,同一时间只能接一个使用,如下图所示,其中:

<ol style="list-style-type: lower-alpha;">
<li><p>'''1号接口接OV13850摄像头'''</p></li>
<li><p>'''2号接口接OV13855摄像头'''</p></li>
<li><p>3号接口未使用,忽略即可</p></li></ol>

[[File:Orange_Pi_5_Ultra-image404.png|252x150px]]

Orange Pi 5 Ultra开发板上总共有3个摄像头接口,我们定义Cam0、Cam1和Cam2的位置如下图所示:

[[File:Orange_Pi_5_Ultra-image405.png|243x158px]] [[File:Orange_Pi_5_Ultra-image406.png|239x159px]]

摄像头插在开发板的Cam0接口的方法如下所示:

[[File:Orange_Pi_5_Ultra-image407.png|300x156px]]

摄像头插在开发板的Cam1接口的方法如下所示:

[[File:Orange_Pi_5_Ultra-image408.png|291x219px]]

摄像头插在开发板的Cam2接口的方法如下所示:

[[File:Orange_Pi_5_Ultra-image409.png|296x290px]]

连接好摄像头到开发板上后,我们可以使用下面的方法来测试下摄像头:

<ol style="list-style-type: lower-alpha;">
<li><p>首先在'''/boot/extlinux/extlinux.conf'''中加上下面的配置</p>
<p>[orangepi@orangepi ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''</p>
<p>LABEL Orange Pi</p>
<p>LINUX /Image</p>
<p>FDT /dtbs/rockchip/rk3588-orangepi-5-ultra.dtb</p>
<p>'''FDTOVERLAYS''' '''/dtbs/rockchip/overlay/rk3588-opi5ultra-cam0.dtbo #需要添加的配置'''</p>
<p>上面红色字体演示的是打开'''Cam0接口'''的配置,其他接口的配置如下表所示,将对应的dtbo配置添加到'''FDTOVERLAYS'''后面即可。如果要同时添加多个配置,请用空格隔开。</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''摄像头'''
| style="text-align: left;"| '''dtbo的配置'''
|-
| style="text-align: left;"| '''Cam0'''
| style="text-align: left;"| '''/dtbs/rockchip/overlay/rk3588-opi5ultra-cam0.dtbo'''
|-
| style="text-align: left;"| '''Cam1'''
| style="text-align: left;"| '''/dtbs/rockchip/overlay/rk3588-opi5ultra-cam1.dtbo'''
|-
| style="text-align: left;"| '''Cam2'''
| style="text-align: left;"| '''/dtbs/rockchip/overlay/rk3588-opi5ultra-cam2.dtbo'''
|}

<ol start="2" style="list-style-type: lower-alpha;">
<li><p>'''然后重启OPi OS Arch系统'''</p></li>
<li><p>然后在桌面系统中打开一个终端,再运行下面的脚本</p>
<p>orangepi@orangepi:~$ '''test_camera.sh'''</p></li>
<li><p>然后就能看到摄像头的预览画面了</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image513.png|576x324px|Screenshot from 2023-04-20 17-16-08]]

</div></li></ol>

== 设置中文环境以及安装中文输入法的方法 ==

<ol style="list-style-type: decimal;">
<li><p>首先点击桌面右上角的这块区域</p>
<p>[[File:Orange_Pi_5_Ultra-image506.png|280x178px]]</p></li>
<li><p>然后打开设置</p>
<p>[[File:Orange_Pi_5_Ultra-image514.png|291x220px]]</p></li>
<li><p>然后找到'''System'''选项</p>
<p>[[File:Orange_Pi_5_Ultra-image515.png|576x393px]]</p></li>
<li><p>然后选择'''Region &amp; Language'''</p>
<p>[[File:Orange_Pi_5_Ultra-image516.png|576x393px]]</p></li>
<li><p>然后选择'''Language'''</p>
<p>[[File:Orange_Pi_5_Ultra-image517.png|576x391px]]</p></li>
<li><p>然后选择汉语</p>
<p>[[File:Orange_Pi_5_Ultra-image518.png|576x393px]]</p></li>
<li><p>然后点击'''Select'''</p>
<p>[[File:Orange_Pi_5_Ultra-image519.png|576x392px]]</p></li>
<li><p>然后点击'''Log Out...'''登出系统,再重新登入系统</p>
<p>[[File:Orange_Pi_5_Ultra-image520.png|575x394px]]</p></li>
<li><p>然后可以看到桌面都显示为中文了</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image521.png|575x323px|2024-08-19 06-23-33屏幕截图]]

</div></li>
<li><p>然后安装下fcitx-im和fcitx-configtool</p>
<p>[orangepi@orangepi ~]$ '''sudo pacman -S fcitx-im fcitx-configtool'''</p>
<p>:: 在组 fcitx-im 中有 3 成员:</p>
<p>:: 软件仓库 community</p>
<p>1) fcitx 2) fcitx-qt5 3) fcitx-qt6</p>
<p>输入某个选择 ( 默认=全部选定 ): '''1'''</p></li>
<li><p>然后打开Fcitx配置程序</p>
<p>[[File:Orange_Pi_5_Ultra-image522.png|576x325px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image523.png|575x320px]]</p></li>
<li><p>然后添加'''Google拼音'''输入法</p>
<p>[[File:Orange_Pi_5_Ultra-image524.png|302x276px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image525.png|431x292px]]</p></li>
<li><p>然后我们可以打开一个终端测试下中文输入法,打开终端后,如果默认还是英文输入法,我们可以通过'''Ctrl+Space'''快捷键来切换成中文输入法,然后就能输入中文了</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image526.png|576x324px|截图 2023-04-20 20-38-24]]

</div></li></ol>

<span id="安装wiringop的方法-1"></span>
== 安装wiringOP的方法 ==

'''注意,Orange Pi发布的OPi OS Arch镜像中已经预装了wiringOP,除非wiringOP的代码有更新,否则无需重新下载编译安装,直接使用即可。'''

'''进入系统后可以运行下gpio readall命令,如果能看到下面的输出,说明wiringOP已经预装并且能正常使用。'''

[[File:Orange_Pi_5_Ultra-image527.png|576x317px]]

<ol style="list-style-type: decimal;">
<li><p>下载wiringOP的代码</p>
<p>[orangepi@orangepi ~]$ '''sudo pacman -Syy git'''</p>
<p>[orangepi@orangepi ~]$ '''git clone https://github.com/orangepi-xunlong/wiringOP.git -b next'''</p>
<p>'''注意,Orange Pi 5 Ultra需要下载wiringOP next分支的代码,请别漏了-b next这个参数。'''</p>
<p>'''如果从GitHub下载代码有问题,可以去[http://www.orangepi.cn/html/serviceAndSupport/index.html Orange Pi 5 Ultra资料下载页面的官方工具]中下载wiringOP.tar.gz的源码压缩包。'''</p>
<p>[[File:Orange_Pi_5_Ultra-image528.png|287x83px]]</p></li>
<li><p>编译安装wiringOP</p>
<p>[orangepi@orangepi ~]$ '''sudo pacman -Syy make gcc'''</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>测试gpio readall命令的输出如下</p>
<p>[[File:Orange_Pi_5_Ultra-image527.png|576x317px]]</p></li></ol>

<span id="pin接口gpioi2cuartspican和pwm测试-1"></span>
== 40pin接口GPIO、I2C、UART、SPI、CAN和PWM测试 ==

'''注意,如果需要设置fdt overlays同时打开多个配置,请像下面红色字体配置那样使用空格隔开写在一行即可。'''

[orangepi@orangepi ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''

LABEL Orange Pi

LINUX /Image

FDT /dtbs/rockchip/rk3588-orangepi-5-ultra.dtb

'''FDTOVERLAYS /dtbs/rockchip/overlay/rk3588-i2c2-m0.dtbo /dtbs/rockchip/overlay/rk3588-uart4-m2.dtbo'''

<span id="pin-gpio口测试-2"></span>
=== 40pin GPIO口测试 ===

<ol style="list-style-type: decimal;">
<li><p>开发板40pin中总共有28个GPIO口可以使用,下面以7号引脚——对应GPIO为GPIO1_A7 ——对应wPi序号为2——为例演示如何设置GPIO口的高低电平</p>
<p>[[File:Orange_Pi_5_Ultra-image529.png|575x107px]]</p></li>
<li><p>首先设置GPIO口为输出模式,其中第三个参数需要输入引脚对应的wPi的序号</p>
<p>[orangepi@orangepi ~]$ '''gpio mode 2 out'''</p></li>
<li><p>然后设置GPIO口输出低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为0v,说明设置低电平成功</p>
<p>[orangepi@orangepi ~]$ '''gpio write 2 0'''</p>
<p>使用gpio readall可以看到7号引脚的值(V)变为了0</p>
<p>[[File:Orange_Pi_5_Ultra-image530.png|576x104px]]</p></li>
<li><p>然后设置GPIO口输出高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为3.3v,说明设置高电平成功</p>
<p>[orangepi@orangepi ~]$ '''gpio write 2 1'''</p>
<p>使用gpio readall可以看到7号引脚的值(V)变为了1</p>
<p>[[File:Orange_Pi_5_Ultra-image531.png|576x104px]]</p></li>
<li><p>其他引脚的设置方法类似,只需修改wPi的序号为引脚对应的序号即可</p></li></ol>

<span id="pin-gpio口上下拉电阻的设置方法-1"></span>
=== 40pin GPIO口上下拉电阻的设置方法 ===

'''注意,Orange Pi 5 Ultra下面10个GPIO引脚因为外部有3.3V上拉,所以设置下拉是无效的。'''

[[File:Orange_Pi_5_Ultra-image532.png|575x315px]]

<ol style="list-style-type: decimal;">
<li><p>下面以11号引脚——对应GPIO为GPIO1_A0 ——对应wPi序号为5——为例演示如何设置GPIO口的上下拉电阻</p>
<p>[[File:Orange_Pi_5_Ultra-image533.png|575x133px]]</p></li>
<li><p>首先需要设置GPIO口为输入模式,其中第三个参数需要输入引脚对应的wPi的序号</p>
<p>[orangepi@orangepi ~]$ '''gpio mode 5 in'''</p></li>
<li><p>设置为输入模式后,执行下面的命令可以设置GPIO口为上拉模式</p>
<p>[orangepi@orangepi ~]$ '''gpio mode 5 up'''</p></li>
<li><p>然后输入下面的命令读取GPIO口的电平,如果电平为1,说明上拉模式设置成功</p>
<p>[orangepi@orangepi ~]$ '''gpio read 5'''</p>
<p>'''1'''</p></li>
<li><p>然后执行下面的命令可以设置GPIO口为下拉模式</p>
<p>[orangepi@orangepi ~]$ '''gpio mode 5 down'''</p></li>
<li><p>然后输入下面的命令读取GPIO口的电平,如果电平为0,说明下拉模式设置成功</p>
<p>[orangepi@orangepi ~]$ '''gpio read 5'''</p>
<p>'''0'''</p></li></ol>

<span id="pin-spi测试-2"></span>
=== 40pin SPI测试 ===

# 由下图可知,Orange Pi 5 Ultra可用的spi为spi0、spi1和spi4

[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]

<ol start="2" style="list-style-type: decimal;">
<li>SPI0、SPI1和SPI4在40pin中对应的引脚如下表所示。</li></ol>

{| class="wikitable"
|-
|
| '''S PI0_M2对应40pin'''
| '''S PI1_M1对应40pin'''
| '''S PI4_M2对应40pin'''
|-
| * *MOSI**

| '''19号引脚'''
| '''40号引脚'''
| '''13号引脚'''
|-
| * *MISO**

| '''21号引脚'''
| '''38号引脚'''
| '''11号引脚'''
|-
| '''CLK'''
| '''23号引脚'''
| '''29号引脚'''
| '''15号引脚'''
|-
| '''CS0'''
| '''24号引脚'''
| '''35号引脚'''
| '''16号引脚'''
|-
| '''CS1'''
| '''26号引脚'''
| '''无'''
| '''无'''
|-
| '''dtb o配置'''
| '''spi 0-m2-cs0-spidev'''

'''spi 0-m2-cs1-spidev'''

'''spi0-m2 -cs0-cs1-spidev'''

| '''spi 1-m1-cs0-spidev'''
| '''spi 4-m2-cs0-spidev'''
|}

'''在OPi OS Arch系统中,40pin中的spi功能默认是关闭的,需要手动打开才能使用。'''

'''在/boot/extlinux/extlinux.conf中加入下面红色字体部分的配置,然后重启OPi OS Arch系统就可以打开spi0、spi1和spi4,如果只需要打开一个,那么就填写一个即可。'''

'''[orangepi@orangepi ~]$ sudo vim /boot/extlinux/extlinux.conf'''

LABEL Orange Pi

LINUX /Image

FDT /dtbs/rockchip/rk3588-orangepi-5-ultra.dtb

'''FDTOVERLAYS /dtbs/rockchip/overlay/rk3588-spi0-m2-cs0-cs1-spidev.dtbo'''

'''/dtbs/rockchip/overlay/rk3588-spi1-m1-cs0-spidev.dtbo'''

'''/dtbs/rockchip/overlay/rk3588-spi4-m2-cs0-spidev.dtbo'''

<ol start="3" style="list-style-type: decimal;">
<li><p>先查看下OPi OS Arch系统中是否存在'''spidevx.x'''的设备节点,如果存在,说明SPI已经设置好了,可以直接使用</p>
<p>[orangepi@orangepi ~]$ '''ls /dev/spidev*'''</p>
<p>/dev/spidev0.0 /dev/spidev0.1 /dev/spidev1.0 /dev/spidev4.0</p>
<p>'''上面是打开spi0-m2-cs0-cs1-spidev、spi1-m1-cs0-spidev和spi4-m2-cs0-spidev后显示的结果。'''</p></li>
<li><p>先不短接SPI0或者SPI1或者SPI4的mosi和miso两个引脚,运行spidev_test的输出结果如下所示,可以看到TX和RX的数据不一致</p>
<p>[orangepi@orangepi ~]$ '''sudo spidev_test -v -D /dev/spidev0.0 #spi0的命令'''</p>
<p>[orangepi@orangepi ~]$ '''sudo spidev_test -v -D /dev/spidev1.0 #spi1的命令'''</p>
<p>[orangepi@orangepi ~]$ '''sudo spidev_test -v -D /dev/spidev4.0 #spi4的命令'''</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>然后短接SPI0或者SPI1或者SPI4的mosi和miso两个引脚再运行spidev_test的输出如下,可以看到发送和接收的数据一样</p>
<p>[orangepi@orangepi ~]$ '''sudo''' '''spidev_test -v -D /dev/spidev0.0 #spi0的命令'''</p>
<p>[orangepi@orangepi ~]$ '''sudo spidev_test -v -D /dev/spidev1.0 #spi1的命令'''</p>
<p>[orangepi@orangepi ~]$ '''sudo spidev_test -v -D /dev/spidev4.0 #spi4的命令'''</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 '''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></ol>

<span id="pin-i2c测试-2"></span>
=== 40pin I2C测试 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的i2c为i2c2、i2c4、i2c5和i2c8共四组 i2c总线</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>4组I2C总线在40pin中对应的引脚如下表所示。I2C2_M0和I2C2_M4同一时间只能使用其中一组,不能同时使用,它们都是同一个I2C,只是接到不同的引脚上去了而已,请不要以为它们是两组不同的I2C总线。</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''I2C总线'''
| style="text-align: left;"| '''SDA对应40pin'''
| style="text-align: left;"| '''SCL对应40pin'''
| style="text-align: left;"| '''dtbo对应配置'''
|-
| style="text-align: left;"| '''I2C2_M0'''
| style="text-align: left;"| '''3号引脚'''
| style="text-align: left;"| '''5号引脚'''
| style="text-align: left;"| '''i2c2-m0'''
|-
| style="text-align: left;"| '''I2C2_M4'''
| style="text-align: left;"| '''11号引脚'''
| style="text-align: left;"| '''13号引脚'''
| style="text-align: left;"| '''i2c2-m4'''
|-
| style="text-align: left;"| '''I2C4_M3'''
| style="text-align: left;"| '''15号引脚'''
| style="text-align: left;"| '''16号引脚'''
| style="text-align: left;"| '''i2c4-m3'''
|-
| style="text-align: left;"| '''I2C5_M2'''
| style="text-align: left;"| '''37号引脚'''
| style="text-align: left;"| '''12号引脚'''
| style="text-align: left;"| '''i2c5-m2'''
|-
| style="text-align: left;"| '''I2C8_M3'''
| style="text-align: left;"| '''27号引脚'''
| style="text-align: left;"| '''28号引脚'''
| style="text-align: left;"| '''i2c8-m3'''
|}

'''在OPi OS Arch系统中,40pin中的i2c默认都是关闭的,需要手动打开才能使用。'''

'''在/boot/extlinux/extlinux.conf中加入下面红色字体部分的配置,然后重启OPi OS Arch系统就可以同时打开i2c2、i2c4、i2c5和i2c8,如果只需要打开一个,那么就填写一个即可。'''

'''[orangepi@orangepi ~]$ sudo vim /boot/extlinux/extlinux.conf'''

LABEL Orange Pi

LINUX /Image

FDT /dtbs/rockchip/rk3588-orangepi-5-ultra.dtb

'''FDTOVERLAYS /dtbs/rockchip/overlay/rk3588-i2c2-m0.dtbo /dtbs/rockchip/overlay/rk3588-i2c4-m3.dtbo /dtbs/rockchip/overlay/rk3588-i2c5-m2.dtbo'''

'''/dtbs/rockchip/overlay/rk3588-i2c8-m3.dtbo'''

'''上面红色字体配置需要写在一行,不同的配置之间需要用空格隔开。'''

<ol start="3" style="list-style-type: decimal;">
<li><p>启动OPi OS Arch系统后,先确认下/dev下存在i2c的设备节点</p>
<p>[orangepi@orangepi ~]$ '''ls /dev/i2c-*'''</p>
<p>/dev/i2c-0 /dev/i2c-10 '''/dev/i2c-4''' /dev/i2c-6 /dev/i2c-9</p>
<p>/dev/i2c-1 '''/dev/i2c-2''' '''/dev/i2c-5''' /dev/i2c-7 '''/dev/i2c-8'''</p></li>
<li><p>然后在40pin接头的i2c引脚上接一个i2c设备</p>
<p>'''3.3v引脚和5v引脚一般只用接一个即可,请根据具体接的i2c设备来选择接3.3v引脚还是5v引脚。'''</p></li>
<li><p>然后使用'''i2cdetect -y'''命令如果能检测到连接的i2c设备的地址,就说明i2c能正常使用</p>
<p>[orangepi@orangepi ~]$ '''sudo pacman -Syy i2c-tools'''</p>
<p>[orangepi@orangepi ~]$ '''sudo i2cdetect -y 2''' #i2c2的命令</p>
<p>[orangepi@orangepi ~]$ '''sudo i2cdetect -y 4''' #i2c4的命令</p>
<p>[orangepi@orangepi ~]$ '''sudo i2cdetect -y 5''' #i2c5的命令</p>
<p>[orangepi@orangepi ~]$ '''sudo i2cdetect -y 8''' #i2c8的命令</p></li></ol>

<span id="pin的uart测试-2"></span>
=== 40pin的UART测试 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的uart为uart3、uart4和uart6共三组uart总线,uart2用于调试串口功能没有计算在里面。</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li>
<li><p>四组UART总线在40pin中对应的引脚如下表所示。</p></li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''UART总线'''
| style="text-align: left;"| '''RX对应40pin'''
| style="text-align: left;"| '''TX对应40pin'''
| style="text-align: left;"| '''dtbo对应配置'''
|-
| style="text-align: left;"| '''UART3_M1'''
| style="text-align: left;"| '''33号引脚'''
| style="text-align: left;"| '''31号引脚'''
| style="text-align: left;"| '''uart3-m1'''
|-
| style="text-align: left;"| '''UART4_M2'''
| style="text-align: left;"| '''19号引脚'''
| style="text-align: left;"| '''23号引脚'''
| style="text-align: left;"| '''uart4-m2'''
|-
| style="text-align: left;"| '''UART6_M1'''
| style="text-align: left;"| '''11号引脚'''
| style="text-align: left;"| '''13号引脚'''
| style="text-align: left;"| '''uart6-m1'''
|}

'''在OPi OS Arch系统中,40pin中的uart默认都是关闭的,需要手动打开才能使用。'''

'''在/boot/extlinux/extlinux.conf中加入下面红色字体部分的配置,然后重启OPi OS Arch系统就可以同时打开uart3、uart4和uart6,如果只需要打开一个,那么就填写一个即可。'''

'''[orangepi@orangepi ~]$ sudo vim /boot/extlinux/extlinux.conf'''

LABEL Orange Pi

LINUX /Image

FDT /dtbs/rockchip/rk3588-orangepi-5-ultra.dtb

'''FDTOVERLAYS /dtbs/rockchip/overlay/rk3588-uart3-m1.dtbo /dtbs/rockchip/overlay/rk3588-uart4-m2.dtbo /dtbs/rockchip/overlay/rk3588-uart6-m1.dtbo'''

'''上面红色字体配置需要写在一行,不同的配置之间需要用空格隔开。'''

<ol start="3" style="list-style-type: decimal;">
<li><p>进入linux系统后,先确认下/dev下是否存在对应uart的设备节点</p>
<p>[orangepi@orangepi ~]$ '''ls /dev/ttyS*'''</p>
<p>'''/dev/ttyS3 /dev/ttyS4 /dev/ttyS6''' /dev/ttyS7</p></li>
<li><p>然后开始测试uart接口,先使用杜邦线短接要测试的uart接口的rx和tx</p></li>
<li><p>使用'''gpio serial'''命令测试串口的回环功能如下所示,如果能看到下面的打印,说明串口通信正常(ttySX需要替换为对应uart的节点名,请不要照抄)</p>
<p>[orangepi@orangepi ~]$ '''sudo gpio serial /dev/ttySX'''</p>
<p>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: -&gt; 4</p>
<p>Out: 5: -&gt; 5^C</p></li></ol>

<span id="pwm的测试方法"></span>
=== PWM的测试方法 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的pwm有pwm0、pwm1、pwm3、pwm6、pwm12、pwm13和pwm14共七路pwm</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p></li></ol>

<!-- -->
<ol start="9" style="list-style-type: decimal;">
<li>PWM在40pin中对应的引脚如下表所示。PWM0_M0和PWM0_M2、PWM1_M0和PWM1_M2同一时间只能使用其中一个,不能同时使用,它们都是同一个PWM,只是接到不同的引脚上去了而已,请不要以为它们是两个不同的PWM总线。</li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''PWM总线'''
| style="text-align: left;"| '''对应40pin'''
| style="text-align: left;"| '''dtbo对应配置'''
|-
| style="text-align: left;"| '''PWM0_M0'''
| style="text-align: left;"| '''5号引脚'''
| style="text-align: left;"| '''pwm0-m0'''
|-
| style="text-align: left;"| '''PWM0_M2'''
| style="text-align: left;"| '''15号引脚'''
| style="text-align: left;"| '''pwm0-m2'''
|-
| style="text-align: left;"| '''PWM1_M0'''
| style="text-align: left;"| '''3号引脚'''
| style="text-align: left;"| '''pwm1-m0'''
|-
| style="text-align: left;"| '''PWM1_M2'''
| style="text-align: left;"| '''16号引脚'''
| style="text-align: left;"| '''pwm1-m2'''
|-
| style="text-align: left;"| '''PWM3_M3'''
| style="text-align: left;"| '''7号引脚'''
| style="text-align: left;"| '''pwm3-m3'''
|-
| style="text-align: left;"| '''PWM6_M1'''
| style="text-align: left;"| '''27号引脚'''
| style="text-align: left;"| '''pwm6-m1'''
|-
| style="text-align: left;"| '''PWM12_M0'''
| style="text-align: left;"| '''31号引脚'''
| style="text-align: left;"| '''pwm12-m0'''
|-
| style="text-align: left;"| '''PWM13_M0'''
| style="text-align: left;"| '''33号引脚'''
| style="text-align: left;"| '''pwm13-m0'''
|-
| style="text-align: left;"| '''PWM14_M0'''
| style="text-align: left;"| '''35号引脚'''
| style="text-align: left;"| '''pwm14-m0'''
|}

'''在OPi OS Arch系统中,40pin中的pwm默认都是关闭的,需要手动打开才能使用。'''

'''在/boot/extlinux/extlinux.conf中加入下面红色字体部分的配置,然后重启OPi OS Arch系统就可以同时打开pwm0、pwm1、pwm3、pwm6、pwm12、pwm13和pwm14,如果只需要打开一个,那么就填写一个即可。'''

'''[orangepi@orangepi ~]$ sudo vim /boot/extlinux/extlinux.conf'''

LABEL Orange Pi

LINUX /Image

FDT /dtbs/rockchip/rk3588-orangepi-5-ultra.dtb

'''FDTOVERLAYS /dtbs/rockchip/overlay/rk3588-pwm0-m0.dtbo'''

'''/dtbs/rockchip/overlay/rk3588-pwm1-m0.dtbo /dtbs/rockchip/overlay/rk3588-pwm3-m3.dtbo /dtbs/rockchip/overlay/rk3588-pwm6-m1.dtbo /dtbs/rockchip/overlay/rk3588-pwm12-m0.dtbo /dtbs/rockchip/overlay/rk3588-pwm13-m0.dtbo /dtbs/rockchip/overlay/rk3588-pwm14-m0.dtbo'''

'''上面红色字体配置需要写在一行,不同的配置之间需要用空格隔开。'''

<ol start="2" style="list-style-type: decimal;">
<li><p>当打开一个pwm后,在'''/sys/class/pwm/'''中就会多出一个pwmchipX(X为具体的的数字),比如打开pwm3后,查看'''/sys/class/pwm/'''下的pwmchipX会由两个变成了三个</p>
<p>[orangepi@orangepi ~]$ '''ls /sys/class/pwm/'''</p>
<p>pwmchip0 pwmchip1 pwmchip2</p></li>
<li><p>上面哪个pwmchip对应pwm3呢,我们先查看下 '''ls /sys/class/pwm/ -l'''命令的输出,如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image534.png|575x59px]]</p></li>
<li><p>然后由下表可知,pwm3寄存器的基地址为fd8b0030,再看 '''ls /sys/class/pwm/ -l'''命令的输出,可以看到pwmchip0中链接到了fd8b0030.pwm,所以pwm3对应pwmchip为pwmchip0</p>
<p>[[File:Orange_Pi_5_Ultra-image283.png|475x280px]]</p></li>
<li><p>然后使用下面的命令可以让pwm3输出一个50Hz的方波(请先切换到root用户,再执行下面的命令)</p></li></ol>

[root@orangepi orangepi]# '''echo 0 &gt; /sys/class/pwm/pwmchip0/export'''

[root@orangepi orangepi]# '''echo 20000000 &gt; /sys/class/pwm/pwmchip0/pwm0/period'''

[root@orangepi orangepi]# '''echo 1000000 &gt; /sys/class/pwm/pwmchip0/pwm0/duty_cycle'''

[root@orangepi orangepi]# '''echo 1 &gt; /sys/class/pwm/pwmchip0/pwm0/enable'''

[[File:Orange_Pi_5_Ultra-image284.png|575x346px]]

<ol start="6" style="list-style-type: decimal;">
<li>上面演示的pwm3的测试方法,其他pwm测试方法都是类似的。</li></ol>

<span id="can的测试方法-1"></span>
=== CAN的测试方法 ===

<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi 5 Ultra可用的CAN总线为CAN0和CAN1共两组CAN总线</p>
<p>[[File:Orange_Pi_5_Ultra-image264.png|576x192px]]</p>
<p>'''在OPi OS Arch系统中,40pin中的CAN默认都是关闭的,需要手动打开才能使用。'''</p>
<p>'''在/boot/extlinux/extlinux.conf中加入下面红色字体部分的配置,然后重启OPi OS Arch系统就可以打开CAN0和CAN1。'''</p>
<p>'''[orangepi@orangepi ~]$ sudo vim /boot/extlinux/extlinux.conf'''</p>
<p>LABEL Orange Pi</p>
<p>LINUX /Image</p>
<p>FDT /dtbs/rockchip/rk3588-orangepi-5-ultra.dtb</p>
<p>'''FDTOVERLAYS /dtbs/rockchip/overlay/rk3588-can0-m0.dtbo'''</p>
<p>'''/dtbs/rockchip/overlay/rk3588-can1-m0.dtbo'''</p>
<p>'''上面红色字体配置需要写在一行,不同的配置之间需要用空格隔开。'''</p></li>
<li><p>进入OPi OS Arch系统后,使用'''sudo ifconfig -a'''命令如果能看到CAN的设备节点,就说明CAN已正确打开了</p>
<p>[orangepi@orangepi ~]$ '''sudo pacman -Syy net-tools'''</p>
<p>[orangepi@orangepi ~]$ '''sudo ifconfig -a'''</p>
<p>can0: flags=128&lt;NOARP&gt; mtu 16</p>
<p>unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)</p>
<p>RX packets 0 bytes 0 (0.0 B)</p>
<p>RX errors 0 dropped 0 overruns 0 frame 0</p>
<p>TX packets 0 bytes 0 (0.0 B)</p>
<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p>
<p>device interrupt 91</p>
<p>can1: flags=128&lt;NOARP&gt; mtu 16</p>
<p>unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)</p>
<p>RX packets 0 bytes 0 (0.0 B)</p>
<p>RX errors 0 dropped 0 overruns 0 frame 0</p>
<p>TX packets 0 bytes 0 (0.0 B)</p>
<p>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p>
<p>device interrupt 92</p></li>
<li><p>CAN0和CAN1对应的引脚为</p></li></ol>

{| class="wikitable"
|-
|
| style="text-align: left;"| '''CAN0'''
| style="text-align: left;"| '''CAN1'''
|-
| '''TX引脚'''
| style="text-align: left;"| '''对应5号引脚'''
| style="text-align: left;"| '''对应33号引脚'''
|-
| '''RX引脚'''
| style="text-align: left;"| '''对应3号引脚'''
| style="text-align: left;"| '''对应31号引脚'''
|}

<ol start="4" style="list-style-type: decimal;">
<li>使用CANalyst-II分析仪测试CAN收发消息的方法请参考下[[#使用canalyst-ii分析仪测试收发消息|'''使用CANalyst-II分析仪测试收发消息''']]一小节的内容。</li></ol>

<span id="linux-sdkorangepi-build使用说明"></span>
= Linux SDK——orangepi-build使用说明 =

== 编译系统需求 ==

'''我们可以在x64的电脑中交叉编译开发板的Linux镜像,也可以在开发板的Ubuntu22.04系统中来编译开发板的Linux镜像,请根据自己的喜好二选一。'''

'''如果是在开发板的Ubuntu22.04系统中使用orangepi-build来编译Linux镜像,请做好散热(尤其是SSD启动时)。如果散热没做好,容易出现文件系统跑飞的错误。'''

<span id="使用开发板的ubuntu22.04系统编译"></span>
=== 使用开发板的Ubuntu22.04系统编译 ===

<ol style="list-style-type: decimal;">
<li><p>Linux SDK,即'''orangepi-build''',支持在开发板的'''Ubuntu 22.04'''的上运行(其它系统没有测试过),所以下载orangepi-build前,请首先确保开发板已安装的Ubuntu版本是Ubuntu 22.04。查看开发板已安装的Ubuntu版本的命令如下所示,如果Release字段显示的不是'''22.04''',说明当前使用的Ubuntu版本不符合要求,请更换系统后再进行下面的操作。</p>
<p>orangepi@orangepi:~$ '''lsb_release -a'''</p>
<p>No LSB modules are available.</p>
<p>Distributor ID: Ubuntu</p>
<p>Description: Ubuntu 22.04.1 LTS</p>
<p>Release: '''22.04'''</p>
<p>Codename: jammy</p></li>
<li><p>'''由于内核和U-boot等源码都是存放在GitHub上的,所以编译镜像的时候请确保开发板能正常从GitHub下载代码,这点是非常重要的'''。</p></li></ol>

<span id="使用x64的ubuntu22.04电脑编译"></span>
=== 使用x64的Ubuntu22.04电脑编译 ===

<ol style="list-style-type: decimal;">
<li><p>Linux SDK,即'''orangepi-build''',支持在安装有'''Ubuntu 22.04'''的电脑上运行,所以下载orangepi-build前,请首先确保自己电脑已安装的Ubuntu版本是Ubuntu 22.04。查看电脑已安装的Ubuntu版本的命令如下所示,如果Release字段显示的不是'''22.04''',说明当前使用的Ubuntu版本不符合要求,请更换系统后再进行下面的操作。</p>
<p>test@test:~$ '''lsb_release -a'''</p>
<p>No LSB modules are available.</p>
<p>Distributor ID: Ubuntu</p>
<p>Description: Ubuntu 22.04 LTS</p>
<p>Release: '''22.04'''</p>
<p>Codename: jammy</p></li>
<li><p>如果电脑安装的是Windows系统,没有安装有Ubuntu 22.04的电脑,可以考虑使用'''VirtualBox'''或者'''VMware'''来在Windows系统中安装一个Ubuntu 22.04虚拟机。但是请注意,不要在WSL虚拟机上编译orangepi-build,因为orangepi-build没有在WSL虚拟机中测试过,所以无法确保能正常在WSL中使用orangepi-build。</p></li>
<li><p>Ubuntu 22.04 '''amd64'''版本的安装镜像下载地址为:</p>
<p>[https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ubuntu-22.04.3-desktop-amd64.iso '''https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ubuntu-22.04.3-desktop-amd64.iso''']</p>
<p>[https://repo.huaweicloud.com/ubuntu-releases/22.04/ubuntu-22.04.3-desktop-amd64.iso '''https://repo.huaweicloud.com/ubuntu-releases/22.04/ubuntu-22.04.3-desktop-amd64.iso''']</p></li>
<li><p>在电脑中或者虚拟机中安装完Ubuntu 22.04后,请先设置Ubuntu 22.04的软件源为清华源,不然后面安装软件的时候很容易由于网络原因而出错</p>
<ol style="list-style-type: lower-alpha;">
<li>替换清华源的方法参考这个网页的说明即可</li></ol>
</li></ol>

[https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ '''https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/''']

<ol start="2" style="list-style-type: lower-alpha;">
<li><p>注意Ubuntu版本需要切换到22.04</p>
<p>[[File:Orange_Pi_5_Ultra-image535.png|576x241px]]</p></li>
<li><p>需要替换的'''/etc/apt/sources.list'''文件的内容为</p>
<p>test@test:~$ '''sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak'''</p>
<p>test@test:~$ '''sudo vim /etc/apt/sources.list'''</p>
<p># 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释</p>
<p>deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse</p>
<p># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse</p>
<p>deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse</p>
<p># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse</p>
<p>deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse</p>
<p># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse</p>
<p>deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse</p>
<p># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse</p>
<p># 预发布软件源,不建议启用</p>
<p># deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse</p>
<p># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse</p></li>
<li><p>替换完后需要更新下包信息,并确保没有报错</p>
<p>test@test:~$ '''sudo apt update'''</p></li>
<li><p>'''另外,由于内核和U-boot等源码都是存放在GitHub上的,所以编译镜像的时候请确保电脑能正常从GitHub下载代码,这点是非常重要的'''。</p></li></ol>

<span id="获取linux-sdk的源码"></span>
== 获取linux sdk的源码 ==

=== 从github下载orangepi-build ===

# linux sdk其实指的就是orangepi-build这套代码,orangepi-build是基于armbian build编译系统修改而来的,使用orangepi-build可以编译出多个版本的linux镜像。首先下载orangepi-build的代码,命令如下所示:

test@test:~$ '''sudo apt-get update'''

test@test:~$ '''sudo apt-get install -y git'''

test@test:~$ '''git clone https://github.com/orangepi-xunlong/orangepi-build.git -b next'''

'''注意,Orange Pi 5 Ultra开发板是需要下载orangepi-build的next分支源码的,上面的git clone命令需要指定orangepi-build源码的分支为next。'''

[[File:Orange_Pi_5_Ultra-image536.png|576x298px]]

'''通过git clone命令下载orangepi-build的代码是不需要输入github账号的用户名和密码的(下载本手册中的其他代码也是一样的),如果如输入git clone命令后Ubuntu PC提示需要输入github账号的用户名和密码,一般都是git clone后面的orangepi-build仓库的地址输入错误了,请仔细检查命令拼写是否有错误,而不是以为我们这里忘了提供github账号的用户名和密码。'''

<ol start="2" style="list-style-type: decimal;">
<li>开发板当前使用的u-boot和linux内核版本如下所示</li></ol>

{| class="wikitable"
|-
| style="text-align: left;"| '''分支'''
| style="text-align: left;"| '''u-boot版本'''
| style="text-align: left;"| '''linux内核版本'''
|-
| style="text-align: left;"| '''legacy'''
| style="text-align: left;"| '''u-boot 2017.09'''
| style="text-align: left;"| '''linux5.10'''
|-
| style="text-align: left;"| '''current'''
| style="text-align: left;"| '''u-boot 2017.09'''
| style="text-align: left;"| '''linux6.1'''
|}

'''这里所说的分支和orangepi-build源代码的分支不是同一个东西,请不要搞混了。此分支主要是用来区分不同内核源码版本的。'''

'''目前RK提供的linux5.10 bsp内核我们定义为legacy分支,linux6.1 bsp内核我们定义为current分支。'''

<ol start="3" style="list-style-type: decimal;">
<li><p>orangepi-build下载完后会包含下面的文件和文件夹</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''build.sh''': 编译启动脚本</p></li>
<li><p>'''external''': 包含编译镜像需要用的配置文件、特定的脚本以及部分程序的源码等</p></li>
<li><p>'''LICENSE''': GPL 2许可证文件</p></li>
<li><p>'''README.md''': orangepi-build说明文件</p></li>
<li><p>'''scripts''': 编译linux镜像的通用脚本</p>
<p>test@test:~/orangepi-build$ '''ls'''</p>
<p>'''build.sh external LICENSE README.md scripts'''</p>
<p>'''如果是从github下载的orangepi-build的代码,下载完后你可能会发现orangepi-build中并没有包含u-boot和linux内核的源码,也没有编译u-boot和linux内核需要用到交叉编译工具链,这是正常的,因为这些东西都存放在其它单独的github仓库或者某些服务器上了(下文会详述其地址)。orangepi-build在脚本和配置文件中会指定u-boot、linux内核和交叉编译工具链的地址,运行orangepi-build时,当其发现本地没有这些东西,会自动去相应的地方下载的。'''</p></li></ol>
</li></ol>

=== 下载交叉编译工具链 ===

'''只有在x64的电脑中使用orangepi-build编译镜像才会下载交叉编译工具链。在开发板的Ubuntu22.04中编译开发板的linux镜像是不会下载交叉编译工具链的,此时orangepi-build/toolchains会是一个空文件夹。'''

<ol style="list-style-type: decimal;">
<li><p>orangepi-build第一次运行的时候会自动下载交叉编译工具链放在'''toolchains'''文件夹中,每次运行orangepi-build的build.sh脚本后,都会检查'''toolchains'''中的交叉编译工具链是否都存在,如果不存在则会重新开始下载,如果存在则直接使用,不会重复下载。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image537.png|575x278px|选区_396]]

</div></li>
<li><p>交叉编译工具链在中国境内的镜像网址为清华大学的开源软件镜像站</p>
<p>[https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/ '''https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/''']</p></li>
<li><p>'''toolchains'''下载完后会包含多个版本的交叉编译工具链,开发板只会使用其中的两个</p>
<p>test@test:~/orangepi-build$ '''ls toolchains/'''</p>
<p>gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu</p>
<p>gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf</p>
<p>gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu</p>
<p>gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf</p>
<p>gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi</p>
<p>gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf</p>
<p>gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu</p>
<p>gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi</p>
<p>gcc-linaro-aarch64-none-elf-4.8-2013.11_linux</p>
<p>gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux</p>
<p>gcc-linaro-arm-none-eabi-4.8-2014.04_linux</p></li>
<li><p>编译linux内核源码使用的交叉编译工具链为</p>
<ol style="list-style-type: lower-alpha;">
<li><p>linux5.10和linux6.1</p>
<p>'''gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu'''</p></li></ol>
</li>
<li><p>编译u-boot源码使用的交叉编译工具链为</p>
<ol style="list-style-type: lower-alpha;">
<li><p>v2017.09</p>
<p>'''gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu'''</p></li></ol>
</li></ol>

=== orangepi-build完整目录结构说明 ===

<ol style="list-style-type: decimal;">
<li><p>orangepi-build仓库下载完后并不包含linux内核、u-boot的源码以及交叉编译工具链,linux内核和u-boot的源码存放在独立的git仓库中</p>
<ol style="list-style-type: lower-alpha;">
<li><p>linux5.10内核源码存放的git仓库如下所示:</p>
<p>'''https://github.com/orangepi-xunlong/linux-orangepi/tree/orange-pi-5.10-rk35xx'''</p></li>
<li><p>Linux6.1内核源码存放的git仓库如下所示:</p>
<p>'''https://github.com/orangepi-xunlong/linux-orangepi/tree/orange-pi-6.1-rk35xx'''</p></li>
<li><p>u-boot源码存放的git仓库如下所示:</p>
<p>'''https://github.com/orangepi-xunlong/u-boot-orangepi/tree/v2017.09-rk3588'''</p></li></ol>
</li>
<li><p>orangepi-build第一次运行的时候会去下载交叉编译工具链、u-boot和linux内核源码,成功编译完一次linux镜像后在orangepi-build中可以看到的文件和文件夹有</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''build.sh''': 编译启动脚本</p></li>
<li><p>'''external''': 包含编译镜像需要用的配置文件、特定功能的脚本以及部分程序的源码,编译镜像过程中缓存的rootfs压缩包也存放在external中</p></li>
<li><p>'''kernel''': 存放linux内核的源码,里面名为'''orange-pi-5.10-rk35xx'''的文件夹存放的就是RK3588/RK3588S系列开发板legacy分支的内核源码,名为'''orange-pi-6.1-rk35xx'''的文件夹存放的就是RK3588/RK3588S系列开发板current分支的内核源码,内核源码的文件夹的名字请不要手动修改,如果修改了,编译系统运行时会重新下载内核源码</p></li>
<li><p>'''LICENSE''': GPL 2许可证文件</p></li>
<li><p>'''README.md''': orangepi-build说明文件</p></li>
<li><p>'''output''': 存放编译生成的u-boot、linux等deb包、编译日志以及编译生成的镜像等文件</p></li>
<li><p>'''scripts''': 编译linux镜像的通用脚本</p></li>
<li><p>'''toolchains''': 存放交叉编译工具链</p></li>
<li><p>'''u-boot''': 存放u-boot的源码,里面名为'''v2017.09-rk3588'''的文件夹存放的就是RK3588/RK3588S系列开发板legacy分支的u-boot源码,u-boot源码的文件夹的名字请不要手动修改,如果修改了,编译系统运行时会重新下载u-boot源码</p></li>
<li><p>'''userpatches''': 存放编译脚本需要用到的配置文件</p>
<p>test@test:~/orangepi-build$ '''ls'''</p>
<p>'''build.sh external kernel LICENSE output README.md scripts toolchains u-boot userpatches'''</p></li></ol>
</li></ol>

== 编译u-boot ==

<ol style="list-style-type: decimal;">
<li><p>运行build.sh脚本,记得加sudo权限</p>
<p>test@test:~/orangepi-build$ '''sudo ./build.sh'''</p></li>
<li><p>选择'''U-boot package''',然后回车</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image538.png|576x132px|选区_238]]

</div></li>
<li><p>接着选择开发板的型号</p>
<p>[[File:Orange_Pi_5_Ultra-image539.png|576x273px]]</p></li>
<li><p>然后就会开始编译u-boot,编译时提示的部分信息说明如下</p>
<ol style="list-style-type: lower-alpha;">
<li><p>u-boot源码的版本</p>
<p>[ o.k. ] Compiling u-boot [ '''v2017.09''' ]</p></li>
<li><p>交叉编译工具链的版本</p>
<p>[ o.k. ] Compiler version [ '''aarch64-linux-gnu-gcc 7.4.1''' ]</p></li>
<li><p>编译生成的u-boot deb包的路径</p>
<p>[ o.k. ] Target directory [ '''orangepi-build/output/debs/u-boot''' ]</p></li>
<li><p>编译生成的u-boot deb包的包名</p>
<p>[ o.k. ] File name [ '''linux-u-boot-legacy-orangepi5ultra_1.0.2_arm64.deb''' ]</p></li>
<li><p>编译使用的时间</p>
<p>[ o.k. ] Runtime [ '''1 min''' ]</p></li>
<li><p>重复编译u-boot的命令,使用下面的命令无需通过图形界面选择,可以直接开始编译u-boot</p>
<p>[ o.k. ] Repeat Build Options [ '''sudo ./build.sh BOARD=orangepi5ultra BRANCH=legacy BUILD_OPT=u-boot KERNEL_CONFIGURE=no''' ]</p></li></ol>
</li>
<li><p>查看编译生成的u-boot deb包</p>
<p>test@test:~/orangepi-build$ '''ls output/debs/u-boot/'''</p>
<p>linux-u-boot-legacy-orangepi5ultra_1.0.2_arm64.deb</p></li>
<li><p>生成的u-boot的deb包包含的文件如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>使用下面的命令可以解压deb包</p>
<p>test@test:~/orangepi-build$ '''cd output/debs/u-boot'''</p>
<p>test@test:~/orangepi_build/output/debs/u-boot$ $ '''dpkg -x''' \</p>
<p>'''linux-u-boot-legacy-orangepi5ultra_1.0.2_arm64.deb . (注意命令最后有个”.”)'''</p>
<p>test@test:~/orangepi_build/output/debs/u-boot$ '''ls'''</p>
<p>linux-u-boot-legacy-orangepi5ultra_1.0.2_arm64.deb '''usr'''</p></li>
<li><p>解压后的文件如下所示</p>
<p>test@test:~/orangepi-build/output/debs/u-boot$ '''tree usr'''</p>
<p>usr</p>
<p>└── lib</p>
<p>├── linux-u-boot-legacy-orangepi5ultra_1.0.2_arm64</p>
<p>│   ├── idbloader.img</p>
<p>│   ├── rkspi_loader.img</p>
<p>│   └── u-boot.itb</p>
<p>└── u-boot</p>
<p>├── LICENSE</p>
<p>├── orangepi_5_ultra_defconfig</p>
<p>└── platform_install.sh</p>
<p>3 directories, 6 files</p></li></ol>
</li>
<li><p>orangepi-bulid编译系统编译u-boot源码时首先会将u-boot的源码和github服务器的u-boot源码进行同步,所以如果想修改u-boot的源码,首先需要关闭源码的下载更新功能('''需要完整编译过一次u-boot后才能关闭这个功能,否则会提示找不到u-boot的源码,如果是从百度云盘下载的源码压缩包,则没有这个问题,因为u-boot的源码都已缓存好了'''),否则所作的修改都会被还原,方法如下:</p>
<p>设置userpatches/config-default.conf中的IGNORE_UPDATES变量为”yes”</p>
<p>test@test:~/orangepi-build$ '''vim userpatches/config-default.conf'''</p>
<p>IGNORE_UPDATES=&quot;'''yes'''&quot;</p></li>
<li><p>调试u-boot代码时,可以使用下面的方法来更新linux镜像中的u-boot进行测试</p>
<ol style="list-style-type: lower-alpha;">
<li><p>将编译好的u-boot的deb包上传到开发板的linux系统中</p>
<p>test@test:~/orangepi-build$ '''cd output/debs/u-boot'''</p>
<p>test@test:~/orangepi_build/output/debs/u-boot$ '''scp \'''</p>
<p>'''linux-u-boot-legacy-orangepi5ultra_1.0.2_arm64.deb [mailto:root@192.168.1.xxx:/root root@192.168.1.xxx:/root]'''</p></li>
<li><p>然后登录到开发板,卸载已安装的u-boot的deb包</p>
<p>root@orangepi:~# '''apt purge -y linux-u-boot-orangepi5ultra-legacy'''</p></li>
<li><p>再安装刚才上传的新的u-boot的deb包</p>
<p>root@orangepi:~# '''dpkg -i''' '''linux-u-boot-legacy-orangepi5ultra_1.0.2_arm64.deb'''</p></li>
<li><p>然后运行 nand-sata-install脚本</p>
<p>root@orangepi:~# '''nand-sata-install'''</p></li>
<li><p>然后选择'''5 Install/Update the bootloader on SD/eMM'''来更新TF卡中的u-boot或者'''7 Install/Update the bootloader on SPI Flash'''来更新SPI Flash中的u-boot</p>
<p>[[File:Orange_Pi_5_Ultra-image540.png|312x152px]]</p></li>
<li><p>按下回车键后首先会弹出一个Warning</p>
<p>[[File:Orange_Pi_5_Ultra-image541.png|309x168px]]</p></li>
<li><p>再按下回车键就会开始更新u-boot,更新完后会显示下面的信息</p>
<p>[[File:Orange_Pi_5_Ultra-image542.png|244x137px]]</p></li>
<li><p>然后就可以重启开发板来测试u-boot的修改是否生效了</p></li></ol>
</li>
<li><p>其它有用的信息</p>
<ol style="list-style-type: lower-alpha;">
<li><p>u-boot 2017.09源码中,开发板使用的defconfig配置文件为</p></li>
<li><p>[https://github.com/orangepi-xunlong/u-boot-orangepi/blob/v2017.09-rk3588/configs/orangepi_5_ultra_defconfig '''orangepi-build/u-boot/v2017.09-rk3588/configs/orangepi_5_ultra_defconfig''']u-boot 2017.09源码中,开发板使用dts文件为</p></li></ol>
</li></ol>

<span id="orangepi-buildu-bootv2017.09-rk3588archarmdtsrk3588-orangepi-5-ultra.dts编译linux内核"></span>
== [https://github.com/orangepi-xunlong/u-boot-orangepi/blob/v2017.09-rk3588/arch/arm/dts/rk3588-orangepi-5-ultra.dts '''orangepi-build/u-boot/v2017.09-rk3588/arch/arm/dts/rk3588-orangepi-5-ultra.dts'''<span id="_Toc16481" class="anchor"></span>]编译linux内核 ==

<ol style="list-style-type: decimal;">
<li><p>运行build.sh脚本,记得加sudo权限</p>
<p>test@test:~/orangepi-build$ '''sudo ./build.sh'''</p></li>
<li><p>选择'''Kernel package''',然后回车</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image543.png|575x116px|选区_240]]

</div></li>
<li><p>接着选择开发板的型号</p>
<p>[[File:Orange_Pi_5_Ultra-image539.png|576x273px]]</p></li>
<li><p>然后会提示是否需要显示内核配置界面,如果不需要修改内核配置,则选择第一个即可,如果需要修改内核配置,则选择第二个</p>
<p>[[File:Orange_Pi_5_Ultra-image544.png|576x87px]]</p></li>
<li><p>如果第4) 步选择了需要显示内核配置菜单(第二个选项),则会弹出通过'''make menuconfig'''打开的内核配置的界面,此时可以直接修改内核的配置,修改完后再保存退出即可,退出后会开始编译内核源码</p>
<p>[[File:Orange_Pi_5_Ultra-image545.png|575x400px]]</p></li></ol>

<!-- -->
<ol style="list-style-type: lower-alpha;">
<li><p>如果不需要修改内核的配置选项,在运行build.sh脚本时,传入'''KERNEL_CONFIGURE=no'''就可临时屏蔽弹出内核的配置界面了</p>
<p>test@test:~/orangepi-build$ '''sudo ./build.sh KERNEL_CONFIGURE=no'''</p></li>
<li><p>也可以设置'''orangepi-build/userpatches/config-default.conf'''配置文件中的'''KERNEL_CONFIGURE=no''',这样可以永久禁用这个功能</p></li>
<li><p>编译内核的时候如果提示下面的错误,这是由于Ubuntu PC的终端界面太小,导致'''make menuconfig'''的界面无法显示,请把Ubuntu PC的终端调到最大,然后重新运行build.sh脚本</p>
<p>[[File:Orange_Pi_5_Ultra-image546.png|574x234px]]</p></li></ol>

<!-- -->
<ol start="6" style="list-style-type: decimal;">
<li><p>编译内核源码时提示的部分信息说明如下</p>
<ol style="list-style-type: lower-alpha;">
<li><p>linux内核源码的版本</p>
<p>[ o.k. ] Compiling current kernel [ '''5.10.160''' ]</p></li>
<li><p>使用的交叉编译工具链的版本</p>
<p>[ o.k. ] Compiler version [ '''aarch64-none-linux-gnu-gcc 11.2.1''' ]</p></li>
<li><p>内核默认使用的配置文件以及它存放的路径</p>
<p>[ o.k. ] Using kernel config file [ '''config/kernel/linux-rockchip-rk3588-legacy.config''' ]</p></li>
<li><p>编译生成的内核相关的deb包的路径</p>
<p>[ o.k. ] Target directory [ '''orangepi-build/output/debs/''' ]</p></li>
<li><p>编译生成的内核镜像deb包的包名</p>
<p>[ o.k. ] File name [ '''linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb''' ]</p></li>
<li><p>编译使用的时间</p>
<p>[ o.k. ] Runtime [ '''5 min''' ]</p></li>
<li><p>最后会显示重复编译上一次选择的内核的编译命令,使用下面的命令无需通过图形界面选择,可以直接开始编译内核源码</p>
<p>[ o.k. ] Repeat Build Options [ '''sudo ./build.sh BOARD=orangepi5ultra BRANCH=legacy BUILD_OPT=kernel KERNEL_CONFIGURE=no''' ]</p></li></ol>
</li>
<li><p>查看编译生成的内核相关的deb包</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''linux-dtb-legacy-rockchip-rk3588_1.0.2_arm64.deb'''包含内核使用的dtb文件</p></li>
<li><p>'''linux-headers-legacy-rockchip-rk3588_1.0.2_arm64.deb'''包含内核头文件</p></li>
<li><p>'''linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb'''包含内核镜像和内核模块</p>
<p>test@test:~/orangepi-build$ '''ls output/debs/linux-*'''</p>
<p>output/debs/linux-dtb-legacy-rockchip-rk3588_1.0.2_arm64.deb output/debs/linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb</p>
<p>output/debs/linux-headers-legacy-rockchip-rk3588_1.0.2_arm64.deb</p></li></ol>
</li>
<li><p>生成的linux-image的deb包包含的文件如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>使用下面的命令可以解压deb包</p>
<p>test@test:~/orangepi-build$ '''cd output/debs'''</p></li></ol>
</li></ol>

test@test:~/orangepi_build/output/debs$ '''mkdir test'''

test@test:~/orangepi_build/output/debs$ '''cp \'''

'''linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb test/'''

test@test:~/orangepi_build/output/debs$ '''cd test'''

test@test:~/orangepi_build/output/debs/test$ '''dpkg -x \'''

'''linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb .'''

test@test:~/orangepi_build/output/debs/test$ '''ls'''

'''boot etc lib''' linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb '''usr'''

<ol start="2" style="list-style-type: lower-alpha;">
<li><p>解压后的文件如下所示</p>
<p>test@test:~/orangepi-build/output/debs/test$ '''tree -L 2'''</p>
<p>.</p>
<p>├── boot</p>
<p>│   ├── config-5.10.160-rockchip-rk3588</p>
<p>│   ├── System.map-5.10.160-rockchip-rk3588</p>
<p>│   └── vmlinuz-5.10.160-rockchip-rk3588</p>
<p>├── etc</p>
<p>│   └── kernel</p>
<p>├── lib</p>
<p>│   └── modules</p>
<p>├── linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb</p>
<p>└── usr</p>
<p>├── lib</p>
<p>└── share</p></li></ol>

<!-- -->
<ol start="9" style="list-style-type: decimal;">
<li><p>orangepi-bulid编译系统编译linux内核源码时首先会将linux内核源码和github服务器的linux内核源码进行同步,所以如果想修改linux内核的源码,首先需要关闭源码的更新功能('''需要完整编译过一次linux内核源码后才能关闭这个功能,否则会提示找不到linux内核的源码,如果是从百度云盘下载的源码压缩包,则没有这个问题,因为linux的源码都已缓存好了'''),否则所作的修改都会被还原,方法如下:</p>
<p>设置'''userpatches/config-default.conf'''中的IGNORE_UPDATES变量为”yes”</p>
<p>test@test:~/orangepi-build$ '''vim userpatches/config-default.conf'''</p>
<p>IGNORE_UPDATES=&quot;'''yes'''&quot;</p></li>
<li><p>如果对内核做了修改,可以使用下面的方法来更新开发板linux系统的内核和内核模块</p>
<ol style="list-style-type: lower-alpha;">
<li><p>将编译好的linux内核的deb包上传到开发板的linux系统中</p>
<p>test@test:~/orangepi-build$ '''cd output/debs'''</p>
<p>test@test:~/orangepi-build/output/debs$ '''scp \'''</p>
<p>'''linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb root@192.168.1.xxx:/root'''</p></li>
<li><p>然后登录到开发板,卸载已安装的linux内核的deb包</p>
<p>root@orangepi:~# '''apt purge -y linux-image-legacy-rockchip-rk3588'''</p></li>
<li><p>再安装刚才上传的新的linux内核的deb包</p>
<p>root@orangepi:~# '''dpkg -i linux-image-legacy-rockchip-rk3588_1.0.2_arm64.deb'''</p></li>
<li><p>然后重启开发板,再查看内核相关的修改是否已生效</p>
<p>root@orangepi:~# '''reboot'''</p></li></ol>
</li></ol>

== 编译rootfs ==

<ol style="list-style-type: decimal;">
<li><p>运行build.sh脚本,记得加sudo权限</p>
<p>test@test:~/orangepi-build$ '''sudo ./build.sh'''</p></li>
<li><p>选择'''Rootfs and all deb packages''',然后回车</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image547.png|576x119px|选区_241]]

</div>
<ol start="3" style="list-style-type: decimal;">
<li><p>接着选择开发板的型号</p>
<p>[[File:Orange_Pi_5_Ultra-image539.png|576x273px]]</p></li>
<li><p>然后选择rootfs的类型</p>
<p>[[File:Orange_Pi_5_Ultra-image548.png|575x103px]]</p></li>
<li><p>然后选择镜像的类型</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''Image with console interface (server)'''表示服务器版的镜像,体积比较小</p></li>
<li><p>'''Image with desktop environment'''表示带桌面的镜像,体积比较大</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image549.png|576x75px|选区_245]]

</div></li></ol>
</li>
<li><p>如果是编译服务器版的镜像,还可以选择编译Standard版本或者Minimal版本,Minimal版本预装的软件会比Standard版本少很多('''没特殊需求请不要选择Minimal版本,因为很多东西默认没有预装,部分功能可能用不了''')</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image550.png|576x78px|选区_397]]

</div></li>
<li><p>如果是编译桌面版本的镜像还需要选择桌面环境的类型,目前Ubuntu Jammy主要维护XFCE和Gnome两种桌面,Ubuntu Focal只维护XFCE桌面,Debian Bullseye主要维护XFCE和KDE桌面,Debian Bookwork主要维护XFCE桌面</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image551.png|575x99px|Selection_001]]

</div>
<p>[[File:Orange_Pi_5_Ultra-image552.png|576x74px]]</p>
<p>然后可以选择需要安装的额外的软件包。这里请按下回车键直接跳过。</p>
<p>[[File:Orange_Pi_5_Ultra-image553.png|575x264px]]</p></li>
<li><p>然后就会开始编译rootfs,编译时提示的部分信息说明如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>rootfs的类型</p>
<p>[ o.k. ] local not found [ Creating new rootfs cache for '''jammy''']</p></li>
<li><p>编译生成的rootfs压缩包的存放路径</p>
<p>[ o.k. ] Target directory [ '''external/cache/rootfs''' ]</p></li>
<li><p>编译生成的rootfs压缩包的名字</p>
<p>[ o.k. ] File name [ '''jammy-xfce-arm64.f930ff6ebbac1a72108a2e100762b18f.tar.lz4''' ]</p></li>
<li><p>编译使用的时间</p>
<p>[ o.k. ] Runtime [ '''13 min''' ]</p></li></ol>
</li>
<li><p>查看编译生成的rootfs压缩包</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''jammy-xfce-arm64.f930ff6ebbac1a72108a2e100762b18f.tar.lz4'''是rootfs的压缩包,名字各字段的含义为</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''jammy'''表示rootfs的linux发行版的类型</p></li>
<li><p>'''xfce'''表示rootfs为桌面版的类型,如果为'''cli'''则表示服务器版类型</p></li>
<li><p>'''arm64'''表示rootfs的架构类型</p></li>
<li><p>'''f930ff6ebbac1a72108a2e100762b18f'''是由rootfs安装的所有软件包的包名生成的MD5哈希值,只要没有修改rootfs安装的软件包的列表,那么这个值就不会变,编译脚本会通过这个MD5哈希值来判断是否需要重新编译rootfs</p></li></ol>
</li>
<li><p>'''jammy-xfce-arm64.f930ff6ebbac1a72108a2e100762b18f.tar.lz4.list'''列出了rootfs安装的所有软件包的包名</p>
<p>test@test:~/orangepi-build$ '''ls external/cache/rootfs/'''</p>
<p>'''jammy-xfce-arm64.f930ff6ebbac1a72108a2e100762b18f.tar.lz4'''</p>
<p>jammy-xfce-arm64.f930ff6ebbac1a72108a2e100762b18f.tar.lz4.current</p>
<p>jammy-xfce-arm64.f930ff6ebbac1a72108a2e100762b18f.tar.lz4.list</p></li></ol>
</li>
<li><p>如果需要的rootfs在'''external/cache/rootfs'''下已经存在,那么再次编译rootfs就会直接跳过编译过程,不会重新开始编译,编译镜像的时候也会去'''external/cache/rootfs'''下查找是否已经有缓存可用的rootfs,如果有就直接使用,这样可以节省大量的下载编译时间。</p></li></ol>

== 编译linux镜像 ==

<ol style="list-style-type: decimal;">
<li><p>运行build.sh脚本,记得加sudo权限</p>
<p>test@test:~/orangepi-build$ '''sudo ./build.sh'''</p></li>
<li><p>选择'''Full OS image for flashing''',然后回车</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image554.png|576x128px|选区_242]]

</div>
<ol start="3" style="list-style-type: decimal;">
<li><p>然后选择开发板的型号</p>
<p>[[File:Orange_Pi_5_Ultra-image539.png|576x273px]]</p></li>
<li><p>然后选择rootfs的类型</p>
<p>[[File:Orange_Pi_5_Ultra-image548.png|575x103px]]</p></li>
<li><p>然后选择镜像的类型</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''Image with console interface (server)'''表示服务器版的镜像,体积比较小</p></li>
<li><p>'''Image with desktop environment'''表示带桌面的镜像,体积比较大</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image549.png|576x75px|选区_245]]

</div></li></ol>
</li>
<li><p>如果是编译服务器版的镜像,还可以选择编译Standard版本或者Minimal版本,Minimal版本预装的软件会比Standard版本少很多('''没特殊需求请不要选择Minimal版本,因为很多东西默认没有预装,部分功能可能用不了''')</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image550.png|569x77px|选区_397]]

</div></li>
<li><p>如果是编译桌面版本的镜像还需要选择桌面环境的类型,目前Ubuntu Jammy主要维护XFCE和Gnome两种桌面,Ubuntu Focal只维护XFCE桌面,Debian Bullseye主要维护XFCE和KDE桌面,Debian Bookwork主要维护XFCE桌面</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image551.png|575x99px|Selection_001]]

</div>
<p>[[File:Orange_Pi_5_Ultra-image552.png|576x74px]]</p>
<p>然后可以选择需要安装的额外的软件包。这里请按下回车键直接跳过。</p>
<p>[[File:Orange_Pi_5_Ultra-image553.png|575x264px]]</p></li>
<li><p>然后就会开始编译linux镜像,编译的大致流程如下</p>
<ol style="list-style-type: lower-alpha;">
<li><p>初始化Ubuntu PC的编译环境,安装编译过程需要的软件包</p></li>
<li><p>下载u-boot和linux内核的源码(如果已经缓存,则只更新代码)</p></li>
<li><p>编译u-boot源码,生成u-boot的deb包</p></li>
<li><p>编译linux源码,生成linux相关的deb包</p></li>
<li><p>制作linux firmware的deb包</p></li>
<li><p>制作orangepi-config工具的deb包</p></li>
<li><p>制作板级支持的deb包</p></li>
<li><p>如果是编译desktop版镜像,还会制作desktop相关的deb包</p></li>
<li><p>检查rootfs是否已经缓存,如果没有缓存,则重新制作rootfs,如果已经缓存,则直接解压使用</p></li>
<li><p>安装前面生成的deb包到rootfs中</p></li>
<li><p>对不同的开发板和不同类型镜像做一些特定的设置,如预装额外的软件包,修改系统配置等</p></li>
<li><p>然后制作镜像文件,并格式化分区,默认类型为ext4</p></li>
<li><p>再将配置好的rootfs拷贝到镜像的分区中</p></li>
<li><p>然后更新initramfs</p></li>
<li><p>最后将u-boot的bin文件通过dd命令写入到镜像中</p></li></ol>
</li>
<li><p>编译完镜像后会提示下面的信息</p>
<ol style="list-style-type: lower-alpha;">
<li><p>编译生成的镜像的存放路径</p>
<p>[ o.k. ] Done building [ '''output/images/orangepi5ultra_1.0.2_debian_bullseye_desktop_xfce_linux5.10.160/orangepi5ultra_1.0.2_debian_bullseye_desktop_xfce_linux5.10.160.img''' ]</p></li>
<li><p>编译使用的时间</p></li></ol>
</li></ol>

'''[ o.k. ] Runtime [ 19 min ]'''

<ol style="list-style-type: lower-alpha;">
<li><p>重复编译镜像的命令,使用下面的命令无需通过图形界面选择,可以直接开始编译镜像</p>
<p>[ o.k. ] Repeat Build Options [ '''sudo ./build.sh BOARD=orangepi5ultra BRANCH=legacy BUILD_OPT=image RELEASE=bullseye BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_CONFIGURE=yes''' ]</p></li></ol>

<span id="android-13系统的使用说明"></span>
= Android 13系统的使用说明 =

<span id="已支持的android版本"></span>
== 已支持的Android版本 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''Android版本'''
| style="text-align: center;"| '''内核版本'''
|-
| style="text-align: center;"| '''Android 13'''
| style="text-align: center;"| '''Linux5.10'''
|}

<span id="android-功能适配情况"></span>
== Android 功能适配情况 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''功能'''
| style="text-align: center;"| '''Android 13'''
|-
| style="text-align: center;"| '''HDMI TX视频'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI TX音频'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI RX视频'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''HDMI RX音频'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB2.0x2'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB3.0x2'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''2.5G网口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''网口状态灯'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''WIFI'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''蓝牙'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''调试串口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''RTC芯片'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''FAN风扇接口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''eMMC扩展接口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''GPIO(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''UART(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''SPI(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''I2C(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''PWM(40pin)'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''TF 卡启动'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''OV13850摄像头'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''OV13855摄像头'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''SPI+NVME启动'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''LCD'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''MIC'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''耳机播放'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''耳机录音'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''三色LED 灯'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''GPU'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''NPU'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''VPU'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''开关机按键'''
| style="text-align: center;"| '''OK'''
|}

<span id="wifi的连接测试方法"></span>
== WIFI的连接测试方法 ==

<ol style="list-style-type: decimal;">
<li><p>首先在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|418x228px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后打开'''Setting'''。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image556.png|419x126px]]

<ol start="3" style="list-style-type: decimal;">
<li>然后选择'''Network &amp; internet'''中的'''Internet'''选项。</li></ol>

[[File:Orange_Pi_5_Ultra-image557.png|574x130px]]

<ol start="4" style="list-style-type: decimal;">
<li>然后打开'''Wi-Fi'''开关。</li></ol>

[[File:Orange_Pi_5_Ultra-image558.png|576x145px]]

<ol start="5" style="list-style-type: decimal;">
<li><p>打开'''Wi-Fi'''后如果一切正常,就可以扫描到附近的Wi-Fi热点了。</p>
<p>[[File:Orange_Pi_5_Ultra-image559.png|574x283px]]</p></li>
<li><p>然后选择想连接的Wi-Fi后会弹出下图所示的密码输入界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image560.png|576x230px]]</p></li>
<li><p>然后使用键盘输入Wi-Fi对应的密码,再使用鼠标点击'''CONNECT'''就会开始连接Wi-Fi了。</p>
<p>[[File:Orange_Pi_5_Ultra-image561.png|575x225px]]</p></li>
<li><p>Wi-Fi连接成功后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image562.png|575x144px]]</p></li></ol>

== 蓝牙的测试方法 ==

<ol style="list-style-type: decimal;">
<li><p>首先在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|418x228px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后进入'''Setting'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image556.png|474x142px]]</p></li>
<li><p>然后选择'''Connected devices'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image563.png|412x193px]]</p></li>
<li><p>然后点击'''Pair new device'''打开蓝牙并开始扫描周围的蓝牙设备。</p>
<p>[[File:Orange_Pi_5_Ultra-image564.png|408x146px]]</p></li>
<li><p>搜索到的蓝牙设备会在'''Available devices'''下面显示出来。</p>
<p>[[File:Orange_Pi_5_Ultra-image565.png|410x208px]]</p></li>
<li><p>然后点击想要连接的蓝牙设备就可以开始配对了,当弹出下面的界面时,请使用鼠标选择'''Pair'''选项。</p>
<p>[[File:Orange_Pi_5_Ultra-image566.png|402x145px]]</p></li>
<li><p>这里测试的是开发板和安卓手机蓝牙的配置过程,此时在手机上会弹出下面的确认界面,在手机上也点击配对按钮后就会开始配对过程。</p>
<p>[[File:Orange_Pi_5_Ultra-image567.png|248x274px]]</p></li>
<li><p>配对完成后,可以看到如下图所示的已配对的蓝牙设备。</p>
<p>[[File:Orange_Pi_5_Ultra-image568.png|432x184px]]</p></li>
<li><p>此时可以使用手机蓝牙给开发板发送一张图片,发送后,在开发板的安卓系统中可以看到下面的确认界面,然后点击'''Accept'''就可以开始接收手机发过来的图片了。</p>
<p>[[File:Orange_Pi_5_Ultra-image569.png|442x190px]]</p></li>
<li><p>开发板Android系统蓝牙接收到的图片可以在文件管理器中打开'''Download'''目录查看。</p>
<p>[[File:Orange_Pi_5_Ultra-image570.png|575x79px]]</p></li></ol>

<span id="寸mipi-屏幕的使用方法"></span>
== 10.1寸MIPI 屏幕的使用方法 ==

<ol style="list-style-type: decimal;">
<li><p>首先需要组装好屏幕,请参考[[#寸mipi-屏幕的组装方法|'''10.1寸MIPI屏幕的组装方法''']]。</p></li>
<li><p>开发板上mipi lcd屏幕接口的位置如下图所示:</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image392.png|326x207px|IMG_256]]

</div></li>
<li><p>将组装好的屏幕接到开发板的LCD接口,给板子接通Type-C电源,并上电,系统启动后,就可以看到屏幕显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image571.png|575x384px]]</p></li></ol>

<span id="ov13850和ov13855-mipi摄像头的测试方法-2"></span>
== OV13850和OV13855 MIPI摄像头的测试方法 ==

目前开发板支持两款MIPI摄像头,OV13850和OV13855,具体的图片如下所示:

<ol style="list-style-type: lower-alpha;">
<li><p>1300万MIPI接口的OV13850摄像头</p>
<p>[[File:Orange_Pi_5_Ultra-image18.png|268x151px]]</p></li>
<li><p>1300万MIPI接口的OV13855摄像头</p>
<p>[[File:Orange_Pi_5_Ultra-image19.png|253x150px]]</p>
<p>OV13850和OV13855摄像头使用的转接板和FPC排线是一样的,只是两款摄像头接在转接板上的位置不一样。FPC排线如下图所示,请注意FPC排线是有方向的,标注'''TO MB'''那端需要插到开发板的摄像头接口中,标注'''TO CAMERA'''那端需要插到摄像头转接板上。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image403.png|525x110px]]

摄像头转接板上总共有3个摄像头的接口,同一时间只能接一个使用,如下图所示,其中:

<ol style="list-style-type: lower-alpha;">
<li><p>'''1号接口接OV13850摄像头'''</p></li>
<li><p>'''2号接口接OV13855摄像头'''</p></li>
<li><p>3号接口未使用,忽略即可</p></li></ol>

[[File:Orange_Pi_5_Ultra-image404.png|288x172px]]

Orange Pi 5 Ultra开发板上总共有3个摄像头接口,在Android系统中,默认只打开了Cam0和Cam1,我们定义Cam0、Cam1和Cam2的位置如下图所示:

[[File:Orange_Pi_5_Ultra-image405.png|243x158px]] [[File:Orange_Pi_5_Ultra-image406.png|239x159px]]

摄像头插在开发板的Cam0接口的方法如下所示:

[[File:Orange_Pi_5_Ultra-image407.png|300x156px]]

摄像头插在开发板的Cam1接口的方法如下所示:

[[File:Orange_Pi_5_Ultra-image408.png|291x219px]]

连接好摄像头到开发板上后,我们可以使用下面的方法来测试下摄像头:

<ol style="list-style-type: lower-alpha;">
<li><p>首先在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|418x228px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后打开相机APP。</p>
<p>[[File:Orange_Pi_5_Ultra-image572.png|482x125px]]</p></li>
<li><p>然后就能看到摄像头的预览画面了。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image573.png|576x296px|Screenshot_20230317-073757]]

</div>
<p>除了单摄外, 我们还可以同时接两个摄像头。接好双摄后,然后和前面步骤一样,打开相机APP后即可看到其中一个摄像头的画面。</p>
<p>切换另一个摄像头的方法为:</p></li></ol>

<!-- -->
<ol style="list-style-type: lower-alpha;">
<li><p>首先点击右上角的这三个点。</p>
<p>[[File:Orange_Pi_5_Ultra-image574.png|576x297px]]</p></li>
<li><p>然后点击下图所示的位置即可切换摄像头。</p>
<p>[[File:Orange_Pi_5_Ultra-image575.png|575x297px]]</p>
<p>在摄像头APP下图红框所示的区域中按住鼠标然后向右拖动可以调出拍照和摄像的切换界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image576.png|576x295px]]</p>
<p>拍照和摄像的切换界面如下所示,点击'''Video'''即可切换到录像模式。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image577.png|576x292px|Screenshot_20230317-074419]]

</div></li></ol>

<span id="pin-接口-gpiouartspi-和-pwm-测试"></span>
== 40pin 接口 GPIO、UART、SPI 和 PWM 测试 ==

<span id="pin-gpio-口测试"></span>
=== 40pin GPIO 口测试 ===

<ol style="list-style-type: decimal;">
<li><p>首先在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|418x228px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后打开wiringOP APP。</p>
<p>[[File:Orange_Pi_5_Ultra-image578.png|417x122px]]</p></li>
<li><p>wiringOP的主界面如下图所示,然后点击'''GPIO_TEST'''按钮打开GPIO测试界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image579.png|576x137px]]</p></li>
<li><p>GPIO测试界面如下图所示,左边的两排'''CheckBox'''按钮跟40pin引脚是一一对应的关系。当勾选'''CheckBox'''按钮时,对应的GPIO引脚会被设置为'''OUT'''模式,引脚电平设置为高电平;当取消勾选时,GPIO引脚电平设置为低电平;当点击右边的'''GPIO READALL'''按钮时,可以获取到wPi号、GPIO模式、引脚电平等信息;</p>
<p>当点击'''BLINK ALL GPIO'''按钮时,程序会控制28个GPIO口不停的切换高低电平。</p>
<p>[[File:Orange_Pi_5_Ultra-image580.png|576x290px]]</p></li>
<li><p>点击'''GPIO READALL'''按钮可以所有引脚的详细信息,如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image581.png|575x317px]]</p></li>
<li><p>开发板40pin中总共有28个GPIO口可以使用,下面以7号引脚——对应GPIO为GPIO1_A7 ——对应wPi序号为2——为例演示如何设置GPIO口的高低电平。首先点击7号引脚对应的'''CheckBox'''按钮,当按钮为选中状态时,7号引脚会设置为高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为'''3.3v''',说明设置高电平成功。</p>
<p>[[File:Orange_Pi_5_Ultra-image582.png|202x216px]]</p></li>
<li><p>然后点击'''GPIO READALL'''按钮,可以看到当前的7号引脚模式为'''OUT''',引脚电平为高电平。</p>
<p>[[File:Orange_Pi_5_Ultra-image583.png|576x309px]]</p></li>
<li><p>再次点击下图的'''CheckBox'''按钮取消勾选状态,7号引脚会设置为低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为'''0v''',说明设置低电平成功</p>
<p>[[File:Orange_Pi_5_Ultra-image584.png|196x212px]]</p></li>
<li><p>然后点击'''GPIO READALL'''按钮,可以看到当前的7号引脚模式为OUT,引脚电平为低电平。</p>
<p>[[File:Orange_Pi_5_Ultra-image585.png|576x316px]]</p></li></ol>

<span id="pin的uart测试-3"></span>
=== 40pin的UART测试 ===

# Android系统中默认打开了UART3和UART6两个串口,在40pin中对应的引脚如下表所示,对应的设备节点是'''/dev/ttyS3'''和'''/dev/ttyS6'''。

{| class="wikitable"
|-
| style="text-align: left;"| '''UART总线'''
| style="text-align: left;"| '''RX对应40pin'''
| style="text-align: left;"| '''TX对应40pin'''
|-
| style="text-align: left;"| '''UART3'''
| style="text-align: left;"| '''33号引脚'''
| style="text-align: left;"| '''31号引脚'''
|-
| style="text-align: left;"| '''UART6'''
| style="text-align: left;"| '''11号引脚'''
| style="text-align: left;"| '''13号引脚'''
|}

<ol start="2" style="list-style-type: decimal;">
<li><p>首先在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|418x228px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后打开wiringOP APP。</p>
<p>[[File:Orange_Pi_5_Ultra-image578.png|417x122px]]</p></li>
<li><p>wiringOP APP的主界面如下图所示,然后点击'''UART_TEST'''按钮打开UART测试界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image586.png|575x136px]]</p></li>
<li><p>wiringOP APP的串口测试界面如下图所示:</p></li></ol>

<div class="figure">

[[File:Orange_Pi_5_Ultra-image587.png|576x149px|Screenshot_20240821-113800]]

</div>
<ol start="6" style="list-style-type: decimal;">
<li>接着在编辑框中输入想要设置的波特率,然后点击'''OPEN'''按钮打开'''/dev/ttyS3'''节点,打开成功后,'''OPEN'''按钮会变为不可选中状态,'''CLOSE'''按钮和'''SEND'''按钮变为可选中状态。</li></ol>

[[File:Orange_Pi_5_Ultra-image588.png|432x176px]]

<ol start="7" style="list-style-type: decimal;">
<li><p>然后使用杜邦线短接uart3的RXD和TXD引脚。</p></li>
<li><p>然后可以在下面的发送编辑框中输入一段字符,点击'''SEND'''按钮开始发送。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image589.png|439x186px]]

<ol start="9" style="list-style-type: decimal;">
<li>如果一切正常,接收框内会显示已接收到的字符串。</li></ol>

[[File:Orange_Pi_5_Ultra-image590.png|440x196px]]

<span id="pin的spi测试"></span>
=== 40pin的SPI测试 ===

<ol style="list-style-type: decimal;">
<li><p>Android中默认打开了'''SPI0'''这一组SPI总线。</p></li>
<li><p>这里通过w25q64模块来测试SPI接口,首先在SPI0接口接入w25q64设备。</p>
<p>[[File:Orange_Pi_5_Ultra-image591.png|243x181px]]</p></li>
<li><p>首先在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|418x228px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后打开wiringOP APP。</p>
<p>[[File:Orange_Pi_5_Ultra-image578.png|417x122px]]</p></li>
<li><p>wiringOP APP的主界面显示如下图所示,点击SPI_TEST按钮打开SPI的测试界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image592.png|576x126px]]</p></li>
<li><p>然后点击'''OPEN'''按钮初始化SPI。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image593.png|574x161px]]

<ol start="7" style="list-style-type: decimal;">
<li><p>然后填充需要发送的字节,比如读取w25q64的ID信息,在data[0]中填入地址0x9f,然后点击'''TRANSFER'''按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image594.png|576x200px]]</p></li>
<li><p>最后APP会显示读取到的ID信息。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image595.png|575x296px]]

<ol start="9" style="list-style-type: decimal;">
<li><p>w25q64模块的MANUFACTURER ID为EFh,Device ID为4017h,跟上面读取到的值是对应的(h代表是16进制)。</p>
<p>[[File:Orange_Pi_5_Ultra-image596.png|374x126px]]</p></li></ol>

<span id="pin的pwm测试"></span>
=== 40pin的PWM测试 ===

# Android默认开启了'''PWM3'''和'''PWM14''',对应的引脚在40pin的所在位置如下图所示:

{| class="wikitable"
|-
| style="text-align: left;"| '''PWM总线'''
| style="text-align: left;"| '''对应40pin'''
|-
| style="text-align: left;"| '''PWM3'''
| style="text-align: left;"| '''7号引脚'''
|-
| style="text-align: left;"| '''PWM14'''
| style="text-align: left;"| '''35号引脚'''
|}

<ol start="2" style="list-style-type: decimal;">
<li><p>首先在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|418x228px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后打开wiringOP APP。</p>
<p>[[File:Orange_Pi_5_Ultra-image578.png|417x122px]]</p></li>
<li><p>然后在wiringOP的主界面点击'''PWM_TEST'''按钮进入PWM的测试界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image597.png|576x131px]]</p></li>
<li><p>PWM3的基地址'''fe8b0030''',PWM14的基地址是'''febf0020''',这里pwmchip0右边显示的是'''fe8b0030.pwm''',说明选中的是'''PWM3'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image598.png|575x160px]]</p></li>
<li><p>然后确认PWM的通道,默认是0通道,并确认PWM的周期,默认的配置是'''50000ns''',转换为PWM频率是'''20KHz''',可自行修改,点击'''EXPORT'''按钮导出'''PWM3'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image599.png|576x162px]]</p></li>
<li><p>然后拖动下面的拖动条,就可以改变PWM的占空比,然后勾选Enable就可以输出PWM波形了。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image600.png|575x116px]]

<ol start="8" style="list-style-type: decimal;">
<li>然后使用示波器测量开发板40pin中的第7号引脚就可以看到下面的波形了。</li></ol>

[[File:Orange_Pi_5_Ultra-image601.png|460x276px]]

<span id="adb的使用方法-1"></span>
== ADB的使用方法 ==

<span id="usb-otg模式切换的方法"></span>
=== USB OTG模式切换的方法 ===

'''开发板有4个USB接口,其中下图红框标注的USB接口既可以支持Host模式,又可以支持Device模式,其它3个USB接口只支持Host模式。'''

[[File:Orange_Pi_5_Ultra-image40.png|272x188px]]

'''USB OTG接口默认为Host模式,可以用来接鼠标键盘等USB设备,如果要使用ADB需要手动切换为Device模式。'''

<ol style="list-style-type: decimal;">
<li><p>首先在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|430x235px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后打开'''Settings'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image556.png|419x126px]]</p></li>
<li><p>然后选择'''About tablet'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image602.png|423x228px]]</p></li>
<li><p>然后用鼠标多次点击'''Build number'''菜单栏,直到出现'''You are now a developer!'''的提示。</p>
<p>[[File:Orange_Pi_5_Ultra-image603.png|428x244px]]</p></li>
<li><p>然后点击返回上一级菜单,选择'''System'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image604.png|377x251px]]</p></li>
<li><p>然后选择'''Developer options'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image605.png|496x118px]]</p></li>
<li><p>最后找到'''USB OTG Mode Switch'''开关,'''打开开关切换为Device模式,关闭开关切换为Host模式'''。</p></li></ol>

[[File:Orange_Pi_5_Ultra-image606.png|494x135px]]

=== 使用数据线连接adb调试 ===

<ol style="list-style-type: decimal;">
<li><p>首先准备一根品质良好的USB2.0公对公数据线。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image17.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]

</div></li></ol>

<!-- -->
<ol start="4" style="list-style-type: decimal;">
<li><p>然后参考[[#usb-otg模式切换的方法|'''USB OTG模式切换的方法''']]将USB OTG切换为device模式。</p></li>
<li><p>然后使用USB2.0公对公数据线将开发板连接到电脑的USB接口中(请同时使用TypeC电源给开发板供电)。</p></li>
<li><p>在Ubuntu PC上安装adb工具。</p>
<p>test@test:~$ '''sudo apt update'''</p>
<p>test@test:~$ '''sudo apt -y install adb'''</p></li>
<li><p>通过下面的命令可以查看识别到的ADB设备。</p>
<p>test@test:~$ '''adb devices'''</p>
<p>List of devices attached</p>
<p>S63QCF54CJ device</p>
<p>test@test:~$ '''lsusb'''</p>
<p>Bus 003 Device 006: ID 2207:0006</p></li>
<li><p>然后在Ubuntu PC上通过adb shell就可以登录到android系统了。</p></li></ol>

test@test:~$ '''adb shell'''

console:/ $

<ol start="9" style="list-style-type: decimal;">
<li>执行命令重新挂载Android系统。</li></ol>

test@test:~$ '''adb root'''

test@test:~$ '''adb remount'''

<ol start="10" style="list-style-type: decimal;">
<li>然后就可以传输文件到Android系统了。</li></ol>

test@test:~$ '''adb push example.txt /system/'''

=== 使用网络连接adb调试 ===

'''使用网络adb无需USB Typc C接口的数据线来连接电脑和开发板,而是通过网络来通信,所以首先请确保开发板的有线或者无线网络已经连接好了,然后获取开发板的IP地址,后面要用到。'''

<ol style="list-style-type: decimal;">
<li><p>确保Android系统的'''service.adb.tcp.port'''设置为5555端口号。</p>
<p>console:/ # '''getprop | grep &quot;adb.tcp&quot;'''</p>
<p>[service.adb.tcp.port]: ['''5555''']</p></li>
<li><p>如果'''service.adb.tcp.port'''没有设置,可以使用下面的命令设置网络adb的端口号。</p></li></ol>

console:/ # '''setprop service.adb.tcp.port 5555'''

console:/ # '''stop adbd'''

console:/ # '''start adbd'''

<ol start="3" style="list-style-type: decimal;">
<li><p>在Ubuntu PC上安装adb工具。</p>
<p>test@test:~$ '''sudo apt update'''</p>
<p>test@test:~$ '''sudo apt install -y adb'''</p></li>
<li><p>然后在Ubuntu PC上连接网络adb。</p>
<p>test@test:~$ '''adb connect 192.168.1.xxx''' '''(IP地址需要修改为开发板的IP地址)'''</p>
<p>* daemon not running; starting now at tcp:5037</p>
<p>* daemon started successfully</p>
<p>connected to 192.168.1.xxx:5555</p>
<p>test@test:~$ '''adb devices'''</p>
<p>List of devices attached</p>
<p>192.168.1.xxx:5555 device</p></li>
<li><p>然后在Ubuntu PC上通过adb shell就可以登录到android系统。</p></li></ol>

test@test:~$ '''adb shell'''

console:/ #

<span id="hdmi-rx的测试方法-1"></span>
== HDMI RX的测试方法 ==

<ol style="list-style-type: decimal;">
<li><p>开发板HDMI RX接口的所在位置如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image236.png|312x118px]]</p></li>
<li><p>然后使用下图所示的HDMI转HDMI线将其它设备的HDMI输出接到开发板的HDMI RX接口上。</p>
<p>[[File:Orange_Pi_5_Ultra-image10.png|199x129px]]</p></li>
<li><p>确保连接到HDMI RX接口的设备的HDMI输出是正常的,然后在桌面按住鼠标左键往上拖打开应用列表。</p>
<div class="figure">

[[File:Orange_Pi_5_Ultra-image555.png|418x228px|Screenshot_20240821-081453]]

</div></li>
<li><p>然后打开HDMI In测试APP。</p>
<p>[[File:Orange_Pi_5_Ultra-image607.png|420x128px]]</p></li>
<li><p>然后就可以看到HDMI RX的视频输入了(下图中HDMI RX显示的是opi5开发板HDMI输出的画面,此时正在播放一个视频),同时HDMI RX的音频输入也会从开发板的HDMI TX接口或者耳机接口输出。</p>
<p>[[File:Orange_Pi_5_Ultra-image608.png|579x325px]]</p></li></ol>

<span id="android-13源码的编译方法"></span>
= Android 13源码的编译方法 =

<span id="下载android-13的源码"></span>
== 下载Android 13的源码 ==

<ol style="list-style-type: decimal;">
<li><p>首先从百度云盘或者谷歌网盘下载Android 13源码的分卷压缩包。</p></li>
<li><p>Android 13源码的分卷压缩包下载完后,请先检查下MD5校验和是否正确,如果不正确,请重新下载源码。</p>
<p>test@test:~$ '''md5sum -c md5sum'''</p>
<p>'''Android_13.tar.gz00: 确定'''</p>
<p>'''Android_13.tar.gz01: 确定'''</p>
<p>'''Android_13.tar.gz02: 确定'''</p>
<p>'''Android_13.tar.gz03: 确定'''</p>
<p>'''Android_13.tar.gz04: 确定'''</p>
<p>'''Android_13.tar.gz05: 确定'''</p>
<p>'''Android_13.tar.gz06: 确定'''</p>
<p>'''Android_13.tar.gz07: 确定'''</p>
<p>'''Android_13.tar.gz08: 确定'''</p></li>
<li><p>然后需要将多个压缩文件合并成一个,再进行解压。</p></li></ol>

test@test:~$ '''cat Android_13.tar.gz0* | tar -xvzf -'''

<span id="编译android-13的源码"></span>
== 编译Android 13的源码 ==

<ol style="list-style-type: decimal;">
<li><p>首先安装编译Android13源码需要的软件包。</p>
<p>test@test:~$ '''sudo apt-get update'''</p>
<p>test@test:~$ '''sudo apt-get install -y git gnupg flex bison gperf build-essential \'''</p>
<p>'''zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \'''</p>
<p>'''lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \'''</p>
<p>'''libgl1-mesa-dev libxml2-utils xsltproc unzip'''</p>
<p>test@test:~$ '''sudo apt-get install -y u-boot-tools'''</p></li>
<li><p>源码中有make.sh编译脚本,编译参数如下:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>-'''B''':编译uboot</p></li>
<li><p>-'''K''':编译kernel</p></li>
<li><p>-'''a''': 编译android</p></li>
<li><p>'''-F''':编译uboot、kernel和android</p></li>
<li><p>'''-M''':在rockdev目录下生成分区镜像</p></li>
<li><p>-'''u''':打包生成最终可以启动的完整镜像</p></li>
<li><p>'''-b''':指定开发板型号</p></li></ol>
</li>
<li><p>编译uboot、kernel、android并打包成最终可以启动的完整镜像。</p>
<p>test@test:~$ '''cd Android_13'''</p>
<p>test@test:~/ Android_13$ '''./make.sh -FMu -b orangepi5ultra --nvme --gapps'''</p></li>
<li><p>编译完成后会打印下面的信息。</p>
<p>********rkImageMaker ver 2.1********</p>
<p>Generating new image, please wait...</p>
<p>Writing head info...</p>
<p>Writing boot file...</p>
<p>Writing firmware...</p>
<p>Generating MD5 data...</p>
<p>MD5 data generated successfully!</p>
<p>New image generated successfully!</p>
<p>Making update.img OK.</p>
<p>Make update image ok!</p></li>
<li><p>最终生成的镜像文件会放在'''rockdev/Image-rk3588_t'''目录下。其中'''update.img'''是TF卡启动镜像,'''update_spi_nvme.img'''是NVME SSD启动镜像。</p>
<p>[mailto:test@test:~OrangePi_4/rk3399-android-8.1$ test@test:~/Android_13$] '''cd rockdev/Image-rk3588_t'''</p>
<p>[mailto:test@test:~OrangePi_4/rk3399-android-8.1$ test@test:~/Android_13/rockdev/Image-rk3588_t$] '''ls update*'''</p>
<p>update.img update_spi_nvme.img</p></li></ol>

<span id="openwrt系统使用说明"></span>
= OpenWRT系统使用说明 =

<span id="openwrt版本"></span>
== OpenWRT版本 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''OpenWRT版本'''
| style="text-align: center;"| '''内核版本'''
|-
| style="text-align: center;"| '''v22.03.4'''
| style="text-align: center;"| '''Linux5.10.110'''
|}

<span id="openwrt适配情况"></span>
== OpenWRT适配情况 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''功能'''
| style="text-align: center;"| '''OpenWRT'''
|-
| style="text-align: center;"| '''USB2.0x2'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''USB3.0x2'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''3pin调试串口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''TF卡启动'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''2.5G PCIe网口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''网口状态灯'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''LED灯'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''RTL8821CU USB网卡'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''RTL8723BU USB网卡'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''FAN风扇接口'''
| style="text-align: center;"| '''OK'''
|-
| style="text-align: center;"| '''eMMC扩展接口'''
| style="text-align: center;"| '''OK'''
|}

== 第一次启动扩容rootfs ==

<ol style="list-style-type: decimal;">
<li><p>第一次启动OpenWRT系统时会执行'''resize-rootfs.sh'''脚本进行 rootfs 的扩容,并且扩容完成后会自动重启。</p></li>
<li><p>登录系统后可以通过 '''df -h''' 命令来查看 rootfs 的大小,如果和存储设备(TF卡、eMMC或者NVME SSD)实际容量一致,说明自动扩容运行正确。</p>
<p>root@OpenWrt:~# '''df -h'''</p>
<p>Filesystem Size Used Available Use% Mounted on</p>
<p>'''/dev/root 14.8G 14.7G 91.6M 99% /'''</p>
<p>tmpfs 495.5M 6.1M 489.4M 1% /tmp</p>
<p>tmpfs 512.0K 0 512.0K 0% /dev</p>
<p>/dev/root 14.8G 14.7G 91.6M 99% /opt/docker</p></li></ol>

== 登录系统的方法 ==

=== 通过串口登录 ===

<ol style="list-style-type: decimal;">
<li><p>首先调试串口的使用可以参考[[#调试串口的使用方法|'''调试串口的使用方法''']]章节。</p></li>
<li><p>OpenWrt系统默认会以 '''root''' 用户自动登录,显示界面如下所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image609.png|573x314px]]</p></li></ol>

<span id="通过ssh登录系统"></span>
=== 通过SSH登录系统 ===

'''请注意,在Orange Pi 5 Ultra的OpenWrt系统中,默认将网口配置成LAN口。'''

<ol style="list-style-type: decimal;">
<li><p>首先用网线连接板子的LAN口到电脑的网口,以便电脑的网口能通过DHCP获取到IP地址。</p></li>
<li><p>默认板子的LAN口IP是设置为'''192.168.2.1'''的,所以此时电脑可以获取到以'''192.168.2'''开头的IP地址。</p></li>
<li><p>如果电脑安装的Ubuntu系统,可以执行下列命令通过SSH登录系统,默认是不需要密码直接就可以登录的。</p>
<p>test@ubuntu:~$ '''ssh root@192.168.2.1'''</p></li>
<li><p>成功登录系统后的显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image610.png|553x330px]]</p></li>
<li><p>如果电脑装的Windows系统,可以参考[[#_Windows下SSH远程登录开发板|'''Windows下SSH远程登录开发板''']]一小节介绍的方法进行登录。</p></li></ol>

<span id="登录luci管理界面"></span>
=== 登录LuCI管理界面 ===

'''请注意,在Orange Pi 5 Ultra的OpenWrt系统中,默认将网口配置成LAN口。'''

# 首先用网线连接板子的LAN口到电脑的网口,以便电脑的网口能通过DHCP获取到IP地址。
# 默认板子的LAN口IP是设置为'''192.168.2.1'''的,所以此时电脑可以获取到以'''192.168.2'''开头的IP地址。
# 在电脑上的浏览器中输入IP地址'''192.168.2.1'''就可以登录LuCI界面了。

<div class="figure">

[[File:Orange_Pi_5_Ultra-image611.png|552x135px|2023-04-21 14-41-42 的屏幕截图]]

</div>
<ol start="4" style="list-style-type: decimal;">
<li><p>'''OpenWrt系统默认是没有设置密码的''',所以直接点击'''登录'''按钮即可,登录成功后界面显示如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image612.png|575x464px]]</p></li></ol>

<span id="通过luci管理界面登录终端"></span>
=== 通过LuCI管理界面登录终端 ===

'''请注意,在Orange Pi 5 Ultra的OpenWrt系统中,默认将网口配置成LAN口。'''

# 首先用网线连接板子的LAN口到电脑的网口,以便电脑的网口能通过DHCP获取到IP地址。
# 默认板子的LAN口IP是设置为'''192.168.2.1'''的,所以此时电脑可以获取到以'''192.168.2'''开头的IP地址。
# 在电脑上的浏览器中输入IP地址'''192.168.2.1'''就可以登录LuCI界面了。

<div class="figure">

[[File:Orange_Pi_5_Ultra-image611.png|482x118px|2023-04-21 14-41-42 的屏幕截图]]

</div>
<ol start="4" style="list-style-type: decimal;">
<li>在导航栏的'''“服务”'''一栏中选择'''“终端”'''并点击进入。</li></ol>

[[File:Orange_Pi_5_Ultra-image613.png|485x192px]]

<ol start="5" style="list-style-type: decimal;">
<li><p>此时终端界面如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image614.png|488x345px]]</p></li>
<li><p>输入用户名root即可登录</p>
<p>[[File:Orange_Pi_5_Ultra-image615.png|575x334px]]</p></li></ol>

<span id="使用ip地址端口号方式登录终端"></span>
=== 使用IP地址+端口号方式登录终端 ===

'''请注意,在Orange Pi 5 Ultra的OpenWrt系统中,默认将网口配置成LAN口。'''

# 首先用网线连接板子的LAN口到电脑的网口,以便电脑的网口能通过DHCP获取到IP地址。
# 默认板子的LAN口IP是设置为'''192.168.2.1'''的,所以此时电脑可以获取到以'''192.168.2'''开头的IP地址。
# 然后在浏览器输入[http://192.168.2.1:7681/ '''192.168.2.1:7681''']即可登录OpenWRT的终端。

<div class="figure">

[[File:Orange_Pi_5_Ultra-image616.png|553x296px|2023-04-21 14-54-26 的屏幕截图]]

</div>
<span id="通过命令行修改lan口ip地址的方法"></span>
== 通过命令行修改LAN口IP地址的方法 ==

# 在OpenWrt系统中,提供了一个命令行工具uci,它可以很方便地对配置文件中的内容进行修改、添加、删除和读取,详细说明请参考[https://openwrt.org/docs/guide-user/base-system/uci '''官方文档''']。
# 首先使用以下命令获取网络配置,对应的配置文件是'''/etc/config/network,'''可以看到'''network.lan.ipaddr'''这一项的值是'''192.168.2.1'''。

root@OpenWrt:~# '''uci show network'''

...

network.lan=interface

network.lan.device='br-lan'

network.lan.proto='static'

'''network.lan.ipaddr='192.168.2.1''''

network.lan.netmask='255.255.255.0'

network.lan.ip6assign='60'

.…

<ol start="3" style="list-style-type: decimal;">
<li>然后输入以下命令修改'''network.lan.ipaddr'''这一项。</li></ol>

root@OpenWrt:~# '''uci set network.lan.ipaddr='192.168.100.1''''

<ol start="4" style="list-style-type: decimal;">
<li>然后输入以下命令完成提交,即写入到配置文件。</li></ol>

root@OpenWrt:~# '''uci commit'''

如果红色字体的IP地址与要设置的一致,说明修改成功。

root@OpenWrt:~# '''cat /etc/config/network'''

'''...'''

config interface 'lan'

option device 'br-lan'

option proto 'static'

option netmask '255.255.255.0'

option ip6assign '60'

'''option ipaddr '192.168.100.1''''

...

<ol start="5" style="list-style-type: decimal;">
<li>通过ubus重启网络,ubus的使用说明请参考[https://openwrt.org/docs/guide-developer/ubus '''官方文档''']。</li></ol>

root@OpenWrt:~# '''ubus call network restart'''

<ol start="6" style="list-style-type: decimal;">
<li><p>此时,输入命令可以看到LAN口的IP已经是'''192.168.100.1'''。</p>
<p>root@OpenWrt:~# '''ifconfig br-lan'''</p>
<p>br-lan Link encap:Ethernet HWaddr FE:55:13:A3:EF:E7</p>
<p>inet addr:'''192.168.100.1''' Bcast:192.168.100.255 Mask:255.255.255.0</p>
<p>inet6 addr: fd60:c4cd:1033::1/60 Scope:Global</p>
<p>UP BROADCAST MULTICAST MTU:1500 Metric:1</p>
<p>RX packets:0 errors:0 dropped:0 overruns:0 frame:0</p>
<p>TX packets:3 errors:0 dropped:0 overruns:0 carrier:0</p>
<p>collisions:0 txqueuelen:1000</p>
<p>RX bytes:0 (0.0 B) TX bytes:370 (370.0 B)</p></li></ol>

== 修改root密码的方法 ==

=== 通过命令行修改 ===

# 首先在系统的命令行输入passwd root,会出现以下提示信息,此时可以输入想要设置的密码,按下回车键确认。

root@OpenWrt:/# '''passwd root'''

'''Enter new UNIX password:'''

<ol start="2" style="list-style-type: decimal;">
<li>接着会提示重新输入密码,此时再次输入密码确认并回车即可。</li></ol>

'''Retype password:'''

<ol start="3" style="list-style-type: decimal;">
<li>修改成功的显示如下:</li></ol>

'''passwd: password for root changed by root'''

<span id="通过luci管理界面修改"></span>
=== 通过LuCI管理界面修改 ===

<ol style="list-style-type: decimal;">
<li><p>首先参考[[#登录luci管理界面|'''登录LuCI管理界面''']]进入OpenWRT的管理界面。</p></li>
<li><p>然后按照下面的步骤修改密码。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在导航栏中找到”'''系统'''”选项并点击。</p></li>
<li><p>在系统下方的竖栏选项中,选择”'''管理权'''”并点击。</p>
<p>[[File:Orange_Pi_5_Ultra-image617.png|576x439px]]</p></li>
<li><p>在Tab页中选择”'''路由器密码'''”选项。</p>
<p>[[File:Orange_Pi_5_Ultra-image618.png|552x211px]]</p></li></ol>
</li>
<li><p>修改并保存路由器密码。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在”'''密码'''”和”'''确认密码'''”的对话框中输入自己设定的密码(如果不确定密码是否输入正确,可点击对话框后面的”'''*'''”图标以显示输入字符)。</p></li>
<li><p>点击”'''保存'''”即可保存新修改的密码。</p>
<p>[[File:Orange_Pi_5_Ultra-image619.png|553x230px]]</p></li></ol>
</li></ol>

'''注:在”密码”和”确认密码”的对话框中,需要两次输入的密码保持一致。'''

<ol start="4" style="list-style-type: decimal;">
<li><p>密码修改成功之后,会弹出”'''系统密码已更改成功'''”的弹框,此时登录OpenWRT就需要密码才能登录。</p>
<p>[[File:Orange_Pi_5_Ultra-image620.png|563x222px]]</p></li></ol>

<span id="usb接口测试-1"></span>
== USB接口测试 ==

<span id="在命令行下挂载usb存储设备"></span>
=== 在命令行下挂载USB存储设备 ===

# 首先将U盘插入Orange Pi开发板的USB接口中。
# 执行下面的命令如果能看到sdX的输出说明U盘识别成功。

root@OpenWrt:~# '''cat /proc/partitions | grep &quot;sd*&quot;'''

major minor #blocks name

8 0 15126528 '''sda'''

<ol start="3" style="list-style-type: decimal;">
<li>使用mount命令可以将U盘挂载到/mnt中,然后就能查看U盘中的文件了。</li></ol>

root@OpenWrt:~# '''mount /dev/sda /mnt/'''

root@OpenWrt:~# '''ls /mnt/'''

test.txt

<ol start="4" style="list-style-type: decimal;">
<li>挂载完后通过df -h命令就能查看U盘的容量使用情况和挂载点。</li></ol>

root@OpenWrt:~# '''df -h | grep &quot;sd&quot;'''

/dev/sda 14.4G 187.2M 14.2G 1% /mnt

<span id="在luci管理界面挂载usb存储设备"></span>
=== '''在LuCI管理界面'''挂载USB存储设备 ===

<ol style="list-style-type: decimal;">
<li><p>首先将U盘(或者其它存储设备)通过USB2.0连接到开发板。</p></li>
<li><p>然后按照[[#登录luci管理界面|'''登录LuCI管理界面''']]进入LuCI管理界面。</p></li>
<li><p>然后在LuCI管理界面中,点击”系统-&gt;挂载点”进入挂载点的配置界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image621.png|575x461px]]</p></li>
<li><p>然后按照下面的步骤新增一个挂载点。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在挂载点'''全局设置界面'''下方找到”'''挂载点'''”。</p></li>
<li><p>在'''挂载点'''下方,选择”添加”按钮并点击进入。</p></li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image622.png|553x163px]]

<ol start="3" style="list-style-type: lower-alpha;">
<li><p>接着会弹出下面的弹窗界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image623.png|553x288px]]</p></li>
<li><p>然后就可以开始挂载存储设备。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>勾选”'''已启用'''”。</p></li>
<li><p>在常规设置UUID一栏中选择实际接入的设备/dev/sda(根据自己的设备选择)。</p></li>
<li><p>在挂载点一栏中选择”'''自定义'''”,并填入要挂载到的目标目录,这里以'''/mnt'''目录为例,填好后'''回车'''确认。</p></li>
<li><p>然后点击右下角的”'''保存'''”按钮。</p></li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image624.png|553x214px]]

<ol start="5" style="list-style-type: decimal;">
<li>然后会回到挂载点全局设置页面,在页面的左下角点击”'''保存并应用'''”使挂载点生效。</li></ol>

[[File:Orange_Pi_5_Ultra-image625.png|527x325px]]

<ol start="6" style="list-style-type: decimal;">
<li>保存完后可以看到”'''已挂载的文件系统'''”中,该存储设备已经挂载成功。</li></ol>

[[File:Orange_Pi_5_Ultra-image626.png|553x201px]]

<span id="usb无线网卡测试-1"></span>
== USB无线网卡测试 ==

目前测试过的能用的USB无线网卡如下所示,其他型号的USB无线网卡请自行测试,如果无法使用就需要移植对应的USB无线网卡驱动。

{| class="wikitable"
|-
| 序号
| 型号
|
|-
| 1
| RTL8723BU

支持2.4G WIFI+BT4.0

| [[File:Orange_Pi_5_Ultra-image2%2048.png]]
|-
| 2
| RTL8821CU

支持2.4G +5G WIFI

支持BT 4.2

| <div class="figure">

[[File:Orange_Pi_5_Ultra-image25%200.jpeg|tb_image_ share_167083320112 3]]

</div>
|}

<span id="使用usb无线网卡连接wifi热点的方法"></span>
=== 使用USB无线网卡连接WIFI热点的方法 ===

<ol style="list-style-type: decimal;">
<li><p>将USB无线网卡插入开发板的USB端口,然后接上电源给开发板上电。</p></li>
<li><p>系统启动完成后,点击 '''网络 -&gt; 无线''' 进入配置无线WiFi界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image627.png|575x300px]]</p></li>
<li><p>OpenWRT系统默认的无线配置是'''Master''' 模式,这里为了方便接下来的操作,我们将默认的无线连接移除。</p>
<p>[[File:Orange_Pi_5_Ultra-image628.png|520x162px]]</p></li>
<li><p>然后点击页面的右下角 '''保存''' 让配置生效。</p>
<p>[[File:Orange_Pi_5_Ultra-image629.png|520x179px]]</p></li>
<li><p>然后点击 '''扫描''' 按钮扫描周围的WiFi热点。</p>
<p>[[File:Orange_Pi_5_Ultra-image630.png|541x225px]]</p></li>
<li><p>然后会弹出下面的窗口显示可用的WiFi热点,这时点击想要连接的WiFi热点右边的 '''加入网络''' 按钮来连接WiFi热点。</p>
<p>[[File:Orange_Pi_5_Ultra-image631.png|553x89px]]</p></li>
<li><p>然后会弹出一个连接WiFi热点的界面,我们在下图所示的位置输入热点的密码,再点击 '''提交''' 按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image632.png|552x135px]]</p></li>
<li><p>然后会弹出下面的界面,点击右下角的 '''保存''' 按钮即可。</p>
<p>[[File:Orange_Pi_5_Ultra-image633.png|553x237px]]</p></li>
<li><p>最后会回到无线配置的主界面,点击 '''保存并应用''' 等待配置被应用完成。</p>
<p>[[File:Orange_Pi_5_Ultra-image634.png|544x252px]]</p></li>
<li><p>成功连接到WiFi热点后,界面显示如下图所示。</p>
<p>[[File:Orange_Pi_5_Ultra-image635.png|547x232px]]</p></li></ol>

<span id="使用usb无线网卡创建wifi热点的方法"></span>
=== 使用USB无线网卡创建WIFI热点的方法 ===

<ol style="list-style-type: decimal;">
<li><p>将USB无线网卡插入开发板的USB端口,然后接上电源给开发板上电。</p></li>
<li><p>系统启动完成,点击 '''网络 -&gt; 无线''' 进入无线WiFi配置界面。</p>
<p>[[File:Orange_Pi_5_Ultra-image627.png|575x300px]]</p></li>
<li><p>OpenWRT系统默认的无线配置是'''Master''' 模式,这里为了方便接下来的操作,我们将默认的无线连接移除。</p>
<p>[[File:Orange_Pi_5_Ultra-image628.png|517x162px]]</p></li>
<li><p>然后点击页面的右下角 '''保存''' 让配置生效。</p>
<p>[[File:Orange_Pi_5_Ultra-image629.png|553x179px]]</p></li>
<li><p>然后点击右侧的 '''添加''' 按钮。</p>
<p>[[File:Orange_Pi_5_Ultra-image636.png|553x138px]]</p></li>
<li><p>在弹出标签页 '''设备配置''' 中,我们设置参数如下图所示。</p>
<p>[[File:Orange_Pi_5_Ultra-image637.png|548x268px]]</p></li>
<li><p>然后在 '''接口配置 -&gt; 常规设置''' 中,将模式设置成 '''接入点AP''' ,'''ESSID'''(无线网络名称)设置为'''OpenWrt''' ,网络指定为''' lan'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image638.png|575x269px]]</p></li>
<li><p>然后在 '''接口配置 -&gt; 无线安全''' 中,加密算法选择''' WPA2-PSK''' ;密钥(无线密码)设置为 '''password'''。</p>
<p>[[File:Orange_Pi_5_Ultra-image639.png|534x224px]]</p></li>
<li><p>以上设置完成后,点击页面右下角''' 保存''',之后会退出标签页。</p>
<p>[[File:Orange_Pi_5_Ultra-image640.png|553x303px]]</p></li>
<li><p>然后点击页面右下角 '''保存并应用''' 等待配置被应用完成。</p>
<p>[[File:Orange_Pi_5_Ultra-image641.png|553x216px]]</p></li>
<li><p>成功创建热点的显示界面如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image642.png|515x266px]]</p></li>
<li><p>然后使用手机或电脑搜索对应SSID的WiFi进行连接,连接成功后如下图所示:</p>
<p>[[File:Orange_Pi_5_Ultra-image643.png|247x156px]]</p></li></ol>

== 通过命令行安装软件包 ==

=== 在终端通过opkg安装 ===

# 更新可获取的软件包列表

root@OpenWrt:/# '''opkg update'''

<ol start="2" style="list-style-type: decimal;">
<li>获取软件列表</li></ol>

root@OpenWrt:/# '''opkg list'''

<ol start="3" style="list-style-type: decimal;">
<li>安装指定的软件包</li></ol>

root@OpenWrt:/# '''opkg install &lt;包名称&gt;'''

<ol start="4" style="list-style-type: decimal;">
<li>查看已经安装的软件</li></ol>

root@OpenWrt:/# '''opkg list-installed'''

<ol start="5" style="list-style-type: decimal;">
<li>卸载软件</li></ol>

root@OpenWrt:/# '''opkg remove &lt;包名称&gt;'''

<span id="openwrt管理界面安装软件包"></span>
== OpenWRT管理界面安装软件包 ==

'''若需要新增软件包,可通过OpenWRT的管理界面进行安装。'''

=== 查看系统可用软件包列表 ===

<ol style="list-style-type: decimal;">
<li><p>首先进入软件包管理页面</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在导航栏中找到”'''系统'''”选项并点击进入</p></li>
<li><p>在系统下方的竖栏选项中,选择”'''软件包'''”并点击进入</p></li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image644.png|575x424px]]

<ol start="2" style="list-style-type: decimal;">
<li><p>然后会出现软件包的主页面,如下图所示,获取可用的软件列表</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在软件包的”'''操作'''”选项中,点击”'''更新列表'''”,获取可用的软件包列表</p></li>
<li><p>在Tab页中,点击”'''可用'''”,查看当前可用软件包</p></li>
<li><p>查看当前可用软件包的数量</p>
<p>[[File:Orange_Pi_5_Ultra-image645.png|553x232px]]</p></li></ol>
</li></ol>

=== 安装软件包示例 ===

<ol style="list-style-type: decimal;">
<li><p>以安装软件包”'''luci-app-acl'''”为例</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在OpenWRT的软件包管理界面下,点击筛选器的对话框并输入”'''luci-app-acl'''”</p></li>
<li><p>在软件包的列表中可以看到”'''luci-app-acl'''”软件包的版本、软件包大小以及描述信息,然后点击”'''安装'''”按钮</p>
<p>[[File:Orange_Pi_5_Ultra-image646.png|552x259px]]</p></li>
<li><p>然后会出现以下弹窗,点击”'''安装'''”即可</p>
<p>[[File:Orange_Pi_5_Ultra-image647.png|348x430px]]</p></li>
<li><p>然后等待安装完成</p></li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image648.png|576x96px]]

<ol start="5" style="list-style-type: lower-alpha;">
<li><p>安装完成的显示如下</p>
<p>[[File:Orange_Pi_5_Ultra-image649.png|506x289px]]</p></li></ol>

<!-- -->
<ol start="2" style="list-style-type: decimal;">
<li><p>查看软件包是否安装成功</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在OpenWRT的软件包管理界面下,点击筛选器的对话框并输入”'''luci-app-acl'''”</p></li>
<li><p>在Tab页选择点击”'''可用'''”</p></li>
<li><p>在软件包列表中会显示”'''luci-app-acl'''”软件包,并更新状态为”'''已安装'''”</p>
<p>[[File:Orange_Pi_5_Ultra-image650.png|576x196px]]</p></li></ol>
</li></ol>

=== 移除软件包示例 ===

<ol style="list-style-type: decimal;">
<li><p>以移除软件包”'''luci-app-acl'''”为例</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在OpenWRT的软件包管理界面下,点击筛选器的对话框并输入”'''luci-app-acl'''”</p></li>
<li><p>在Tab页中选择”'''已安装'''”,显示已安装的软件包列表</p></li>
<li><p>点击右边的”'''移除'''”,即可移除相应的软件包</p>
<p>[[File:Orange_Pi_5_Ultra-image651.png|461x164px]]</p></li>
<li><p>然后会显示下面弹窗,点击”'''移除'''”即可</p>
<p>[[File:Orange_Pi_5_Ultra-image652.png|415x129px]]</p></li>
<li><p>移除成功后,显示界面如下</p>
<p>[[File:Orange_Pi_5_Ultra-image653.png|414x88px]]</p></li></ol>
</li>
<li><p>查看软件包是否移除成功</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在OpenWRT的软件包管理界面下,点击筛选器的对话框并输入”'''luci-app-acl'''”</p></li>
<li><p>在Tab页选择点击”'''已安装'''”</p></li>
<li><p>在软件包列表中不会显示”'''luci-app-acl'''”软件包,此时”'''luci-app-acl'''”软件包已移除成功</p>
<p>[[File:Orange_Pi_5_Ultra-image654.png|493x187px]]</p></li></ol>
</li></ol>

<span id="使用samba网络共享"></span>
== 使用Samba网络共享 ==

'''OpenWRT局域网文件共享实现主要有两个软件选择,Samba和NFS。Samba系统兼容性较好,NFS则性能表现占优。对于需要使用Windows设备的用户来说,建议选择Samba。'''

<ol style="list-style-type: decimal;">
<li><p>进入Samba网络共享的管理页面</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在导航栏中找到”'''服务'''”选项并点击进入</p></li>
<li><p>在服务下方的竖栏选项中,选择”'''网络共享'''”并点击进入</p>
<p>[[File:Orange_Pi_5_Ultra-image655.png|553x205px]]</p></li></ol>
</li>
<li><p>选择Samba服务需要监听的接口</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在网络共享的导航栏中选择”'''常规设置'''”并点击进入</p></li>
<li><p>接口设置为”'''Lan'''”</p>
<p>[[File:Orange_Pi_5_Ultra-image656.png|575x262px]]</p></li></ol>
</li>
<li><p>设置网络共享的共享目录</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在网络共享的”'''常规设置'''”的”'''共享目录'''”点击”添加”来共享目录地址</p></li>
<li><p>在名称下面输入共享文件夹的名称为”'''mmt'''”</p></li>
<li><p>在共享目录的路径下,选择设置共享的目录位置”'''/'''”</p></li>
<li><p>勾选”'''可浏览'''”和”'''允许运行匿名用户'''”</p></li>
<li><p>点击”'''保存并应用'''”,保存配置</p>
<p>[[File:Orange_Pi_5_Ultra-image657.png|575x211px]]</p></li></ol>
</li>
<li><p>window10启动网络发现与共享</p>
<p>'''注:在windows10系统下访问Samba,共享需要先确认window10是否已经启动网络发现与共享,如未启动,先进行如下设置。'''</p></li></ol>

<!-- -->
<ol style="list-style-type: lower-alpha;">
<li><p>启用Samba v1/v2的访问</p>
<ol style="list-style-type: lower-alpha;">
<li><p>进入windows10的”控制面板”</p></li>
<li><p>在控制面板的左侧导航栏点击”程序”</p></li>
<li><p>在程序和功能中选择”启用或关闭Windows功能”</p></li>
<li><p>在启用或关闭Windows功能的弹框中勾选”SMB 1.0/CIFS文件共享支持”</p></li>
<li><p>点击”确定”,配置应用</p></li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image658.png|575x316px]]

<ol start="2" style="list-style-type: lower-alpha;">
<li><p>打开Windows10的网络发现</p>
<ol style="list-style-type: lower-alpha;">
<li><p>进入windows10的”控制面板”</p></li>
<li><p>在控制面板中选择”网络和Internet”</p></li>
<li><p>然后打开”网络和共享中心”</p></li>
<li><p>点击|“高级共享设置”</p></li>
<li><p>打开”'''启用网络发现'''”和”'''启用文件和打印机共享'''”</p></li>
<li><p>点击”保存更改”,保存Windows10的网络发现配置</p></li></ol>
</li></ol>

[[File:Orange_Pi_5_Ultra-image659.png|575x323px]]

<ol start="5" style="list-style-type: decimal;">
<li>设置完成后,在资源管理器的地址栏输入\\OpenWrt即可访问共享目录,用户名为root,密码为开发板主机设定的密码</li></ol>

[[File:Orange_Pi_5_Ultra-image660.png|575x270px]]

== zerotier使用说明 ==

'''OpenWRT系统已经预装了zerotier客户端,在zerotier官网创建虚拟局域网后,在客户端可以通过Network ID直接加入其中,具体操作如下文所示。'''

<ol style="list-style-type: decimal;">
<li><p>登录zerotier官网[https://my.zerotier.com/network '''https://my.zerotier.com/network'''],注册登录后点击Network-&gt;Create A Network,创建一个虚拟局域网</p>
<p>[[File:Orange_Pi_5_Ultra-image661.png|575x118px]]</p>
<p>[[File:Orange_Pi_5_Ultra-image662.png|574x166px]]</p></li>
<li><p>点击进入网络控制台页面,可以把隐私选项设置为公共,这样加入的网络节点就不需要验证</p>
<p>[[File:Orange_Pi_5_Ultra-image663.png|353x257px]]</p></li>
<li><p>下面自动分配地址这里可以自己选择网段,此处选择的是172.27.*.*</p>
<p>[[File:Orange_Pi_5_Ultra-image664.png|374x233px]]</p></li>
<li><p>在OpenWRT终端输入下面命令就可以加入到上面创建的虚拟局域网,'''其中8286ac0e47d53bb5是上面创建的虚拟局域网的Network ID'''</p></li></ol>

root@OpenWrt:/# '''zerotier-one -d''' #启动zerotier客户端

root@OpenWrt:/# '''zerotier-cli join 8286ac0e47d53bb5''' #加入网络

<ol start="5" style="list-style-type: decimal;">
<li>在终端输入ifconfig可以看到已经有个新增的'''ztks54inm2'''设备,IP地址为'''172.27.214.213'''</li></ol>

root@OpenWrt:/# '''ifconfig'''

'''ztks54inm2''' Link encap:Ethernet HWaddr F6:4E:DE:BF:D8:52

inet addr:'''172.27.214.213''' Bcast:172.27.255.255 Mask:255.255.0.0

inet6 addr: fe80::e82f:d0ff:fe5a:867e/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:2800 Metric:1

RX packets:18 errors:0 dropped:0 overruns:0 frame:0

TX packets:48 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:1720 (1.6 KiB) TX byte81 (8.2 KiB)

<ol start="6" style="list-style-type: decimal;">
<li>在另一台设备上安装zerotier客户端(此处以Ubuntu18.04为例),执行下面命令进行安装,安装完成后需要重启电脑</li></ol>

test@ubuntu:~$ '''curl -s https://install.zerotier.com | sudo bash'''

<ol start="7" style="list-style-type: decimal;">
<li>重启后根据Network ID加入虚拟局域网,也可以看到已经获取到zerotier分配的ip地址,此时该Ubuntu PC和开发板处于同一局域网中,两者可以自由通信</li></ol>

test@ubuntu:~$ '''sudo zerotier-cli join 8286ac0e47d53bb5'''

test@ubuntu:~$ '''ifconfig'''

'''ztks54inm2''': flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 2800

inet '''172.27.47.214''' netmask 255.255.0.0 broadcast 172.27.255.255

inet6 fe80::5ce1:85ff:fe2b:6918 prefixlen 64 scopeid 0x20&lt;link&gt;

ether f6:fd:87:68:12:cf txqueuelen 1000 (以太网)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 46 bytes 10006 (10.0 KB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

<ol start="8" style="list-style-type: decimal;">
<li>测试两个终端是否可以通信</li></ol>

root@OpenWrt:/# '''ping 172.27.47.214 -I ztks54inm2'''

PING 172.27.47.214 (172.27.47.214): 56 data bytes

64 bytes from 172.27.47.214: seq=0 ttl=64 time=1.209 ms

64 bytes from 172.27.47.214: seq=1 ttl=64 time=1.136 ms

64 bytes from 172.27.47.214: seq=2 ttl=64 time=1.203 ms

64 bytes from 172.27.47.214: seq=3 ttl=64 time=1.235 ms

^C

--- 172.27.47.214 ping statistics ---

4 packets transmitted, 4 packets received, 0% packet loss

round-trip min/avg/max = 1.136/1.195/1.235 ms

<ol start="9" style="list-style-type: decimal;">
<li>zerotier其他常用命令</li></ol>

root@OpenWrt:/# '''zerotier-one -d''' #启动zerotier客户端

root@OpenWrt:/# '''zerotier-cli status''' #获取地址和服务状态

root@OpenWrt:/# '''zerotier-cli join # Network ID''' #加入网络

root@OpenWrt:/# '''zerotier-cli leave # Network ID''' #离开网络

root@OpenWrt:/# '''zerotier-cli listnetworks''' #列出网络

OPENWRT_DEVICE_REVISION=&quot;v0&quot;

OPENWRT_RELEASE=&quot;OpenWrt 22.03.4 r20123-38ccc47687&quot;

<span id="openwrt源码的编译方法"></span>
= OpenWRT源码的编译方法 =

<span id="下载openwrt源码"></span>
== 下载OpenWRT源码 ==

# 首先执行下面的命令下载openwrt-22.03分支代码

test@test:~$ '''sudo apt update'''

test@test:~$ '''sudo apt install -y git'''

test@test:~$ '''git clone https://github.com/orangepi-xunlong/openwrt.git -b openwrt-22.03'''

<ol start="2" style="list-style-type: decimal;">
<li>OpenWRT代码下载完后会包含下面的文件和文件夹</li></ol>

test@test:~/openwrt$ '''ls'''

BSDmakefile Config.in include Makefile README.md scripts toolchain

Config feeds.conf.default LICENSE package rules.mk target tools

<span id="编译openwrt源码"></span>
== 编译OpenWRT源码 ==

# 首先安装下面这些依赖包(目前仅测试了在Ubuntu22.04上编译需要安装下面的依赖包,如果在其他版本的Ubuntu系统上编译,请根据出错信息自行安装对应的依赖包)

test@test:~/openwrt$ '''sudo apt update'''

test@test:~/openwrt$ '''sudo apt install -y ack antlr3 asciidoc autoconf \'''

'''automake autopoint binutils bison build-essential \'''

'''bzip2 ccache cmake cpio curl device-tree-compiler fastjar \'''

'''flex gawk gettext gcc-multilib g++-multilib git gperf haveged \'''

'''help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev \'''

'''libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev \'''

'''libncurses5-dev \libncursesw5-dev libreadline-dev libssl-dev \'''

'''libtool lrzsz mkisofs msmtp nano ninja-build p7zip p7zip-full \'''

'''patch pkgconf python2.7 python3 python3-pyelftools \'''

'''libpython3-dev qemu-utils rsync scons squashfs-tools \'''

'''subversion swig texinfo uglifyjs upx-ucl unzip \'''

'''vim wget xmlto xxd zlib1g-dev'''

<ol start="2" style="list-style-type: decimal;">
<li>然后执行'''./scripts/feeds update -a'''和'''./scripts/feeds install -a'''下载依赖包</li></ol>

test@test:~/openwrt$ '''./scripts/feeds update -a'''

test@test:~/openwrt$ '''./scripts/feeds install -a'''

<ol start="3" style="list-style-type: decimal;">
<li><p>然后选择使用OrangePi 5 Ultra的配置文件</p>
<p>test@test:~/openwrt$ '''cp configs/orangepi-5-ultra-rk3588_defconfig .config'''</p></li>
<li><p>然后执行下面的命令使配置生效</p></li></ol>

test@test:~/openwrt$ '''make defconfig'''

<ol start="5" style="list-style-type: decimal;">
<li>执行下面的命令开始编译openwrt源码</li></ol>

test@test:~/openwrt$ '''make V=s'''

<ol start="6" style="list-style-type: decimal;">
<li>编译完成后,镜像生成所在的路径为:</li></ol>

'''bin/targets/rockchip/armv8/openwrt-rockchip-armv8-xunlong_orangepi-5-ultra-ext4-sysupgrade.img.gz'''

= 附录 =

== 用户手册更新历史 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''版本'''
| style="text-align: center;"| '''日期'''
| style="text-align: center;"| '''更新说明'''
|-
| style="text-align: center;"| v1.0
| style="text-align: center;"| 2024-10-10
| style="text-align: center;"| 初始版本
|}

== 镜像更新历史 ==

{| class="wikitable"
|-
| style="text-align: center;"| '''日期'''
| style="text-align: center;"| '''更新说明'''
|-
| style="text-align: center;"| 2024-10-10
| style="text-align: center;"| Oran gepi5ultra_1.0.0_ubuntu_focal_server_linux5.10.160.7z

Oran gepi5ultra_1.0.0_ubuntu_jammy_server_linux5.10.160.7z

Orangep i5ultra_1.0.0_debian_bullseye_server_linux5.10.160.7z

Orangep i5ultra_1.0.0_debian_bookworm_server_linux5.10.160.7z

Orangepi5u ltra_1.0.0_ubuntu_focal_desktop_xfce_linux5.10.160.7z

Orangepi5u ltra_1.0.0_ubuntu_jammy_desktop_xfce_linux5.10.160.7z

Orangepi5ultr a_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160.7z

Orangepi5ultr a_1.0.0_debian_bookworm_desktop_xfce_linux5.10.160.7z

Orangepi5ul tra_1.0.0_ubuntu_jammy_desktop_gnome_linux5.10.160.7z

Or angepi5ultra_1.0.0_ubuntu_jammy_server_linux6.1.43.7z

Orang epi5ultra_1.0.0_debian_bookworm_server_linux6.1.43.7z

Orangepi 5ultra_1.0.0_ubuntu_jammy_desktop_xfce_linux6.1.43.7z

Orangepi5ult ra_1.0.0_debian_bookworm_desktop_xfce_linux6.1.43.7sz

OrangePi5Ultra_RK3588_Android13_v1.0.0.tar.gz

O rangePi5Ultra_RK3588_Android13_spi-nvme_v1.0.0.tar.gz

Opi os-droid-aarch64-opi5ultra-24.09-linux5.10.160.tar.gz

Opios-droid- aarch64-opi5ultra-24.09-linux5.10.160-spi-nvme.tar.gz

Opios-ar ch-aarch64-gnome-opi5ultra-24.08-linux5.10.160.img.xz

openwrt-rockchip-armv 8-xunlong_orangepi-5ultra-ext4-sysupgrade_v1.0.img.gz

* 初始版本

|}
8,460
个编辑