8,460
个编辑
更改
→准备需要的配件
<big>'''顶层视图:'''</big><br>
[[File:media/image3cm4-img3.png|404x299px]]
<big>'''底层视图:'''</big><br>
[[File:media/image4cm4-img4.png|414x308px]]
<span id="orange-pi-cm4-底板的顶层视图和底层视图"></span>
<big>'''顶层视图:'''</big><br>
[[File:media/image5cm4-img5.png|422x274px800px]]
<big>'''底层视图:'''</big><br>
[[File:media/image6cm4-img6.png|440x289px800px]]
<span id="orange-pi-cm4的接口详情图"></span>
=== Orange Pi CM4核心板的接口详情图 ===
[[File:media/image7cm4-img7.png|569x720px]]
<span id="orange-pi-cm4底板的接口详情图"></span>
=== Orange Pi CM4底板的接口详情图 ===
[[File:media/image8cm4-img8.png|576x756px]]
[[File:media/image9cm4-img9.png|575x264px]]
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
<ol style="list-style-type: decimal;">
<li><p>TF卡,最小16GB容量(推荐32GB或以上)的'''class10'''级或以上的高速闪迪卡</p>
<p>[[File:media/image10cm4-img10.png|124x96px]]</p></li>
<li><p>TF卡读卡器,用于将镜像烧录到TF卡中</p>
<p>[[File:media/image11cm4-img11.png|139x106px]]</p></li>
<li><p>HDMI接口的显示器</p>
<p>[[File:media/image12cm4-img12.png|256x195px]]</p></li>
<li><p>Micro HDMI转HDMI连接线,用于将开发板连接到HDMI显示器或者电视进行显示</p>
<div class="figure">
[[File:media/image13cm4-img13.png|181x181px|40B5201C-C998-4dcd-BA92-54C1BD4D78D2]]
</div>
</li>
<li><p>电源适配器,Orange Pi CM4建议使用5V/3A 的Type-C电源供电</p>
<p>[[File:media/image14cm4-img14.png|184x160px]]</p></li>
<li><p>USB接口的鼠标和键盘,只要是标准USB接口的鼠标和键盘都可以,鼠标和键盘可以用来控制Orange Pi开发板</p>
<p>[[File:media/image15cm4-img15.png|206x170px]]</p></li>
<li><p>USB摄像头</p>
<p>[[File:media/image16cm4-img16.png|255x148px]]</p></li>
<li><p>PCIe NVMe SSD,开发板支持M.2 2230和M.2 2242规格的SSD,M.2 2280也是可以支持的,只是没法用螺丝固定。</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
</li>
<li><p>百兆或者千兆网线,用于将开发板连接到因特网</p>
<p>[[File:media/image17cm4-img17.png|143x112px]]</p></li>
<li><p>USB2.0公对公数据线,用于烧录镜像到eMMC、TF卡等功能</p>
<div class="figure">
[[File:media/image18cm4-img18.png|158x155px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<li><p>'''3.3V'''的USB转TTL模块和杜邦线,使用串口调试功能时,需要USB转TTL模块和杜邦线来连接开发板和电脑</p>
<p>[[File:media/image19cm4-img19.png|217x89px|G7U7JZX(V`L$`A6864]38$P350px]] [[File:media/image20cm4-img20.png|305x110px450px]]</p></li>
<li><p>安装有Ubuntu和Windows操作系统的个人电脑</p></li>
<p>[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html''']</p>
|}
<p>[[File:media/image21cm4-img21.png|429x428px]]</p></li>
<li><p>英文版资料的下载网址为:</p>
{| class="wikitable" style="width:800px;"
<p>[http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html''']</p>
|}
<p>[[File:media/image22cm4-img22.png|431x461px]]</p></li>
<li><p>资料主要包含</p>
<ol style="list-style-type: lower-alpha;">
<ol start="5" style="list-style-type: decimal;">
<li><p>进入balenaEtcher下载页面后,点击绿色的下载按钮会跳到软件下载的地方</p>
<p>[[File:media/image23cm4-img23.png|359x172px]]</p></li>
<li><p>然后可以选择下载balenaEtcher的Portable版本的软件,Portable版本无需安装,双击打开就可以使用</p>
<p>[[File:media/image24cm4-img24.png|382x141px]]</p></li>
<li><p>如果下载的是需要安装版本的balenaEtcher,请先安装再使用。如果下载的Portable版本balenaEtcher,直接双击打开即可,打开后的balenaEtcher界面如下图所示:</p>
<p>[[File:media/image25cm4-img25.png|369x233px]]</p></li>
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
<big>'''打开balenaEtcher时如果提示下面的错误:'''</big>
[[File:media/image26cm4-img26.png|center]]
<big>'''请选择balenaEtcher后点击右键,然后选择以管理员身份运行。'''</big>
[[File:media/image27cm4-img27.png|center]]
|}
</ol>
<li><p>然后选择TF卡的盘符</p></li>
<li><p>最后点击Flash就会开始烧录Linux镜像到TF卡中</p>
<p>[[File:media/image28cm4-img28.png|423x237px]]</p></li></ol>
</li>
<li><p>balenaEtcher烧录Linux镜像的过程显示的界面如下图所示,另外进度条显示紫色表示正在烧录Linux镜像到TF卡中</p>
<p>[[File:media/image29cm4-img29.png|428x268px]]</p></li>
<li><p>Linux镜像烧录完后,balenaEtcher默认还会对烧录到TF卡中的镜像进行校验,确保烧录过程没有出问题。如下图所示,显示绿色的进度条就表示镜像已经烧录完成,balenaEtcher正在对烧录完成的镜像进行校验</p>
<p>[[File:media/image30cm4-img30.png|427x267px]]</p></li>
<li><p>成功烧录完成后balenaEtcher的显示界面如下图所示,如果显示绿色的指示图标说明镜像烧录成功,此时就可以退出balenaEtcher,然后拔出TF卡插入到开发板的TF卡槽中使用了</p>
<p>[[File:media/image31cm4-img31.png|430x266px]]</p></li></ol>
<span id="使用rkdevtool烧录linux镜像到tf卡中的方法"></span>
<div class="figure">
[[File:media/image18cm4-img18.png|146x143px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<ol style="list-style-type: lower-alpha;">
<li><p>在[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']首先选择'''官方工具''',然后进入下面的文件夹中</p>
<p>[[File:media/image32cm4-img32.png|267x56px]]</p></li>
<li><p>然后下载下面的所有文件</p>
<p>[[File:media/image33cm4-img33.png|246x97px]]</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可</p>
<p>[[File:media/image34cm4-img34.png|464x136px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮</p>
<p>[[File:media/image35cm4-img35.png|245x129px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可</p>
<p>[[File:media/image36cm4-img36.png|254x132px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可</p>
<p>[[File:media/image37cm4-img37.png|448x132px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:media/image38cm4-img38.png|402x189px]]</p></li>
<li><p>然后开始烧录Linux镜像到TF卡中</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB2.0烧录口的位置如下图所示</p>
<p>[[File:media/image39cm4-img39.png|269x108px]]</p></li>
<li><p>确保TF卡插槽没有插入TF卡</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:media/image40cm4-img40.png|439x98px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了</p>
<p>[[File:media/image41cm4-img41.png|441x103px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”</p>
<p>[[File:media/image42cm4-img42.png|454x213px]]</p></li>
<li><p>此时请在TF卡插槽中插入TF卡</p></li>
<li><p>然后将鼠标光标放在下面的这片区域中</p>
<p>[[File:media/image43cm4-img43.png|452x212px]]</p></li>
<li><p>然后点击鼠标右键会弹出下图所示的选择界面</p>
<p>[[File:media/image44cm4-img44.png|453x213px]]</p></li>
<li><p>然后选择'''导入配置'''选项</p>
<p>[[File:media/image45cm4-img45.png|458x215px]]</p></li>
<li><p>然后选择前面下载的'''MiniLoader'''文件夹中的'''rk356x_linux_tfcard.cfg'''配置文件,再点击'''打开'''</p>
<div class="figure">
[[File:media/image46cm4-img46.jpeg|464x241px|[BXCMJ([KF%SJ}1X{LT`2@Ipng]]
</div></li>
<li><p>然后点击'''确定'''</p>
<p>[[File:media/image47cm4-img47.png|467x219px]]</p></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image48cm4-img48.png|486x228px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中'''MiniLoaderAll.bin''',再点击'''打开'''</p>
<div class="figure">
[[File:media/image49cm4-img49.png|491x250px|(@G{}Y0U)`5J5K@9R(ICYWA]]
</div></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image50cm4-img50.png|493x232px]]</p></li>
<li><p>然后选择想要烧录的Linux镜像的路径,再点击'''打开'''</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
<big><p>'''在烧录镜像前,建议将要烧录的Linux镜像重命名为orangepi.img或者其它比较短的名字,这样在烧录镜像的时候就能看到烧录进度的百分比数值。'''</p></big>
|}
<p>[[File:media/image51cm4-img51.png|499x234px]]</p></li>
<li><p>然后请勾选上'''强制按地址写'''选项</p>
<p>[[File:media/image52cm4-img52.png|497x234px]]</p></li>
<li><p>再点击执行按钮就会开始烧录Linux镜像到开发板的tf卡中</p>
<p>[[File:media/image53cm4-img53.png|497x233px]]</p></li>
<li><p>Linux镜像烧录完后的显示log如下图所示</p>
<div class="figure">
[[File:media/image54cm4-img54.png|492x231px|%O4~FPPAT$0RH{3S~CGJ@@Q(1)]]
</div></li>
<div class="figure">
[[File:media/image55cm4-img55.png|209x228px|选区_199]]
</div></li>
<li><p>然后点击”'''Format'''”,格式化前会弹出一个警告框,选择”'''是(Y)'''”后就会开始格式化</p></li>
[[File:media/image56cm4-img56.png|304x147px]]
</ol>
<ol start="5" style="list-style-type: lower-alpha;">
<li><p>格式化完TF卡后会弹出下图所示的信息,点击确定即可</p>
<p>[[File:media/image57cm4-img57.png|186x149px]]</p></li></ol>
</li></ol>
<!-- -->
<li><p>b) 然后确认下TF卡的盘符和”'''设备'''”一栏中显示的一致</p></li>
<li><p>c) 最后点击”'''写入'''”即可开始烧录</p>
<p>[[File:media/image58cm4-img58.png|297x206px]]</p></li></ol>
</li>
<li><p>镜像写入完成后,点击”'''退出'''”按钮退出即可,然后就可以拔出TF卡插到开发板中启动</p></li></ol>
<ol start="4" style="list-style-type: decimal;">
<li><p>进入balenaEtcher下载页面后,点击绿色的下载按钮会跳到软件下载的地方</p>
<p>[[File:media/image23cm4-img23.png|434x208px]]</p></li>
<li><p>然后选择下载Linux版本的软件即可</p>
<p>[[File:media/image59cm4-img59.png|430x163px]]</p></li>
<li><p>从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上</p>
<p>7z结尾的压缩包的解压命令如下所示</p>
</li>
<li><p>然后在Ubuntu PC的图形界面双击'''balenaEtcher-1.5.109-x64.AppImage'''即可打开balenaEtcher('''无需安装'''),balenaEtcher打开后的界面显示如下图所示</p>
<p>[[File:media/image60cm4-img60.png|423x251px]]</p></li>
<li><p>使用balenaEtcher烧录Linux镜像的具体步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>然后选择TF卡的盘符</p></li>
<li><p>最后点击Flash就会开始烧录Linux镜像到TF卡中</p>
<p>[[File:media/image61cm4-img61.png|431x278px]]</p></li></ol>
</li>
<li><p>balenaEtcher烧录Linux镜像的过程显示的界面如下图所示,另外进度条显示紫色表示正在烧录Linux镜像到TF卡中</p>
<p>[[File:media/image62cm4-img62.png|429x184px]]</p></li>
<li><p>Linux镜像烧录完后,balenaEtcher默认还会对烧录到TF卡中的镜像进行校验,确保烧录过程没有出问题。如下图所示,显示绿色的进度条就表示镜像已经烧录完成,balenaEtcher正在对烧录完成的镜像进行校验</p>
<p>[[File:media/image63cm4-img63.png|436x190px]]</p></li></ol>
<!-- -->
<ol start="12" style="list-style-type: decimal;">
<li><p>成功烧录完成后balenaEtcher的显示界面如下图所示,如果显示绿色的指示图标说明镜像烧录成功,此时就可以退出balenaEtcher,然后拔出TF卡插入到开发板的TF卡槽中使用了</p>
<p>[[File:media/image64cm4-img64.png|435x257px]]</p></li></ol>
<span id="烧录linux镜像到emmc中的方法"></span>
<div class="figure">
[[File:media/image18cm4-img18.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<ol style="list-style-type: lower-alpha;">
<li><p>在[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']首先选择官方工具,然后进入下面的文件夹中</p>
<p>[[File:media/image32cm4-img32.png|366x77px]]</p></li>
<li><p>然后下载下面的所有文件</p>
<p>[[File:media/image33cm4-img33.png|315x125px]]</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可</p>
<p>[[File:media/image34cm4-img34.png|496x146px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮</p>
<p>[[File:media/image35cm4-img35.png|284x149px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可</p>
<p>[[File:media/image36cm4-img36.png|296x154px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可</p>
<p>[[File:media/image37cm4-img37.png|484x143px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:media/image38cm4-img38.png|442x208px]]</p></li>
<li><p>然后开始烧录Linux镜像到eMMC中</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB2.0烧录口的位置如下图所示</p>
<p>[[File:media/image39cm4-img39.png|269x108px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:media/image40cm4-img40.png|439x98px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了</p>
<p>[[File:media/image41cm4-img41.png|441x103px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”</p>
<p>[[File:media/image42cm4-img42.png|457x215px]]</p></li>
<li><p>然后将鼠标光标放在下面的这片区域中</p>
<p>[[File:media/image43cm4-img43.png|458x215px]]</p></li>
<li><p>然后点击鼠标右键会弹出下图所示的选择界面</p>
<p>[[File:media/image44cm4-img44.png|460x216px]]</p></li>
<li><p>然后选择'''导入配置'''选项</p>
<p>[[File:media/image45cm4-img45.png|458x215px]]</p></li>
<li><p>然后选择前面下载的'''MiniLoader'''文件夹中的'''rk356x_linux_emmc.cfg'''配置文件,再点击'''打开'''</p>
<div class="figure">
[[File:media/image65cm4-img65.png|466x244px|UWD{G1]NB1Y${7ARF[8IIVP]]
</div></li>
<li><p>然后点击'''确定'''</p>
<p>[[File:media/image66cm4-img66.png|468x220px]]</p></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image67cm4-img67.png|462x217px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中'''MiniLoaderAll.bin''',再点击'''打开'''</p>
<div class="figure">
[[File:media/image49cm4-img49.png|462x236px|(@G{}Y0U)`5J5K@9R(ICYWA]]
</div></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image68cm4-img68.png|459x216px]]</p></li>
<li><p>然后选择想要烧录的Linux镜像的路径,再点击'''打开'''</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
<big><p>'''在烧录镜像前,建议将要烧录的Linux镜像重命名为orangepi.img或者其它比较短的名字,这样在烧录镜像的时候就能看到烧录进度的百分比数值。'''</p></big>
|}
<p>[[File:media/image51cm4-img51.png|499x234px]]</p></li>
<li><p>然后请勾选上'''强制按地址写'''选项</p>
<p>[[File:media/image69cm4-img69.png|501x235px]]</p></li>
<li><p>再点击执行按钮就会开始烧录Linux镜像到开发板的eMMC中</p>
<p>[[File:media/image70cm4-img70.png|502x236px]]</p></li>
<li><p>Linux镜像烧录完后的显示log如下图所示</p>
<p>[[File:media/image71cm4-img71.png|500x235px]]</p></li>
<li><p>烧录完Linux镜像到eMMC中后,Linux系统会自动启动。</p></li></ol>
</li></ol>
<ol style="list-style-type: decimal;">
<li><p>使用dd命令烧录Linux镜像到eMMC中需要借助TF卡来完成,所以首先需要将Linux镜像烧录到TF卡上,然后使用TF卡启动开发板进入Linux系统。烧录Linux镜像到TF卡的方法请见[[Orange Pi CM4#基于Windows PC将Linux镜像烧写到TF卡的方法|'''基于Windows PC将Linux镜像烧录到TF卡的方法''']]和[[Orange Pi CM4#基于Ubuntu PC将Linux镜像烧录到TF卡的方法PC将Linux镜像烧写到TF卡的方法|'''基于Ubuntu PC将Linux镜像烧录到TF卡的方法PC将Linux镜像烧写到TF卡的方法''']]两小节的说明。</p></li>
<li><p>使用TF卡启动Linux系统后,我们首先将解压后的Linux镜像文件(从官网下载的Debian、Ubuntu镜像或者OPi OS(Arch)镜像)上传到TF卡中。上传Linux镜像文件到开发板中的方法请参考[[Orange Pi CM4#上传文件到开发板Linux系统中的方法|'''上传文件到开发板Linux系统中的方法''']]小节的说明。</p></li>
<li><p>上传完镜像到开发板的Linux系统中后,我们再在开发板Linux系统的命令行中进入镜像文件的存放路径,比如,我将开发板的Linux镜像存放在'''/home/orangepi/Desktop'''目录下了,然后进入'''/home/orangepi/Desktop'''目录就能看到上传的镜像文件了。</p>
|
<big><p>'''<span style="color:#FF0000">注意,如果上传的是 .7z或者.xz 结尾Linux镜像压缩文件,使用dd命令烧录前请记得先解压。</span>'''</p>
<p>'''dd命令的所有参数的详细说明和更多用法可以在Linux系统中执行man dd命令来查看。'''</p></big>
|}
== 烧写Linux镜像到SPIFlash+NVMe SSD中的方法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''在开始烧录镜像之前,必须确保开发板已经贴了SPI Flash芯片,因为开发板在出厂时是没有贴SPI Flash芯片的,所以需要自行购买并焊接上,我们建议选用的SPI Flash芯片型号为XM25QU128CWIQT08QFlash芯片型号为<span style="color:#FF0000">XM25QU128CWIQT08Q</span>'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''由于eMMC的启动优先级高于NVMe SSD,所以在烧录镜像之前需要将eMMC的系统清空,清空eMMC的方法请参考下[[\lOrange Pi CM4#使用RKDevTool清空eMMC的方法|使用RKDevTool清空eMMC的方法]]一小节的说明'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,这里说的Linux镜像具体指的是从Orange Pi资料下载页面下载的Debian、Ubuntu和OPi OS Arch这样的Linux发行版镜像。'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,下面所有的操作都是在Windows电脑中进行的。'''</big>|}
<span id="使用rkdevtool烧录的方法"></span>
<ol style="list-style-type: lower-alpha;">
<li><p>M.2 2230规格的SSD如下所示</p>
<p>[[File:media/image72cm4-img72.png|157x128px]]</p></li>
<li><p>M.2 2242规格的SSD如下所示</p>
<p>[[File:media/image73cm4-img73.png|174x105px]]</p></li></ol>
</li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好</p>
<p>[[File:media/image74cm4-img74.png|274x185px]]</p></li>
<li><p>请确保开发板已经贴了SPI Flash,SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置</p>
<p>[[File:media/image75cm4-img75.png|274x205px]]</p></li>
<li><p>然后需要准备一根品质良好的USB2.0公对公数据线</p>
<div class="figure">
[[File:media/image18cm4-img18.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.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/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange > Pi的资料下载页面''']首先选择'''官方工具''',然后进入下面的文件夹中</p><p>[[File:media/image32cm4-img32.png|294x61px]]</p></li>
<li><p>然后下载下面的所有文件</p>
<p>[[File:media/image33cm4-img33.png|244x97px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意,“MiniLoader-烧录Linux镜像才需要用到的东西”文件夹下文简称为MiniLoader文件夹。'''</p></big>|}</li></ol>
</li>
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']下载想要烧录的Linux操作系统镜像文件压缩包,然后使用解压软件解压,解压后的文件中,以”'''.img'''”结尾的文件就是操作系统的镜像文件,大小一般都在2GB以上</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可</p>
<p>[[File:media/image34cm4-img34.png|446x131px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮</p>
<p>[[File:media/image35cm4-img35.png|253x133px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可</p>
<p>[[File:media/image36cm4-img36.png|269x140px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可</p>
<p>[[File:media/image37cm4-img37.png|402x119px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:media/image38cm4-img38.png|402x189px]]</p></li>
<li><p>然后开始烧录Linux镜像到SSD中</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB2.0烧录接口的位置如下图所示</p>
<p>[[File:media/image39cm4-img39.png|269x108px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:media/image40cm4-img40.png|439x98px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了</p>
<p>[[File:media/image41cm4-img41.png|441x103px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”</p>
<p>[[File:media/image42cm4-img42.png|457x215px]]</p></li>
<li><p>然后将鼠标光标放在下面的这片区域中</p>
<p>[[File:media/image43cm4-img43.png|459x216px]]</p></li>
<li><p>然后点击鼠标右键会弹出下图所示的选择界面</p>
<p>[[File:media/image44cm4-img44.png|453x213px]]</p></li>
<li><p>然后选择'''导入配置'''选项</p>
<p>[[File:media/image45cm4-img45.png|458x215px]]</p></li>
<li><p>然后进入前面下载的'''MiniLoader'''文件夹中,然后选择'''rk356x_linux_pcie.cfg'''配置文件,再点击'''打开'''</p>
<div class="figure">
[[File:media/image76cm4-img76.png|469x240px|9~MB4BQ%AB[R]6]O7]D6885]]
</div></li>
<li><p>然后点击'''确定'''</p>
<p>[[File:media/image77cm4-img77.png|468x220px]]</p></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image78cm4-img78.png|475x223px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中'''MiniLoaderAll.bin''',再点击'''打开'''</p>
<div class="figure">
[[File:media/image49cm4-img49.png|483x247px|(@G{}Y0U)`5J5K@9R(ICYWA]]
</div></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image79cm4-img79.png|486x228px]]</p></li>
<li><p>然后进入前面下载的'''MiniLoader'''文件夹中,再选择'''rkspi_loader.img''',再点击'''打开'''</p>
<div class="figure">
[[File:media/image80cm4-img80.png|489x250px|IVB8KM4PM(J~U[(I3HB}$XU]]
</div></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image81cm4-img81.png|493x231px]]</p></li>
<li><p>然后选择想要烧录的Linux镜像的路径,再点击'''打开'''</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''在烧录镜像前,建议将要烧录的Linux镜像重命名为orangepi.img或者其它比较短的名字,这样在烧录镜像的时候就能看到烧录进度的百分比数值。'''</p></big>|}<p>[[File:media/image51cm4-img51.png|499x234px]]</p></li>
<li><p>然后请勾选上'''强制按地址写'''选项</p>
<p>[[File:media/image82cm4-img82.png|498x234px]]</p></li>
<li><p>再点击执行按钮就会开始烧录Linux镜像到SSD中</p>
<p>[[File:media/image83cm4-img83.png|500x235px]]</p></li>
<li><p>Linux镜像烧录完后的显示log如下图所示</p>
<p>[[File:media/image84cm4-img84.png|504x240px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''如果烧录有问题,请先清空下SPIFlash然后再烧录试下。清空SPIFlash的方法请参考下[[\lOrange Pi CM4#使用RKDevTool清空SPIFlash的方法|使用RKDevTool清空SPIFlash的方法]]一小节的说明。'''</p></big>|}</li><li><p>镜像烧录完后会自动启动SPIFlash+PCIe > SSD中的Linux系统,如果没有正常启动,请重新上电试下。</p></li></ol>
</li></ol>
<ol style="list-style-type: lower-alpha;">
<li><p>M.2 2230规格的SSD如下所示</p>
<p>[[File:media/image72cm4-img72.png|158x129px]]</p></li>
<li><p>M.2 2242规格的SSD如下所示</p>
<p>[[File:media/image73cm4-img73.png|192x116px]]</p></li></ol>
</li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好</p>
<p>[[File:media/image74cm4-img74.png|274x185px]]</p></li>
<li><p>请确保开发板已经贴了SPI Flash,SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置</p>
<p>[[File:media/image75cm4-img75.png|274x205px]]</p></li><li><p>烧录Linux镜像到SPIFlash+NVMe SSD中需要借助TF卡来完成,所以首先需要将Linux镜像烧录到TF卡上,然后使用TF卡启动开发板进入Linux系统。烧录Linux镜像到TF卡的方法请见[[\lOrange Pi CM4#基于Windows PC将Linux镜像烧写到TF卡的方法|'''基于Windows PC将Linux镜像烧写到TF卡的方法''']]和[[\lOrange Pi CM4#基于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''','''<span style="color:#FF0000">普通用户记得加sudo权限</span>'''</p>{| class="wikitable" style="width:800px;" |-| <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:media/image85cm4-img85.png|355x174px|IMG_256]]
</div></ol>
<ol start="3" style="list-style-type: lower-alpha;">
<li>然后选择'''<Yes>'''</li></ol>
<div class="figure">
[[File:media/image86cm4-img86.png|356x179px|IMG_256]]
</div></ol>
<ol start="4" style="list-style-type: lower-alpha;">
<li>然后请耐心等待烧录完成,烧录完成后显示如下所示(左下角会显示一个'''Done'''):</li></ol>
<div class="figure">
[[File:media/image87cm4-img87.png|358x161px|IMG_256]]
</div></ol></li></ol>
<ol start="6" style="list-style-type: decimal;">
<li><p>然后将Linux镜像文件(从官网下载的Debian或者Ubuntu镜像)上传到TF卡中。上传Linux镜像文件到开发板中的方法请参考[[\lOrange Pi CM4#上传文件到开发板Linux系统中的方法|'''上传文件到开发板Linux系统中的方法''']]小节的说明。</p></li>
<li><p>上传完镜像到开发板的Linux系统中后,我们再在开发板Linux系统的命令行中进入镜像文件的存放路径,比如,我将开发板的Linux镜像存放在'''/home/orangepi/Desktop'''目录下了,然后进入'''/home/orangepi/Desktop'''目录就能看到上传的镜像文件了。</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''cd /home/orangepi/Desktop'''</p>
<p>orangepi@orangepi:~/Desktop$ '''ls'''</p>
<p>Orangepi3b_x.x.x_debian_bullseye_desktop_xfce_linux5.10.160.img</p>
|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''怎么进入开发板Linux系统的命令行?'''</p></li></ol> '''1. 使用串口登录终端的方法请参考[[Orange Pi CM4#调试串口的使用方法|调试串口的使用方法]]一小节的说明。'''
'''3. 如果接了HDMI、LCD等显示屏幕,可以在桌面中打开一个命令行终端。'''<!-- --/big>|}</li></ol>
<ol start="8" style="list-style-type: decimal;">
<li><p>接下来,我们先确认下NVMe SSD已经被开发板的Linux正常识别了。如果NVMe SSD正常识别了的话,使用'''sudo fdisk -l'''命令就能看到'''nvme'''相关的信息</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~/Desktop$ '''sudo fdisk -l | grep "nvme0n1"'''</p>
<p>Disk /dev/nvme0n1: 1.86 TiB, 2048408248320 bytes, 4000797360 sectors</p>
|}
<p>使用'''lspci'''命令可以看到一个NVMe相关的PCI设备</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~/Desktop$ '''lspci'''</p>
<p>00:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3566 (rev 01)</p>
<p>01:00.0 Non-Volatile memory controller: Realtek Semiconductor Co., Ltd. Device 5765 (rev 01)</p>|}</li>
<li><p>然后我们可以使用dd命令清空下NVMe SSD(可选)</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi3b:~/Desktop$ '''sudo dd bs=1M if=/dev/zero of=/dev/nvme0n1 count=2000 status=progress'''</p>
<p>orangepi@orangepi3b:~/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>
{| class="wikitable" style="width:800px;"
|-
|
<p>'''sudo dd bs=1M if=Orangepi3b_x.x.x_debian_bullseye_desktop_xfce_linux5.10.160.img of=/dev/nvme0n1 status=progress'''</p>
<p>'''sudo''' '''sync'''</p>
|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''<span style="color:#FF0000">注意,如果上传的是 .7z或者.xz 或者.gz结尾Linux镜像压缩文件,使用dd命令烧录前请记得先解压。</span>'''</p><p>'''dd命令的所有参数的详细说明和更多用法可以在Linux系统中执行man dd命令来查看。'''</p></big>|}</li></ol>
</li>
<li><p>当成功烧录开发板的Linux镜像到NVMe SSD后,此时就可以使用'''poweroff'''命令关机了。然后请拔出TF卡,再短按电源按键开机,此时就会启动SPIFlash+NVMe SSD中的Linux系统了。</p></li>
<ol style="list-style-type: lower-alpha;">
<li><p>128GB NVMe SSD</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''df -h'''</p>
<pspan style="margin-right: 80px;">Filesystem </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 30px;">Used </span><span style="margin-right: 30px;">Avail </span><span style="margin-right: 50px;">Use% Mounted on</pspan><br><pspan style="margin-right: 110px;">udev </span><span style="margin-right: 60px;">3.8G </span><span style="margin-right: 50px;">8.0K </span><span style="margin-right: 70px;">3.8G </span><span style="margin-right: 90px;">1% /dev</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 50px;">769M </span><span style="margin-right: 30px;">1.4M </span><span style="margin-right: 70px;">768M </span><span style="margin-right: 90px;">1% /run</pspan><br><pspan style="margin-right: 25px;color:#FF0000">'''/dev/nvme0n1p2 '''</span><span style="margin-right: 50px;color:#FF0000">'''118G '''</span><span style="margin-right: 35px;color:#FF0000">'''5.8G '''</span><span style="margin-right: 80px;color:#FF0000">'''111G '''</span><span style="margin-right: 90px;color:#FF0000">'''5% /'''</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">3.8G </span><span style="margin-right: 50px;">0 </span><span style="margin-right: 50px;">3.8G </span><span style="margin-right: 90px;">0% /dev/shm</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">5.0M </span><span style="margin-right: 50px;">4.0K </span><span style="margin-right: 50px;">5.0M </span><span style="margin-right: 90px;">1% /run/lock</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">3.8G </span><span style="margin-right: 50px;">16K </span><span style="margin-right: 50px;">3.8G </span><span style="margin-right: 90px;">1% /tmp</pspan><br><pspan style="margin-right: 25px;color:#FF0000">'''/dev/nvme0n1p1 '''</span><span style="margin-right: 50px;color:#FF0000">'''256M '''</span><span style="margin-right: 35px;color:#FF0000">'''90M '''</span><span style="margin-right: 80px;color:#FF0000">'''166M '''</span><span style="margin-right: 90px;color:#FF0000">'''36% /boot'''</pspan><br><pspan style="margin-right: 65px;">/dev/zram1 </span><span style="margin-right: 60px;">194M </span><span style="margin-right: 50px;">9.9M </span><span style="margin-right: 50px;">170M </span><span style="margin-right: 90px;">6% /var/log</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">769M </span><span style="margin-right: 50px;">60K </span><span style="margin-right: 50px;">769M </span><span style="margin-right: 90px;">1% /run/user/1000</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">769M </span><span style="margin-right: 50px;">48K </span><span style="margin-right: 50px;">769M </span><span style="margin-right: 90px;">1% /run/user/0</pspan><br>|}</li>
<li><p>2TB NVMe SSD</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''df -h'''</p>
<pspan style="margin-right: 80px;">Filesystem </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 30px;">Used </span><span style="margin-right: 30px;">Avail </span><span style="margin-right: 50px;">Use% Mounted on</pspan><br><pspan style="margin-right: 110px;">udev </span><span style="margin-right: 60px;">3.8G </span><span style="margin-right: 50px;">8.0K </span><span style="margin-right: 70px;">3.8G </span><span style="margin-right: 90px;">1% /dev</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 50px;">769M </span><span style="margin-right: 30px;">1.4M </span><span style="margin-right: 70px;">768M </span><span style="margin-right: 90px;">1% /run</pspan><br><pspan style="margin-right: 25px;color:#FF0000">'''/dev/nvme0n1p2 '''</span><span style="margin-right: 50px;color:#FF0000">'''1.9T '''</span><span style="margin-right: 35px;color:#FF0000">'''4.1G '''</span><span style="margin-right: 80px;color:#FF0000">'''1.8T '''</span><span style="margin-right: 90px;color:#FF0000">'''1% /'''</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">3.8G </span><span style="margin-right: 50px;">0 </span><span style="margin-right: 50px;">3.8G </span><span style="margin-right: 90px;">0% /dev/shm</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">5.0M </span><span style="margin-right: 50px;">4.0K </span><span style="margin-right: 50px;">5.0M </span><span style="margin-right: 90px;">1% /run/lock</pspan><br><pspan style="margin-right: 65px;">/dev/zram2 </span><span style="margin-right: 60px;">3.7G </span><span style="margin-right: 50px;">76K </span><span style="margin-right: 50px;">3.5G </span><span style="margin-right: 90px;">1% /tmp</pspan><br><pspan style="margin-right: 25px;color:#FF0000">'''/dev/nvme0n1p1 '''</span><span style="margin-right: 50px;color:#FF0000">'''256M '''</span><span style="margin-right: 35px;color:#FF0000">'''90M '''</span><span style="margin-right: 80px;color:#FF0000">'''166M '''</span><span style="margin-right: 90px;color:#FF0000">'''36% /boot'''</pspan><br><pspan style="margin-right: 65px;">/dev/zram1 </span><span style="margin-right: 60px;">194M 15M 165M </span><span style="margin-right: 50px;">9.9M </span><span style="margin-right: 50px;">170M </span><span style="margin-right: 90px;">6% /var/log</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">769M </span><span style="margin-right: 50px;">60K </span><span style="margin-right: 50px;">769M </span><span style="margin-right: 90px;">1% /run/user/1000</pspan><br><pspan style="margin-right: 100px;">tmpfs </span><span style="margin-right: 60px;">769M </span><span style="margin-right: 50px;">48K </span><span style="margin-right: 50px;">769M </span><span style="margin-right: 90px;">1% /run/user/0</pspan><br>|}</li></ol>
</li>
<li><p>当TF卡和NVMe SSD中烧录了一模一样的系统,'''如果TF卡和NVMe SSD都插在了开发板中,此时上电启动开发板,u-boot会优先启动TF卡中的系统'''。但由于TF卡和NVMe SSD中的系统一模一样,所以两个存储设备中的/'''boot'''分区和'''rootfs'''分区的UUID也一样,这样会导致TF卡启动的时候有可能会加载了NVMe SSD中的分区。运行下面的脚本可以解决这个问题。</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo fix_mmc_ssd.sh'''</p>
|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''一模一样的系统是指镜像名一字不差的意思。就算都是Debian11系统,版本不同也是不同的。'''</p></big>|}</li></ol>
<span id="使用balenaetcher软件烧录的方法"></span>
=== 使用balenaEtcher软件烧录的方法 ===
<ol style="list-style-type: lower-alpha;">
<li><p>M.2 2230规格的SSD如下所示</p>
<p>[[File:media/image72cm4-img72.png|189x153px]]</p></li>
<li><p>M.2 2242规格的SSD如下所示</p>
<p>[[File:media/image73cm4-img73.png|238x144px]]</p></li></ol>
</li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好</p>
<p>[[File:media/image74cm4-img74.png|274x185px]]</p></li>
<li><p>请确保开发板已经贴了SPI Flash,SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置</p>
<p>[[File:media/image75cm4-img75.png|274x205px]]</p></li><li><p>烧录Linux镜像到SPIFlash+NVMe SSD中需要借助TF卡来完成,所以首先需要将Linux镜像烧录到TF卡上,然后使用TF卡启动开发板进入Linux系统。烧录Linux镜像到TF卡的方法请见[[\lOrange Pi CM4#基于Windows PC将Linux镜像烧写到TF卡的方法|'''基于Windows PC将Linux镜像烧写到TF卡的方法''']]和[[\lOrange Pi CM4#基于Ubuntu PC将Linux镜像烧写到TF卡的方法|'''基于Ubuntu PC将Linux镜像烧写到TF卡的方法''']]两小节的说明。</p></li>
<li><p>启动进入TF卡中的Linux系统后,请先确认下NVMe SSD已经被开发板的Linux正常识别了。如果NVMe SSD正常识别了的话,使用'''sudo fdisk -l'''命令就能看到'''nvme'''相关的信息</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~/Desktop$ '''sudo fdisk -l | grep "nvme0n1"'''</p>
<p>Disk /dev/nvme0n1: 1.86 TiB, 2048408248320 bytes, 4000797360 sectors</p>
|}
<p>使用'''lspci'''命令可以看到一个NVMe相关的PCI设备</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~/Desktop$ '''lspci'''</p>
<p>00:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3566 (rev 01)</p>
<p>01:00.0 Non-Volatile memory controller: Realtek Semiconductor Co., Ltd. Device 5765 (rev 01)</p>|}</li><li><p>Linux镜像中已经预装了balenaEtcher,打开方法如下所示:</p></li></ol>
<div class="figure">
[[File:media/image88cm4-img88.png|506x249px|IMG_256]]
</div>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''如果没有预装,balenaEtcher arm64版本的下载安装方法请参考[[\lOrange Pi CM4#下载安装arm64版本balenaEtcher的方法|下载安装arm64版本balenaEtcher的方法]]小节的说明。'''</big>|}</ol>
<ol start="7" style="list-style-type: decimal;">
<li>balenaEtcher打开后的界面如下所示:</li></ol>
<div class="figure">
[[File:media/image89cm4-img89.png|406x207px|IMG_256]]
</div></ol>
<ol start="8" style="list-style-type: decimal;">
<li><p>使用balenaEtcher烧录u-boot到开发板SPI Flash中的方法如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li>首先点击'''Flash from file'''</li></ol></li></ol>
<div class="figure">
[[File:media/image90cm4-img90.png|406x205px|IMG_256]]
</div></ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li>然后进入'''/usr/lib/linux-u-boot-legacy-orangepi3b_1.x.x_arm64'''目录,再选择'''rkspi_loader.img''',再点击'''Open'''打开</li></ol>
<div class="figure">
[[File:media/image91cm4-img91.png|563x110px|IMG_256]]
</div></ol>
<ol start="3" style="list-style-type: lower-alpha;">
<li><p>打开'''rkspi_loader.img'''后的界面如下所示:</p>
<p>[[File:media/image92cm4-img92.png|379x181px]]</p></li><li><p>然后点击'''Select target'''</p></li></ol>
<div class="figure">
[[File:media/image93cm4-img93.png|379x171px|IMG_256]]
</div></ol>
<ol start="5" style="list-style-type: lower-alpha;">
<li>然后点击'''Show 2 hidden'''打开更多存储设备的选项</li></ol>
<div class="figure">
[[File:media/image94cm4-img94.png|385x155px|IMG_256]]
</div></ol>
<ol start="6" style="list-style-type: lower-alpha;">
<li>然后选择SPI Flash的设备名'''/dev/mtdblock0''',然后点击'''Select'''</li></ol>
<div class="figure">
[[File:media/image95cm4-img95.png|389x264px|IMG_256]]
</div></ol>
<ol start="7" style="list-style-type: lower-alpha;">
<li>然后点击'''Flash'''</li></ol>
<div class="figure">
[[File:media/image96cm4-img96.png|394x268px|IMG_256]]
</div></ol>
<ol start="8" style="list-style-type: lower-alpha;">
<li>然后点击'''Yes, I’m sure'''</li></ol>
<div class="figure">
[[File:media/image97cm4-img97.png|396x269px|IMG_256]]
</div></ol><ol start="9" style="list-style-type: lower-romanalpha;"><li>然后输入开发板Linux系统的密码'''orangepi''',就会开始烧录u-boot镜像到SPI > Flash中</li></ol>
<div class="figure">
[[File:media/image98cm4-img98.png|393x269px|IMG_256]]
</div></ol>
<ol start="10" style="list-style-type: lower-alpha;">
<li>烧录过程的显示如下所示:</li></ol>
<div class="figure">
[[File:media/image99cm4-img99.png|397x272px|IMG_256]]
</div></ol>
<ol start="11" style="list-style-type: lower-alpha;">
<li>烧录完成后的显示如下所示:</li></ol>
<div class="figure">
[[File:media/image100cm4-img100.png|395x225px|IMG_256]]
</div></ol></li></ol>
<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:media/image101cm4-img101.png|386x204px|IMG_256]]
</div></ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li>然后选择TF卡的设备名'''/dev/mmcblk1'''</li></ol>
<div class="figure">
[[File:media/image102cm4-img102.png|379x256px|IMG_256]]
</div></ol>
<ol start="3" style="list-style-type: lower-alpha;">
<li>打开TF卡后的界面如下所示:</li></ol>
<div class="figure">
[[File:media/image103cm4-img103.png|381x191px|IMG_256]]
</div></ol>
<ol start="4" style="list-style-type: lower-alpha;">
<li>然后点击'''Select target'''</li></ol>
<div class="figure">
[[File:media/image93cm4-img93.png|379x171px|IMG_256]]
</div></ol>
<ol start="5" style="list-style-type: lower-alpha;">
<li>然后点击'''Show 2 hidden'''打开更多存储设备的选项</li></ol>
<div class="figure">
[[File:media/image94cm4-img94.png|385x155px|IMG_256]]
</div></ol>
<ol start="6" style="list-style-type: lower-alpha;">
<li>然后选择NVMe SSD的设备名'''/dev/nvme0n1''',然后点击'''Select'''</li></ol> [[File:media/image104.png|386x264px]]
[[File:cm4-img104.png]]
</ol>
<ol start="7" style="list-style-type: lower-alpha;">
<li>然后点击'''Flash'''</li></ol>
<div class="figure">
[[File:media/image105cm4-img105.png|389x264px|IMG_256]]
</div></ol>
<ol start="8" style="list-style-type: lower-alpha;">
<li>然后点击'''Yes, I’m sure'''</li></ol>
<div class="figure">
[[File:media/image106cm4-img106.png|392x268px|IMG_256]]
</div></ol><ol start="9" style="list-style-type: lower-romanalpha;"><li>然后输入开发板Linux系统的密码orangepi,就会开始烧录Linux镜像到SSD中</li></ol>
<div class="figure">
[[File:media/image107cm4-img107.png|390x267px|IMG_256]]
</div></ol>
<ol start="10" style="list-style-type: lower-alpha;">
<li>烧录过程的显示如下所示:</li></ol>
[[File:media/image108cm4-img108.png|393x212px]]
<div class="figure">
[[File:media/image109cm4-img109.png|395x205px|IMG_256]]
</div></ol>
<ol start="11" style="list-style-type: lower-alpha;">
<li>烧录完成后的显示如下所示:</li></ol> [[File:media/image110.png|398x227px]]
[[File:cm4-img110.png]]
</ol>
<ol start="12" style="list-style-type: lower-alpha;">
<li><p>然后需要扩容下NVMe SSD中rootfs分区的容量,步骤如下所示:</p>
<ol style="list-style-type: lower-alphanone;"><li><p>a) 首先打开'''GParted,'''如果系统没有预装Gparted,请使用apt命令安装下</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt-get install -y gparted'''</p></li></ol>|}</li></ol>
<div class="figure">
[[File:media/image111cm4-img111.png|576x215px|IMG_256]]
</div></ol><ol start="2" style="list-style-type: lower-alphanone;"><li>b) 然后输入Linux系统的密码orangepi,再点击'''Authenticate'''</li></ol>
[[File:media/image112cm4-img112.png|356x173px]]</ol><ol start="3" style="list-style-type: lower-alphanone;"><li><p>c) 然后点击'''Fix'''</p><p>[[File:media/image113cm4-img113.png|355x261px]]</p></li><li><p>d) 然后选择NVMe SSD</p></li></ol>
<div class="figure">
[[File:media/image114cm4-img114.png|452x187px|IMG_256]]
</div></ol><ol start="5" style="list-style-type: lower-alphanone;"><li>e) 选择NVMe SSD后的显示界面如下所所示:</li></ol>
<div class="figure">
[[File:media/image115cm4-img115.png|451x187px|IMG_256]]
</div></ol><ol start="6" style="list-style-type: lower-alphanone;"><li>f) 然后选择'''/dev/nvme0n1p2'''分区,再击点击右键,再选择'''Resize/Move'''</li></ol>
<div class="figure">
[[File:media/image116cm4-img116.png|448x345px|IMG_256]]
</div></ol><ol start="7" style="list-style-type: lower-alphanone;"><li><p>g) 然后在下图所示的位置将容量拖动到最大</p><p>[[File:media/image117cm4-img117.png|339x210px]]</p></li><li><p>h) 然后点击'''Resize/Move'''</p><p>[[File:media/image118cm4-img118.png|339x212px]]</p></li><li><p>i) 然后点击下图位置绿色的'''<span style="color:green">√</span>'''</p><p>[[File:media/image119cm4-img119.png|425x166px]]</p></li><li><p>j) 再点击'''Apply'''</p><p>[[File:media/image120cm4-img120.png|378x276px]]</p></li><li><p>k) 然后点击'''Close'''关闭即可</p><p>[[File:media/image121cm4-img121.png|383x234px]]</p></li></ol></li></ol>
<ol start="13" style="list-style-type: lower-alpha;">
<li>此时就可以使用'''sudo > poweroff'''命令关机了。然后请拔出TF卡,再短按电源按键开机,此时就会启动SPIFlash+NVMe > SSD中的Linux系统了。</li></ol></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:media/image122cm4-img122.png|463x291px]]</p></li>
<li><p>'''使用这种方法烧录镜像后无需手动扩容,第一次启动会自动扩容。'''</p></li></ol>
</li></ol>
<span id="烧录android镜像到tf卡中的方法"></span>
== 烧录Android镜像到TF卡中的方法 ==
<div class="figure">
[[File:media/image18cm4-img18.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']下载瑞芯微驱动'''DriverAssitant_v5.12.zip'''和烧录工具'''RKDevTool_Release_v3.15.zip'''</p>
<ol style="list-style-type: lower-alpha;">
<li><p>在[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange > Pi的资料下载页面''']首先选择'''官方工具''',然后进入下面的文件夹中</p><p>[[File:media/image32cm4-img32.png|294x61px]]</p></li>
<li><p>然后下载下面的所有文件</p>
<p>[[File:media/image33cm4-img33.png|244x97px]]</p></li></ol>
</li>
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']下载Android的镜像。</p>
<ol style="list-style-type: lower-alpha;">
<li><p>打开安卓镜像的下载链接后可以看到下面两种类型的安卓镜像,请选择'''TF卡和eMMC启动镜像'''文件夹中的镜像进行下载</p>
<p>[[File:media/image123cm4-img123.png|224x82px]]</p></li>
<li><p>进入'''TF卡和eMMC启动镜像'''文件夹后可以看到下面两个镜像,它们的区别是:</p>
<ol style="list-style-type: lower-alphanone;"><li><p>a) 第一个镜像专门用于HDMI显示的,支持4K显示,如果不使用LCD屏幕,请下载不带lcd的镜像</p></li><li><p>b) 如果要使用lcd屏幕,请选择带lcd的镜像</p><p>[[File:media/image124cm4-img124.png|369x84px]]</p></li></ol>
</li></ol>
</li>
<li><p>然后使用解压软件解压下载的Android镜像的压缩包,解压后的文件中,以”.img” 结尾的文件就是Android镜像文件,大小在1GB以上</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可</p>
<p>[[File:media/image34cm4-img34.png|575x169px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮</p>
<p>[[File:media/image35cm4-img35.png|300x157px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可</p>
<p>[[File:media/image36cm4-img36.png|315x164px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可</p>
<p>[[File:media/image37cm4-img37.png|454x134px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:media/image38cm4-img38.png|442x208px]]</p></li>
<li><p>然后开始烧录Android镜像到TF卡中</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB2.0烧录接口的位置如下图所示</p>
<p>[[File:media/image39cm4-img39.png|269x108px]]</p></li>
<li><p>然后确保开发板没有插入TF卡,没有连接电源</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:media/image40cm4-img40.png|439x98px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电</p>
<p>[[File:media/image41cm4-img41.png|441x103px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”</p>
<p>[[File:media/image42cm4-img42.png|457x215px]]</p></li>
<li><p>然后再插入TF卡到开发板</p></li>
<li><p>然后请选择'''高级功能'''</p>
<p>[[File:media/image125cm4-img125.png|458x138px]]</p></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image126cm4-img126.png|459x216px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中的'''MiniLoaderAll.bin''',再点击打开</p>
<div class="figure">
[[File:media/image49cm4-img49.png|459x234px|(@G{}Y0U)`5J5K@9R(ICYWA]]
</div></li>
<li><p>然后点击'''下载'''</p>
<p>[[File:media/image127cm4-img127.png|472x222px]]</p></li>
<li><p>下载完'''MiniLoaderAll.bin'''后的显示如下图所示</p>
<p>[[File:media/image128cm4-img128.png|474x227px]]</p></li>
<li><p>然后选择存储设备为'''SD''',再点击'''切换存储'''</p>
<div class="figure">
[[File:media/image129cm4-img129.jpeg|477x222px|D~T2CO%X~K2@ELR98)BVP~2png]]
</div></li>
<div class="figure">
[[File:media/image130cm4-img130.jpeg|474x223px|QFVLTK~19N32OK2UGH{D{AKpng]]
</div></li>
<li><p>然后点击烧录工具的”'''升级固件'''”一栏</p>
<p>[[File:media/image131cm4-img131.png|477x224px]]</p></li>
<li><p>接着点击”'''固件'''”按钮选择需要烧录的Android镜像的路径</p>
<p>[[File:media/image132cm4-img132.png|444x209px]]</p></li><li><p>最后点击”'''升级'''”按钮就会开始烧录,烧录过程中的log如下图所示。烧录完成后Android系统会自动启动。</p></li></ol></li></ol>
<div class="figure">
[[File:media/image133cm4-img133.png|447x209px|09ce44c8ba61c0440bce194fa1835d36]]
</div></ol></li></ol>
<span id="烧录android镜像到emmc中的方法"></span>
== 烧录Android镜像到eMMC中的方法 ==
=== 通过USB2.0烧录口将Android 镜像烧录到eMMC中的方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,下面所有的操作都是在Windows电脑中进行的。'''</big>|}
<ol style="list-style-type: decimal;">
<div class="figure">
[[File:media/image18cm4-img18.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<ol style="list-style-type: lower-alpha;">
<li><p>打开安卓镜像的下载链接后可以看到下面两种类型的安卓镜像,请选择'''TF卡和eMMC启动镜像'''文件夹中的镜像进行下载</p>
<p>[[File:media/image123cm4-img123.png|224x82px]]</p></li>
<li><p>进入'''TF卡和eMMC启动镜像'''文件夹后可以看到下面两个镜像,它们的区别是:</p>
<ol style="list-style-type: lower-alphanone;"><li><p>a) 第一个镜像专门用于HDMI显示的,支持4K显示,如果不使用LCD屏幕,请下载不带lcd的镜像</p></li><li><p>b) 如果要使用lcd屏幕,请选择带lcd的镜像</p><p>[[File:media/image124cm4-img124.png|369x84px]]</p></li></ol>
</li></ol>
</li>
<li><p>然后使用解压软件解压下载的Android镜像的压缩包,解压后的文件中,以”.img” 结尾的文件就是Android镜像文件,大小在1GB以上</p></li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可</p>
<p>[[File:media/image34cm4-img34.png|575x169px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮</p>
<p>[[File:media/image35cm4-img35.png|300x157px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可</p>
<p>[[File:media/image36cm4-img36.png|315x164px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可</p>
<p>[[File:media/image37cm4-img37.png|454x134px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:media/image38cm4-img38.png|442x208px]]</p></li>
<li><p>然后开始烧录Android镜像到eMMC中</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB2.0烧录接口的位置如下图所示</p>
<p>[[File:media/image39cm4-img39.png|269x108px]]</p></li>
<li><p>然后确保开发板没有插入TF卡,没有连接电源</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:media/image40cm4-img40.png|439x98px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电</p>
<p>[[File:media/image41cm4-img41.png|441x103px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”</p>
<p>[[File:media/image42cm4-img42.png|457x215px]]</p></li>
<li><p>然后请选择'''高级功能'''</p>
<p>[[File:media/image125cm4-img125.png|458x138px]]</p></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image126cm4-img126.png|459x216px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中的'''MiniLoaderAll.bin''',再点击打开</p>
<div class="figure">
[[File:media/image49cm4-img49.png|462x236px|(@G{}Y0U)`5J5K@9R(ICYWA]]
</div></li>
<li><p>然后点击'''下载'''</p>
<p>[[File:media/image127cm4-img127.png|472x222px]]</p></li>
<li><p>下载完'''MiniLoaderAll.bin'''后的显示如下图所示</p>
<p>[[File:media/image134cm4-img134.png|474x223px]]</p></li>
<li><p>然后选择存储设备为'''EMMC,'''再点击'''切换存储'''</p>
<p>[[File:media/image135cm4-img135.png|468x225px]]</p></li>
<li><p>切换成功的显示如下图所示</p>
<p>[[File:media/image136cm4-img136.png|472x227px]]</p></li>
<li><p>然后点击烧录工具的”'''升级固件'''”一栏</p>
<p>[[File:media/image131cm4-img131.png|442x208px]]</p></li>
<li><p>接着点击”'''固件'''”按钮选择需要烧录的Android镜像的路径</p>
<p>[[File:media/image132cm4-img132.png|444x209px]]</p></li>
<li><p>最后点击”'''升级'''”按钮就会开始烧录,烧录过程中的log如下图所示。烧录完成后Android系统会自动启动。</p>
<div class="figure">
[[File:media/image133cm4-img133.png|447x209px|09ce44c8ba61c0440bce194fa1835d36]]
</div></li></ol>
<span id="通过tf卡将android11镜像烧录到emmc中的方法"></span>
=== 通过TF卡将Android11镜像烧录到eMMC中的方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,下面所有的操作都是在Windows电脑中进行的。'''</big>|}
<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/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']下载SDDiskTool烧写工具,'''<span style="color:#FF0000">请确保SDDiskTool工具的版本为最新的v1.72</span>'''</p></li>
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''Orange Pi的资料下载页面''']下载Android的镜像</p>
<ol style="list-style-type: lower-alpha;">
<li><p>打开安卓镜像的下载链接后可以看到下面两种类型的安卓镜像,请选择'''TF卡和eMMC启动镜像'''文件夹中的镜像进行下载</p>
<p>[[File:media/image123cm4-img123.png|224x82px]]</p></li>
<li><p>进入'''TF卡和eMMC启动镜像'''文件夹后可以看到下面两个镜像,它们的区别是:</p>
<ol style="list-style-type: lower-alphanone;"><li><p>a) 第一个镜像专门用于HDMI显示的,支持4K显示,如果不使用LCD屏幕,请下载不带lcd的镜像</p></li><li><p>b) 如果要使用lcd屏幕,请选择带lcd的镜像</p><p>[[File:media/image124cm4-img124.png|369x84px]]</p></li></ol>
</li></ol>
</li>
<li><p>然后使用解压软件解压下载的Android镜像的压缩包,解压后的文件中,以”.img” 结尾的文件就是Android镜像文件,大小在1GB以上</p></li>
<li><p>然后使用解压软件解压'''SDDiskTool_v1.72.zip''',此软件无需安装,在解压后的文件夹中找到'''SD_Firmware_Tool.exe'''打开即可</p>
<p>[[File:media/image137cm4-img137.png|429x103px]]</p></li><li><p>打开'''SDDiskTool'''后,如果TF卡识别正常,会在”'''选择可移动磁盘设备'''”一栏中显示插入的磁盘设备,'''<span style="color:#FF0000">请务必确认显示的磁盘设备和你想烧录的TF卡的盘符是一致的</span>''',如果没有显示可以尝试拔插下TF卡</p><p>[[File:media/image138cm4-img138.png|267x228px]]</p></li>
<li><p>确认完盘符后,可以先格式化下TF卡,点击'''SDDiskTool'''中的'''恢复磁盘'''按钮即可,也可使用前面提到的'''SD Card Formatter'''进行TF卡的格式化</p>
<p>[[File:media/image139cm4-img139.png|247x212px]]</p></li>
<li><p>然后开始将Android镜像写入TF卡</p>
<ol style="list-style-type: lower-alpha;">
<li><p>然后在”'''选择升级固件'''”一栏中选择Android固件的路径</p></li>
<li><p>最后点击”'''开始创建'''”按钮就会开始烧录</p>
<p>[[File:media/image140cm4-img140.png|290x246px]]</p></li></ol>
</li>
<li><p>烧录完成后的显示如下图所示,然后就可以退出SDDiskTool</p>
<p>[[File:media/image141cm4-img141.png|285x243px]]</p></li>
<li><p>然后把TF卡从电脑中拔出来插到开发板中,开发板上电启动后就会自动开始将TF卡中的Android镜像烧录到开发板的eMMC中</p></li>
<li><p>如果开发板连接了HDMI显示器,还可以从HDMI显示器中看到烧录Android镜像到eMMC中的进度条</p>
<p>[[File:media/image142cm4-img142.png|430x247px]]</p></li>
<li><p>当HDMI显示器显示如下信息时,说明烧录Android镜像到eMMC中已完成,此时就可以拔出TF卡,然后eMMC中的安卓系统就会开始启动。</p>
<p>[[File:media/image143cm4-img143.png|576x389px]]</p></li></ol>
<span id="烧录android镜像到spiflashnvme-ssd中的方法"></span>
== 烧录Android镜像到SPIFlash+NVMe SSD中的方法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''在开始烧录镜像之前,必须确保开发板已经贴了SPI Flash芯片,因为开发板在出厂时是没有贴SPI Flash芯片的,所以需要自行购买并焊接上,我们建议选用的SPI Flash芯片型号为XM25QU128CWIQT08QFlash芯片型号为<span style="color:#FF0000">XM25QU128CWIQT08Q</span>'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''由于eMMC的启动优先级高于NVMe SSD,所以在烧录镜像之前需要将eMMC的系统清空,清空eMMC的方法请参考下[[\lOrange Pi CM4#使用RKDevTool清空eMMC的方法|使用RKDevTool清空eMMC的方法]]一小节的说明'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,下面所有的操作都是在Windows电脑中进行的。'''</big>|}
<ol style="list-style-type: decimal;">
<ol style="list-style-type: lower-alpha;">
<li><p>M.2 2230规格的SSD如下所示</p>
<p>[[File:media/image72cm4-img72.png|147x120px]]</p></li>
<li><p>M.2 2242规格的SSD如下所示</p>
<p>[[File:media/image73cm4-img73.png|216x131px]]</p></li></ol>
</li>
<li><p>然后把NVMe SSD插入开发板的M.2 PCIe接口,并固定好</p>
<p>[[File:media/image74cm4-img74.png|274x185px]]</p></li>
<li><p>请确保开发板已经贴了SPI Flash,SPI Flash在开发板上的位置如下图所示,开始烧录前无需其他设置</p>
<p>[[File:media/image75cm4-img75.png|274x205px]]</p></li>
<li><p>还需要准备一根品质良好的USB2.0公对公数据线</p>
<div class="figure">
[[File:media/image18cm4-img18.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<ol style="list-style-type: lower-alpha;">
<li><p>打开安卓镜像的下载链接后可以看到下面两种类型的安卓镜像,请选择'''SPIFlash-NVME > SSD启动镜像'''文件夹中的镜像进行下载</p>
<p>[[File:media/image144cm4-img144.png|195x65px]]</p></li>
<li><p>进入'''SPIFlash-NVME > SSD启动镜像'''文件夹后可以看到下面两个镜像,它们的区别是:</p>
<ol style="list-style-type: lower-alphanone;"><li><p>a) 不带lcd的镜像是专门用于HDMI显示的,支持4K显示,如果不使用LCD屏幕,请下载不带lcd的镜像</p></li><li><p>b) 如果要使用LCD屏幕,请选择带lcd的镜像</p><p>[[File:media/image145cm4-img145.png|292x50px]]</p></li></ol>
</li></ol>
</li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可</p>
<p>[[File:media/image34cm4-img34.png|407x120px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮</p>
<p>[[File:media/image35cm4-img35.png|286x150px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可</p>
<p>[[File:media/image36cm4-img36.png|296x154px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可</p>
<p>[[File:media/image37cm4-img37.png|413x122px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:media/image38cm4-img38.png|402x189px]]</p></li>
<li><p>然后开始烧录Android镜像到SPIFlash+NVMe SSD中</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB2.0烧录口的位置如下图所示</p>
<p>[[File:media/image39cm4-img39.png|269x108px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:media/image40cm4-img40.png|439x98px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了</p>
<p>[[File:media/image41cm4-img41.png|441x103px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”</p>
<p>[[File:media/image42cm4-img42.png|443x208px]]</p></li>
<li><p>然后点击烧录工具的”'''升级固件'''”一栏</p>
<p>[[File:media/image131cm4-img131.png|442x208px]]</p></li>
<li><p>接着点击”'''固件'''”按钮选择需要烧录的Android镜像</p>
<p>[[File:media/image132cm4-img132.png|444x209px]]</p></li>
<li><p>最后点击”'''升级'''”按钮就会开始烧录,烧录的过程如下图所示,可以看到,首先会烧录固件到SPIFlash中,然后烧录固件到PCIE中。烧录完成后Android系统会自动启动。</p>
<p>[[File:media/image146cm4-img146.png|453x212px]]</p></li></ol>
</li></ol>
<span id="使用rkdevtool清空spiflash的方法"></span>
== 使用RKDevTool清空SPIFlash的方法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''开发板出厂时是没有贴SPI Flash芯片的,因此需要自行贴上,我们建议选用的SPI Flash芯片型号为XM25QU128CWIQT08QFlash芯片型号为<span style="color:#FF0000">XM25QU128CWIQT08Q</span>'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>SPI Flash在开发板上的位置如下图所示</p>
<p>[[File:media/image75cm4-img75.png|274x205px]]</p></li>
<li><p>首先需要准备一根品质良好的USB2.0公对公数据线</p>
<div class="figure">
[[File:media/image18cm4-img18.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.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/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3B.html '''Orange > Pi的资料下载页面''']首先选择'''官方工具''',然后进入下面的文件夹中</p><p>[[File:media/image32cm4-img32.png|366x77px]]</p></li>
<li><p>然后下载下面的所有文件</p>
<p>[[File:media/image33cm4-img33.png|315x125px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意,“MiniLoader-烧录Linux镜像才需要用到的东西”文件夹下文简称为MiniLoader文件夹。'''</p></big>|}</li></ol>
</li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可</p>
<p>[[File:media/image34cm4-img34.png|472x139px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮</p>
<p>[[File:media/image35cm4-img35.png|276x145px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可</p>
<p>[[File:media/image36cm4-img36.png|292x151px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可</p>
<p>[[File:media/image37cm4-img37.png|467x138px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:media/image38cm4-img38.png|402x189px]]</p></li>
<li><p>然后就可以开始清空SPI FLASH中的内容</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB2.0烧录口的位置如下图所示</p>
<p>[[File:media/image39cm4-img39.png|269x108px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:media/image40cm4-img40.png|439x98px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了</p>
<p>[[File:media/image41cm4-img41.png|441x103px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”</p>
<p>[[File:media/image42cm4-img42.png|457x215px]]</p></li>
<li><p>然后请选择'''高级功能'''</p>
<p>[[File:media/image125cm4-img125.png|458x138px]]</p></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image126cm4-img126.png|459x216px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中的'''MiniLoaderAll.bin''',再点击打开</p>
<div class="figure">
[[File:media/image49cm4-img49.png|469x239px|(@G{}Y0U)`5J5K@9R(ICYWA]]
</div></li>
<li><p>然后点击'''下载'''</p>
<p>[[File:media/image127cm4-img127.png|472x222px]]</p></li>
<li><p>下载完'''MiniLoaderAll.bin'''后的显示如下图所示</p>
<p>[[File:media/image134cm4-img134.png|474x223px]]</p></li>
<li><p>然后选择存储设备为'''SPINOR'''</p>
<p>[[File:media/image147cm4-img147.png|467x220px]]</p></li>
<li><p>然后点击'''切换存储'''</p>
<p>[[File:media/image148cm4-img148.png|464x218px]]</p></li>
<li><p>然后点击'''擦除所有'''就会开始擦除SPIFlash了</p>
<p>[[File:media/image149cm4-img149.png|467x220px]]</p></li>
<li><p>擦除SPIFlash后的显示log如下图所示</p>
<p>[[File:media/image150cm4-img150.png|460x216px]]</p></li></ol>
</li></ol>
<span id="使用rkdevtool清空emmc的方法"></span>
== 使用RKDevTool清空eMMC的方法 ==
<div class="figure">
[[File:media/image18cm4-img18.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<li><p>然后从[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.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/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3B.html '''Orange > Pi的资料下载页面''']首先选择'''官方工具''',然后进入下面的文件夹中</p><p>[[File:media/image32cm4-img32.png|366x77px]]</p></li>
<li><p>然后下载下面的所有文件</p>
<p>[[File:media/image33cm4-img33.png|315x125px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意,“MiniLoader-烧录Linux镜像才需要用到的东西”文件夹下文简称为MiniLoader文件夹。'''</p></big>|}</li></ol>
</li>
<li><p>然后用解压软件解压'''DriverAssitant_v5.12.zip''',再在解压后的文件夹中找到'''DriverInstall.exe'''可执行文件并打开即可</p>
<p>[[File:media/image34cm4-img34.png|472x139px]]</p></li>
<li><p>打开'''DriverInstall.exe'''后安装瑞芯微驱动的步骤如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>点击”'''驱动安装'''”按钮</p>
<p>[[File:media/image35cm4-img35.png|276x145px]]</p></li>
<li><p>等待一段时间后,会弹出窗口提示”'''安装驱动成功'''”,然后点击'''“确定”'''按钮即可</p>
<p>[[File:media/image36cm4-img36.png|292x151px]]</p></li></ol>
</li>
<li><p>然后解压'''RKDevTool_Release_v3.15.zip''',此软件无需安装,在解压后的文件夹中找到 '''RKDevTool'''打开即可</p>
<p>[[File:media/image37cm4-img37.png|467x138px]]</p></li>
<li><p>打开'''RKDevTool''' 烧录工具后,因为电脑此时还没有通过USB2.0公对公数据线连接上开发板,所以左下角会提示”'''没有发现设备'''”</p>
<p>[[File:media/image38cm4-img38.png|402x189px]]</p></li>
<li><p>然后就可以开始清空eMMC中的内容</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先通过USB2.0公对公数据线连接好开发板与Windows电脑,开发板USB2.0烧录口的位置如下图所示</p>
<p>[[File:media/image39cm4-img39.png|269x108px]]</p></li>
<li><p>确保开发板没有插入TF卡,没有连接电源</p></li>
<li><p>然后按住开发板的MaskROM按键不放,MaskROM按键在开发板的位置如下图所示:</p>
<p>[[File:media/image40cm4-img40.png|439x98px]]</p></li>
<li><p>然后给开发板接上Type-C接口的电源,并上电,然后就可以松开MaskROM按键了</p>
<p>[[File:media/image41cm4-img41.png|441x103px]]</p></li>
<li><p>如果前面的步骤顺利,此时开发板会进入'''MASKROM'''模式,在烧录工具的界面上会提示”'''发现一个MASKROM设备'''”</p>
<p>[[File:media/image42cm4-img42.png|457x215px]]</p></li>
<li><p>然后请选择'''高级功能'''</p>
<p>[[File:media/image125cm4-img125.png|458x138px]]</p></li>
<li><p>然后点击下图所示的位置</p>
<p>[[File:media/image126cm4-img126.png|459x216px]]</p></li>
<li><p>再选择前面下载的'''MiniLoader'''文件夹中的'''MiniLoaderAll.bin''',再点击打开</p>
<div class="figure">
[[File:media/image49cm4-img49.png|469x239px|(@G{}Y0U)`5J5K@9R(ICYWA]]
</div></li>
<li><p>然后点击'''下载'''</p>
<p>[[File:media/image127cm4-img127.png|472x222px]]</p></li>
<li><p>下载完'''MiniLoaderAll.bin'''后的显示如下图所示</p>
<p>[[File:media/image134cm4-img134.png|474x223px]]</p></li>
<li><p>然后选择存储设备为'''eMMC'''</p>
<p>[[File:media/image151cm4-img151.png|465x218px]]</p></li>
<li><p>然后点击'''切换存储'''</p>
<p>[[File:media/image152cm4-img152.png|470x221px]]</p></li>
<li><p>然后点击'''擦除所有'''就会开始擦除eMMC了</p>
<p>[[File:media/image153cm4-img153.png|466x221px]]</p></li>
<li><p>擦除eMMC后的显示log如下图所示</p>
<p>[[File:media/image154cm4-img154.png|466x221px]]</p></li></ol>
</li></ol>
<ol style="list-style-type: decimal;">
<li><p>首先将Orange Pi CM4核心板安装到底板上</p>
<p>[[File:media/image155cm4-img155.png|417x277px]]</p></li>
<li><p>然后将烧录好镜像的TF卡插入香橙派开发板的TF卡插槽中。</p></li>
<li><p>开发板有Micro HDMI接口,可以通过Micro HDMI转HDMI连接线把开发板连接到电视或者HDMI显示器。如果有购买LCD屏幕,也可以使用LCD屏幕来显示开发板的系统界面。</p></li>
<li><p>接上USB鼠标和键盘,用于控制香橙派开发板。</p></li>
<li><p>开发板有以太网口,可以插入网线用来上网。</p></li>
<li><p>连接一个5V/3A的USB Type-C接口的'''高品质'''的电源适配器。</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </li></olbig style="color:#FF0000"> '''切记不要插入电压输出大于5V的电源适配器,会烧坏开发板。'''
'''系统上电启动过程中很多不稳定的现象基本都是供电有问题导致的,所以一个靠谱的电源适配器很重要。如果启动过程中发现有不断重启的现象,请更换下电源或者Type-C数据线再试下。'''
'''Type-C电源接口是不支持PD协商的。'''
'''另外请不要接到电脑的USB接口来给开发板供电。'''</big>|}</li></ol>
<ol start="7" style="list-style-type: decimal;">
<li><p>然后打开电源适配器的开关,如果一切正常,此时HDMI显示器或者LCD屏幕就能看到系统的启动画面了。</p></li>
<li><p>如果想通过调试串口查看系统的输出信息,请使用串口线将开发板连接到电脑,串口的连接方法请参看[[\lOrange Pi CM4#调试串口的使用方法|'''调试串口的使用方法''']]一节。</p></li></ol>
== 调试串口的使用方法 ==
# 首先需要准备一个'''3.3V'''的USB转TTL模块,然后将USB转TTL模块的USB接口一端插入到电脑的USB接口中。
::{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''为了更好的兼容性,推荐使用CH340 USB转TTL模块,请不要使用CP2102、PL2303类型的USB转TTL模块。'''
'''购买USB转TTL模块前,请确认模块支持1500000速率的波特率。'''</big>|}
::[[File:media/image156cm4-img156.png|569x114px]]
<ol start="2" style="list-style-type: decimal;">
<li><p>开发板的调试串口GND、RXD和TXD引脚的对应关系如下图所示</p>
<p>[[File:media/image157cm4-img157.png|499x66px]]</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模块的'''<span style="color:#FF0000">RX接到开发板的TX上</span>'''</p></li><li><p>USB转TTL模块的'''<span style="color:#FF0000">TX接到开发板的RX上</span>'''</p></li></ol>
</li>
<li><p>USB转TTL模块连接电脑和Orange Pi开发板的示意图如下所示</p>
<div class="figure">
[[File:media/image158cm4-img158.jpeg|524x189px|QQ图片20210204145010png]]
</div>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''串口的TX和RX是需要交叉连接的,如果不想仔细区分TX和RX的顺序,可以把串口的TX和RX先随便接上,如果测试没有输出再交换下TX和RX的顺序,这样就总有一种顺序是对的'''</p></big>|}</li></ol>
<span id="ubuntu平台调试串口的使用方法"></span>
=== Ubuntu平台调试串口的使用方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Linux下可以使用的串口调试软件有很多,如putty、minicom等,下面演示putty的使用方法。'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>首先将USB转TTL模块插入Ubuntu电脑的USB接口,如果USB转TTL模块连接识别正常,在Ubuntu PC的'''/dev'''下就可以看到对应的设备节点名,记住这个节点名,后面设置串口软件时会用到</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''ls /dev/ttyUSB*'''</p>
<p>/dev/ttyUSB0</p>|}</li>
<li><p>然后使用下面的命令在Ubuntu PC上安装下putty</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''sudo apt-get update'''</p>
<p>test@test:~$ '''sudo apt-get install -y putty'''</p>|}</li><li><p>然后运行putty,'''<span style="color:#FF0000">记得加sudo权限</span>'''</p>{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo putty'''</p>|}</li>
<li><p>执行putty命令后会弹出下面的界面</p>
<p>[[File:media/image159cm4-img159.png|367x321px]]</p></li>
<li><p>首先选择串口的设置界面</p>
<p>[[File:media/image160cm4-img160.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:media/image161cm4-img161.png|316x312px]]</p></li></ol>
</li>
<li><p>在串口的设置界面设置完后,再回到Session界面</p>
<li><p>首先选择Connection type为Serial</p></li>
<li><p>然后点击Open按钮连接串口</p>
<p>[[File:media/image162cm4-img162.png|345x340px]]</p></li></ol>
</li>
<li><p>启动开发板后,就能从打开的串口终端中看到系统输出的Log信息了</p>
<p>[[File:media/image163cm4-img163.png|468x340px]]</p></li></ol>
<span id="windows平台调试串口的使用方法"></span>
=== Windows平台调试串口的使用方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Windows下可以使用的串口调试软件有很多,如SecureCRT、MobaXterm等,下面演示MobaXterm的使用方法,这款软件有免费版本,无需购买序列号即可使用。'''</big>|}
<ol style="list-style-type: decimal;">
<ol style="list-style-type: lower-alpha;">
<li><p>下载MobaXterm网址如下</p>
{| class="wikitable" style="width:800px;" |-| <p>[https://mobaxterm.mobatek.net/ '''https://mobaxterm.mobatek.net''']</p>|}</li>
<li><p>进入MobaXterm下载网页后点击'''GET XOBATERM NOW!'''</p>
<p>[[File:media/image164cm4-img164.png|576x334px]]</p></li>
<li><p>然后选择下载Home版本</p>
<p>[[File:media/image165cm4-img165.png|353x231px]]</p></li>
<li><p>然后选择Portable便携式版本,下载完后无需安装,直接打开就可以使用</p>
<p>[[File:media/image166cm4-img166.png|575x259px]]</p></li></ol>
</li>
<li><p>下载完后使用解压缩软件解压下载的压缩包,即可得到MobaXterm的可执软件,然后双击打开</p>
<p>[[File:media/image167cm4-img167.png|576x81px]]</p></li>
<li><p>打开软件后,设置串口连接的步骤如下</p>
<ol style="list-style-type: lower-alpha;">
<li><p>选择串口的端口号(根据实际的情况选择对应的端口号),如果看不到端口号,请使用[http://weishi.360.cn/qudongdashi/ '''360驱动大师''']扫描安装USB转TTL串口芯片的驱动</p></li>
<li><p>选择串口的波特率为'''1500000'''</p></li>
<li><p>最后点击”'''OK'''”按钮完成设置</p></li> [[File:cm4-img168.png]]</ol>
</li></ol>
<ol start="4" style="list-style-type: decimal;">
<li><p>点击”'''OK'''”按钮后会进入下面的界面,此时启动开发板就能看到串口的输出信息了</p>
<p>[[File:media/image169cm4-img169.png|575x291px]]</p></li></ol>
== 使用开发板40pin接口中的5v引脚供电说明 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''我们推荐的开发板的供电方式是使用5V/3A的Type C接口的电源线插到开发板的Type-C电源接口来供电的。如果需要使用40pin接口中的5V引脚来给开发板供电,请确保使用的电源线和电源适配器能满足开发板的供电需求。如果有使用不稳定的情况,请换回Type-C电源供电。'''</big>|}
<ol style="list-style-type: decimal;">
<div class="figure">
[[File:media/image170cm4-img170.jpeg|216x154px|4ff86e49b6624616f9498fe44c366f29png]]
</div>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''上图所示的电源线在淘宝可以买到,请自行搜索购买。'''</p></big>|}</li>
<li><p>使用40pin接口中的5V引脚来给开发板供电,电源线的接法如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>上图所示的电源线USB > A口需要插到5V/3A的电源适配器接头上('''<span style="color:#FF0000">请不要插到电脑的USB接口来供电</span>''')</p></li>
<li><p>红色的杜邦线需要插到开发板40pin的5V引脚上</p></li>
<li><p>黑色的杜邦线需要插到40pin接口的GND引脚上</p></li>
<li><p>40pin接口5V引脚和GND引脚在开发板中的位置如下图所示,'''<span style="color:#FF0000">切记不要接反了</span>'''</p><p>[[File:media/image171cm4-img171.png|414x91px]]</p></li></ol>
</li></ol>
<span id="ubuntudebian-server和xfce桌面系统使用说明"></span>
= '''Ubuntu/Debian Server和Xfce桌面系统使用说明''' =
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''本章内容是基于Linux服务器版本的镜像和xfce桌面版本镜像编写的。'''</big>|}
<span id="已支持的linux镜像类型和内核版本"></span>
== 已支持的Linux镜像类型和内核版本 ==
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''Linux镜像类型'''
== Linux系统适配情况 ==
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''功能'''
|-
| '''M.2 NVMe SSD启动'''
| colspan=4 | <span style="color:#FF0000">'''OK,需要贴了SPI Flash才能正常使用'''| style="text-align: left;"|| style="text-align: left;"|| style="text-align: left;"|</span>
|-
| '''WIFI'''
|-
| '''OV5647摄像头'''
| colspan=4 | <span style="color:#FF0000">'''内核驱动OK,3A未调'''| style="text-align: left;"|| style="text-align: left;"|| style="text-align: left;"|</span>
|-
| '''LCD'''
<ol style="list-style-type: decimal;">
<li><p>本手册中所有需要在Linux系统中输入的命令都会使用下面的方框框起来</p>
{| class="wikitable" style="width:800px;height:40px"
|-
|
|}
<p>如下所示,黄色方框里内容表示需要特别注意的内容,这里面的命令除外。</p></li>
{| class="wikitable" style="background-color:#ffffdc;width:800px;height:40px"
|-
|
|}
<li><p>命令前面的提示符类型说明</p>
<ol style="list-style-type: lower-alpha;">
<li><p>命令前面提示符指的是下面方框内红色部分的内容,这部分内容不是Linux命令的一部分,所以在Linux系统中输入命令时,请不要把红色字体部分的内容也输入进去。</p>
{| class="wikitable" style="width:800px;" |-| <p>'''<span style="color:#FF0000">orangepi@orangepi:~$ </span> sudo apt update'''</p><p>'''<span style="color:#FF0000">root@orangepi:~#</span>''' '''vim /boot/boot.cmd'''</p><p>'''<span style="color:#FF0000">test@test:~$ </span> ssh [mailto:root@192.168.1.36 root@192.168.1.]xxx'''</p><p>'''<span style="color:#FF0000">root@test:~# </span> ls'''</p>|}</li><li><p>'''<span style="color:#FF0000">root@orangepi:~$</span>''' > 提示符表示这个命令是在'''开发板的Linux系统'''中输入的, > 提示符最后的 '''<span style="color:#FF0000">$</span>''' > 表示系统当前用户为普通用户,当执行特权命令时,需要加上'''sudo'''</p></li><li><p>'''<span style="color:#FF0000">root@orangepi:~#</span>''' > 提示符表示这个命令是在'''开发板的Linux系统'''中输入的, > 提示符最后的 '''<span style="color:#FF0000">#</span>''' > 表示系统当前用户为root用户,可以执行任何想要执行的命令</p></li><li><p>'''<span style="color:#FF0000">test@test:~$</span>''' 提示符表示这个命令是在Ubuntu > PC或者Ubuntu虚拟机中输入的,而不是开发板的Linux系统中。提示符最后的 > '''<span style="color:#FF0000">$</span>''' > 表示系统当前用户为普通用户,当执行特权命令时,需要加上'''sudo'''</p></li><li><p>'''<span style="color:#FF0000">root@test:~#</span>''' 提示符表示这个命令是在Ubuntu > PC或者Ubuntu虚拟机中输入的,而不是开发板的Linux系统中。提示符最后的 > '''<span style="color:#FF0000">#</span>''' 表示系统当前用户为root用户,可以执行任何想要执行的命令</p></li></ol>
</li>
<li><p>哪些是需要输入的命令?</p>
<ol style="list-style-type: lower-alpha;">
<li><p>如下所示,'''黑色加粗部分'''是需要输入的命令,命令下面的是输出的内容(有些命令有输出,有些可能没有输出),这部分内容是不需要输入的</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~# '''cat /boot/orangepiEnv.txt'''</p>
<p>'''<span style="color:#FF0000">verbosity=7</span>'''</p>
<p>bootlogo=false</p>
<p>'''<span style="color:#FF0000">console=serial</span>'''</p>|}</li>
<li><p>如下所示,有些命令一行写不下会放到下一行,只要黑色加粗的部分就都是需要输入的命令。当这些命令输入到一行的时候,每行最后的”'''\'''”是需要去掉的,这个不是命令的一部分。另外命令的不同部分都是有空格的,请别漏了</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''echo \'''</p>
<p>'''"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" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null'''</p>|}</li></ol>
</li></ol>
<span id="linux系统登录说明"></span>
== Linux系统登录说明 ==
=== Linux系统默认登录账号和密码 ===
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''账号'''
|}
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,输入密码的时候,屏幕上是不会显示输入的密码的具体内容的,请不要以为是有什么故障,输入完后直接回车即可。注意,输入密码的时候,<span style="color:#FF0000">屏幕上是不会显示输入的密码的具体内容的</span>,请不要以为是有什么故障,输入完后直接回车即可。'''
'''当输入密码提示错误,或者ssh连接有问题,请注意,只要使用的是Orange Pi提供的Linux镜像,就请不要怀疑上面的密码不对,而是要找其它的原因。Pi提供的Linux镜像,<span style="color:#FF0000">就请不要怀疑上面的密码不对</span>,而是要找其它的原因。'''</big>|}
<span id="设置linux系统终端自动登录的方法"></span>
=== 设置Linux系统终端自动登录的方法 ===
<ol style="list-style-type: decimal;">
<li><p>Linux系统默认就是自动登录终端的,默认登录的用户名是'''<span style="color:#FF0000">orangepi</span>'''</p><p>[[File:media/image172cm4-img172.png|286x220px]]</p></li>
<li><p>使用下面的命令可以设置root用户自动登录终端</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh root'''</p>|}</li>
<li><p>使用下面的命令可以禁止自动登录终端</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh -d'''</p>|}</li>
<li><p>使用下面的命令可以再次设置orangepi用户自动登录终端</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo auto_login_cli.sh orangepi'''</p>|}</li></ol> <span id="linux桌面版系统自动登录说明"></span>
=== Linux桌面版系统自动登录说明 ===
<div class="figure">
[[File:media/image173cm4-img173.png|576x324px|1]]
</div></li>
<li><p>运行下面的命令可以禁止桌面版系统自动登录桌面</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo disable_desktop_autologin.sh'''</p>|}</li><li><p>然后重启系统就会出现登录对话框,此时需要输入[[\lOrange Pi CM4#Linux系统默认登录账号和密码|'''密码''']]才能进入系统</p>
<div class="figure">
[[File:media/image174cm4-img174.png|569x320px|IMG_256]]
</div></li></ol>
<span id="linux桌面版系统root用户自动登录的设置方法"></span>
=== Linux桌面版系统root用户自动登录的设置方法 ===
<ol style="list-style-type: decimal;">
<li><p>执行下面的命令可以设置桌面版系统使用root用户自动登录</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo desktop_login.sh root'''</p>|}</li>
<li><p>然后重启系统,就会自动使用root用户登录桌面了</p>
<p>[[File:media/image175cm4-img175.png|448x187px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意,如果使用root用户登录桌面系统,是无法使用右上角的pulseaudio来管理音频设备的。'''</p> <p>'''另外请注意这并不是一个bug,因为pulseaudio本来就不允许在root用户下运行。'''</p></big>|}</li>
<li><p>执行下面的命令可以再次设置桌面版系统使用orangepi用户自动登录</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo desktop_login.sh orangepi'''</p>|}</li></ol>
<span id="linux桌面版系统禁用桌面的方法"></span>
=== Linux桌面版系统禁用桌面的方法 ===
<ol style="list-style-type: decimal;">
<li><p>首先在命令行中输入下面的命令,'''<span style="color:#FF0000">请记得加sudo权限</span>'''</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo systemctl disable lightdm.service'''</p>|}</li>
<li><p>然后重启Linux系统就会发现不会显示桌面了</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo reboot'''</p>|}</li>
<li><p>重新打开桌面的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先在命令行中输入下面的命令,'''<span style="color:#FF0000">请记得加sudo权限</span>'''</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo systemctl start lightdm.service'''</p>|}</li>
<li><p>命令执行完成后就会显示桌面了</p></li></ol>
</li></ol>
<span id="板载led灯测试说明"></span>
== 板载LED灯测试说明 ==
<ol style="list-style-type: decimal;">
<li><p>开发板上有三个LED灯,一个绿灯,一个红灯,一个PCIe指示灯,所在位置如下图所示:</p>
<p>[[File:media/image176cm4-img176.png|567x156px]]</p></li><li><p>'''<span style="color:#FF0000">只要开发板打开了电源,红色的LED灯就会常亮,这是由硬件控制的,软件无法关闭。</span>'''</p></li>
<li><p>绿色的LED灯在内核启动后会一直闪烁,这是由软件控制的。</p></li>
<li><p>PCIe指示灯在PCIe接口有数据传输时会闪烁。</p></li>
<li><p>设置绿灯亮灭和闪烁的方法如下所示</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意,下面的操作请在root用户下进行。'''</p></big>|}
<ol style="list-style-type: lower-alpha;">
<li><p>首先进入绿灯的设置目录</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''cd /sys/class/leds/status_led'''</p>|}</li>
<li><p>设置绿灯停止闪烁的命令如下</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:/sys/class/leds/status_led# '''echo none > trigger'''</p>|}</li>
<li><p>设置绿灯常亮的命令如下</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:/sys/class/leds/status_led# '''echo default-on > trigger'''</p>|}</li>
<li><p>设置绿灯闪烁的命令如下</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:/sys/class/leds/status_led# '''echo heartbeat > trigger'''</p>|}</li></ol>
</li></ol>
<li><p>系统启动后会通过'''DHCP'''自动给以太网卡分配IP地址,'''不需要其他任何配置'''</p></li>
<li><p>在开发板的Linux系统中查看IP地址的命令如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ip addr show eth0'''</p>
<p>2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000</p>
:<p>link/ether 4a:fe:2b:3d:17:1c brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''192.168.1.150'''/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0</p>::<p>valid_lft 43150sec preferred_lft 43150sec</p>:<p>inet6 fe80::9a04:3703:faed:23be/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''当使用ifconfig查看IP地址时,如果提示下面的信息,是因为没有加sudo导致的,正确的命令是:sudo ifconfig'''</p></big>
<p>orangepi@orangepi:~$ '''ifconfig'''</p>
<p>Command 'ifconfig' is available in the following places</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>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </li></olbig>'''开发板启动后查看IP地址有三种方法:''' '''1. 接HDMI显示器,然后登录系统使用ip addr show eth0命令查看IP地址'''
'''开发板启动后查看IP地址有三种方法:2. 在调试串口终端输入ip addr show eth0命令来查看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>
<!-- --p>'''另外需要注意的是开发板DHCP自动分配IP地址是不需要任何设置的。'''</p></big>|}</li></ol>
<ol start="4" style="list-style-type: decimal;">
<li><p>测试网络连通性的命令如下,'''ping'''命令可以通过'''Ctrl+C'''快捷键来中断运行</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ping www.baidu.com -I eth0'''</p>
<p>PING www.a.shifen.com (14.215.177.38) from 192.168.1.12 eth0: 56(84) bytes of data.</p>
<p>--- www.a.shifen.com ping statistics ---</p>
<p>4 packets transmitted, 4 received, 0% packet loss, time 3002ms</p>
<p>rtt min/avg/max/mdev = 6.260/6.770/7.275/0.373 ms</p>|}</li></ol>
<span id="wifi连接测试"></span>
=== WIFI连接测试 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''请不要通过修改/etc/network/interfaces配置文件的方式来连接WIFI,通过这种方式连接WIFI网络使用会有问题。'''</big>|}
<span id="服务器版镜像通过命令连接wifi"></span>
==== 服务器版镜像通过命令连接WIFI ====
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''当开发板没有连接以太网,没有连接HDMI显示器,只连接了串口时,推荐使用此小节演示的命令来连接WIFI网络。因为nmtui在某些串口软件(如minicom)中只能显示字符,无法正常显示图形界面。当然,如果开发板连接了以太网或者HDMI显示屏,也可以使用此小节演示的命令来连接WIFI网络的。'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>先登录Linux系统,有下面三种方式</p>
<ol style="list-style-type: lower-alpha;">
<li>如果开发板连接了网线,可以通过[[\lOrange Pi CM4#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>
<!-- -->
<ol start="2" style="list-style-type: decimal;">
<li><p>首先使用'''nmcli dev wifi'''命令扫描周围的WIFI热点</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''nmcli dev wifi'''</p>
|}
<div class="figure">
[[File:media/image177cm4-img177.png|575x250px|选区_011]]
</div></li>
<li><p>'''wifi_name'''需要换成想连接的WIFI热点的名字</p></li>
<li><p>'''wifi_passwd'''需要换成想连接的WIFI热点的密码</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''nmcli dev wifi connect <span style="color:#FF0000">wifi_name </span>password <span style="color:#FF0000">wifi_passwd</span>'''</p><p>Device 'wlan0' successfully activated with 'cf937f88-ca1e-4411-bb50-61f402eef293'.</p>|}</li></ol>
</li>
<li><p>通过'''ip addr show wlan0'''命令可以查看wifi的IP地址</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ip addr show wlan0'''</p>
<p>11: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 23:8c:d6:ae:76:bb brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.11</span>'''/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0</p>::<p>valid_lft 259192sec preferred_lft 259192sec</p>:<p>inet6 240e:3b7:3240:c3a0:c401:a445:5002:ccdd/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259192sec preferred_lft 172792sec</p>:<p>inet6 fe80::42f1:6019:a80e:4c31/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}</li>
<li><p>使用'''ping'''命令可以测试wifi网络的连通性,'''ping'''命令可以通过'''Ctrl+C'''快捷键来中断运行</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ping www.orangepi.org -I wlan0'''</p>
<p>PING www.orangepi.org (182.92.236.130) from 192.168.1.49 wlan0: 56(84) bytes of data.</p>
<p>--- www.orangepi.org ping statistics ---</p>
<p>5 packets transmitted, 5 received, 0% packet loss, time 4006ms</p>
<p>rtt min/avg/max/mdev = 41.321/44.864/48.834/2.484 ms</p>|}</li></ol>
<span id="服务器版镜像通过图形化方式连接wifi"></span>
==== 服务器版镜像通过图形化方式连接WIFI ====
<li><p>先登录Linux系统,有下面三种方式</p>
<ol style="list-style-type: lower-alpha;">
<li><p>如果开发板连接了网线,可以通过[[\lOrange Pi CM4#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>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''nmtui'''</p>|}</li>
<li><p>输入nmtui命令打开的界面如下所示</p>
<p>[[File:media/image178cm4-img178.png|345x215px]]</p></li>
<li><p>选择'''Activate a connect'''后回车</p>
<p>[[File:media/image179cm4-img179.png|349x216px]]</p></li>
<li><p>然后就能看到所有搜索到的WIFI热点</p>
<p>[[File:media/image180cm4-img180.png|360x229px]]</p></li>
<li><p>选择想要连接的WIFI热点后再使用Tab键将光标定位到'''Activate'''后回车</p>
<p>[[File:media/image181cm4-img181.png|366x230px]]</p></li>
<li><p>然后会弹出输入密码的对话框,在'''Password'''内输入对应的密码然后回车就会开始连接WIFI</p>
<p>[[File:media/image182cm4-img182.png|352x225px]]</p></li>
<li><p>WIFI连接成功后会在已连接的WIFI名称前显示一个”*”</p>
<p>[[File:media/image183cm4-img183.png|349x223px]]</p></li>
<li><p>通过'''ip addr show wlan0'''命令可以查看wifi的IP地址</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ip addr show wlan0'''</p>
<p>11: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 24:8c:d3:aa:76:bb brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.11</span>'''/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0</p>::<p>valid_lft 259069sec preferred_lft 259069sec</p>:<p>inet6 240e:3b7:3240:c4a0:c401:a445:5002:ccdd/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259071sec preferred_lft 172671sec</p>:<p>inet6 fe80::42f1:6019:a80e:4c31/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}</li>
<li><p>使用'''ping'''命令可以测试wifi网络的连通性,'''ping'''命令可以通过'''Ctrl+C'''快捷键来中断运行</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ping www.orangepi.org -I wlan0'''</p>
<p>PING www.orangepi.org (182.92.236.130) from 192.168.1.49 wlan0: 56(84) bytes of data.</p>
<p>--- www.orangepi.org ping statistics ---</p>
<p>5 packets transmitted, 5 received, 0% packet loss, time 4006ms</p>
<p>rtt min/avg/max/mdev = 41.321/44.864/48.834/2.484 ms</p>|}</li></ol>
==== 桌面版镜像的测试方法 ====
<ol style="list-style-type: decimal;">
<li><p>点击桌面右上角的网络配置图标(测试WIFI时请不要连接网线)</p>
<p>[[File:media/image184cm4-img184.png|377x166px]]</p></li>
<li><p>在弹出的下拉框中点击'''More networks'''可以看到所有扫描到的WIFI热点,然后选择想要连接的WIFI热点</p>
<p>[[File:media/image185cm4-img185.png|576x353px]]</p></li>
<li><p>然后输入WIFI热点的密码,再点击'''Connect'''就会开始连接WIFI</p>
<p>[[File:media/image186cm4-img186.png|320x163px]]</p></li>
<li><p>连接好WIFI后,可以打开浏览器查看是否能上网,浏览器的入口如下图所示</p>
<p>[[File:media/image187cm4-img187.png|576x308px]]</p></li>
<li><p>打开浏览器后如果能打开其他网页说明WIFI连接正常</p>
<div class="figure">
[[File:media/image188cm4-img188.png|575x270px|Screenshot from 2023-08-15 09-32-49]]
</div></li></ol>
<span id="设置静态ip地址的方法"></span>
=== 设置静态IP地址的方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''请不要通过修改/etc/network/interfaces配置文件的方式来设置静态IP地址。'''</big>|}
<span id="使用nmtui命令来设置静态ip地址"></span>
<ol style="list-style-type: decimal;">
<li><p>首先运行'''nmtui'''命令</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''nmtui'''</p>|}</li>
<li><p>然后选择'''Edit a connection'''并按下回车键</p>
<p>[[File:media/image189cm4-img189.png|227x247px]]</p></li>
<li><p>然后选择需要设置静态IP地址的网络接口,比如设置'''Ethernet'''接口的静态IP地址选择'''Wired connection 1'''就可以了</p>
<p>[[File:media/image190cm4-img190.png|310x149px]]</p></li>
<li><p>然后通过'''Tab'''键选择'''Edit'''并按下回车键</p>
<p>[[File:media/image191cm4-img191.png|316x144px]]</p></li>
<li><p>然后通过Tab键将光标移动到下图所示的'''<Automatic>'''位置进行IPv4的配置</p>
<p>[[File:media/image192cm4-img192.png|575x240px]]</p></li>
<li><p>然后回车,通过上下方向键选择'''Manual''',然后回车确定</p>
<p>[[File:media/image193cm4-img193.png|576x237px]]</p></li>
<li><p>选择完后的显示如下图所示</p>
<p>[[File:media/image194cm4-img194.png|575x240px]]</p></li>
<li><p>然后通过Tab键将光标移动到'''<Show>'''</p>
<p>[[File:media/image195cm4-img195.png|576x241px]]</p></li>
<li><p>然后回车,回车后会弹出下面的设置界面</p>
<p>[[File:media/image196cm4-img196.png|575x450px]]</p></li><li><p>然后就可以在下图所示的位置设置IP地址(Addresses)、网关(Gateway)和DNS服务器的地址(里面还有很多其他设置选项,请自行探索),'''<span style="color:#FF0000">请根据自己的具体需求来设置,下图中设置的值只是一个示例</span>'''</p><p>[[File:media/image197cm4-img197.png|576x233px]]</p></li>
<li><p>设置完后将光标移动到右下角的'''<OK>''',然后回车确认</p>
<p>[[File:media/image198cm4-img198.png|576x116px]]</p></li>
<li><p>然后点击'''<Back>'''回退到上一级选择界面</p>
<p>[[File:media/image199cm4-img199.png|330x325px]]</p></li>
<li><p>然后选择'''Activate a connection''',再将光标移动到'''<OK>''',最后点击回车</p>
<p>[[File:media/image200cm4-img200.png|331x248px]]</p></li>
<li><p>然后选择需要设置的网络接口,比如'''Wired connection 1''',然后将光标移动到'''<Deactivate>''',再按下回车键禁用'''Wired connection 1'''</p>
<p>[[File:media/image201cm4-img201.png|576x224px]]</p></li>
<li><p>然后请不要移动光标,再按下回车键重新使能'''Wired connection 1''',这样前面设置的静态IP地址就会生效了</p>
<p>[[File:media/image202cm4-img202.png|576x224px]]</p></li>
<li><p>然后通过'''<Back>'''和'''Quit'''按钮就可以退出nmtui</p>
<p>[[File:media/image203cm4-img203.png|300x253px]] [[File:media/image204cm4-img204.png|227x252px]]</p></li>
<li><p>然后通过'''ip addr show eth0'''就能看到网口的IP地址已经变成前面设置的静态IP地址了</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ip addr show eth0'''</p>
<p>3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 5e:ac:14:a5:92:b3 brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.177</span>'''/24 brd 192.168.1.255 scope global noprefixroute eth0</p>::<p>valid_lft forever preferred_lft forever</p>:<p>inet6 241e:3b8:3240:c3a0:e269:8305:dc08:135e/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259149sec preferred_lft 172749sec</p>:<p>inet6 fe80::957d:bbbe:4928:3604/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}</li>
<li><p>然后就可以测试网络的连通性来检查IP地址是否配置OK了,'''ping'''命令可以通过'''Ctrl+C'''快捷键来中断运行</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ping 192.168.1.47 -I eth0'''</p>
<p>PING 192.168.1.47 (192.168.1.47) from 192.168.1.188 eth0: 56(84) bytes of data.</p>
<p>--- 192.168.1.47 ping statistics ---</p>
<p>5 packets transmitted, 5 received, 0% packet loss, time 4042ms</p>
<p>rtt min/avg/max/mdev = 0.233/0.262/0.275/0.015 ms</p>|}</li></ol>
<span id="使用nmcli命令来设置静态ip地址"></span>
==== 使用nmcli命令来设置静态IP地址 ====
<li><p>'''orangepi'''为WIFI网络接口的名字(名字不一定相同)</p></li>
<li><p>'''Wired connection 1'''为以太网接口的名字</p>
</li>
<li><p>然后输入下面的命令,其中</p>
<li><p>'''ipv4.addresses'''后面是要设置的静态IP地址,可以修改为自己想要设置的值</p></li>
<li><p>'''ipv4.gateway''' 表示网关的地址</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''nmcli con mod "Wired connection 1" \'''</p>
<p>'''ipv4.addresses "192.168.1.110" \'''</p>
<p>'''ipv4.gateway "192.168.1.1" \'''</p>
<p>'''ipv4.dns "8.8.8.8" \'''</p>
<p>'''ipv4.method "manual"'''</p>|}</li></ol>
</li>
<li><p>然后重启Linux系统</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo reboot'''</p>|}</li>
<li><p>然后重新进入Linux系统使用'''ip addr show eth0'''命令就可以看到IP地址已经设置为想要的值了</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ip addr show eth0'''</p>
<p>3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000</p>
:<p>link/ether 5e:ae:14:a5:91:b3 brd ff:ff:ff:ff:ff:ff</p>:<p>inet '''<span style="color:#FF0000">192.168.1.110</span>'''/32 brd 192.168.1.110 scope global noprefixroute eth0</p>::<p>valid_lft forever preferred_lft forever</p>:<p>inet6 240e:3b7:3240:c3a0:97de:1d01:b290:fe3a/64 scope global dynamic noprefixroute</p>::<p>valid_lft 259183sec preferred_lft 172783sec</p>:<p>inet6 fe80::3312:861a:a589:d3c/64 scope link noprefixroute</p>::<p>valid_lft forever preferred_lft forever</p>|}</li></ol>
<span id="ssh远程登录开发板"></span>
== SSH远程登录开发板 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Linux系统默认都开启了ssh远程登录,并且允许root用户登录系统。ssh登录前首先需要确保以太网或者wifi网络已连接,然后使用ip addr命令或者通过查看路由器的方式获取开发板的IP地址。'''</big>|}
<span id="ubuntu下ssh远程登录开发板"></span>
# 然后就可以通过ssh命令远程登录Linux系统
::{| class="wikitable" style="width:800px;" |-| test@test:~$ '''ssh [mailto:root@192.168.1.36 root@192.168.1.]xxx''' (需要替换为开发板的IP地址)
root@192.168.1.xx's password: (在这里输入密码,默认密码为orangepi)|}::{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,输入密码的时候,<span style="color:#FF0000">屏幕上是不会显示输入的密码的具体内容的</span>,请不要以为是有什么故障,输入完后直接回车即可。'''
'''注意,输入密码的时候,屏幕上是不会显示输入的密码的具体内容的,请不要以为是有什么故障,输入完后直接回车即可。如果提示拒绝连接,只要使用的是Orange Pi提供的镜像,<span style="color:#FF0000">就请不要怀疑orangepi这个密码是不是不对</span>,而是要找其他原因。'''</big> '''如果提示拒绝连接,只要使用的是Orange Pi提供的镜像,就请不要怀疑orangepi这个密码是不是不对,而是要找其他原因。'''|}
<ol start="3" style="list-style-type: decimal;">
<div class="figure">
[[File:media/image205cm4-img205.png|394x218px|R[`56P}CFQVXI2Y]H1DTBOL]]
</div>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''如果ssh无法正常登陆Linux系统,首先请检查下开发板的IP地址是否能ping通,如果ping通没问题的话,可以通过串口或者HDMI显示器登录Linux系统然后在开发板上输入下面的命令后再尝试是否能连接:'''</p></li></ol>
root@orangepi:~# '''reset_ssh.sh'''
'''如果还不行,请重烧系统试下。'''</big>
|}
</li></ol>
<span id="windows下ssh远程登录开发板"></span>
=== Windows下SSH远程登录开发板 ===
<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:media/image206cm4-img206.png|576x292px]]</p></li></ol>
</li>
<li><p>然后会提示输入密码,默认root和orangepi用户的密码都为orangepi</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意,输入密码的时候,屏幕上是不会显示输入的密码的具体内容的,请不要以为是有什么故障,输入完后直接回车即可。注意,输入密码的时候,<span style="color:#FF0000">屏幕上是不会显示输入的密码的具体内容的</span>,请不要以为是有什么故障,输入完后直接回车即可。'''</p></li></olbig>|}
<div class="figure">
[[File:media/image207cm4-img207.png|578x150px|IMG_256]]
</div></li></ol>
<ol start="4" style="list-style-type: decimal;">
<li>成功登录系统后的显示如下图所示</li></ol>
[[File:media/image208cm4-img208.png|575x364px]]</ol><span id="上传文件到开发板linux系统中的方法"></span>
== 上传文件到开发板Linux系统中的方法 ==
<li><p>'''orangepi:'''为开发板Linux系统的用户名,也可以替换成其它的,比如root</p></li>
<li><p>'''192.168.xx.xx:''' 为开发板的IP地址,请根据实际情况进行修改</p></li>
<li><p>'''/home/orangepi:''' > 开发板Linux系统中的路径,也可以修改为其它的路径</p>{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''scp file_path orangepi@192.168.xx.xx:/home/orangepi/'''</p>|}</li></ol>
</li>
<li><p>如果要上传文件夹,需要加上-r参数</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''scp <span style="color:#FF0000">-r </span> dir_path orangepi@192.168.xx.xx:/home/orangepi/'''</p>|}</li><li><p>scp还有更多的用法,请使用下面的命令查看man手册</p></li></ol>{| class="wikitable" style="width:800px;" |-|
test@test:~$ '''man scp'''
|}
</li></ol>
==== 使用filezilla上传文件的方法 ====
<ol style="list-style-type: decimal;">
<li><p>首先在Ubuntu PC中安装filezilla</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo apt install -y filezilla'''</p>|}</li>
<li><p>然后使用下面的命令打开filezilla</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''filezilla'''</p>|}</li>
<li><p>filezilla打开后的界面如下所示,此时右边远程站点下面显示的是空的</p>
<div class="figure">
[[File:media/image209cm4-img209.png|576x453px|截图 2022-12-03 19-04-40]]
</div></li>
<li><p>连接开发板的方法如下图所示</p></li></ol>
<div class="figure">
[[File:media/image210cm4-img210.png|577x128px|IMG_256]]
</div></ol>
<ol start="5" style="list-style-type: decimal;">
<li><p>然后选择'''保存密码''',再点击'''确定'''</p>
<p>[[File:media/image211cm4-img211.png|249x181px]]</p></li><li><p>然后选择'''总是信任该主机''',再点击'''确定'''</p></li></ol>
<div class="figure">
[[File:media/image212cm4-img212.png|278x150px|IMG_256]]
</div></ol>
<ol start="7" style="list-style-type: decimal;">
<li>连接成功后在filezilla软件的右边就可以看到开发板Linux文件系统的目录结构了</li></ol>
<div class="figure">
[[File:media/image213cm4-img213.png|533x330px|IMG_256]]
</div></ol>
<ol start="8" style="list-style-type: decimal;">
<li>然后在filezilla软件的右边选择要上传到开发板中的路径,再在filezilla软件的左边选中Ubuntu PC中要上传的文件,再点击鼠标右键,再点击上传选项就会开始上传文件到开发板中了。</li></ol>
<div class="figure">
[[File:media/image214cm4-img214.png|529x414px|IMG_256]]
</div></ol>
<ol start="9" style="list-style-type: decimal;">
<li><p>上传完成后就可以去开发板Linux系统中的对应路径中查看上传的文件了</p></li>
<span id="在windows-pc中上传文件到开发板linux系统中的方法"></span>
=== 在Windows PC中上传文件到开发板Linux系统中的方法 ===
# 首先下载filezilla软件Windows版本的安装文件,下载链接如下所示
::{| class="wikitable" style="width:800px;" |-| [https://filezilla-project.org/download.php?type=client '''https://filezilla-project.org/download.php?type=client''']|} ::[[File:media/image215cm4-img215.png|472x171px|IMG_256]] ::[[File:media/image216cm4-img216.png|384x276px]]
<ol start="2" style="list-style-type: decimal;">
<li><p>下载的安装包如下所示,然后双击直接安装即可</p>
{| class="wikitable" style="width:800px;" |-| <p>'''FileZilla_Server_1.5.1_win64-setup.exe'''</p></li></ol>|}
安装过程中,下面的安装界面请选择'''Decline''',然后再选择'''Next>'''
<div class="figure">
[[File:media/image217cm4-img217.png|319x251px|IMG_256]]
</div>
</li></ol>
<ol start="3" style="list-style-type: decimal;">
<li>filezilla打开后的界面如下所示,此时右边远程站点下面显示的是空的</li></ol>
<div class="figure">
[[File:media/image218cm4-img218.png|451x357px|IMG_256]]
</div></ol>
<ol start="4" style="list-style-type: decimal;">
<li>连接开发板的方法如下图所示:</li></ol>
<div class="figure">
[[File:media/image219cm4-img219.png|522x108px|IMG_256]]
</div></ol>
<ol start="5" style="list-style-type: decimal;">
<li>然后选择'''保存密码''',再点击'''确定'''</li></ol>
<div class="figure">
[[File:media/image220cm4-img220.png|207x146px|IMG_256]]
</div></ol>
<ol start="6" style="list-style-type: decimal;">
<li>然后选择'''总是信任该主机''',再点击'''确定'''</li></ol>
<div class="figure">
[[File:media/image221cm4-img221.png|221x109px|IMG_256]]
</div></ol>
<ol start="7" style="list-style-type: decimal;">
<li>连接成功后在filezilla软件的右边就可以看到开发板Linux文件系统的目录结构了</li></ol>
<div class="figure">
[[File:media/image222cm4-img222.png|537x397px|IMG_256]]
</div></ol>
<ol start="8" style="list-style-type: decimal;">
<li>然后在filezilla软件的右边选择要上传到开发板中的路径,再在filezilla软件的左边选中Windows PC中要上传的文件,再点击鼠标右键,再点击上传选项就会开始上传文件到开发板中了</li></ol>
<div class="figure">
[[File:media/image223cm4-img223.png|535x394px|IMG_256]]
</div></ol>
<ol start="9" style="list-style-type: decimal;">
<li><p>上传完成后就可以去开发板Linux系统中的对应路径中查看上传的文件了</p></li>
<span id="hdmi测试"></span>
== HDMI测试 ==
<div class="figure">
[[File:media/image13cm4-img13.png|181x181px|40B5201C-C998-4dcd-BA92-54C1BD4D78D2]]
</div></li>
<li><p>启动Linux系统后如果HDMI显示器有图像输出说明Micro HDMI接口使用正常</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </li></olbig>'''注意,很多笔记本电脑虽然带有HDMI接口,但是笔记本的HDMI接口一般只有输出功能,并没有HDMI in的功能,也就是说并不能将其他设备的HDMI输出显示到笔记本的屏幕上。'''
'''注意,很多笔记本电脑虽然带有HDMI接口,但是笔记本的HDMI接口一般只有输出功能,并没有HDMI in的功能,也就是说并不能将其他设备的HDMI输出显示到笔记本的屏幕上。当想把开发板的Micro HDMI接到笔记本电脑HDMI接口时,请先确认清楚您的笔记本是支持HDMI in的功能。'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''当HDMI没有显示的时候,请先检查下Micro HDMI线有没有插紧,确认接线没问题后,可以换一个不同的屏幕试下有没有显示。'''</big>|}</li></ol>
=== HDMI分辨率设置方法 ===
<ol style="list-style-type: decimal;">
<li><p>首先在'''Settings'''中打开'''Display'''</p>
<p>[[File:media/image224cm4-img224.png|509x327px]]</p></li>
<li><p>然后就能看到系统当前的分辨率</p>
<p>[[File:media/image225cm4-img225.png|382x254px]]</p></li>
<li><p>点击Resolution(分辨率)的下拉框,就可以看到显示器当前支持的所有分辨率</p>
<p>[[File:media/image226cm4-img226.png|415x274px]]</p></li>
<li><p>然后选择想要设置的分辨率,再点击Apply</p>
<p>[[File:media/image227cm4-img227.png|415x277px]]</p></li>
<li><p>等新的分辨率设置完后再选择'''Keep the configuration'''即可</p>
<p>[[File:media/image228cm4-img228.png|447x243px]]</p></li></ol>
== 蓝牙使用方法 ==
<ol style="list-style-type: decimal;">
<li><p>点击桌面右上角的蓝牙图标</p>
<p>[[File:media/image229cm4-img229.png|330x128px]]</p></li>
<li><p>然后选择适配器</p>
<p>[[File:media/image230cm4-img230.png|375x165px]]</p></li>
<li><p>如果有提示下面的界面,请选择'''Yes'''</p>
<p>[[File:media/image231cm4-img231.png|248x85px]]</p></li>
<li><p>然后在蓝牙的适配器设置界面中设置'''Visibility Setting'''为'''Always visible''',然后关闭即可</p>
<p>[[File:media/image232cm4-img232.png|243x229px]]</p></li>
<li><p>然后打开蓝牙设备的配置界面</p>
<p>[[File:media/image233cm4-img233.png|438x179px]]</p></li>
<li><p>点击'''Search'''即可开始扫描周围的蓝牙设备</p>
<p>[[File:media/image234cm4-img234.png|322x217px]]</p></li>
<li><p>然后选择想要连接的蓝牙设备,再点击鼠标右键就会弹出对此蓝牙设备的操作界面,选择'''Pair'''即可开始配对,这里演示的是和Android手机配对</p>
<p>[[File:media/image235cm4-img235.png|338x263px]]</p></li>
<li><p>配对时,桌面的右上角会弹出配对确认框,选择'''Confirm'''确认即可,此时手机上也同样需要进行确认</p>
<p>[[File:media/image236cm4-img236.png|417x152px]]</p></li>
<li><p>和手机配对完后,可以选择已配对的蓝牙设备,然后右键选择'''Send a File'''即可开始给手机发送一张图片</p>
<p>[[File:media/image237cm4-img237.png|439x259px]]</p></li>
<li><p>发送图片的界面如下所示</p>
<p>[[File:media/image238cm4-img238.png|437x253px]]</p></li></ol>
<span id="usb接口测试"></span>
== USB接口测试 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''USB接口是可以接USB hub来扩展USB接口的数量的。'''</big>|}
<span id="连接usb鼠标或键盘测试"></span>
# 执行下面的命令如果能看到sdX的输出说明U盘识别成功
::{| class="wikitable" style="width:800px;"|-|orangepi@orangepi:~$ '''cat /proc/partitions | grep "sd*"'''<br> <span style="margin-right: 30px;">major </span><span style="margin-right: 40px;">minor </span><span style="margin-right: 30px;">#blocks </span><span style="margin-right: 50px;">name</span><br> <span style="margin-right: 70px;">8 </span><span style="margin-right: 60px;">0 </span><span style="margin-right: 50px;">30044160 </span><span style="margin-right: 50px;color:#FF0000">'''sda'''</span><br> <span style="margin-right: 70px;">8 </span><span style="margin-right: 60px;">1 </span><span style="margin-right: 50px;">30043119 </span><span style="margin-right: 50px;color:#FF0000">'''sda1'''</span><br>|}
<ol start="3" style="list-style-type: decimal;">
<li>使用mount命令可以将U盘挂载到'''/mnt'''中,然后就能查看U盘中的文件了</li></ol>{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''sudo mount /dev/sda1 /mnt/'''
test.txt
|}</li></ol>
<ol start="4" style="list-style-type: decimal;">
<li>挂载完后通过'''df -h'''命令就能查看U盘的容量使用情况和挂载点</li></ol>{| class="wikitable" style="width:800px;" |-|
orangepi@orangepi:~$ '''df -h | grep "sd"'''
/dev/sda1 29G 208K 29G 1% /mnt|}</li></ol>
<span id="usb无线网卡测试"></span>
=== USB无线网卡测试 ===
目前'''测试过的'''能用的USB无线网卡如下所示,其他型号的USB无线网卡请自行测试,如果无法使用就需要移植对应的USB无线网卡驱动。
{| class="wikitable" style="width:800px;text-align: center;"
|-
| 序号
|-
| 1
| RTL8723BU
支持2.4G WIFI+BT4.0
| [[File:media/image2%2039cm4-img239.png]]
|-
| 2
| RTL8811
支持2.4G +5G WIFI
| [[File:media/image2%2040cm4-img240.png]]
|}
<li><p>首先将RTL8723BU无线网卡模块插入开发板的USB接口中</p></li>
<li><p>然后Linux系统会自动加载RTL8723BU蓝牙和WIFI相关的内核模块,通过lsmod命令可以看到下面内核模块已自动加载</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''lsmod'''</p>
<pspan style="margin-right: 100px;">Module </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 45px;">Used by</pspan><br><pspan style="margin-right: 100px;">rfcomm </span><span style="margin-right: 50px;">57344 </span><span style="margin-right: 50px;">16</pspan><br><pspan style="margin-right: 95px;">rtl8xxxu </span><span style="margin-right: 50px;">106496 </span><span style="margin-right: 30px;">0</pspan><br><pspan style="margin-right: 90px;">rtk_btusb </span><span style="margin-right: 50px;">61440 </span><span style="margin-right: 30px;">0</pspan><br>|}</li>
<li><p>通过dmesg命令可以看到RTL8723BU模块的加载信息</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''dmesg'''</p>
<p>......</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的连接和测试方法请参看[[\lOrange Pi CM4#WIFI连接测试|'''WIFI连接测试''']]一节,这里不再赘述</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo ifconfig wlx0013eff458ae'''</p>
<p>wlx0013eff458ae: flags=4099<UP,BROADCAST,MULTICAST> 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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo apt update && sudo apt install bluez'''</p>
<p>orangepi@orangepi:~$ '''hciconfig'''</p>
<p>hci0: Type: Primary Bus: '''<span style="color:#FF0000">USB</span>'''</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>在桌面中也可以看到出现了蓝牙图标,此时蓝牙还未打开,所以会显示一个红色的'''<span style="color:#FF0000">x</span>'''</p><p>[[File:media/image241cm4-img241.png|576x157px]]</p></li>
<li><p>点击'''Turn Bluetooth On'''可以打开蓝牙</p>
<p>[[File:media/image242cm4-img242.png|576x262px]]</p></li>
<li><p>打开蓝牙后的显示如下所示</p>
<p>[[File:media/image243cm4-img243.png|576x164px]]</p></li><li><p>蓝牙的测试方法请参看[[\lOrange Pi CM4#蓝牙使用方法|'''蓝牙使用方法''']]一节,这里不再赘述</p></li></ol>
<span id="rtl8811测试"></span>
==== RTL8811测试 ====
<li><p>首先将RTL8811无线网卡模块插入开发板的USB接口中</p></li>
<li><p>然后Linux系统会自动加载RTL8811 WIFI相关的内核模块,通过lsmod命令可以看到下面内核模块已自动加载</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''lsmod'''</p>
<pspan style="margin-right: 100px;">Module </span><span style="margin-right: 50px;">Size </span><span style="margin-right: 45px;">Used by</pspan><br><pspan style="margin-right: 100px;">8821cu </span><span style="margin-right: 50px;">1839104 </span><span style="margin-right: 50px;">0</pspan><br>|}</li>
<li><p>通过dmesg命令可以看到RTL8811模块的加载信息</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''dmesg'''</p>
<p>[ 118.618194] usb 2-1: new high-speed USB device number 2 using ehci-platform</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的连接和测试方法请参看[[\lOrange Pi CM4#WIFI连接测试|'''WIFI连接测试''']]一节,这里不再赘述</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo ifconfig wlx1cbfced9d260'''</p>
<p>wlx1cbfced9d260: flags=4099<UP,BROADCAST,MULTICAST> 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="usb摄像头测试"></span>
=== USB摄像头测试 ===
<ol style="list-style-type: decimal;">
<li><p>首先需要准备一个下图所示的或者类似的支持UVC协议的USB摄像头,然后将USB摄像头插入到Orange Pi开发板的USB接口中</p>
<p>[[File:media/image16cm4-img16.png|259x150px]]</p></li>
<li><p>通过v4l2-ctl命令可以看到USB摄像头的设备节点信息为/dev/video0</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''v4l2-ctl --list-devices'''</p>
<p>Q8 HD Webcam: Q8 HD Webcam ('''<span style="color:#FF0000">usb</span>'''-fc880000.usb-1):</p>::<p>'''/dev/video0'''</p>::<p>/dev/video1</p>::<p>/dev/media0</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意v4l2中的l是小写字母l,不是数字1。'''</p><p>'''另外video的序号不一定都是video0,请以实际看到的为准。'''</p></big>|}</li><li><p>在桌面系统中可以使用Cheese直接打开USB摄像头,Cheese打开方法如下图所示:</p><p>[[File:media/image244cm4-img244.png|474x302px]]</p>
<p>Cheese打开USB摄像头后的界面如下图所示:</p>
<p>[[File:media/image245cm4-img245.png|473x277px]]</p></li>
<li><p>使用fswebcam测试USB摄像头的方法</p>
<ol style="list-style-type: lower-alpha;">
<li><p>安装fswebcam</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo''' '''apt update'''</p>
<p>orangepi@orangepi:~$ '''sudo apt-get install -y fswebcam'''</p>|}</li>
<li><p>安装完fswebcam后可以使用下面的命令来拍照</p>
<ol style="list-style-type: lower-alphanone;"><li><p>a) -d 选项用于指定USB摄像头的设备节点</p></li><li><p>b) --no-banner用于去除照片的水印</p></li><li><p>c) -r 选项用于指定照片的分辨率</p></li><li><p>d) -S 选项用于设置跳过前面的帧数</p></li><li><p>e) ./image.jpg 用于设置生成的照片的名字和路径</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo''' '''fswebcam -d /dev/video0 \'''</p>
<p>'''--no-banner -r 1280x720 -S 5 ./image.jpg'''</p>|}</li></ol>
</li>
<li><p>在服务器版的Linux系统中,拍完照后可以使用scp命令将拍好的图片传到Ubuntu > PC上镜像观看</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''scp image.jpg [mailto:test@192.168.1.55:/home/test test@192.168.1.55:/home/test] (根据实际情况修改IP地址和路径)'''</p>|}</li>
<li><p>在桌面版的Linux系统中,可以通过HDMI显示器直接查看拍摄的图片</p></li></ol>
</li></ol>
<ol style="list-style-type: decimal;">
<li><p>首先打开文件管理器</p>
<p>[[File:media/image246cm4-img246.png|357x176px]]</p></li>
<li><p>然后找到下面这个文件(如果系统中没有这个音频文件,可以自己上传一个音频文件到系统中)</p>
<p>[[File:media/image247cm4-img247.png|283x225px]]</p></li>
<li><p>然后选中audio.wav文件,右键选择使用vlc打开就可以开始播放</p>
<p>[[File:media/image248cm4-img248.png|288x234px]]</p></li>
<li><p>切换HDMI播放和耳机播放等不同音频设备的方法</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先打开音量控制界面</p>
<p>[[File:media/image249cm4-img249.png|308x169px]]</p></li>
<li><p>播放音频的时候,在'''Playback'''中会显示播放软件可以使用的音频设备选项,如下图所示,在这里可以设置需要播放到哪个音频设备</p>
<p>[[File:media/image250cm4-img250.png|576x282px]]</p></li></ol>
</li></ol>
<ol style="list-style-type: decimal;">
<li><p>首先将耳机插入开发板的耳机孔中</p>
<p>[[File:media/image251cm4-img251.png|466x110px]]</p></li>
<li><p>然后可以通过'''aplay -l'''命令可以查看下Linux系统支持的声卡设备,从下面的输出可知,'''card 0'''为rk809的声卡设备,也就是耳机的声卡设备</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''aplay -l'''</p>
<p>**** List of PLAYBACK Hardware Devices ****</p>
<p>'''card 0: rockchiprk809 [rockchip-rk809], device 0: dailink-multicodecs rk817-hifi-0 [dailink-multicodecs rk817-hifi-0]'''</p>
:<p>'''Subdevices: 0/1'''</p>:<p>'''Subdevice #0: subdevice #0'''</p>
<p>card 1: rockchiphdmi [rockchip,hdmi], device 0: fe400000.i2s-i2s-hifi i2s-hifi-0 [fe400000.i2s-i2s-hifi i2s-hifi-0]</p>
:<p>Subdevices: 0/1</p>:<p>Subdevice #0: subdevice #0</p>:<p>Subdevice #0: subdevice #0</p>|}</li>
<li><p>然后使用'''aplay'''命令播放下系统自带的音频文件,如果耳机能听到声音说明硬件能正常使用</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''aplay -D hw:0,0 /usr/share/sounds/alsa/audio.wav'''</p>
<p>Playing WAVE 'audio.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo</p>|}</li></ol>
<span id="hdmi音频播放测试"></span>
==== HDMI音频播放测试 ====
<li><p>首先使用Micro HDMI 转HDMI线将Orange Pi开发板连接到电视机上(其他的HDMI显示器需要确保可以播放音频)</p></li>
<li><p>然后查看下HDMI的声卡序号,从下面的输出可以知道HDMI的声卡为'''card 1'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''aplay -l'''</p>
<p>**** List of PLAYBACK Hardware Devices ****</p>
<p>card 0: rockchiprk809 [rockchip-rk809], device 0: dailink-multicodecs rk817-hifi-0 [dailink-multicodecs rk817-hifi-0]</p>
:<p>Subdevices: 0/1</p>:<p>Subdevice #0: subdevice #0</p>
<p>'''card 1: rockchiphdmi [rockchip,hdmi], device 0: fe400000.i2s-i2s-hifi i2s-hifi-0 [fe400000.i2s-i2s-hifi i2s-hifi-0]'''</p>
:<p>'''Subdevices: 0/1'''</p>:<p>'''Subdevice #0: subdevice #0'''</p>:<p>'''Subdevice #0: subdevice #0'''</p>|}</li>
<li><p>然后使用'''aplay'''命令播放下系统自带的音频文件,如果HDMI显示器或者电视能听到声音说明硬件能正常使用</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''aplay -D hw:<span style="color:#FF0000">1</span>,0 /usr/share/sounds/alsa/audio.wav'''</p>|}</li></ol>
=== 使用命令测试录音的方法 ===
<ol style="list-style-type: decimal;">
<li><p>Orange Pi CM4开发板没有板载MIC,只能通过带MIC功能的耳机来录制音频。将带MIC功能的耳机插入开发板后,运行下面的命令会通过耳机录制一段音频</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''amixer -c 0 cset name='Capture MIC Path' 'Main Mic''''</p>
<p>orangepi@orangepi:~$ '''arecord -D hw:0,0 -d 5 -f cd -t wav /tmp/test.wav'''</p>|}</li></ol>
== 温度传感器 ==
# 查看系统温度传感器的命令为:
::{| class="wikitable" style="width:800px;"
|-
|
orangepi@orangepi:~$ '''sensors'''
Adapter: Virtual device
temp1: +41.9°C (crit = +115.0°C)
gpu_thermal-virtual-0
Adapter: Virtual device
temp1: +43.8°C|}
<ol start="2" style="list-style-type: decimal;">
<li><p>查看nvme ssd固态硬盘当前温度的命令为:</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo smartctl -a /dev/nvme0 | grep "Temperature:"'''</p>
<p>Temperature: '''<span style="color:#FF0000">40 Celsius</span>'''</p>|}</li></ol>
<span id="pin接口引脚说明"></span>
== 40 Pin接口引脚说明 ==
<ol style="list-style-type: decimal;">
<li><p>Orange Pi CM4开发板40 pin接口引脚的顺序请参考下图</p>
<p>[[File:media/image252cm4-img252.png|478x94px]]</p></li>
<li><p>Orange Pi CM4开发板40 pin接口引脚的功能如下表所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>下面是40pin完整的引脚图</p>
<p>[[File:media/image253cm4-img253.png|575x176px]]</p></li>
<li><p>下面的表格是上面完整表格左半边部分的图,能看得清楚点</p>
<p>[[File:media/image254cm4-img254.png|492x294px]]</p></li>
<li><p>下面的表格是上面完整表格右半边部分的图,能看得清楚点</p>
<p>[[File:media/image255cm4-img255.png|491x305px]]</p></li></ol>
</li>
<li><p>40pin接口中总共有'''<span style="color:#FF0000">28</span>'''个GPIO口,所有GPIO口的电压都是'''<span style="color:#FF0000">3.3v</span>'''</p></li></ol>
<span id="安装wiringop的方法"></span>
== 安装wiringOP的方法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,Orange Pi发布的Linux镜像中已经预装了wiringOP,除非wiringOP的代码有更新,否则无需重新下载编译安装,直接使用即可。'''
'''编译好的wiringOP的deb包在orangepi-build中的存放路径为:'''
'''<span style="color:blue">orangepi-build/external/cache/debs/arm64/wiringpi_x.xx.deb</span>'''
'''进入系统后可以运行下gpio readall命令,如果能看到下面的输出,说明wiringOP已经预装并且能正常使用。'''</big>
<div class="figure">
[[File:media/image256cm4-img256.png|575x352px|DGH7EEA7KFTH_@G9X9W6~SDcenter]]
</div>
<big>'''wiringOP目前主要适配了设置GPIO口输入输出,设置GPIO口输出高低电平以及设置上下拉电阻的功能,像硬件PWM这样的功能是用不了的。'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>下载wiringOP的代码</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意,Orange Pi CM4需要下载wiringOP next分支的代码,请别漏了-b next这个参数。'''</p><p>'''如果从GitHub下载代码有问题,可以直接使用Linux镜像中自带的wiringOP源码,存放位置为:/usr/src/wiringOP。'''</p></big>|}</li>
<li><p>编译安装wiringOP</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
<div class="figure">
[[File:media/image256cm4-img256.png|575x352px|DGH7EEA7KFTH_@G9X9W6~SD]]
</div></li></ol>
<span id="pin接口gpioi2cuartspi和pwm测试"></span>
== 40pin接口GPIO、I2C、UART、SPI和PWM测试 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,如果需要设置overlays同时打开多个配置,请像下面这样使用空格隔开写在一行即可。'''</big>
orangepi@orangepi:~$ '''sudo vim /boot/orangepiEnv.txt'''
'''<span style="color:#FF0000">overlays=spi3-m0-cs0-spidev i2c2-m1 i2c3-m0 uart7-m2 uart9-m2 pwm11-m1</span>'''|}
<span id="pin-gpio口测试"></span>
=== 40pin GPIO口测试 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''Orange Pi发布的Linux系统中有预装一个blink_all_gpio程序,这个程序会设置40pin中的所有28个GPIO口不停的切换高低电平。'''
'''运行blink_all_gpio程序后,当用万用表去测量GPIO口的电平时,会发现GPIO引脚会在0和3.3v之间不停的切换。使用这个程序我们可以来测试GPIO口是否能正常工作。'''
'''运行blink_all_gpio程序的方式如下所示:'''</big> orangepi@orangepicm4:~$ '''sudo blink_all_gpio''' #记得加sudo权限
[sudo] password for orangepi: #在这里需要输入密码|}
<ol style="list-style-type: decimal;">
<li><p>开发板40pin中总共有'''28'''个GPIO口可以使用,下面以7号引脚——对应GPIO为GPIO4_C3 ——对应wPi序号为2——为例演示如何设置GPIO口的高低电平</p>
<p>[[File:media/image257cm4-img257.png|575x119px]]</p></li>
<li><p>首先设置GPIO口为输出模式,其中第三个参数需要输入引脚对应的wPi的序号</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio mode <span style="color:#FF0000">2 </span> out'''</p>|}</li><li><p>然后设置GPIO口输出低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为0v,说明设置低电平成功</p>{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio write 2 <span style="color:#FF0000">0</span>'''</p>|}<p>使用gpio readall可以看到7号引脚的值(V)变为了0</p><p>[[File:media/image258cm4-img258.png|576x119px]]</p></li>
<li><p>然后设置GPIO口输出高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为3.3v,说明设置高电平成功</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio write 2 <span style="color:#FF0000">1</span>'''</p>|}
<p>使用gpio readall可以看到7号引脚的值(V)变为了1</p>
<p>[[File:media/image259cm4-img259.png|575x123px]]</p></li>
<li><p>其他引脚的设置方法类似,只需修改wPi的序号为引脚对应的序号即可</p></li></ol>
<span id="pin-gpio口上下拉电阻的设置方法"></span>
=== 40pin GPIO口上下拉电阻的设置方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,Orange Pi CM4下面4个GPIO引脚因为外部有3.3V上拉,所以设置下拉是无效的,其它的引脚可以正常设置上下拉电阻功能'''</big>
[[File:media/image260cm4-img260.png|575x353pxcenter]]|}
<ol style="list-style-type: decimal;">
<li><p>下面以11号引脚——对应GPIO为GPIO3_C6 ——对应wPi序号为5——为例演示如何设置GPIO口的上下拉电阻</p>
<p>[[File:media/image261cm4-img261.png|576x160px]]</p></li>
<li><p>首先需要设置GPIO口为输入模式,其中第三个参数需要输入引脚对应的wPi的序号</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio mode <span style="color:#FF0000">5 </span> in'''</p>|}</li>
<li><p>设置为输入模式后,执行下面的命令可以设置GPIO口为上拉模式</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio mode <span style="color:#FF0000">5 </span> up'''</p>|}</li>
<li><p>然后输入下面的命令读取GPIO口的电平,如果电平为1,说明上拉模式设置成功</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio read <span style="color:#FF0000">5</span>'''</p><p>'''<span style="color:#FF0000">1</span>'''</p>|}</li>
<li><p>然后执行下面的命令可以设置GPIO口为下拉模式</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio mode <span style="color:#FF0000">5 </span> down'''</p>|}</li>
<li><p>然后输入下面的命令读取GPIO口的电平,如果电平为0,说明下拉模式设置成功</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP# '''gpio read <span style="color:#FF0000">5</span>'''</p><p>'''<span style="color:#FF0000">0</span>'''</p>|}</li></ol>
<span id="pin-spi测试"></span>
=== 40pin SPI测试 ===
<ol style="list-style-type: decimal;">
<li><p>由40pin接口的原理图可知,Orange Pi CM4可用的spi为spi3</p>
<p>[[File:media/image262cm4-img262.png|575x192px]]</p></li>
<li><p>在linux系统中,40 pin中的SPI默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image263cm4-img263.png|397x205px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image264cm4-img264.png|389x169px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的SPI的配置</p>
<p>[[File:media/image265cm4-img265.png|393x244px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image266cm4-img266.png|396x161px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image267cm4-img267.png|393x158px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image268cm4-img268.png|332x146px]]</p></li></ol>
</li>
<li><p>重启后进入系统先查看下Linux系统中是否存在'''spidev3.0'''的设备节点,如果存在,说明SPI3已经设置好了,可以直接使用</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ls /dev/spidev3.0'''</p>
<p>/dev/spidev3.0</p>|}</li>
<li><p>先不短接SPI3的mosi和miso两个引脚,运行spidev_test的输出结果如下所示,可以看到TX和RX的数据不一致</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev3.0'''</p>
<p>spi mode: 0x0</p>
<p>bits per word: 8</p>
<p>max speed: 500000 Hz (500 KHz)</p>
<p>TX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒.</p><p>RX | FF FF FF FF FF FF '''<span style="color:#FF0000">FF FF FF FF FF FF</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | ............................….</p>|}</li>
<li><p>然后短接SPI3的mosi(40pin接口中的第19号引脚)和miso(40pin接口中的第21号引脚)两个引脚再运行spidev_test的输出如下,可以看到发送和接收的数据一样</p>
<p>[[File:media/image269cm4-img269.png|479x109px]]</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo spidev_test -v -D /dev/spidev3.0'''</p>
<p>spi mode: 0x0</p>
<p>bits per word: 8</p>
<p>max speed: 500000 Hz (500 KHz)</p>
<p>TX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒.</p><p>RX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.…▒..................▒.</p>|}</li></ol>
<span id="pin-i2c测试"></span>
=== 40pin I2C测试 ===
<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi CM4可用的i2c为i2c2、i2c3和i2c4共三组 i2c总线</p>
<p>[[File:media/image270cm4-img270.png|576x174px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''从上表中可以看到,i2c4_m0和spi3_m0是引脚复用的,两者不能同时打开,i2c3_m0和uart3_m0也是引脚复用的,两者不能同时打开'''</p></big>|}</li>
<li><p>在linux系统中,40 pin中的I2C总线默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image263cm4-img263.png|397x205px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image264cm4-img264.png|385x167px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的I2C的配置</p>
<p>[[File:media/image271cm4-img271.png|380x53px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image266cm4-img266.png|382x156px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image267cm4-img267.png|386x155px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image268cm4-img268.png|254x112px]]</p></li></ol>
</li>
<li><p>启动Linux系统后,先确认下/dev下存在i2c的设备节点</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~# '''ls /dev/i2c-*'''</p>
<p>/dev/i2c-0 '''/dev/i2c-2''' '''/dev/i2c-3''' '''/dev/i2c-4''' /dev/i2c-6</p>|}</li><li><p>然后在40pin接头的i2c引脚上接一个i2c设备</p></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
|
| 对应6号引脚
|}
</ol>
<ol start="5" style="list-style-type: decimal;">
<li><p>然后使用'''i2cdetect -y'''命令如果能检测到连接的i2c设备的地址,就说明i2c能正常使用</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ sudo i2cdetect -y 2 #i2c2的命令</p><p>orangepi@orangepi:~$ sudo i2cdetect -y 3 #i2c3的命令</p><p>orangepi@orangepi:~$ sudo i2cdetect -y 4 #i2c4的命令</p>|}</li></ol>
[[File:media/image272cm4-img272.png|416x164px]]</ol><span id="pin的uart测试"></span>
=== 40pin的UART测试 ===
<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi CM4可用的uart为uart3、uart7和uart9共三组uart总线</p>
<p>[[File:media/image273cm4-img273.png|575x176px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''从上表中可以看到,i2c3_m0和uart3_m0是引脚复用的,两者不能同时打开'''</p></big>|}</li>
<li><p>在linux系统中,40 pin中的UART默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li><li><p>然后选择'''System'''</p><p>[[File:media/image263cm4-img263.png|397x205px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image264cm4-img264.png|403x175px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的UART的配置</p>
<p>[[File:media/image274cm4-img274.png|333x49px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image275cm4-img275.png|331x137px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image276cm4-img276.png|323x132px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image268cm4-img268.png|235x103px]]</p></li></ol>
</li>
<li><p>进入Linux系统后,先确认下/dev下是否存在对应uart的设备节点</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~# '''ls /dev/ttyS*'''</p>
<p>/dev/ttyS1 '''/dev'''/'''ttyS3 /dev/ttyS7 /dev/ttyS9'''</p>|}</li><li><p>然后开始测试uart接口,先使用杜邦线短接要测试的uart接口的rx和tx</p></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
|
|}
[[File:media/image277cm4-img277.png|586x125px]]</ol>
<ol start="5" style="list-style-type: decimal;">
<li><p>使用'''gpio serial'''命令测试串口的回环功能如下所示,如果能看到下面的打印,说明串口通信正常</p>
<ol style="list-style-type: lower-alpha;">
<li><p>测试UART3</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo gpio serial /dev/ttyS3'''</p>
<p>[sudo] password for orangepi: #在这里输入密码</p>
<p>Out: 0: -> 0</p>
<p>Out: 1: -> 1</p>
<p>Out: 3: -> 3</p>
<p>Out: 4: -> 4</p>
<p>Out: 5: -> 5^C</p>|}</li>
<li><p>测试UART7</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo gpio serial /dev/ttyS7'''</p>
<p>[sudo] password for orangepi: #在这里输入密码</p>
<p>Out: 0: -> 0</p>
<p>Out: 1: -> 1</p>
<p>Out: 3: -> 3</p>
<p>Out: 4: -> 4</p>
<p>Out: 5: -> 5^C</p>|}</li>
<li><p>测试UART9</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo gpio serial /dev/ttyS9'''</p>
<p>[sudo] password for orangepi: #在这里输入密码</p>
<p>Out: 0: -> 0</p>
<p>Out: 1: -> 1</p>
<p>Out: 3: -> 3</p>
<p>Out: 4: -> 4</p>
<p>Out: 5: -> 5^C</p>|}</li></ol>
</li></ol>
<span id="pwm的测试方法"></span>
=== PWM的测试方法 ===
<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi CM4可用的pwm11和pwm15共两路pwm</p>
<p>[[File:media/image278cm4-img278.png|575x176px]]</p></li>
<li><p>在linux系统中,40 pin中的PWM默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image279cm4-img279.png|416x192px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image264cm4-img264.png|457x198px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的PWM的配置</p>
<p>[[File:media/image280cm4-img280.png|371x37px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image266cm4-img266.png|366x149px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image267cm4-img267.png|369x148px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image268cm4-img268.png|235x103px]]</p></li></ol>
</li>
<li><p>当打开一个pwm后,在'''/sys/class/pwm/'''中就会多出一个pwmchipX(X为具体的的数字),比如打开pwm11后,查看'''/sys/class/pwm/'''下的pwmchipX会由一个变成了两个</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ls /sys/class/pwm/'''</p>
<p>pwmchip0 pwmchip1</p>|}</li>
<li><p>上面哪个pwmchip对应pwm11呢,我们先查看下 '''ls /sys/class/pwm/ -l'''命令的输出,如下所示:</p>
<p>[[File:media/image281cm4-img281.png|575x48px]]</p></li>
<li><p>然后由下表可知,pwm11寄存器的基地址为fe6f0030,再看 '''ls /sys/class/pwm/ -l'''命令的输出,可以看到pwmchip1中链接到了fe6f0030.pwm,所以pwm11对应pwmchip为pwmchip1</p>
<p>[[File:media/image282cm4-img282.png|426x265px]]</p></li><li><p>然后使用下面的命令可以让pwm11输出一个50Hz的方波(请先切换到root用户,再执行下面的命令)</p></li></ol>{| class="wikitable" style="width:800px;" |-|
root@orangepi:~# '''echo 0 > /sys/class/pwm/pwmchip1/export'''
root@orangepi:~# '''echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable'''
|}
[[File:media/image283cm4-img283.png|575x346px]]</li></ol>
<ol start="7" style="list-style-type: decimal;">
<li>上面演示的pwm11的测试方法,其他pwm测试方法都是类似的。</li></ol>
<span id="wiringop-python的安装使用方法"></span>
== wiringOP-Python的安装使用方法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''wiringOP-Python是wiringOP的Python语言版本的库,用于在Python程序中操作开发板的GPIO、I2C、SPI和UART等硬件资源。'''
'''另外请注意下面所有的命令都是在root用户下操作的。另外请注意下面所有的命令都是在<span style="color:#FF0000">root</span>用户下操作的。'''</big>|}
<span id="wiringop-python的安装方法"></span>
<ol style="list-style-type: decimal;">
<li><p>首先安装依赖包</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~# '''sudo apt-get update'''</p>
<p>root@orangepi:~# '''sudo apt-get -y install git swig python3-dev python3-setuptools'''</p>|}</li><li><p>然后使用下面的命令下载wiringOP-Python的源码</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </libig></ol> '''注意,下面的git clone--recursive命令会自动下载wiringOP的源码,因为wiringOP-Python是依赖wiringOP的。请确保下载过程没有因为网络问题而报错。''' '''如果从GitHub下载代码有问题,可以直接使用Linux镜像中自带的wiringOP-Python源码,存放位置为:/usr/src/wiringOP-Python'''。
'''如果从GitHub下载代码有问题,可以直接使用Linux镜像中自带的wiringOP-Python源码,存放位置为:/usr/src/wiringOP-Python'''。</big>
|}
{| class="wikitable" style="width:800px;"
|-
|
root@orangepi:~# '''git clone --recursive https://github.com/orangepi-xunlong/wiringOP-Python -b next'''
root@orangepi:~/wiringOP-Python# '''git submodule update --init --remote'''
|}</li></ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>然后使用下面的命令编译wiringOP-Python并将其安装到开发板的Linux系统中</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~# '''cd wiringOP-Python'''</p>
<p>root@orangepi:~/wiringOP-Python# '''python3 generate-bindings.py > bindings.i'''</p>
<p>root@orangepi:~/wiringOP-Python# '''sudo python3 setup.py install'''</p>|}</li><li><p>然后输入下面的命令,如果有帮助信息输出,说明wiringOP-Python安装成功,按下'''q'''键可以退出帮助信息的界面</p></li></ol>{| class="wikitable" style="width:800px;" |-|
root@orangepi:~/wiringOP-Python# '''python3 -c "import wiringpi; 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.
: # the SWIG interface file instead.
|}
</li></ol>
<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>{| class="wikitable" style="width:800px;" |-|
root@orangepi:~# '''python3'''
|}</ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li>然后导入wiringpi的python模块</li></ol>{| class="wikitable" style="width:800px;" |-|
>>> '''import wiringpi;'''
|}</ol>
<ol start="3" style="list-style-type: lower-alpha;">
<li>最后输入下面的命令可以查看下wiringOP-Python的帮助信息,按下'''q'''键可以退出帮助信息的界面</li></ol>{| class="wikitable" style="width:800px;" |-|
>>> '''help(wiringpi)'''
Help on module wiringpi:
NAME
:wiringpi
DESCRIPTION
: # This file was automatically generated by SWIG (http://www.swig.org). : # Version 4.0.2
: # Version 4.0.2
: #Do not make changes to this file unless you know what you are doing--modify
: # Do not make changes to this the SWIG interface file unless you know what you are doing--modifyinstead.
CLASSES
:builtins.object ::GPIO
:| GPIO(pinmode=0)
>>>
|}
</ol>
</li></ol>
<span id="pin-gpio口测试-1"></span>
=== 40pin GPIO口测试 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''wiringOP-Python跟wiringOP一样,也是可以通过指定wPi号来确定操作哪一个GPIO引脚,因为wiringOP-Python中没有查看wPi号的命令,所以只能通过wiringOP中的gpio命令来查看板子wPi号与物理引脚的对应关系。'''</big>
<div class="figure">
[[File:media/image256cm4-img256.png|575x352px|DGH7EEA7KFTH_@G9X9W6~SDcenter]]
</div>
|}
<ol style="list-style-type: decimal;">
<li><p>下面以7号引脚——对应GPIO为GPIO4_C3 ——对应wPi序号为2——为例演示如何设置GPIO口的高低电平</p>
<p>[[File:media/image257cm4-img257.png|575x119px]]</p></li>
<li><p>直接用命令测试的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先设置GPIO口为输出模式,其中'''pinMode'''函数的第一个参数是引脚对应的wPi的序号,第二个参数是GPIO的模式</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~/wiringOP-Python# '''python3 -c "import wiringpi; \'''</p>
<p>'''from wiringpi import GPIO; wiringpi.wiringPiSetup() ; \'''</p>
<p>'''wiringpi.pinMode(<span style="color:#FF0000">2, GPIO.OUTPUT</span>) ; "'''</p>|}</li>
<li><p>然后设置GPIO口输出低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为0v,说明设置低电平成功</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~/wiringOP-Python# '''python3 -c "import wiringpi; \'''</p>
<p>'''from wiringpi import GPIO; wiringpi.wiringPiSetup() ;\'''</p>
<p>'''wiringpi.digitalWrite(<span style="color:#FF0000">2, GPIO.LOW</span>)"'''</p>|}</li>
<li><p>然后设置GPIO口输出高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为3.3v,说明设置高电平成功</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~/wiringOP-Python# '''python3 -c "import wiringpi; \'''</p>
<p>'''from wiringpi import GPIO; wiringpi.wiringPiSetup() ;\'''</p>
<p>'''wiringpi.digitalWrite(<span style="color:#FF0000">2, GPIO.HIGH</span>)"'''</p>|}</li></ol>
</li>
<li><p>在python3的命令行中测试的步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先使用python3命令进入python3的命令行模式</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''python3'''</p>|}</li>
<li><p>然后导入wiringpi的python模块</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>>>> '''import wiringpi'''</p>
<p>>>> '''from wiringpi import GPIO'''</p>|}</li>
<li><p>然后设置GPIO口为输出模式,其中'''pinMode'''函数的第一个参数是引脚对应的wPi的序号,第二个参数是GPIO的模式</p>
{| class="wikitable" style="width:800px;" |-| <p>>>> '''wiringpi.wiringPiSetup()'''</p>
<p>0</p>
<p>>>> '''wiringpi.pinMode(<span style="color:#FF0000">2, GPIO.OUTPUT</span>)'''</p>|}</li>
<li><p>然后设置GPIO口输出低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为0v,说明设置低电平成功</p>
{| class="wikitable" style="width:800px;" |-| <p>>>> '''wiringpi.digitalWrite(2, <span style="color:#FF0000">GPIO.LOW</span>)'''</p>|}</li>
<li><p>然后设置GPIO口输出高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为3.3v,说明设置高电平成功</p>
{| class="wikitable" style="width:800px;" |-| <p>>>> '''wiringpi.digitalWrite(2, <span style="color:#FF0000">GPIO.HIGH</span>)'''</p>|}</li></ol>
</li>
<li><p>wiringOP-Python在python代码中设置GPIO高低电平的方法可以参考下examples中的'''blink.py'''测试程序,'''blink.py'''测试程序会设置开发板40 pin中所有的GPIO口的电压不断的高低变化</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>由40pin接口的原理图可知,Orange Pi CM4可用的spi为spi3</p>
<p>[[File:media/image262cm4-img262.png|575x192px]]</p></li>
<li><p>在linux系统中,40 pin中的SPI默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image263cm4-img263.png|397x205px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image264cm4-img264.png|389x169px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的SPI的配置</p>
<p>[[File:media/image265cm4-img265.png|393x244px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image266cm4-img266.png|396x161px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image267cm4-img267.png|393x158px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image268cm4-img268.png|332x146px]]</p></li></ol>
</li>
<li><p>先查看下Linux系统中是否存在'''spidev3.0'''的设备节点,如果存在,说明SPI3已经设置好了,可以直接使用</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ls /dev/spidev3.0'''</p>
<p>/dev/spidev3.0</p>|}</li>
<li><p>然后可以使用examples中的'''spidev_test.py'''程序测试下SPI的回环功能,'''spidev_test.py'''程序需要指定下面的两个参数:</p>
<ol style="list-style-type: lower-alpha;">
</li>
<li><p>先不短接 SPI3 的 mosi 和 miso 两个引脚,运行 spidev_test.py 的输出结果如下所示,可以看到 TX 和 RX 的数据不一致</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p></li></ol>
root@orangepi:~/wiringOP-Python/examples# '''python3 spidev_test.py \'''
Opening device /dev/spidev3.0
TX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…| 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 |.............….|
RX | FF FF FF FF FF FF '''<span style="color:#FF0000">FF FF FF FF FF FF</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |.............….|
|}
</li></ol>
<ol start="6" style="list-style-type: decimal;">
<li><p>然后使用杜邦线短接SPI3的txd(40pin接口中的第19号引脚)和rxd(40pin接口中的第21号引脚)两个引脚再运行spidev_test.py的输出如下,可以看到发送和接收的数据一样,说明SPI3回环测试正常</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p></li></ol>
root@orangepi:~/wiringOP-Python/examples# '''python3 spidev_test.py \'''
Opening device /dev/spidev3.0
TX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…|
RX | FF FF FF FF FF FF '''<span style="color:#FF0000">40 00 00 00 00 95</span>''' FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.......…||}</li></ol><span id="pin-i2c测试-1"></span>
=== 40pin I2C测试 ===
<ol style="list-style-type: decimal;">
<li><p>由下表可知,Orange Pi CM4可用的i2c为i2c2、i2c3和i2c4共三组 i2c总线</p>
<p>[[File:media/image270cm4-img270.png|576x174px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''从上表中可以看到,i2c4_m0和spi3_m0是引脚复用的,两者不能同时打开,i2c3_m0和uart3_m0也是引脚复用的,两者不能同时打开'''</p></big>|}</li><li><p>在linux系统中,40 pin中的I2C总线默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image263cm4-img263.png|397x205px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image264cm4-img264.png|385x167px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的I2C的配置</p>
<p>[[File:media/image271cm4-img271.png|380x53px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image266cm4-img266.png|382x156px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image267cm4-img267.png|386x155px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image268cm4-img268.png|254x112px]]</p></li></ol>
</li>
<li><p>启动Linux系统后,先确认下/dev下存在i2c的设备节点</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~# '''ls /dev/i2c-*'''</p>
<p>/dev/i2c-0 '''/dev/i2c-2''' '''/dev/i2c-3''' '''/dev/i2c-4''' /dev/i2c-6</p>|}</li><li><p>然后在40pin接头的i2c引脚上接一个i2c设备,这里以ds1307 RTC模块为例</p></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
|
|}
[[File:media/image284cm4-img284.png|180x153px]]</li></ol>
<ol start="5" style="list-style-type: decimal;">
<li><p>然后使用'''i2cdetect -y'''命令如果能检测到连接的i2c设备的地址,就说明i2c能正常使用</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ sudo i2cdetect -y 2 #i2c2的命令</p><p>orangepi@orangepi:~$ sudo i2cdetect -y 3 #i2c3的命令</p><p>orangepi@orangepi:~$ sudo i2cdetect -y 4 #i2c4的命令</p>|}<p>[[File:media/image272cm4-img272.png|416x164px]]</p></li>
<li><p>然后可以运行'''examples'''中的'''ds1307.py'''测试程序读取RTC的时间</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~/wiringOP-Python# '''cd examples'''</p>
<p>root@orangepi:~/wiringOP-Python/examples# '''python3 ds1307.py --device \'''</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 CM4可用的uart为uart3、uart7和uart9共三组uart总线</p>
<p>[[File:media/image273cm4-img273.png|575x176px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''从上表中可以看到,i2c3_m0和uart3_m0是引脚复用的,两者不能同时打开'''</p></big>|}</li>
<li><p>在linux系统中,40 pin中的UART默认都是关闭的,需要手动打开才能使用。详细步骤如下所示:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image263cm4-img263.png|397x205px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image264cm4-img264.png|403x175px]]</p></li>
<li><p>然后使用键盘的方向键定位到下图所示的位置,再使用'''空格'''选中想要打开的UART的配置</p>
<p>[[File:media/image274cm4-img274.png|333x49px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image275cm4-img275.png|331x137px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image276cm4-img276.png|323x132px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image268cm4-img268.png|235x103px]]</p></li></ol>
</li>
<li><p>进入Linux系统后,先确认下/dev下是否存在对应uart的设备节点</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~# '''ls /dev/ttyS*'''</p>
<p>/dev/ttyS1 '''/dev'''/'''ttyS3 /dev/ttyS7 /dev/ttyS9'''</p>|}</li><li><p>然后开始测试uart接口,先使用杜邦线短接要测试的uart接口的rx和tx</p></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
|
|}
[[File:media/image277cm4-img277.png|585x125px]]</li></ol>
<ol start="5" style="list-style-type: decimal;">
<li><p>使用examples中的'''serialTest.py'''程序测试串口的回环功能如下所示,如果能看到下面的打印,说明串口通信正常</p>
<ol style="list-style-type: lower-alpha;">
<li><p>测试UART3</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~/wiringOP-Python/examples# '''python3 serialTest.py --device \'''</p>
<p>'''"/dev/ttyS3"'''</p>
<p>Out: 0: -> 0</p>
<p>Out: 1: -> 1</p>
<p>Out: 3: -> 3</p>
<p>Out: 4:^C</p>
<p>exit</p>|}</li>
<li><p>测试UART7</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~/wiringOP-Python/examples# '''python3 serialTest.py --device \'''</p>
<p>'''"/dev/ttyS7"'''</p>
<p>Out: 0: -> 0</p>
<p>Out: 1: -> 1</p>
<p>Out: 3: -> 3</p>
<p>Out: 4:^C</p>
<p>exit</p>|}</li>
<li><p>测试UART9</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>root@orangepi:~/wiringOP-Python/examples# '''python3 serialTest.py --device \'''</p>
<p>'''"/dev/ttyS9"'''</p>
<p>Out: 0: -> 0</p>
<p>Out: 1: -> 1</p>
<p>Out: 3: -> 3</p>
<p>Out: 4:^C</p>
<p>exit</p>|}</li></ol>
</li></ol>
<li><p>第二个参数10表示看门狗的计数时间,如果这个时间内没有喂狗,系统会重启</p></li>
<li><p>我们可以通过按下键盘上的任意键(ESC除外)来喂狗,喂狗后,程序会打印一行keep alive表示喂狗成功</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo watchdog_test 10'''</p>
<p>open success</p>
<p>keep alive</p>
<p>keep alive</p>
<p>keep alive</p>|}</li></ol>
<span id="查看rk3566芯片的序列号"></span>
== 查看RK3566芯片的序列号 ==
查看RK3566芯片序列号的命令如下所示,每个芯片的序列号都是不同的,所以可以使用序列号来区分多个开发板。
{| class="wikitable" style="width:800px;"
|-
|
orangepi@orangepi:~$ '''cat_serial.sh'''
Serial : '''8fa18eaf489041f0'''
|}
<span id="安装docker的方法"></span>
== 安装Docker的方法 ==
<li><p>Orange Pi提供的linux镜像已经预装了Docker,只是Docker服务默认没有打开</p></li>
<li><p>使用'''enable_docker.sh'''脚本可以使能docker服务,然后就可以开始使用docker命令了,并且在下次启动系统时也会自动启动docker服务</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''enable_docker.sh'''</p>|}</li>
<li><p>然后可以使用下面的命令测试下docker,如果能运行hello-world说明docker能正常使用了</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''docker run hello-world'''</p>
<p>Unable to find image 'hello-world:latest' locally</p>
<p>Digest: sha256:7f0a9f93b4aa3022c3a4c147a449ef11e0941a1fd0bf4a8e6c9408b2600777c5</p>
<p>Status: Downloaded newer image for hello-world:latest</p>
<p>'''<span style="color:#FF0000">Hello from Docker!</span>'''</p><p>'''<span style="color:#FF0000">This message shows that your installation appears to be working correctly.</span>'''</p><p>'''.….'''</p>|}</li></ol>
<span id="下载安装arm64版本balenaetcher的方法"></span>
== 下载安装arm64版本balenaEtcher的方法 ==
<ol style="list-style-type: lower-alpha;">
<li><p>deb安装包的下载地址如下所示,需要安装才能使用</p>
{| class="wikitable" style="width:800px;" |-| <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>
{| class="wikitable" style="width:800px;" |-| <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:media/image285cm4-img285.png|527x211px|IMG_256]]
</div></ol></li></ol>
<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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo apt install -y \'''</p>
<p>'''--fix-broken ./balena-etcher-electron_1.7.9+5945ab1f_arm64.deb'''</p>|}</li>
<li><p>deb版本的balenaEtcher安装完成后,在Application中就可以打开了</p>
<div class="figure">
[[File:media/image88cm4-img88.png|507x249px|IMG_256]]
</div></li>
<li><p>balenaEtcher打开后的界面如下所示:</p></li></ol></li></ol>
<div class="figure">
[[File:media/image286cm4-img286.png|429x263px|IMG_256]]
</div></ol></li></ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>AppImage版本的balenaEtcher的使用方法:</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先给balenaEtcher添加权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~/Desktop$ '''chmod +x balenaEtcher-1.7.9+5945ab1f-arm64.AppImage'''</p>|}</li>
<li><p>然后选中AppImage版本balenaEtcher,再点击鼠标右键,再点击Execute就可以打开balenaEtcher了</p>
<p>[[File:media/image287cm4-img287.png|145x118px]]</p></li></ol>
</li></ol>
<span id="宝塔linux面板的安装方法"></span>
== 宝塔Linux面板的安装方法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''宝塔Linux面板是提升运维效率的服务器管理软件,支持一键配置LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能(摘抄自[https://www.bt.cn/ 宝塔官网])'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>首先需要扩展下'''/tmp'''空间的大小,设置完后需要'''<span style="color:#FF0000">重启下开发板的linux系统</span>''',命令如下所示:</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo sed -i 's/nosuid/&,size=2G/' /etc/fstab'''</p>
<p>orangepi@orangepi:~$ '''sudo reboot'''</p>|}</li>
<li><p>重启后,可以看到'''/tmp'''空间的大小变为2G了</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''df -h | grep "/tmp"'''</p>
<p>tmpfs 2.0G 12K '''<span style="color:#FF0000">2.0G</span>''' 1% /tmp</p>|}</li>
<li><p>然后在Linux系统中输入下面的命令就可以开始宝塔的安装</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo install_bt_panel.sh'''</p>|}</li>
<li><p>然后宝塔安装程序会提醒是否安装'''Bt-Panel'''到'''/www'''文件夹,此时输入'''y'''即可</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>+----------------------------------------------------------------------</p>
<p>| Bt-WebPanel FOR CentOS/Ubuntu/Debian</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): '''<span style="color:#FF0000">y</span>'''</p>|}</li>
<li><p>然后要做的就是耐心等待,当看到终端输出下面的打印信息时,说明宝塔已经安装完成,整个安装过程大约耗时34分钟,根据网络速度的不同可能会有一些差别</p>
<p>[[File:media/image288cm4-img288.png|576x233px]]</p></li>
<li><p>此时在浏览器中输入上面显示的'''面板地址'''就可以打开宝塔Linux面板的登录界面,然后在对应的位置输入上图显示的'''username'''和'''password'''就可以登录进宝塔<br />
[[File:media/image289cm4-img289.png|575x281px]]</p></li>
<li><p>成功登录宝塔后的会弹出下面的欢迎界面,首先请将中间的用户须知阅读完拖到最下面,然后就可以选择”我已同意并阅读《用户协议》“,接着点击”进入面板”就可以进入宝塔了</p>
<p>[[File:media/image290cm4-img290.png|575x317px]]</p></li>
<li><p>进入宝塔后首先会提示需要绑定宝塔官网的账号,如果没有账号可以去宝塔的官网('''https://www.bt.cn''')注册一个</p>
<p>[[File:media/image291cm4-img291.png|576x300px]]</p></li>
<li><p>最终显示的界面如下图所示,可以很直观的看到开发板Linux系统的一些状态信息,比如负载状态、CPU的使用率、内存使用率和存储空间的使用情况等</p>
<p>[[File:media/image292cm4-img292.png|575x306px]]</p></li>
<li><p>宝塔的更多功能可以参考下面资料自行探索</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
== 设置中文环境以及安装中文输入法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,安装中文输入法前请确保开发板使用的Linux系统为桌面版系统。'''</big>|}
<span id="debian系统的安装方法"></span>
<ol style="list-style-type: lower-alpha;">
<li><p>输入下面的命令可以开始配置'''locale'''</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo dpkg-reconfigure locales'''</p>|}</li>
<li><p>然后在弹出的界面中选择'''zh_CN.UTF-8 > UTF-8'''(通过键盘上的上下方向按键来上下移动,通过空格键来选择,最后通过Tab键可以将光标移动到'''<OK>''',然后回车即可)</p>
<p>[[File:media/image293cm4-img293.png|575x296px]]</p></li>
<li><p>然后设置默认'''locale'''为'''zh_CN.UTF-8'''</p>
<p>[[File:media/image294cm4-img294.png|575x160px]]</p></li>
<li><p>退出界面后就会开始'''locale'''的设置,命令行显示的输出如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<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:media/image295cm4-img295.png|575x361px]]</p></li>
<li><p>然后选择'''OK'''</p>
<p>[[File:media/image296cm4-img296.png|295x212px]]</p></li>
<li><p>然后选择'''Yes'''</p>
<p>[[File:media/image297cm4-img297.png|303x192px]]</p></li>
<li><p>然后选择'''fcitx'''</p>
<p>[[File:media/image298cm4-img298.png|307x220px]]</p></li>
<li><p>然后选择'''OK'''</p>
<p>[[File:media/image299cm4-img299.png|305x216px]]</p></li><li><p>'''<span style="color:#FF0000">然后重启Linux系统才能使配置生效</span>'''</p></li>
<li><p>然后打开'''Fcitx configuration'''</p>
<p>[[File:media/image300cm4-img300.png|575x376px]]</p></li>
<li><p>然后点击下图所示位置的'''+'''号</p>
<p>[[File:media/image301cm4-img301.png|280x187px]]</p></li>
<li><p>然后搜索'''Google Pinyin'''再点击'''OK'''</p>
<p>[[File:media/image302cm4-img302.png|291x196px]]</p></li>
<li><p>然后将'''Google Pinyin'''放到最前面</p>
<p>[[File:media/image303cm4-img303.png|299x202px]]</p><p>[[File:media/image304cm4-img304.png|300x202px]]</p></li>
<li><p>然后打开'''Geany'''这个编辑器测试下中文输入法</p>
<p>[[File:media/image305cm4-img305.png|349x212px]]</p></li>
<li><p>中文输入法测试如下所示</p>
<p>[[File:media/image306cm4-img306.png|575x325px]]</p></li>
<li><p>通过'''Ctrl+Space'''快捷键可以切换中英文输入法</p></li>
<li><p>如果需要整个系统都显示为中文,可以将'''/etc/default/locale'''中的变量都设置为'''zh_CN.UTF-8'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo vim /etc/default/locale'''</p>
<p># File generated by update-locale</p>
<p>LC_MESSAGES='''<span style="color:#FF0000">zh_CN.UTF-8</span>'''</p><p>LANG='''<span style="color:#FF0000">zh_CN.UTF-8</span>'''</p><p>LANGUAGE='''<span style="color:#FF0000">zh_CN.UTF-8</span>'''</p>|}</li><li><p>然后'''<span style="color:#FF0000">重启系统</span>'''就能看到系统显示为中文了</p><p>[[File:media/image307cm4-img307.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:media/image308cm4-img308.png|575x351px]]</p></li>
<li><p>然后找到'''汉语(中国)'''选项</p>
<p>[[File:media/image309cm4-img309.png|318x311px]]</p></li>
<li><p>然后请使用鼠标左键选中'''汉语(中国)'''并按住不动,然后往上将其拖到最开始的位置,拖完后的显示如下图所示:</p>
<p>[[File:media/image310cm4-img310.png|324x320px]]</p></li></ol> '''注意,这一步不是很好拖动的,请耐心多试几次。'''
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
|
<big>'''注意,这一步不是很好拖动的,请耐心多试几次。'''</big>
|}
</li></ol>
<ol start="4" style="list-style-type: decimal;">
<li><p>然后选择'''Apply System-Wide'''将中文设置应用到整个系统</p>
<p>[[File:media/image311cm4-img311.png|321x316px]]</p></li>
<li><p>然后设置'''Keyboard input method system'''为'''fcitx'''</p>
<p>[[File:media/image312cm4-img312.png|327x320px]]</p></li><li><p>'''<span style="color:#FF0000">然后重启Linux系统使配置生效</span>'''</p></li>
<li><p>重新进入系统后,在下面的界面请选择'''不要再次询问我''',然后请根据自己的喜好决定标准文件夹是否也要更新为中文</p>
<p>[[File:media/image313cm4-img313.png|303x247px]]</p></li>
<li><p>然后可以看到桌面都显示为中文了</p>
<p>[[File:media/image314cm4-img314.png|575x383px]]</p></li>
<li><p>然后我们可以打开'''Geany'''测试下中文输入法,打开方式如下图所示</p>
<p>[[File:media/image315cm4-img315.png|576x292px]]</p></li>
<li><p>打开'''Geany'''后,默认还是英文输入法,我们可以通过'''Ctrl+Space'''快捷键来切换成中文输入法,然后就能输入中文了</p>
<p>[[File:media/image316cm4-img316.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:media/image308cm4-img308.png|575x351px]]</p></li>
<li><p>然后找到'''汉语(中国)'''选项</p>
<p>[[File:media/image317cm4-img317.png|335x326px]]</p></li>
<li><p>然后请使用鼠标左键选中'''汉语(中国)'''并按住不动,然后往上将其拖到最开始的位置,拖完后的显示如下图所示:</p>
<p>[[File:media/image318cm4-img318.png|337x331px]]</p></li></ol> '''注意,这一步不是很好拖动的,请耐心多试几次。'''
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
|
<big>'''注意,这一步不是很好拖动的,请耐心多试几次。'''</big>
|}
</li></ol>
<ol start="4" style="list-style-type: decimal;">
<li><p>然后选择'''Apply System-Wide'''将中文设置应用到整个系统</p>
<p>[[File:media/image319cm4-img319.png|336x330px]]</p></li><li><p>'''<span style="color:#FF0000">然后重启Linux系统使配置生效</span>'''</p></li>
<li><p>重新进入系统后,在下面的界面请选择'''不要再次询问我''',然后请根据自己的喜好决定标准文件夹是否也要更新为中文</p>
<p>[[File:media/image313cm4-img313.png|303x247px]]</p></li>
<li><p>然后可以看到桌面都显示为中文了</p>
<p>[[File:media/image314cm4-img314.png|575x383px]]</p></li>
<li><p>然后打开Fcitx5配置程序</p>
<p>[[File:media/image320cm4-img320.png|575x349px]]</p></li>
<li><p>然后选择使用拼音输入法</p>
<p>[[File:media/image321cm4-img321.png|366x289px]]</p></li>
<li><p>选择后的界面如下所示,再点击确定即可</p>
<p>[[File:media/image322cm4-img322.png|366x290px]]</p></li>
<li><p>然后我们可以打开'''Geany'''测试下中文输入法,打开方式如下图所示</p>
<p>[[File:media/image315cm4-img315.png|576x292px]]</p></li>
<li><p>打开'''Geany'''后,默认还是英文输入法,我们可以通过'''Ctrl+Space'''快捷键来切换成中文输入法,然后就能输入中文了</p>
<p>[[File:media/image323cm4-img323.png|576x408px]]</p></li></ol>
<span id="远程登录linux系统桌面的方法"></span>
== 远程登录Linux系统桌面的方法 ==
=== 使用NoMachine远程登录 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''请确保开发板安装的Ubuntu或者Debian系统为桌面版本的系统。另外NoMachine也提供了详细的使用文档,强烈建议通读此文档来熟悉NoMachine的使用,文档链接如下所示:请确保开发板安装的Ubuntu或者Debian系统为<span style="color:#FF0000">桌面版本</span>的系统。另外NoMachine也提供了详细的使用文档,强烈建议通读此文档来熟悉NoMachine的使用,文档链接如下所示:'''
'''https://knowledgebase.nomachine.com/DT10R00166'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''NoMachine支持Windows、Mac、Linux、iOS和安卓平台,所以我们可以在多种设备上通过NoMachine来远程登录控制Orange Pi开发板。下面演示下在Windows中通过NoMachine来远程登录Orange Pi开发板的Linux系统桌面。其他平台的安装方法请参考下NoMachine的官方文档。'''</big>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''操作前请先确保Windwos电脑和开发板在同一局域网内,并且能正常ssh登录开发板的Ubuntu或者Debian系统。'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>首先下载NoMachine软件Linux '''<span style="color:#FF0000">arm64</span>''' deb版本的安装包,然后安装到开发板的Linux系统中</p>
<ol style="list-style-type: lower-alpha;">
<li>由于RK3566是ARMv8架构的SOC,我们使用的系统为Ubuntu或者Debian,所以这里需要下载'''NoMachine > for ARM ARMv8 DEB'''安装包,下载链接如下所示:</li></ol>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </libig></ol> '''注意,这个下载链接可能会变,请认准Armv8/Arm64版本的deb包。'''</big>|}{| class="wikitable" style="width:800px;" |-| [https://downloads.nomachine.com/download/?id=116&distro=ARM '''https://downloads.nomachine.com/download/?id=116&distro=ARM'''][[File:media/image324.png|575x227px]]}
[[File:cm4-img324.png]]
</ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>另外在'''官方工具'''中也可以下载到'''NoMachine'''的安装包</p>
<p>[[File:media/image325cm4-img325.png|86x106px]]</p>
<p>先进入'''远程登录软件-NoMachine'''文件夹</p>
<p>[[File:media/image326cm4-img326.png|256x46px]]</p>
<p>然后下载arm64版本的deb安装包</p>
<p>[[File:media/image327cm4-img327.png|180x109px]]</p></li>
<li><p>然后将下载的'''nomachine_x.x.x_x_arm64.deb'''上传到开发板的Linux系统中</p></li>
<li><p>然后使用下面的命令在开发板的Linux系统中安装'''NoMachine'''</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo dpkg -i nomachine_x.x.x_x_arm64_arm64.deb'''</p>|}</li></ol></li></ol>
<!-- -->
<ol start="2" style="list-style-type: decimal;">
<li>然后下载NoMachine软件Windows版本的安装包,下载地址如下所示</li>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </olbig> '''注意,这个下载链接可能会变。'''</big>|}{| class="wikitable" style="width:800px;" |-|
[https://downloads.nomachine.com/download/?id=8 '''https://downloads.nomachine.com/download/?id=8''']
|}
[[File:media/image328cm4-img328.png|575x163px]]</ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>然后在Windows中安装NoMachine,'''安装完后请重启下电脑'''</p></li>
<li><p>然后在Window中打开'''NoMachine'''</p>
<p>[[File:media/image329cm4-img329.png|76x66px]]</p></li>
<li><p>NoMachine启动后会自动扫描局域网内其他安装有NoMachine的设备,进入NoMachine的主界面后就可以看到开发板已经在可连接的设备列表里了,然后点击下图红色方框所示的位置即可开始登录开发板的Linux系统桌面</p>
<p>[[File:media/image330cm4-img330.png|321x92px]]</p></li>
<li><p>然后点击'''OK'''</p>
<p>[[File:media/image331cm4-img331.png|402x275px]]</p></li>
<li><p>然后在下图对应的位置输入开发板Linux系统的用户名和密码,再点击'''OK'''开始登陆</p>
<p>[[File:media/image332cm4-img332.png|406x274px]]</p></li>
<li><p>然后在接下来的界面中都点击OK</p></li>
<li><p>最后就能看到开发板Linux系统的桌面了</p>
<p>[[File:media/image333cm4-img333.png|411x246px]]</p></li></ol>
<span id="使用vnc远程登录"></span>
=== 使用VNC远程登录 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''操作前请先确保Windows电脑和开发板在同一局域网内,并且能正常ssh登录开发板的Ubuntu或者Debian系统。'''
'''<span style="color:#FF0000">Ubuntu20.04测试VNC很多问题,请不要使用这种方法。</span>'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>首先运行'''set_vnc.sh'''脚本设置下vnc,'''<span style="color:#FF0000">记得加sudo权限</span>'''</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''sudo set_vnc.sh'''</p>
<p>You will require a password to access your desktops.</p>
<p>Password: '''<span style="color:#FF0000">#在这里设置vnc的密码,8位字符</span>'''</p><p>Verify: '''<span style="color:#FF0000">#在这里设置vnc的密码,8位字符</span>'''</p><p>Would you like to enter a view-only password (y/n)? '''<span style="color:#FF0000">n</span>'''</p>
<p>xauth: file /root/.Xauthority does not exist</p>
<p>New 'X' desktop is orangepicm4: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/orangepicm4:1.log</p>
<p>Killing Xtightvnc process ID 3047</p>
<p>New 'X' desktop is orangepicm4:1</p>
<p>Starting applications specified in /root/.vnc/xstartup</p>
<p>Log file is /root/.vnc/orangepicm4: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:media/image334.png|576x410px]]
[[File:cm4-img334.png]]
</ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>然后输入前面设置的VNC的密码</p>
<p>[[File:media/image335cm4-img335.png|274x131px]]</p></li>
<li><p>登录成功后的界面显示如下图所示,然后就可以远程操作开发板Linux系统的桌面了</p>
<p>[[File:media/image336cm4-img336.png|405x293px]]</p></li></ol></li></ol><span id="linux系统支持的部分编程语言测试"></span>
== Linux系统支持的部分编程语言测试 ==
<ol style="list-style-type: lower-alpha;">
<li><p>gcc的版本如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.c'''</p>
<p>#include <stdio.h></p>
<p>int main(void)</p>
<p>{</p>
:<p>printf("Hello World!\n");</p> :<p>return 0;</p><p>}</p>|}</li>
<li><p>然后编译运行'''hello_world.c'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;"
|-
|
<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 "help", "copyright", "credits" or "license" for more information.</p>
<p>>>></p>|}</li>
<li><p>编写Python语言的'''hello_world.py'''程序</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.py'''</p>
<p>print('Hello World!')</p>|}</li>
<li><p>运行'''hello_world.py'''的结果如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdk'''</p>|}</li>
<li><p>安装完后可以查看下Java的版本</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''java --version'''</p>|}</li>
<li><p>编写Java版本的'''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.java'''</p>
<p>public class hello_world</p>
<p>{</p>
:<p>public static void main(String[] args)</p>:<p>{</p>::<p>System.out.println("Hello World!");</p>:<p>}</p>
<p>}</p>
<li><p>然后编译运行'''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''javac hello_world.java'''</p>
<p>orangepi@orangepi:~$ '''java hello_world'''</p>
<p>Hello World!</p>|}</li></ol>
</li></ol>
<span id="debian-bookworm系统"></span>
=== Debian Bookworm系统 ===
<ol style="list-style-type: lower-alpha;">
<li><p>gcc的版本如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.c'''</p>
<p>#include <stdio.h></p>
<p>int main(void)</p>
<p>{</p>
:<p>printf("Hello World!\n");</p> :<p>return 0;</p><p>}</p>|}</li>
<li><p>然后编译运行'''hello_world.c'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;"
|-
|
<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 "help", "copyright", "credits" or "license" for more information.</p>
<p>>>></p>
|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''使用Ctrl+D快捷键可退出python的交互模式。'''</p></big>|}</li><li><p>编写Python语言的'''hello_world.py'''程序</p>{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''vim hello_world.py'''</p>
<p>print('Hello World!')</p>|}</li>
<li><p>运行'''hello_world.py'''的结果如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdk'''</p>|}</li>
<li><p>安装完后可以查看下Java的版本</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''java --version'''</p>|}</li>
<li><p>编写Java版本的'''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.java'''</p>
<p>public class hello_world</p>
<p>{</p>
:<p>public static void main(String[] args)</p>:<p>{</p>::<p>System.out.println("Hello World!");</p>:<p>}</p>
<p>}</p>
<li><p>然后编译运行'''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''javac hello_world.java'''</p>
<p>orangepi@orangepi:~$ '''java hello_world'''</p>
<p>Hello World!</p>|}</li></ol>
</li></ol>
<span id="ubuntu-focal系统"></span>
=== Ubuntu Focal系统 ===
<ol style="list-style-type: lower-alpha;">
<li><p>gcc的版本如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''gcc --version'''</p>
<p>gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0</p>
<p>Copyright (C) 2019 Free Software Foundation, Inc.</p>
<p>This is free software; see the source for copying conditions. There is NO</p>
<p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p>|}</li>
<li><p>编写C语言的'''hello_world.c'''程序</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.c'''</p>
<p>#include <stdio.h></p>
<p>int main(void)</p>
<p>{</p>
:<p>printf("Hello World!\n");</p> :<p>return 0;</p><p>}</p>|}</li>
<li><p>然后编译运行'''hello_world.c'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;"
|-
|
<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 "help", "copyright", "credits" or "license" for more information.</p>
<p>>>></p>|}</li>
<li><p>编写Python语言的'''hello_world.py'''程序</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.py'''</p>
<p>print('Hello World!')</p>|}</li>
<li><p>运行'''hello_world.py'''的结果如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-17-jdk'''</p>|}</li>
<li><p>安装完后可以查看下Java的版本</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''java --version'''</p>
<p>openjdk 17.0.2 2022-01-18</p>
<p>OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)</p>
<p>OpenJDK 64-Bit Server VM (build 17.0.2+8-Ubuntu-120.04, mixed mode, sharing)</p>|}</li>
<li><p>编写Java版本的'''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.java'''</p>
<p>public class hello_world</p>
<p>{</p>
:<p>public static void main(String[] args)</p>:<p>{</p>::<p>System.out.println("Hello World!");</p>:<p>}</p>
<p>}</p>
<li><p>然后编译运行'''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''javac hello_world.java'''</p>
<p>orangepi@orangepi:~$ '''java hello_world'''</p>
<p>Hello World!</p>|}</li></ol>
</li></ol>
<span id="ubuntu-jammy系统"></span>
=== Ubuntu Jammy系统 ===
<ol style="list-style-type: lower-alpha;">
<li><p>gcc的版本如下所示</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''gcc --version'''</p>
<p>gcc (Ubuntu 11.2.0-19ubuntu1) '''11.2.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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.c'''</p>
<p>#include <stdio.h></p>
<p>int main(void)</p>
<p>{</p>
:<p>printf("Hello World!\n");</p> :<p>return 0;</p><p>}</p>|}</li>
<li><p>然后编译运行'''hello_world.c'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''python3'''</p>
<p>Python '''3.10.4''' (main, Apr 2 2022, 09:04:19) [GCC 11.2.0] on linux</p>
<p>Type "help", "copyright", "credits" or "license" for more information.</p>
<p>>>></p>|}</li>
<li><p>编写Python语言的'''hello_world.py'''程序</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.py'''</p>
<p>print('Hello World!')</p>|}</li>
<li><p>运行'''hello_world.py'''的结果如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo apt install -y openjdk-18-jdk'''</p>|}</li>
<li><p>安装完后可以查看下Java的版本</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''java --version'''</p>
<p>openjdk 18-ea 2022-03-22</p>
<p>OpenJDK Runtime Environment (build 18-ea+36-Ubuntu-1)</p>
<p>OpenJDK 64-Bit Server VM (build 18-ea+36-Ubuntu-1, mixed mode, sharing)</p>|}</li>
<li><p>编写Java版本的'''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello_world.java'''</p>
<p>public class hello_world</p>
<p>{</p>
:<p>public static void main(String[] args)</p>:<p>{</p>::<p>System.out.println("Hello World!");</p>:<p>}</p>
<p>}</p>
<li><p>然后编译运行'''hello_world.java'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''javac hello_world.java'''</p>
<p>orangepi@orangepi:~$ '''java hello_world'''</p>
<p>Hello World!</p>|}</li></ol>
</li></ol>
<span id="qt的安装方法"></span>
== QT的安装方法 ==
<ol style="list-style-type: decimal;">
<li><p>使用下面的脚本可以安装QT5和QT Creator</p>
{| class="wikitable" style="width:800px;" |-| <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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''install_qt.sh'''</p>
<p>......</p>
<p>QMake version 3.1</p>
<p>Using Qt version '''<span style="color:#FF0000">5.12.8</span>''' in /usr/lib/aarch64-linux-gnu</p>|}</li>
<li><p>Ubuntu22.04自带的QT版本为'''5.15.3'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''install_qt.sh'''</p>
<p>......</p>
<p>QMake version 3.1</p>
<p>Using Qt version '''<span style="color:#FF0000">5.15.3</span>''' in /usr/lib/aarch64-linux-gnu</p>|}</li>
<li><p>Debian11自带的QT版本为'''5.15.2'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''install_qt.sh'''</p>
<p>......</p>
<p>QMake version 3.1</p>
<p>Using Qt version '''<span style="color:#FF0000">5.15.2</span>''' in /usr/lib/aarch64-linux-gnu</p>|}</li>
<li><p>Debian12自带的QT版本为'''5.15.8'''</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''install_qt.sh'''</p>
<p>......</p>
<p>QMake version 3.1</p>
<p>Using Qt version '''<span style="color:#FF0000">5.15.8</span>''' in /usr/lib/aarch64-linux-gnu</p>|}</li></ol>
</li>
<li><p>然后在'''Applications'''中就可以看到QT Creator的启动图标</p>
<p>[[File:media/image337cm4-img337.png|576x270px]]</p>
<p>也可以使用下面的命令打开QT Creator</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''qtcreator'''</p>
|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><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></big>|}</li>
<li><p>QT Creator打开后的界面如下所示</p>
<p>[[File:media/image338cm4-img338.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:media/image339cm4-img339.png|419x224px]]</p></li>
<li><p>QT Creator在'''Ubuntu22.04'''中的默认版本如下所示</p>
<p>[[File:media/image340cm4-img340.png|443x237px]]</p></li>
<li><p>QT Creator在'''Debian11'''中的默认版本如下所示</p>
<p>[[File:media/image341cm4-img341.png|444x238px]]</p></li>
<li><p>QT Creator在'''Debian12'''中的默认版本如下所示</p>
<p>[[File:media/image342cm4-img342.png|449x277px]]</p></li></ol>
</li>
<li><p>然后设置下QT</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先打开'''Help'''->'''About Plugins...'''</p>
<p>[[File:media/image343cm4-img343.png|573x164px]]</p></li>
<li><p>然后去掉'''ClangCodeModel'''的那个勾</p>
<p>[[File:media/image344cm4-img344.png|408x254px]]</p></li><li><p>'''<span style="color:#FF0000">设置完后需要重启下QT Creator</span>'''</p></li>
<li><p>然后确保QT Creator使用的GCC编译器,如果默认为Clang,请修改为GCC</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''Debian12请跳过这步。'''</p></big>|}<p>[[File:media/image345cm4-img345.png|576x315px]]</p><p>[[File:media/image346cm4-img346.png|575x307px]]</p></li></ol></li>
<li><p>然后就可以打开一个示例代码</p>
<p>[[File:media/image347cm4-img347.png|575x312px]]</p></li>
<li><p>点击示例代码后会自动打开对应的说明文档,可以仔细看下其中的使用说明</p>
<p>[[File:media/image348cm4-img348.png|576x218px]]</p></li>
<li><p>然后点击下'''Configure Project'''</p>
<p>[[File:media/image349cm4-img349.png|575x304px]]</p></li>
<li><p>然后点击左下角的绿色三角形编译运行下示例代码</p>
<p>[[File:media/image350cm4-img350.png|575x312px]]</p></li>
<li><p>等待一段时间后,会弹出下图所示的界面,此时就说明QT能正常编译运行</p>
<p>[[File:media/image351cm4-img351.png|576x308px]]</p></li>
<li><p>参考资料</p>
{| class="wikitable" style="width:800px;"
|-
|
<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安装方法 ==
# ROS 1当前活跃的版本如下所示,推荐版本为'''Noetic Ninjemys'''
::[[File:media/image352cm4-img352.png|345x235px]]
::[[File:media/image353cm4-img353.png|576x210px]]
::{| class="wikitable" style="width:800px;"
|-
|
[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>
{| class="wikitable" style="width:800px;" |-| <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,所以请确保开发板使用的系统为'''<span style="color:#FF0000">Ubuntu20.04桌面版系统</span>'''</p>{| class="wikitable" style="width:800px;" |-|
<p>[http://wiki.ros.org/noetic/Installation '''http://wiki.ros.org/noetic/Installation''']</p>
|}<p>[[File:media/image354cm4-img354.png|312x176px]]</p></li>
<li><p>然后使用下面的脚本安装ros1</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepicm4:~$ '''install_ros.sh ros1'''</p>|}</li><li><p>使用ROS工具前,首先需要初始化下rosdep,然后编译源码时就能快速的安装一些系统依赖和一些ROS中的核心组件</p> {| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''</lispan style="color:#FF0000">注意,运行下面的命令需要确保开发板能正常访问github,否则会由于网络问题而报错。</olspan>'''
'''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'''
'''<span style="color:#FF0000">ERROR: error loading sources list:''' '''The read operation timed out</span>'''
::'''<span style="color:#FF0000">The read operation timed out</span>'''</big>
|}
{| class="wikitable" style="width:800px;"
|-
|
orangepi@orangepi:~$ '''source /opt/ros/noetic/setup.bash'''
Recommended: please run
::rosdep update
orangepi@orangepi:~$ '''rosdep update'''
updated cache in /home/orangepi/.ros/rosdep/sources.cache
|}</li></ol>
<ol start="6" style="list-style-type: decimal;">
<li><p>然后在'''桌面'''中打开一个命令行终端窗口,再使用'''test_ros.sh'''脚本可以启动一个小海龟的例程来测试下ROS是否能正常使用</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''test_ros.sh'''</p>|}</li>
<li><p>运行完'''test_ros.sh'''脚本后,会弹出下图所示的一个小海龟</p>
<p>[[File:media/image355cm4-img355.png|576x276px]]</p></li><li><p>然后请保持刚才打开终端窗口在最上面</p></li></ol> [[File:media/image356.png|576x275px]]
[[File:cm4-img356.png]]
</li></ol>
<ol start="9" style="list-style-type: decimal;">
<li><p>此时按下键盘上的方向按键就可以控制小海龟上下左右移动了</p>
<p>[[File:media/image357cm4-img357.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:media/image358cm4-img358.png|576x271px]]</p><p>[[File:media/image359cm4-img359.png|575x265px]]</p>{| class="wikitable" style="width:800px;" |-|
<p>[http://docs.ros.org/ '''http://docs.ros.org''']</p>
<p>'''http://docs.ros.org/en/galactic/Releases.html'''</p>|}</li>
<li><p>ROS 2 '''Galactic Geochelone'''官方安装文档链接如下所示:</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>'''docs.ros.org/en/galactic/Installation.html'''</p>
<p>'''http://docs.ros.org/en/galactic/Installation/Ubuntu-Install-Debians.html'''</p>|}</li><li><p>ROS 2 '''Galactic Geochelone'''官方安装文档中Ubuntu Linux推荐使用Ubuntu20.04,所以请确保开发板使用的系统为'''<span style="color:#FF0000">Ubuntu20.04桌面版系统</span>'''。安装ROS 2有几种方法,下面演示下通过'''Debian packages'''的方式来安装ROS 2 '''Galactic Geochelone'''</p></li>
<li><p>使用'''install_ros.sh'''脚本可以安装ros2</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''install_ros.sh ros2'''</p>|}</li>
<li><p>'''install_ros.sh'''脚本安装完ros2后会自动运行下'''ros2 -h'''命令,如果能看到下面的打印,说明ros2安装完成</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>usage: ros2 [-h] Call `ros2 <command> -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 <command> -h` for more detailed usage.</p>|}</li>
<li><p>然后可以使用 '''test_ros.sh'''脚本测试下ROS 2是否安装成功,如果能看到下面的打印,说明ROS 2能正常运行</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepicm4:~$ '''test_ros.sh'''</p>
<p>[INFO] [1671174101.200091527] [talker]: Publishing: 'Hello World: 1'</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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''source /opt/ros/galactic/setup.bash'''</p>
<p>orangepi@orangepi:~$ '''ros2 run rviz2 rviz2'''</p>
|}
<div class="figure">
[[File:media/image360cm4-img360.png|576x324px|1]]
</div></li>
<li><p>ROS的使用方法请参考下ROS 2的文档</p>
{| class="wikitable" style="width:800px;" |-| <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>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''install_ros.sh ros2'''</p>|}</li><li><p>'''install_ros.sh'''脚本安装完ros2后会自动运行下'''ros2 -h'''命令,如果能看到下面的打印,说明ros2安装完成</p>{| class="wikitable" style="width:800px;" |-| <p>usage: ros2 [-h] Call `ros2 <command> -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 <command> -h` for more detailed usage.</p>|}</li>
<li><p>然后可以使用 '''test_ros.sh'''脚本测试下ROS 2是否安装成功,如果能看到下面的打印,说明ROS 2能正常运行</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepicm4:~$ '''test_ros.sh'''</p>
<p>[INFO] [1671174101.200091527] [talker]: Publishing: 'Hello World: 1'</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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''source /opt/ros/humble/setup.bash'''</p>
<p>orangepi@orangepi:~$ '''ros2 run rviz2 rviz2'''</p>
|}
<div class="figure">
[[File:media/image361cm4-img361.png|576x324px|1]]
</div></li>
<li><p>参考文档</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ls /opt/linux-headers*'''</p>
<p>/opt/linux-headers-legacy-rockchip-rk356x_x.x.x_arm64.deb</p>|}</li>
<li><p>使用下面的命令可以安装内核头文件的deb包</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''内核头文件deb包的名字需要替换为实际的名字,请不要照抄。'''</p></big>|}{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo dpkg -i /opt/linux-headers-legacy-rockchip-rk356x_1.x.x_arm64.deb'''</p>|}</li>
<li><p>安装完后在'''/usr/src'''下就能看到内核头文件所在的文件夹</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ls /usr/src'''</p>
<p>linux-headers-5.10.160-rockchip-rk356x</p>|}</li>
<li><p>然后可以编写一个hello内核模块测试下内核头文件</p>
<ol style="list-style-type: lower-alpha;">
<li><p>首先编写hello内核模块的代码,如下所示:</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim hello.c'''</p>
<p>#include <linux/init.h></p>
<p>#include <linux/module.h></p>
<p>static int hello_init(void)</p>
<p>{</p>
:<p>printk("Hello Orange Pi -- init\n");</p> :<p>return 0;</p>
<p>}</p>
<p>static void hello_exit(void)</p>
<p>{</p>
:<p>printk("Hello Orange Pi -- exit\n");</p> :<p>return;</p>
<p>}</p>
<p>module_init(hello_init);</p>
<p>module_exit(hello_exit);</p>
<p>MODULE_LICENSE("GPL");</p>|}</li>
<li><p>然后编写编译hello内核模块的Makefile文件,如下所示:</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim Makefile'''</p>
<p>ifneq ($(KERNELRELEASE),)</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>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''如果自己复制的代码这里编译如果有问题,请去[http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html 官方工具]中下载源码然后上传到开发板的Linux系统中测试。'''</p></big> <p>[[File:media/image362cm4-img362.png|253x41pxcenter]]</p>|}{| class="wikitable" style="width:800px;" |-|
<p>orangepi@orangepi:~$ '''make'''</p>
<p>make -C /lib/modules/5.10.160-rockchip-35xx/build M=/home/orangepi modules</p>
<p>make[1]: Entering directory '/usr/src/linux-headers-5.10.160-rockchip-rk35xx'</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-rk35xx'</p>|}</li>
<li><p>编译完后会生成'''hello.ko'''内核模块</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''ls *.ko'''</p>
<p>hello.ko</p>|}</li>
<li><p>使用'''insmod'''命令可以将'''hello.ko'''内核模块插入内核中</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo insmod hello.ko'''</p>|}</li>
<li><p>然后使用'''demsg'''命令可以查看下'''hello.ko'''内核模块的输出,如果能看到下面的输出说明'''hello.ko'''内核模块加载正确</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''dmesg | grep "Hello"'''</p>
<p>[ 2871.893988] '''Hello Orange Pi -- init'''</p>|}</li>
<li><p>使用'''rmmod'''命令可以卸载'''hello.ko'''内核模块</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo rmmod hello'''</p>
<p>orangepi@orangepi:~$ '''dmesg | grep "Hello"'''</p>
<p>[ 2871.893988] Hello Orange Pi -- init</p>
<p>[ 3173.800892] '''Hello Orange Pi -- exit'''</p>|}</li></ol>
</li></ol>
<ol style="list-style-type: lower-alpha;">
<li><p>树莓派5寸MIPI LCD显示屏+触摸屏</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''再次强调下,只要购买的屏幕和Orange Pi测试的屏幕是一样的,那么树莓派5寸屏幕的显示和触摸就都是可以使用的。'''</p><p>'''Orange Pi测试的屏幕如下图所示,购买的店铺为淘宝的LCD DIY。其他店铺购买的类似树莓派的屏幕一般也是可以用的,但是由于没有测试过,无法百分百保证。'''</p></big><p>[[File:media/image363cm4-img363.png|312x312pxcenter]]</p>|}<p>[[File:media/image364cm4-img364.png|306x219px]]</p></li>
<li><p>15pin MIPI排线</p>
<p>[[File:media/image365cm4-img365.png|276x111px]]</p></li></ol>
</li>
<li><p>然后将15pin MIPI排线按照下图所示的方式连接到树莓派5寸屏幕上(注意绝缘面的朝向)</p>
<p>[[File:media/image366cm4-img366.png|294x160px]]</p></li>
<li><p>最后连接到Orange Pi CM4开发板的LCD接口上</p>
<p>[[File:media/image367cm4-img367.png|299x173px]]</p></li></ol>
=== 打开树莓派5寸屏幕配置的方法 ===
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image368cm4-img368.png|576x304px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image369cm4-img369.png|576x266px]]</p></li>
<li><p>然后使用键盘的方向键定位到raspi-7inch-touchscreen,再使用'''空格'''选中</p>
<p>[[File:media/image370cm4-img370.png|408x310px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image371cm4-img371.png|404x133px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image372cm4-img372.png|397x151px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image373cm4-img373.png|331x154px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''上面的设置最终会在/boot/orangepiEnv.txt中加入overlaystxt中加入<span style="color:#FF0000">overlays=raspi-7inch-touchscreen这句配置。设置完后可以先检查下。如果不存在这句配置,那么设置就是有问题。touchscreen</span>这句配置。设置完后可以先检查下。如果不存在这句配置,那么设置就是有问题。'''</p><p>'''如果觉得使用orangepi-config比较麻烦,也可以使用vim编辑器打开/boot/orangepiEnv.txt,然后加入overlaystxt,然后加入<span style="color:#FF0000">overlays=raspi-7inch-touchscreen </span> 这句配置也是可以。'''</p>
<p>orangepi@orangepi:~$ '''cat /boot/orangepiEnv.txt | grep "raspi"'''</p>
<p><span style="color:#FF0000">'''overlays=raspi-7inch-touchscreen #示例配置'''</span></p></big>|}</li></ol>
</li>
<li><p>启动后可以看到lcd屏幕的显示如下所示:</p></li></ol>
[[File:media/image374cm4-img374.png|381x262px]]</li></ol>
=== 服务器版镜像旋转显示方向的方法 ===
<li><p>2: 翻转180度</p></li>
<li><p>3: 顺时钟转270度</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''sudo vim /boot/orangepiEnv.txt'''</p>
<p>overlays=lcd1</p>
<p>'''<span style="color:#FF0000">extraargs=cma=64M fbcon=rotate:3</span>'''</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''注意,/boot/orangepiEnv.txt中如果默认有extraargs=cma=64M这行配置,fbcon=rotate:3这个配置添加到extraargs=cma=64M的后面即可(需要用空格隔开)。'''</p></big>|}</li></ol>
</li>
<li><p>然后'''<span style="color:#FF0000">重启</span>'''Linux系统就能看到lcd屏幕显示的方向已经旋转了</p></li></ol>
=== 桌面版镜像旋转显示和触摸方向的方法 ===
<ol style="list-style-type: decimal;">
<li><p>首先在Linux系统中打开'''Display'''设置</p>
<p>[[File:media/image375cm4-img375.png|298x206px]]</p></li>
<li><p>然后在'''Rotation'''中选择想要旋转的方向</p>
<ol style="list-style-type: lower-alpha;">
<li><p>'''Inverted''': 上下翻转,相当于旋转180度</p></li>
<li><p>'''Right''': 向右旋转90度</p>
<p>[[File:media/image376cm4-img376.png|286x180px]]</p></li></ol>
</li>
<li><p>然后点击'''Apply'''</p>
<p>[[File:media/image377cm4-img377.png|330x207px]]</p></li>
<li><p>然后选择'''Keep this configuration'''</p>
<p>[[File:media/image378cm4-img378.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>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''set_lcd_rotate.sh none'''</p>|}</li>
<li><p>'''Left''': 向左旋转90度</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''set_lcd_rotate.sh left'''</p>|}</li>
<li><p>'''Inverted''': 上下翻转,相当于旋转180度</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''set_lcd_rotate.sh inverted'''</p>|}</li>
<li><p>'''Right''': 向右旋转90度</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''set_lcd_rotate.sh right'''</p>
|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><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 "TransformationMatrix" "x x x x x x x x x"这行配置来实现的。其中"x x x x x x x x x"不同的方向配置不同。'''</p></li></ol>
<!-- -p>'''旋转触摸的方向是通过在/usr/share/X11/xorg.conf.d/40-libinput.conf中加入Option "TransformationMatrix" "x x x x x x x x x"这行配置来实现的。其中"x x x x x x x x x"不同的方向配置不同。'''</p></big>|}</li></ol></li></ol>
<ol start="7" style="list-style-type: decimal;">
<li><p>触摸旋转参考资料</p>
{| class="wikitable" style="width:800px;" |-| <p>[https://wiki.ubuntu.com/X/InputCoordinateTransformation '''https://wiki.ubuntu.com/X/InputCoordinateTransformation''']</p>|}</li></ol>
<span id="edp屏幕的使用方法"></span>
== eDP屏幕的使用方法 ==
<ol style="list-style-type: lower-alpha;">
<li><p>0.5间距30pin单头同向排线</p>
<p>[[File:media/image379cm4-img379.png|199x197px]]</p></li>
<li><p>15.6寸 eDP显示屏,分辨率为1920x1080。</p>
<div class="figure">
[[File:media/image380cm4-img380.png|212x367px|8763EEF4-115F-4b95-A8FB-CA0A62F57B70]]
</div></li></ol>
</li>
<li><p>将30pin单头同向排线的FPC端连接到开发板的eDP接口,另一端连接到屏幕的eDP接口</p>
<p>[[File:media/image381cm4-img381.png|339x150px]]</p></li></ol>
<span id="打开edp屏幕配置的方法"></span>
=== 打开eDP屏幕配置的方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''注意,下面介绍的方法仅适用于已适配过的eDP屏幕,如果客户使用的是未经过适配的屏幕,按照下面的方法是无法点亮的。'''</big>|}
<ol style="list-style-type: decimal;">
<ol style="list-style-type: lower-alpha;">
<li><p>首先运行下'''orangepi-config''',普通用户记得加'''sudo'''权限</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo orangepi-config'''</p>|}</li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image368cm4-img368.png|576x304px]]</p></li>
<li><p>然后选择'''Hardware'''</p>
<p>[[File:media/image369cm4-img369.png|576x266px]]</p></li>
<li><p>然后使用键盘的方向键定位到edp,再使用'''空格'''选中</p>
<p>[[File:media/image382cm4-img382.png|396x379px]]</p></li>
<li><p>然后选择'''<Save>'''保存</p>
<p>[[File:media/image371cm4-img371.png|404x133px]]</p></li>
<li><p>然后选择'''<Back>'''</p>
<p>[[File:media/image372cm4-img372.png|397x151px]]</p></li>
<li><p>然后选择'''<Reboot>'''重启系统使配置生效</p>
<p>[[File:media/image373cm4-img373.png|331x154px]]</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''上面的设置最终会在/boot/orangepiEnv.txt中加入overlaystxt中加入<span style="color:#FF0000">overlays=edp这句配置。设置完后可以先检查下。如果不存在这句配置,那么设置就是有问题。edp</span>这句配置。设置完后可以先检查下。如果不存在这句配置,那么设置就是有问题。'''</p><p>'''如果觉得使用orangepi-config比较麻烦,也可以使用vim编辑器打开/boot/orangepiEnv.txt,然后加入overlaystxt,然后加入<span style="color:#FF0000">overlays=edp </span> 这句配置也是可以。'''</p>
<p>orangepi@orangepi:~$ '''cat /boot/orangepiEnv.txt | grep "edp"'''</p>
<p>'''<span style="color:#FF0000">overlays=edp #示例配置</span>'''</p></big>|}</li></ol>
</li>
<li><p>启动后可以看到eDP屏幕的显示如下所示:</p>
<p>[[File:media/image383cm4-img383.png|458x289px]]</p></li></ol>
== 开关机logo使用说明 ==
<li><p>开关机logo默认只在桌面版的系统中才会显示</p></li>
<li><p>在'''/boot/orangepiEnv.txt'''中设置'''bootlogo'''变量为'''false'''可以关闭开关机logo</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim /boot/orangepiEnv.txt'''</p>
<p>verbosity=1</p>
<p>'''<span style="color:#FF0000">bootlogo=false</span>'''</p>|}</li>
<li><p>在'''/boot/orangepiEnv.txt'''中设置'''bootlogo'''变量为'''true'''可以开启开关机logo</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>orangepi@orangepi:~$ '''vim /boot/orangepiEnv.txt'''</p>
<p>verbosity=1</p>
<p>'''<span style="color:#FF0000">bootlogo=true</span>'''</p>|}</li>
<li><p>开机logo图片在Linux系统中的位置为</p>
{| class="wikitable" style="width:800px;" |-| <p>'''/usr/share/plymouth/themes/orangepi/watermark.png'''</p>|}</li>
<li><p>替换开机logo图片后需要运行下命令才能生效</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo update-initramfs -u'''</p>|}</li></ol>
<span id="zfs文件系统的使用方法"></span>
== ZFS文件系统的使用方法 ==
=== 安装ZFS的方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''安装zfs前,请先确保使用的Linux镜像为最新版本。另外,如果系统中已经安装了zfs,就无需重复安装了。'''</big>|}
安装zfs前首先需要安装内核头文件,安装内核头文件的方法请参考[[\lOrange Pi CM4#安装内核头文件的方法|'''安装内核头文件的方法''']]小节的说明。
在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/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html '''官方工具''']中下载到。打开'''官方工具''',然后进入'''Ubuntu和Debian系统使用的zfs相关的deb包'''文件夹后,可以看到Ubuntu20.04、Ubuntu22.04和Debian11三种类型的deb包,请下载需要的版本。
[[File:media/image384cm4-img384.png|232x136px]]
下载完对应版本的zfs deb包后,请将它们上传到开发板的Linux系统中。上传方法请参考[[\l|'''上传文件到开发板Linux系统中的方法''']]小节的说明。
上传完成后,再在开发板Linux系统的命令行中使用'''cd'''命令进入deb包的目录,然后使用下面的命令就可以安装zfs的deb包。
{| class="wikitable" style="width:800px;"
|-
|
orangepi@orangepi:~$ '''sudo apt install ./*.deb'''
|}
安装完成后,使用下面的命令可以看到zfs相关的内核模块:
{| class="wikitable" style="width:800px;"
|-
|
orangepi@orangepi:~$ '''ls /lib/modules/5.10.160-rockchip-rk356x/updates/dkms/'''
'''icp.ko spl.ko zavl.ko zcommon.ko zfs.ko zlua.ko znvpair.ko zunicode.ko zzstd.ko'''
|}
然后重启下Linux系统就能看到zfs内核模块会自动加载了:
{| class="wikitable" style="width:800px;" |-| orangepi@orangepi:~$ '''lsmod | grep ""zfs""'''
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包。
{| class="wikitable" style="width:800px;"
|-
|
orangepi@orangepi:~$ '''sudo apt install -y zfsutils-linux zfs-dkms'''
|}
<span id="创建zfs池的方法"></span>
=== 创建ZFS池的方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''ZFS是基于存储池的,我们可以将多个物理存储设备添加到池中,然后从这个池中分配存储空间。'''
'''下面的内容是基于开发板接了一个NVMe SSD和一个U盘来演示的。'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>首先我们可以通过'''lsblk'''命令查看下开发板所有的存储设备,当前开发板接了一个NVMe SSD以及一个U盘,输出如下所示:</p>
<p>[[File:media/image385cm4-img385.png|379x227px]]</p></li>
<li><p>然后输入下面的命令可以创建一个ZFS池,包含NVMe SSD和U盘两个存储设备</p>
{| class="wikitable" style="width:800px;" |-| <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:media/image386cm4-img386.png|576x37px]]</p></li>
<li><p>然后执行'''df -h'''可以看到'''pool1'''被挂载到了'''/pool1'''目录</p>
/dev/mmcblk0p2 29G 6.0G 22G 22% / <span id="测试zfs的数据去重功能"></spanbr>=== 测试ZFS的数据去重功能 ===
tmpfs 7.7G 46M 7.7G 1% /dev/shm <br> tmpfs 5.0M 4.0K 5.0M 1% /run/lock <br> tmpfs 7.7G 944K 7.7G 1% /tmp <br> /dev/mmcblk0p1 1022M 115M 908M 12% /boot <br> /dev/zram1 188M 4.5M 169M 3% /var/log <br> tmpfs 1.6G 80K 1.6G 1% /run/user/1000 <br> '''pool1 489G 9.3M 489G 1% <span style="color:#FF0000">/pool1</span>''' <br>|}</li><li><p>使用下面的命令可以看到pool1的文件系统类型为zfs</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''mount | grep pool1'''</p><p>pool1 on /pool1 type '''<span style="color:#FF0000">zfs</span>''' (rw,xattr,noacl)</p>|}</li><li><p>然后我们可以测试下拷贝一个文件到ZFS池中</p>{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo cp -v /usr/local/test.mp4 /pool1/'''</p><p>'/usr/local/test.mp4' -> '/pool1/test.mp4'</p>|}</li></ol> <span id="测试zfs的数据去重功能"></span> === 测试ZFS的数据去重功能 === <ol style="list-style-type: decimal;">
<li><p>ZFS的数据去重功能默认是关闭的,我们需要执行下面的命令打开</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo zfs set dedup=on pool1'''</p>|}</li>
<li><p>然后做一个简单的测试,首先进入pool1中,再执行下面的命令生成1个1G大小的随机文件</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>{| class="wikitable" style="width:800px;" |-|
root@orangepi:/pool1$ '''for ((i=0; i<1000; i++)); do sudo cp test.1g $i.test.1g; done'''
|}</li></ol>
<ol start="4" style="list-style-type: decimal;">
<li>然后用'''du -lh'''可以看到目前池中总共有1002G的数据,但实际上ZFS池的大小只有'''504GB'''(SSD+U盘的总容量),是装不下那么大的数据的</li></ol>{| class="wikitable" style="width:800px;" |-|
root@orangepi:/pool1$ '''du -lh'''
1002G
|}</li></ol>
<ol start="5" style="list-style-type: decimal;">
<li><p>然后用'''zpool list'''命令可以看到实际只占用了1.01G,因为这1001个文件都是重复的,说明数据去重功能有效。</p>
<p>[[File:media/image387cm4-img387.png|576x36px]]</p></li></ol>
<span id="测试zfs的数据压缩功能"></span>
=== 测试ZFS的数据压缩功能 ===
# 因为存储的数据不同,压缩节省的磁盘空间也会有所不同,所以我们选择压缩比较大的纯文本文件来进行压缩测试,执行下面的命令将'''/var/log/'''和'''/etc/'''目录打包成tar包
::{| class="wikitable" style="width:800px;"
|-
|
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:media/image388cm4-img388.png|576x90px]]</p></li>
<li><p>然后我们在ZFS池pool1中启用压缩功能</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:/pool1$ '''sudo zfs set compression=lz4 pool1'''</p>|}</li><li><p>然后再次执行下面的命令将'''/var/log/'''和'''/etc/'''目录打包成tar包</p></li></ol>{| class="wikitable" style="width:800px;" |-|
root@orangepi:/pool1$ '''sudo tar -cf text.tar /var/log/ /etc/'''
|}</li></ol>
<ol start="5" style="list-style-type: decimal;">
<li>这时可以看到'''text.tar'''文件大小还是27M,但是在ZFS池中只占用9.47M的空间,说明文件被压缩了</li></ol> [[File:media/image389cm4-img389.png|576x79px]]</li></ol>
== 关机和重启开发板的方法 ==
<ol style="list-style-type: decimal;">
<li><p>在Linux系统运行的过程中,如果直接拔掉Type-C电源断电,可能会导致文件系统丢失某些数据或者损坏,所以在断电前请先使用'''poweroff'''命令关闭开发板的Linux系统,然后再拔掉电源。</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo poweroff'''</p>|}</li>
<li><p>重启Linux系统的命令为</p>
{| class="wikitable" style="width:800px;" |-| <p>orangepi@orangepi:~$ '''sudo''' '''reboot'''</p>|}</li></ol>
<span id="linux-sdkorangepi-build使用说明"></span>
== 编译系统需求 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''我们可以在x64的电脑中交叉编译开发板的Linux镜像,也可以在开发板的Ubuntu22.04系统中来编译开发板的Linux镜像,请根据自己的喜好二选一。'''
'''如果是在开发板的Ubuntu22.04系统中使用orangepi-build来编译Linux镜像,请做好散热(尤其是SSD启动时)。如果散热没做好,容易出现文件系统跑飞的错误。'''</big>|}
<span id="使用x64的ubuntu22.04电脑编译"></span>
<ol style="list-style-type: decimal;">
<li><p>Linux SDK,即'''orangepi-build''',支持在安装有'''<span style="color:#FF0000">Ubuntu 22.04</span>'''的电脑上运行,所以下载orangepi-build前,请首先确保自己电脑已安装的Ubuntu版本是Ubuntu 22.04。查看电脑已安装的Ubuntu版本的命令如下所示,如果Release字段显示的不是'''<span style="color:#FF0000">22.04</span>''',说明当前使用的Ubuntu版本不符合要求,请更换系统后再进行下面的操作。</p>{| class="wikitable" style="width:800px;" |-|
<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: '''<span style="color:#FF0000">22.04</span>'''</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 '''<span style="color:#FF0000">amd64</span>'''版本的安装镜像下载地址为:</p>{| class="wikitable" style="width:800px;" |-|
<p>[https://repo.huaweicloud.com/ubuntu-releases/21.04/ubuntu-21.04-desktop-amd64.iso '''https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ubuntu-22.04-desktop-amd64.iso''']</p>
<p>或者</p>
<p>'''https://repo.huaweicloud.com/ubuntu-releases/22.04/ubuntu-22.04.1-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>{| class="wikitable" style="width:800px;" |-|
[https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ '''https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/''']
|}</ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>注意Ubuntu版本需要切换到22.04</p>
<p>[[File:media/image390cm4-img390.png|576x241px]]</p></li>
<li><p>需要替换的'''/etc/apt/sources.list'''文件的内容为</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>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>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~$ '''sudo apt update'''</p>|}</li><li><p>'''<span style="color:#FF0000">另外,由于内核和U-boot等源码都是存放在GitHub上的,所以编译镜像的时候请确保电脑能正常从GitHub下载代码,这点是非常重要的。</span>'''</p></li></ol></li></ol><span id="获取linux-sdk的源码"></span>
== 获取Linux sdk的源码 ==
# Linux sdk其实指的就是orangepi-build这套代码,orangepi-build是基于armbian build编译系统修改而来的,使用orangepi-build可以编译出多个版本的Linux镜像。首先下载orangepi-build的代码,命令如下所示:
::{| class="wikitable" style="width:800px;"
|-
|
test@test:~$ '''sudo apt-get update'''
test@test:~$ '''git clone https://github.com/orangepi-xunlong/orangepi-build.git -b next'''
|}
::{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
|
<big>'''注意,Orange Pi CM4开发板是需要下载orangepi-build的next分支源码的,上面的git clone命令需要指定orangepi-build源码的分支为next。'''</big>
<ol start="2" style="list-style-type: decimal;">
<li>开发板当前使用的u-boot和Linux内核版本如下所示</li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''分支'''
| '''Linux5.10'''
|}
{| class="wikitable" style="background-color:#ffffdc;width:800px;"
|-
|
<big>'''这里所说的分支和orangepi-build源代码的分支不是同一个东西,请不要搞混了。此分支主要是用来区分不同内核源码版本的。'''
<ol start="3" style="list-style-type: decimal;">
<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>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build$ '''ls'''</p>
<p>'''build.sh external LICENSE README.md scripts'''</p>|}{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''如果是从github下载的orangepi-build的代码,下载完后你可能会发现orangepi-build中并没有包含u-boot和Linux内核的源码,也没有编译u-boot和Linux内核需要用到交叉编译工具链,这是正常的,因为这些东西都存放在其它单独的github仓库或者某些服务器上了(下文会详述其地址)。orangepi-build在脚本和配置文件中会指定u-boot、Linux内核和交叉编译工具链的地址,运行orangepi-build时,当其发现本地没有这些东西,会自动去相应的地方下载的。'''</p></big>|}</li></ol>
</li></ol>
=== 下载交叉编译工具链 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''只有在x64的电脑中使用orangepi-build编译镜像才会下载交叉编译工具链。在开发板的Ubuntu22.04中编译开发板的Linux镜像是不会下载交叉编译工具链的,此时orangepi-build/toolchains会是一个空文件夹。'''</big>|}
<ol style="list-style-type: decimal;">
<div class="figure">
[[File:media/image392cm4-img392.png|575x278px|选区_396]]
</div></li>
<li><p>交叉编译工具链在中国境内的镜像网址为清华大学的开源软件镜像站</p>
{| class="wikitable" style="width:800px;" |-| <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>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build$ '''ls toolchains/'''</p>
<p>gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu</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</p>
{| class="wikitable" style="width:800px;" |-| <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>
{| class="wikitable" style="width:800px;" |-| <p>'''gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu'''</p>|}</li></ol>
</li></ol>
<ol style="list-style-type: lower-alpha;">
<li><p>Linux内核源码存放的git仓库如下所示:</p>
{| class="wikitable" style="width:800px;" |-| <p>'''https://github.com/orangepi-xunlong/linux-orangepi/tree/orange-pi-5.10-rk35xx'''</p>|}</li>
<li><p>u-boot源码存放的git仓库如下所示:</p>
{| class="wikitable" style="width:800px;" |-| <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/RK3566系列开发板legacy分支的内核源码,内核源码的文件夹的名字请不要手动修改,如果修改了,编译系统运行时会重新下载内核源码</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/RK3566系列开发板legacy分支的u-boot源码,u-boot源码的文件夹的名字请不要手动修改,如果修改了,编译系统运行时会重新下载u-boot源码</p></li>
<li><p>'''userpatches''': 存放编译脚本需要用到的配置文件</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
<ol style="list-style-type: decimal;">
<li><p>运行build.sh脚本,记得加sudo权限</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~/orangepi-build$ '''sudo ./build.sh'''</p>|}</li>
<li><p>选择'''U-boot package''',然后回车</p>
<div class="figure">
[[File:media/image393cm4-img393.png|576x132px|选区_238]]
</div></li>
<div class="figure">
[[File:media/image394cm4-img394.png|576x253px|7d7048f5baea57bf0b852752e46b5446]]
</div></li>
<ol style="list-style-type: lower-alpha;">
<li><p>u-boot源码的版本</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Compiling u-boot [ '''v2017.09''' ]</p>|}</li>
<li><p>交叉编译工具链的版本</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Compiler version [ '''aarch64-linux-gnu-gcc 7.4.1''' ]</p>|}</li>
<li><p>编译生成的u-boot deb包的路径</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Target directory [ '''orangepi-build/output/debs/u-boot''' ]</p>|}</li>
<li><p>编译生成的u-boot deb包的包名</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] File name [ '''linux-u-boot-legacy-orangepicm4_1.0.0_arm64.deb''' ]</p>|}</li>
<li><p>编译使用的时间</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Runtime [ '''1 min''' ]</p>|}</li>
<li><p>重复编译u-boot的命令,使用下面的命令无需通过图形界面选择,可以直接开始编译u-boot</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Repeat Build Options [ '''sudo ./build.sh BOARD=orangepicm4 BRANCH=legacy BUILD_OPT=u-boot KERNEL_CONFIGURE=no''' ]</p>|}</li></ol>
</li>
<li><p>查看编译生成的u-boot deb包</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build$ '''ls output/debs/u-boot/'''</p>
<p>linux-u-boot-legacy-orangepicm4_1.0.0_arm64.deb</p>|}</li>
<li><p>生成的u-boot的deb包包含的文件如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>使用下面的命令可以解压deb包</p>
{| class="wikitable" style="width:800px;"
|-
|
<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-orangepicm4_1.0.0_arm64.deb . (注意命令最后有个”.”)'''</p>
<p>test@test:~/orangepi_build/output/debs/u-boot$ '''ls'''</p>
<p>linux-u-boot-legacy-orangepicm4_1.0.0_arm64.deb '''usr'''</p>|}</li>
<li><p>解压后的文件如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build/output/debs/u-boot$ '''tree usr'''</p>
<p>usr</p>
<p>└── lib</p>
:<p>├── linux-u-boot-legacy-orangepicm4_1.0.0_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-cm4-rk3566_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>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build$ '''vim userpatches/config-default.conf'''</p>
<p>IGNORE_UPDATES="'''<span style="color:#FF0000">yes</span>'''"</p>|}</li>
<li><p>调试u-boot代码时,可以使用下面的方法来更新Linux镜像中的u-boot进行测试</p>
<ol style="list-style-type: lower-alpha;">
<li><p>将编译好的u-boot的deb包上传到开发板的Linux系统中</p>
{| class="wikitable" style="width:800px;"
|-
|
<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-orangepicm4_1.0.0_arm64.deb [mailto:root@192.168.1.xxx:/root root@192.168.1.xxx:/root]'''</p>|}</li>
<li><p>然后登录到开发板,卸载已安装的u-boot的deb包</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''apt purge -y linux-u-boot-orangepicm4-legacy'''</p>|}</li>
<li><p>再安装刚才上传的新的u-boot的deb包</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''dpkg -i''' '''linux-u-boot-legacy-orangepicm4_1.0.0_arm64.deb'''</p>|}</li>
<li><p>然后运行 nand-sata-install脚本</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''nand-sata-install'''</p>|}</li>
<li><p>然后选择'''5 Install/Update the bootloader on SD/eMMC'''来更新TF卡中的u-boot</p>
<p>[[File:media/image395cm4-img395.png|312x152px]]</p></li>
<li><p>按下回车键后首先会弹出一个Warning</p>
<p>[[File:media/image396cm4-img396.png|309x168px]]</p></li>
<li><p>再按下回车键就会开始更新u-boot,更新完后会显示下面的信息</p>
<p>[[File:media/image397cm4-img397.png|244x137px]]</p></li>
<li><p>然后就可以重启开发板来测试u-boot的修改是否生效了</p></li></ol>
</li>
<ol style="list-style-type: lower-alpha;">
<li><p>u-boot 2017.09源码中,开发板使用的defconfig配置文件为</p>
{| class="wikitable" style="width:800px;" |-| <p>[https://github.com/orangepi-xunlong/u-boot-orangepi/blob/v2017.09-rk3588/configs/orangepi-cm4-rk3566_defconfig '''orangepi-build/u-boot/v2017.09-rk3588/configs/orangepi-cm4-rk3566_defconfig''']</p>|}</li><li><p>u-boot 2017.09源码中,开发板使用dts文件为</p>{| class="wikitable" style="width:800px;" |-| [https://github.com/orangepi-xunlong/u-boot-orangepi/blob/v2017.09-rk3588/arch/arm/dts/rk3566-orangepi-cm4.dts '''orangepi-build/u-boot/v2017.09-rk3588/arch/arm/dts/rk3566-orangepi--cm4.dts''']|}</li></ol>
</li></ol>
<span id="_Toc181485290" class="anchor"></span>
<ol style="list-style-type: decimal;">
<li><p>运行build.sh脚本,记得加sudo权限</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~/orangepi-build$ '''sudo ./build.sh'''</p>|}</li>
<li><p>选择'''Kernel package''',然后回车</p>
<div class="figure">
[[File:media/image398cm4-img398.png|575x116px|选区_240]]
</div></li>
<div class="figure">
[[File:media/image394cm4-img394.png|576x253px|7d7048f5baea57bf0b852752e46b5446]]
</div></li>
<li><p>然后会提示是否需要显示内核配置界面,如果不需要修改内核配置,则选择第一个即可,如果需要修改内核配置,则选择第二个</p>
<p>[[File:media/image399cm4-img399.png|576x87px]]</p></li><li><p>如果第4) 如果第'''4'''步选择了需要显示内核配置菜单(第二个选项),则会弹出通过'''make menuconfig'''打开的内核配置的界面,此时可以直接修改内核的配置,修改完后再保存退出即可,退出后会开始编译内核源码</p><p>[[File:media/image400cm4-img400.png|575x400px]]</p></li></ol>
<ol style="list-style-type: lower-alpha;">
<li><p>如果不需要修改内核的配置选项,在运行build.sh脚本时,传入'''KERNEL_CONFIGURE=no'''就可临时屏蔽弹出内核的配置界面了</p>
{| class="wikitable" style="width:800px;" |-| <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:media/image401cm4-img401.png|574x234px]]</p></li></ol></ol>
<!-- -->
<ol start="6" style="list-style-type: decimal;">
<ol style="list-style-type: lower-alpha;">
<li><p>Linux内核源码的版本</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Compiling current kernel [ '''5.10.160''' ]</p>|}</li>
<li><p>使用的交叉编译工具链的版本</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Compiler version [ '''aarch64-none-linux-gnu-gcc 11.2.1''' ]</p>|}</li>
<li><p>内核默认使用的配置文件以及它存放的路径</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Using kernel config file [ '''config/kernel/linux-rockchip-rk356x-legacy.config''' ]</p>|}</li>
<li><p>编译生成的内核相关的deb包的路径</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Target directory [ '''orangepi-build/output/debs/''' ]</p>|}</li>
<li><p>编译生成的内核镜像deb包的包名</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] File name [ '''linux-image-legacy-rockchip-rk356x_1.0.0_arm64.deb''' ]</p>|}</li>
<li><p>编译使用的时间</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Runtime [ '''5 min''' ]</p>|}</li>
<li><p>最后会显示重复编译上一次选择的内核的编译命令,使用下面的命令无需通过图形界面选择,可以直接开始编译内核源码</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Repeat Build Options [ '''sudo ./build.sh BOARD=orangepicm4 BRANCH=legacy BUILD_OPT=kernel KERNEL_CONFIGURE=no''' ]</p>|}</li></ol>
</li>
<li><p>查看编译生成的内核相关的deb包</p>
<li><p>'''linux-headers-legacy-rockchip-rk356x_1.0.0_arm64.deb'''包含内核头文件</p></li>
<li><p>'''linux-image-legacy-rockchip-rk356x_1.0.0_arm64.deb'''包含内核镜像和内核模块</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build$ '''ls output/debs/linux-*'''</p>
<p>output/debs/linux-dtb-legacy-rockchip-rk356x_1.0.0_arm64.deb </p><p>output/debs/linux-image-legacy-rockchip-rk356x_1.0.0_arm64.deb</p><p>output/debs/linux-headers-legacy-rockchip-rk356x_1.0.0_arm64.deb</p>|}</li></ol>
</li>
<li><p>生成的linux-image的deb包包含的文件如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>使用下面的命令可以解压deb包</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~/orangepi-build$ '''cd output/debs'''</p></li></ol></li></ol>
test@test:~/orangepi_build/output/debs$ '''mkdir test'''
'''boot etc lib''' linux-image-legacy-rockchip-rk356x_1.0.0_arm64.deb '''usr'''
|}</li></ol>
<ol start="2" style="list-style-type: lower-alpha;">
<li><p>解压后的文件如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build/output/debs/test$ '''tree -L 2'''</p>
<p>.</p>
<p>├── linux-image-legacy-rockchip-rk356x_1.0.0_arm64.deb</p>
<p>└── usr</p>
:<p>├── lib</p>:<p>└── share</p>|}</li></ol></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>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build$ '''vim userpatches/config-default.conf'''</p>
<p>IGNORE_UPDATES="'''<span style="color:#FF0000">yes</span>'''"</p>|}</li>
<li><p>如果对内核做了修改,可以使用下面的方法来更新开发板Linux系统的内核和内核模块</p>
<ol style="list-style-type: lower-alpha;">
<li><p>将编译好的Linux内核的deb包上传到开发板的Linux系统中</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~/orangepi-build$ '''cd output/debs'''</p>
<p>test@test:~/orangepi-build/output/debs$ '''scp \'''</p>
<p>'''linux-image-legacy-rockchip-rk356x_1.0.0_arm64.deb root@192.168.1.xxx:/root'''</p>|}</li>
<li><p>然后登录到开发板,卸载已安装的Linux内核的deb包</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''apt purge -y linux-image-legacy-rockchip-rk356x'''</p>|}</li>
<li><p>再安装刚才上传的新的Linux内核的deb包</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''dpkg -i linux-image-legacy-rockchip-rk356x_1.0.0_arm64.deb'''</p>|}</li>
<li><p>然后重启开发板,再查看内核相关的修改是否已生效</p>
{| class="wikitable" style="width:800px;" |-| <p>root@orangepi:~# '''reboot'''</p>|}</li></ol>
</li>
<li><p>其它有用的信息</p>
<ol style="list-style-type: lower-alpha;">
<li><p>内核配置文件存放位置如下所示,请不要到内核源码中去找开发板所使用的内核配置文件</p></li>
</li></ol>
== 编译rootfs ==
<ol style="list-style-type: decimal;">
<li><p>运行build.sh脚本,记得加sudo权限</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~/orangepi-build$ '''sudo ./build.sh'''</p>|}</li><li><p>选择'''Rootfs and all deb packages''',然后回车</p></li></ol>
<div class="figure">
[[File:media/image402cm4-img402.png|576x119px|选区_241]]
</div></ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>接着选择开发板的型号</p>
<div class="figure">
[[File:media/image394cm4-img394.png|576x253px|7d7048f5baea57bf0b852752e46b5446]]
</div></li>
<li><p>然后选择rootfs的类型</p>
<p>[[File:media/image403cm4-img403.png|575x86px]]</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:media/image404cm4-img404.png|576x75px|选区_245]]
</div></li></ol>
<div class="figure">
[[File:media/image405cm4-img405.png|576x78px|选区_397]]
</div></li>
<div class="figure">
[[File:media/image406cm4-img406.png|575x99px|Selection_001]]
</div>
<p>[[File:media/image407cm4-img407.png|576x74px]]</p>
<p>然后可以选择需要安装的额外的软件包。这里请按下回车键直接跳过。</p>
<p>[[File:media/image408cm4-img408.png|575x264px]]</p></li>
<li><p>然后就会开始编译rootfs,编译时提示的部分信息说明如下所示</p>
<ol style="list-style-type: lower-alpha;">
<li><p>rootfs的类型</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] local not found [ Creating new rootfs cache for '''jammy''']</p>|}</li>
<li><p>编译生成的rootfs压缩包的存放路径</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Target directory [ '''external/cache/rootfs''' ]</p>|}</li>
<li><p>编译生成的rootfs压缩包的名字</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] File name [ '''jammy-xfce-arm64.f930ff6ebbac1a72108a2e100762b18f.tar.lz4''' ]</p>|}</li>
<li><p>编译使用的时间</p>
{| class="wikitable" style="width:800px;" |-| <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-alphanone;"><li><p>a) '''jammy'''表示rootfs的Linux发行版的类型</p></li><li><p>b) '''xfce'''表示rootfs为桌面版的类型,如果为'''cli'''则表示服务器版类型</p></li><li><p>c) '''arm64'''表示rootfs的架构类型</p></li><li><p>d) '''f930ff6ebbac1a72108a2e100762b18f'''是由rootfs安装的所有软件包的包名生成的MD5哈希值,只要没有修改rootfs安装的软件包的列表,那么这个值就不会变,编译脚本会通过这个MD5哈希值来判断是否需要重新编译rootfs</p></li></ol>
</li>
<li><p>'''jammy-xfce-arm64.f930ff6ebbac1a72108a2e100762b18f.tar.lz4.list'''列出了rootfs安装的所有软件包的包名</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>
<span id="编译linux镜像"></span>
== 编译Linux镜像 ==
<ol style="list-style-type: decimal;">
<li><p>运行build.sh脚本,记得加sudo权限</p>
{| class="wikitable" style="width:800px;" |-| <p>test@test:~/orangepi-build$ '''sudo ./build.sh'''</p>|}</li><li><p>选择'''Full OS image for flashing''',然后回车</p></li></ol>
<div class="figure">
[[File:media/image409cm4-img409.png|576x128px|选区_242]]
</div></li></ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>然后选择开发板的型号</p>
<div class="figure">
[[File:media/image394cm4-img394.png|576x253px|7d7048f5baea57bf0b852752e46b5446]]
</div></li>
<li><p>然后选择rootfs的类型</p>
<p>[[File:media/image403cm4-img403.png|575x86px]]</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:media/image404cm4-img404.png|576x75px|选区_245]]
</div></li></ol>
<div class="figure">
[[File:media/image405cm4-img405.png|569x77px|选区_397]]
</div></li>
<div class="figure">
[[File:media/image406cm4-img406.png|575x99px|Selection_001]]
</div>
<p>[[File:media/image407cm4-img407.png|576x74px]]</p>
<p>然后可以选择需要安装的额外的软件包。这里请按下回车键直接跳过。</p>
<p>[[File:media/image408cm4-img408.png|575x264px]]</p></li>
<li><p>然后就会开始编译Linux镜像,编译的大致流程如下</p>
<ol style="list-style-type: lower-alpha;">
<ol style="list-style-type: lower-alpha;">
<li><p>编译生成的镜像的存放路径</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Done building [ '''output/images/Orangepicm4_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160/Orangepicm4_1.0.0_debian_bullseye_desktop_xfce_linux5.10.160.img''' ]</p>|}</li><li><p>编译使用的时间</p></li></ol></li></ol>{| class="wikitable" style="width:800px;" |-|
'''[ o.k. ] Runtime [ 19 min ]'''
|}</ol ><ol start="3" style="list-style-type: lower-alpha;">
<li><p>重复编译镜像的命令,使用下面的命令无需通过图形界面选择,可以直接开始编译镜像</p>
{| class="wikitable" style="width:800px;" |-| <p>[ o.k. ] Repeat Build Options [ '''sudo ./build.sh BOARD=orangepicm4 BRANCH=legacy BUILD_OPT=image RELEASE=bullseye BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_CONFIGURE=yes''' ]</p>|}</li></ol></li></ol>
<span id="orange-pi-os-arch系统的使用说明"></span>
== Orange Pi OS Arch系统功能适配情况 ==
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''功能'''
|-
| '''SPIFlash+M.2 NVMe SSD启动'''
| '''<span style="color:#FF0000">OK,需要贴了SPI Flash才能正常使用</span>'''
|-
| '''WIFI'''
|-
| '''OV5647摄像头'''
| '''<span style="color:#FF0000">内核驱动OK,3A未调</span>'''
|-
| '''千兆网口'''
|-
| '''GPU'''
| '''<span style="color:#FF0000">NO</span>'''
|-
| '''NPU'''
| '''<span style="color:#FF0000">NO</span>'''
|-
| '''VPU'''
| '''<span style="color:#FF0000">NO</span>'''
|}
<span id="orange-pi-os-arch系统用户向导使用说明"></span>
== Orange Pi OS Arch系统用户向导使用说明 ==
<div class="figure">
[[File:media/image410cm4-img410.png|576x324px|1]]
</div></li>
<div class="figure">
[[File:media/image411cm4-img411.png|576x324px|2]]
</div></li>
<div class="figure">
[[File:media/image412cm4-img412.png|576x324px|3]]
</div></li>
<div class="figure">
[[File:media/image413cm4-img413.png|576x324px|4]]
</div></li>
<div class="figure">
[[File:media/image414cm4-img414.png|576x324px|5]]
</div></li>
<div class="figure">
[[File:media/image415cm4-img415.png|576x324px|6]]
</div></li>
<div class="figure">
[[File:media/image416cm4-img416.png|576x324px|7]]
</div></li>
<div class="figure">
[[File:media/image417cm4-img417.png|576x324px|8]]
</div></li>
<div class="figure">
[[File:media/image418cm4-img418.png|576x324px|9]]
</div></li>
<div class="figure">
[[File:media/image419cm4-img419.png|576x324px|1]]
</div>
<ol style="list-style-type: decimal;">
<li><p>首先打开'''/boot/extlinux/extlinux.conf'''配置文件</p>
{| class="wikitable" style="width:800px;" |-| <p>[orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''</p>|}</li><li><p>然后在'''/boot/extlinux/extlinux.conf'''中通过添加'''FDTOVERLAYS /dtbs/rockchip/overlay/xxx.dtbo'''来打开对应的配置</p>{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| </li></olbig> '''注意FDTOVERLAYS /dtbs/rockchip/overlay/xxx.dtbo中的xxx.dtbo需要替换为具体的dtbo配置,请不要照抄。'''</big>|}{| class="wikitable" style="width:800px;" |-|
[orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''
FDT /dtbs/rockchip/rk3566-orangepi-cm4.dtb
'''FDTOVERLAYS /dtbs/rockchip/overlay/<span style="color:#FF0000">xxx.dtbo</span>''' #需要添加的配置|}</li></ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>xxx.dtbo在OPi OS Arch镜像中的存放路径如下所示,请注意,此路径下面不是所有的dtbo都可以使用的。</p>
{| class="wikitable" style="width:800px;" |-| <p>'''/boot/dtbs/rockchip/overlay/'''</p>|}</li><li><p>开发板可以使用的DT overlays配置如下所示</p></li></ol>
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''开发板上的功能'''
| '''rk356x-spi3-m0-cs0-spidev.dtbo'''
|}
</li></ol>
<ol start="5" style="list-style-type: decimal;">
<li><p>如果需要同时打开多个配置,直接在'''FDTOVERLAYS'''后面将多个配置的路径加上即可,比如同时打开i2c2和pwm11的配置如下所示</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>[orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''</p>
<p>LABEL OPIOS ARM</p>
<p>LINUX /Image</p>
<p>FDT /dtbs/rockchip/rk3566-orangepi-cm4.dtb</p>
<p>'''FDTOVERLAYS <span style="color:#FF0000">/dtbs/rockchip/overlay/rk356x-i2c2-m1.dtbo /dtbs/rockchip/overlay/rk356x-pwm11-m1.dtbo</span>'''</p>|}</li>
<li><p>设置好后需要重启系统才能让配置生效</p>
{| class="wikitable" style="width:800px;" |-| <p>[orangepi@orangepi-pc ~]$ '''sudo reboot'''</p>|}</li></ol>
<span id="树莓派5寸屏幕的使用-1"></span>
== 树莓派5寸屏幕的使用 ==
<span id="树莓派5寸屏幕的组装方法-1"></span>
=== 树莓派5寸屏幕的组装方法 树莓派5寸屏幕组装方法 ===
请参考[[\lOrange Pi CM4#树莓派5寸屏幕的组装方法|'''树莓派5寸屏幕的组装方法''']]('''点击蓝色部分的文字即可跳转到对应位置''')。
<span id="打开树莓派5寸屏幕配置的方法-1"></span>
=== 打开树莓派5寸屏幕配置的方法 ===
<ol style="list-style-type: lower-alpha;">
<li><p>首先在'''/boot/extlinux/extlinux.conf'''中加入下面的配置</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>[orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''</p>
<p>LABEL OPIOS ARM</p>
<p>LINUX /Image</p>
<p>FDT /dtbs/rockchip/rk3566-orangepi-cm4.dtb</p>
<p>'''<span style="color:#FF0000">FDTOVERLAYS /dtbs/rockchip/overlay/rk356x-raspi-7inch-touchscreen.dtbo</span>''' #需要添加的配置</p>|}</li>
<li><p>然后重启系统</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>[orangepi@orangepi-pc ~]$ '''sudo reboot'''</p>
|}<p>重启后可以看到LCD屏幕的显示如下所示:</p></li></ol>
[[File:media/image420cm4-img420.png|349x215px]]</li></ol><span id="edp屏幕的使用方法-1"></span>
== eDP屏幕的使用方法 ==
<span id="edp屏幕的组装方法-1"></span>
=== eDP屏幕的组装方法 eDP屏幕组装方法 ===
请参考[[\lOrange Pi CM4#eDP屏幕的使用方法|'''eDP屏幕的使用方法''']]('''点击蓝色部分的文字即可跳转到对应位置''')。
<span id="打开edp屏幕配置的方法-1"></span>
=== 打开eDP屏幕配置的方法 ===
<ol style="list-style-type: lower-alpha;">
<li><p>首先在'''/boot/extlinux/extlinux.conf'''中加入下面的配置</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>[orangepi@orangepi-pc ~]$ '''sudo vim /boot/extlinux/extlinux.conf'''</p>
<p>LABEL OPIOS ARM</p>
<p>LINUX /Image</p>
<p>FDT /dtbs/rockchip/rk3566-orangepi-cm4.dtb</p>
<p>'''<span style="color:#FF0000">FDTOVERLAYS /dtbs/rockchip/overlay/rk356x-edp.dtbo</span>''' #需要添加的配置</p>|}</li>
<li><p>然后重启系统</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>[orangepi@orangepi-pc ~]$ '''sudo reboot'''</p>
|}<p>重启后可以看到eDP屏幕的显示如下所示:</p></li></ol>
[[File:media/image421cm4-img421.png|459x265px]]</li></ol>
== 安装软件的方法 ==
使用pacman包管理工具可以安装OPi OS中没有的软件,比如安装vim编辑器的命令如下所示,如果想安装其他软件,只需要把vim替换想要安装的软件的包名即可。
{| class="wikitable" style="width:800px;"
|-
|
[orangepi@orangepi-pc ~]$ '''sudo pacman -Syy vim'''
|}
<span id="android-11系统的使用说明"></span>
== 已支持的Android版本 ==
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''Android版本'''
<span id="android-功能适配情况"></span>
== Android 功能适配情况 ==
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''功能'''
|-
| '''M.2 NVMe SSD启动'''
| '''<span style="color:#FF0000">OK,需要贴了SPI Flash才能正常使用</span>'''
|-
| '''WIFI'''
|-
| '''OV5647摄像头'''
| '''<span style="color:#FF0000">内核驱动OK,3A未调</span>'''
|-
| '''千兆网口'''
<span id="wifi的连接测试方法"></span>
== WIFI的连接测试方法 ==
# 首先点击进入'''Setting'''
::[[File:media/image422cm4-img422.png|549x228px]]
<ol start="2" style="list-style-type: decimal;">
<li>然后选择'''Network & internet'''</li></ol> [[File:media/image423.png|565x120px]]
[[File:cm4-img423.png]]
</ol>
<ol start="3" style="list-style-type: decimal;">
<li>然后选择'''Wi-Fi'''</li></ol> [[File:media/image424.png|561x99px]]
[[File:cm4-img424.png]]
</ol>
<ol start="4" style="list-style-type: decimal;">
<li>然后打开'''Wi-Fi'''开关</li></ol> [[File:media/image425.png|560x167px]]
[[File:cm4-img425.png]]
</ol>
<ol start="5" style="list-style-type: decimal;">
<li><p>打开'''Wi-Fi'''后如果一切正常,就可以扫描到附近的Wi-Fi热点了</p>
<p>[[File:media/image426cm4-img426.png|561x166px]]</p></li>
<li><p>然后选择想连接的Wi-Fi后会弹出下图所示的密码输入界面</p>
<p>[[File:media/image427cm4-img427.png|553x237px]]</p></li>
<li><p>然后使用键盘输入Wi-Fi对应的密码,再使用鼠标点击虚拟键盘中的回车按钮就会开始连接Wi-Fi了</p>
<p>[[File:media/image428cm4-img428.png|553x232px]]</p></li>
<li><p>Wi-Fi连接成功后的显示如下图所示:</p>
<p>[[File:media/image429cm4-img429.png|558x102px]]</p></li></ol>
<span id="wi-fi-hotspot的使用方法"></span>
== Wi-Fi hotspot的使用方法 ==
<li><p>首先请确保以太网口已连接网线,并且能正常上网</p></li>
<li><p>然后选择'''Settings'''</p>
<p>[[File:media/image422cm4-img422.png|549x228px]]</p></li>
<li><p>然后选择'''Network & internet'''</p>
<p>[[File:media/image423cm4-img423.png|565x120px]]</p></li>
<li><p>然后选择'''Hotspot & tethering'''</p>
<p>[[File:media/image430cm4-img430.png|549x173px]]</p></li>
<li><p>然后选择'''Wi-Fi hotspot'''</p>
<p>[[File:media/image431cm4-img431.png|548x104px]]</p></li>
<li><p>然后打开'''Wi-Fi hotspot''',下图中还可以看到生成的热点的名字和密码,记住它们,在连接热点的时候要用到(如果需要修改热点的名字和密码,需要先关闭'''Wi-Fi hotspot''',然后才能修改)</p>
<p>[[File:media/image432cm4-img432.png|551x158px]]</p></li><li><p>此时可以拿出你的手机,如果一切正常,在手机搜索到的WI-FI列表中就能找到上图'''Hotspot name'''下面显示的同名('''这里为 AndroidAP_6953''')的WIFI热点了。然后可以点击'''AndroidAP_6953'''连接热点,密码在上图的'''Hotspot password''' 下面可以看到</p></li></ol> [[File:media/image433.png|313x238px]]
[[File:cm4-img433.png]]
</ol>
<ol start="8" style="list-style-type: decimal;">
<li>连接成功后显示如下图所示(不同手机界面会有区别,具体界面以你手机显示的为准)。此时就可以在手机上打开一个网页看下能否上网了,如果能正常打开网页, 说明开发板的'''WI-FI Hotspot''' 能正常使用</li></ol>
[[File:media/image434cm4-img434.png|327x165px]]</ol>
== 蓝牙的测试方法 ==
<ol style="list-style-type: decimal;">
<li><p>首先点击进入'''Setting'''</p>
<p>[[File:media/image422cm4-img422.png|549x228px]]</p></li>
<li><p>然后选择'''Connected devices'''</p>
<p>[[File:media/image435cm4-img435.png|547x115px]]</p></li>
<li><p>然后点击'''Pair new device'''打开蓝牙并开始扫描周围的蓝牙设备</p>
<p>[[File:media/image436cm4-img436.png|547x126px]]</p></li>
<li><p>搜索到的蓝牙设备会在'''Available devices'''下面显示出来</p>
<p>[[File:media/image437cm4-img437.png|559x279px]]</p></li>
<li><p>然后点击想要连接的蓝牙设备就可以开始配对了,当弹出下面的界面时,请使用鼠标选择'''Pair'''选项</p>
<p>[[File:media/image438cm4-img438.png|522x212px]]</p></li>
<li><p>这里测试的是开发板和安卓手机蓝牙的配置过程,此时在手机上会弹出下面的确认界面,在手机上也点击配对按钮后就会开始配对过程</p>
<p>[[File:media/image439cm4-img439.png|236x273px]]</p></li>
<li><p>配对完成后,可以看到如下图所示的已配对的蓝牙设备</p>
<p>[[File:media/image440cm4-img440.png|545x178px]]</p></li>
<li><p>此时可以使用手机蓝牙给开发板发送一张图片,发送后,在开发板的安卓系统中可以看到下面的确认界面,然后点击'''Accept'''就可以开始接收手机发过来的图片了</p>
<p>[[File:media/image441cm4-img441.png|559x238px]]</p></li>
<li><p>开发板Android系统蓝牙接收到的图片可以在文件管理器中打开'''Download'''目录查看</p>
<p>[[File:media/image442cm4-img442.png|573x97px]]</p></li></ol>
== 树莓派5寸屏幕的使用方法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''请确保使用的镜像为下面版本的两个版本的镜像:'''
'''OrangePiCM4_RK3566_Android11_lcd_v1.x.x.img'''
'''OrangePiCM4_RK3566_Android11_spi-nvme_lcd_v1.x.x.img'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>首先需要组装好屏幕,请参考[[\lOrange Pi CM4#树莓派5寸屏幕的组装方法|'''树莓派5寸屏幕的组装方法''']]</p></li>
<li><p>给板子接通Type-C电源,并上电,系统启动后,就可以看到屏幕显示如下图所示</p>
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big><p>'''树莓派5寸屏幕的显示和触摸都是可以用的,如果你的屏幕测试有问题,请先确保下购买的屏幕和Orange Pi适配的屏幕是一模一样的。'''</p><p>'''Orange Pi适配的屏幕在[[\lOrange Pi CM4#树莓派5寸屏幕的组装方法|树莓派5寸屏幕的组装方法]]中有说明。'''</p></big>|}<p>[[File:media/image443cm4-img443.png|484x312px]]</p></li></ol>
<span id="edp屏幕的使用方法-2"></span>
== eDP屏幕的使用方法 ==
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''请确保使用的镜像为下面的两个版本的镜像:'''
'''OrangePiCM4_RK3566_Android11_lcd_v1.x.x.img'''
'''OrangePiCM4_RK3566_Android11_spi-nvme_lcd_v1.x.x.img'''</big>|}
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''eDP屏幕是没有触摸功能的。'''</big>|}
<ol style="list-style-type: decimal;">
<ol style="list-style-type: lower-alpha;">
<li><p>0.5间距30pin单头同向排线</p>
<p>[[File:media/image379cm4-img379.png|215x212px]]</p></li>
<li><p>15.6寸 eDP显示屏,分辨率为1920x1080</p>
<div class="figure">
[[File:media/image380cm4-img380.png|259x449px|8763EEF4-115F-4b95-A8FB-CA0A62F57B70]]
</div></li></ol>
</li>
<li><p>将30pin单头同向排线的FPC端连接到开发板的eDP接口,另一端连接到屏幕的eDP接口</p></li></ol> [[File:media/image381.png|294x137px]]
[[File:cm4-img381.png]]
</li></ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>再给板子接通Type-C电源,并上电,系统启动后,就可以看到屏幕显示如下图所示</p>
<p>[[File:media/image444cm4-img444.png|388x243px]]</p></li></ol>
<span id="pin-接口-gpiouartspi-和-pwm-测试"></span>
== 40pin 接口 GPIO、UART、SPI 和 PWM 测试 ==
<ol style="list-style-type: decimal;">
<li><p>首先点击wiringOP图标打开wiringOP APP</p>
<p>[[File:media/image445cm4-img445.png|576x210px]]</p></li>
<li><p>wiringOP APP的主界面显示如下图所示,然后点击'''GPIO_TEST'''按钮打开GPIO测试界面</p>
<p>[[File:media/image446cm4-img446.png|575x148px]]</p></li>
<li><p>GPIO测试界面如下图所示,左边的两排'''CheckBox'''按钮跟40pin引脚是一一对应的关系。当勾选'''CheckBox'''按钮时,对应的GPIO引脚会被设置为'''OUT'''模式,引脚电平设置为高电平;当取消勾选时,GPIO引脚电平设置为低电平;当点击右边的'''GPIO READALL'''按钮时,可以获取到wPi号、GPIO模式、引脚电平等信息;当点击'''BLINK ALL GPIO'''按钮时,程序会控制28个GPIO口不停的切换高低电平</p>
<p>[[File:media/image447cm4-img447.png|575x323px]]</p></li>
<li><p>然后点击'''GPIO READALL'''按钮,输出信息如下图所示:</p>
<p>[[File:media/image448cm4-img448.png|576x322px]]</p></li>
<li><p>开发板40pin中总共有28个GPIO口可以使用,下面以11号引脚——对应GPIO为GPIO3_C6 ——对应wPi序号为5——为例演示如何设置GPIO口的高低电平。首先点击7号引脚对应的'''CheckBox'''按钮,当按钮为选中状态时,11号引脚会设置为高电平,设置完后可以使用万用表测量引脚的电压的数值,如果为'''3.3v''',说明设置高电平成功</p>
<p>[[File:media/image449cm4-img449.png|225x294px]]</p></li>
<li><p>然后点击'''GPIO READALL'''按钮,可以看到当前的7号引脚模式为'''OUT''',引脚电平为高电平</p>
<p>[[File:media/image450cm4-img450.png|575x322px]]</p></li>
<li><p>再次点击下图的'''CheckBox'''按钮取消勾选状态,11号引脚会设置为低电平,设置完后可以使用万用表测量引脚的电压的数值,如果为'''0v''',说明设置低电平成功</p>
<p>[[File:media/image451cm4-img451.png|227x309px]]</p></li>
<li><p>然后点击'''GPIO READALL'''按钮,可以看到当前的7号引脚模式为OUT,引脚电平为低电平</p>
<p>[[File:media/image452cm4-img452.png|575x323px]]</p></li></ol>
<span id="pin的uart测试-2"></span>
<ol style="list-style-type: decimal;">
<li><p>Android中默认打开了UART7和UART9,在40pin的位置如下图所示,对应的设备节点分别是'''/dev/ttyS7'''和'''/dev/ttyS9'''</p>
<p>[[File:media/image453cm4-img453.png|507x101px]]</p></li>
<li><p>首先点击wiringOP图标打开wiringOP APP</p>
<p>[[File:media/image445cm4-img445.png|576x210px]]</p></li>
<li><p>wiringOP APP的主界面显示如下图所示,然后点击'''UART_TEST'''按钮打开UART测试界面</p>
<p>[[File:media/image454cm4-img454.png|575x156px]]</p></li><li><p>APP的串口测试界面如下图所示</p></li></ol> [[File:media/image455.png|576x324px]]
[[File:cm4-img455.png]]
</ol>
<ol start="5" style="list-style-type: decimal;">
<li>下面以测试'''UART7'''为例,在选择框中选择'''/dev/ttyS7'''节点,在编辑框中输入想要设置的波特率,然后点击'''OPEN'''按钮打开'''/dev/ttyS7'''节点,打开成功后,'''OPEN'''按钮变为不可选中状态,'''CLOSE'''按钮和'''SEND'''按钮变为可选中状态</li></ol> [[File:media/image456.png|574x166px]]
[[File:cm4-img456.png]]
</ol>
<ol start="6" style="list-style-type: decimal;">
<li><p>然后使用杜邦线短接uart7的RXD和TXD引脚</p>
<p>[[File:media/image457cm4-img457.png|574x91px]]</p></li><li><p>然后可以在下面的发送编辑框中输入一段字符,点击'''SEND'''按钮开始发送</p></li></ol> [[File:media/image458.png|575x161px]]
[[File:cm4-img458.png]]
</ol>
<ol start="8" style="list-style-type: decimal;">
<li>如果一切正常,接收框内会显示已接收到的字符串</li></ol>
[[File:media/image459cm4-img459.png|574x164px]]</ol><span id="pin的spi测试"></span>
=== 40pin的SPI测试 ===
<ol style="list-style-type: decimal;">
<li><p>由 40pin 接口的原理图可知,Orange Pi CM4可用的 spi 为 spi3</p>
<p>[[File:media/image262cm4-img262.png|575x192px]]</p></li>
<li><p>这里通过w25q64模块来测试SPI接口,首先在SPI3接口接入w25q64设备</p>
<p>[[File:media/image460cm4-img460.png|261x216px]]</p></li>
<li><p>然后点击wiringOP图标打开wiringOP APP</p>
<p>[[File:media/image445cm4-img445.png|576x210px]]</p></li>
<li><p>wiringOP APP的主界面显示如下图所示,点击SPI_TEST按钮打开SPI的测试界面</p>
<p>[[File:media/image461cm4-img461.png|574x149px]]</p></li><li><p>然后点击'''OPEN'''按钮初始化SPI</p></li></ol> [[File:media/image462.png|576x241px]]
[[File:cm4-img462.png]]
</ol>
<ol start="6" style="list-style-type: decimal;">
<li><p>然后填充需要发送的字节,比如读取w25q64的ID信息,在data[0]中填入地址0x9f,然后点击'''TRANSFER'''按钮</p>
<p>[[File:media/image463cm4-img463.png|572x216px]]</p></li><li><p>最后APP会显示读取到的ID信息</p></li></ol> [[File:media/image464.png|575x296px]]
[[File:cm4-img464.png]]
</ol>
<ol start="8" style="list-style-type: decimal;">
<li><p>w25q64模块的MANUFACTURER ID为EFh,Device ID为4017h,跟上面读取到的值是对应的(h代表是16进制)</p>
<p>[[File:media/image465cm4-img465.png|374x126px]]</p></li></ol>
<span id="pin的pwm测试"></span>
=== 40pin的PWM测试 ===
<ol style="list-style-type: decimal;">
<li><p>Android默认开启了'''PWM11'''和'''PWM15''',对应的引脚在40pin的所在位置如下图所示</p>
<p>[[File:media/image466cm4-img466.png|465x86px]]</p></li>
<li><p>首先点击wiringOP图标打开wiringOP APP</p>
<p>[[File:media/image445cm4-img445.png|576x210px]]</p></li>
<li><p>然后在wiringOP的主界面点击'''PWM_TEST'''按钮进入PWM的测试界面</p>
<p>[[File:media/image467cm4-img467.png|575x150px]]</p></li>
<li><p>PWM11对应的基地址是'''fe6f0030''',PWM15对应的基地址是'''fe700030''',这里pwmchip0右边显示是'''fdd70020.pwm''', 这时需要点击下拉选项选择其它的pwmchip,直到右边显示'''fe6f0030.pwm'''或者'''fe700030.pwm'''为止</p>
<p>[[File:media/image468cm4-img468.png|576x178px]]</p></li>
<li><p>当下拉选项选择'''pwmchip3'''时,右边对应的就是PWM11对应的基地址'''fe6f0030'''</p>
<p>[[File:media/image469cm4-img469.png|574x161px]]</p></li>
<li><p>然后确认PWM的通道,默认是0通道,并确认PWM的周期,默认的配置是'''50000ns''',转换为PWM频率是'''20KHz''',可自行修改,点击'''EXPORT'''按钮导出'''PWM11'''</p>
<p>[[File:media/image470cm4-img470.png|575x160px]]</p></li><li><p>然后拖动下面的拖动条,就可以改变PWM的占空比,然后勾选Enable就可以输出PWM波形了</p></li></ol> [[File:media/image471.png|575x167px]]
[[File:cm4-img471.png]]
</ol>
<ol start="8" style="list-style-type: decimal;">
<li>然后使用示波器测量开发板40pin中的第32号引脚就可以看到下面的波形了</li></ol>
[[File:media/image472cm4-img472.png|460x276px]]</ol><span id="adb的使用方法"></span>
== ADB的使用方法 ==
=== USB OTG模式切换的方法 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''开发板有4个USB接口,其中下图红框标注的USB接口既可以支持Host模式,又可以支持Device模式,其它3个USB接口只支持Host模式。'''</big>
[[File:media/image473cm4-img473.png|403x158pxcenter]]
<big>'''USB OTG接口默认为Host模式,可以用来接鼠标键盘等USB设备,如果要使用ADB需要手动切换为Device模式。OTG接口默认为Host模式,可以用来接鼠标键盘等USB设备,如果要使用ADB需要<span style="color:#FF0000">手动</span>切换为Device模式。'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>首先打开Settings</p>
<p>[[File:media/image422cm4-img422.png|569x236px]]</p></li>
<li><p>然后选择'''About tablet'''</p>
<p>[[File:media/image474cm4-img474.png|563x295px]]</p></li>
<li><p>然后用鼠标多次点击'''Build number'''菜单栏,直到出现'''You are now a developer!'''的提示</p>
<p>[[File:media/image475cm4-img475.png|577x321px]]</p></li>
<li><p>然后点击返回上一级菜单</p>
<p>[[File:media/image476cm4-img476.png|578x312px]]</p></li>
<li><p>然后选择'''System'''</p>
<p>[[File:media/image477cm4-img477.png|575x301px]]</p></li>
<li><p>然后选择'''Advanced'''</p>
<p>[[File:media/image478cm4-img478.png|581x206px]]</p></li>
<li><p>然后在展开的栏目中选择'''Developer options'''</p>
<p>[[File:media/image479cm4-img479.png|577x260px]]</p></li><li><p>最后找到'''USB OTG Mode Switch'''开关,'''<span style="color:#FF0000">打开开关切换为Device模式,关闭开关切换为Host模式</span>'''</p></li></ol>
[[File:media/image480cm4-img480.png|579x219px]]</ol>
=== 使用数据线连接adb调试 ===
<div class="figure">
[[File:media/image18cm4-img18.png|141x138px|D6BB9058-CDC3-42d7-A7FC-FBF630D886B7]]
</div></li>
<li><p>然后参考[[\lOrange Pi CM4#USB OTG模式切换的方法|'''USB OTG模式切换的方法''']]将USB OTG切换为Device模式</p></li>
<li><p>然后通过USB2.0公对公数据线连接好开发板与Ubuntu PC,开发板USB OTG接口的位置如下图所示:</p>
<p>[[File:media/image473cm4-img473.png|318x125px]]</p></li>
<li><p>然后在Ubuntu PC上安装adb工具</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''sudo apt update'''</p>
<p>test@test:~$ '''sudo apt -y install adb'''</p>|}</li>
<li><p>通过下面的命令可以查看识别到的ADB设备</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>{| class="wikitable" style="width:800px;" |-|
test@test:~$ '''adb shell'''
console:/ $
|}</ol>
<ol start="7" style="list-style-type: decimal;">
<li>执行下面的命令可以重新挂载Android系统</li></ol>{| class="wikitable" style="width:800px;" |-|
test@test:~$ '''adb root'''
test@test:~$ '''adb remount'''
|}</ol>
<ol start="8" style="list-style-type: decimal;">
<li>然后就可以传输文件到Android系统了</li></ol>{| class="wikitable" style="width:800px;" |-|
test@test:~$ '''adb push example.txt /system/'''
|}
</ol>
=== 使用网络连接adb调试 ===
{| class="wikitable" style="background-color:#ffffdc;width:800px;" |-| <big>'''使用网络adb无需数据线来连接电脑和开发板,而是通过网络来通信,所以首先请确保开发板的有线或者无线网络已经连接好了,然后获取开发板的IP地址,后面要用到。'''</big>|}
<ol style="list-style-type: decimal;">
<li><p>确保Android系统的'''service.adb.tcp.port'''设置为5555端口号</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>console:/ # '''getprop | grep "adb.tcp"'''</p>
<p>[service.adb.tcp.port]: ['''5555''']</p>|}</li><li><p>如果'''service.adb.tcp.port'''没有设置,可以使用下面的命令设置网络adb的端口号</p></li></ol>{| class="wikitable" style="width:800px;" |-|
console:/ # '''setprop service.adb.tcp.port 5555'''
console:/ # '''start adbd'''
|}</ol>
<ol start="3" style="list-style-type: decimal;">
<li><p>在Ubuntu PC上安装adb工具</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''sudo apt update'''</p>
<p>test@test:~$ '''sudo apt install -y adb'''</p>|}</li>
<li><p>然后在Ubuntu PC上连接网络adb</p>
{| class="wikitable" style="width:800px;"
|-
|
<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>{| class="wikitable" style="width:800px;" |-|
test@test:~$ '''adb shell'''
console:/ #
|}</ol>
<span id="android-11源码的编译方法"></span>
<ol style="list-style-type: lower-alpha;">
<li><p>百度云盘</p>
<p>[[File:media/image481cm4-img481.png|492x233px]]</p></li>
<li><p>谷歌网盘</p>
<p>[[File:media/image482cm4-img482.png|499x174px]]</p></li></ol>
</li>
<li><p>Android 11源码的分卷压缩包下载完后,请先检查下MD5校验和是否正确,如果不正确,请重新下载源码</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''md5sum -c RK356X_Android11.tar.gz.md5sum'''</p>
<pstyle="color:#FF0000">'''RK356X_Android11.tar.gz00: OK'''</p><pstyle="color:#FF0000">'''RK356X_Android11.tar.gz01: OK'''</p><pstyle="color:#FF0000">'''RK356X_Android11.tar.gz02: OK'''</p><pstyle="color:#FF0000">'''RK356X_Android11.tar.gz03: OK'''</p><pstyle="color:#FF0000">'''RK356X_Android11.tar.gz04: OK'''</p><pstyle="color:#FF0000">'''RK356X_Android11.tar.gz05: OK'''</p><pstyle="color:#FF0000">'''RK356X_Android11.tar.gz06: OK'''</p>|}</li><li><p>然后需要将多个压缩文件合并进行解压</p>{| class="wikitable" style="width:800px;" |-| test@test:~$ '''cat RK356X_Android11.tar.gz<span style="color:#FF0000">0</span>* | tar -xvzf -'''|}</li></ol><span id="编译android-11的源码"></span>
== 编译Android 11的源码 ==
<ol style="list-style-type: decimal;">
<li><p>首先安装编译Android11源码需要的软件包</p>
{| class="wikitable" style="width:800px;"
|-
|
<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 libncurses5 \'''</p>
<p>'''lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \'''</p>
<p>'''libgl1-mesa-dev libxml2-utils xsltproc unzip liblz4-tool'''</p>|}</li>
<li><p>源码中有build.sh编译脚本,编译参数如下</p>
<ol style="list-style-type: lower-alpha;">
<ol style="list-style-type: lower-alpha;">
<li><p>编译支持HDMI 4K显示镜像(默认关闭LCD)的命令如下所示:</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''cd RK356X_Android11'''</p>
<p>test@test:~/ RK356X_Android11$ '''export BOARD=orangepicm4'''</p>
<p>test@test:~/ RK356X_Android11$ '''source build/envsetup.sh'''</p>
<p>test@test:~/ RK356X_Android11$ '''lunch rk3566_r-userdebug'''</p>
<p>test@test:~/ RK356X_Android11$ '''./build.sh -AUKu'''</p>|}</li>
<li><p>编译支持LCD显示镜像(默认关闭HDMI)的命令如下所示:</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>test@test:~$ '''cd RK356X_Android11'''</p>
<p>test@test:~/ RK356X_Android11$ '''export BOARD=orangepicm4'''</p>
<p>test@test:~/ RK356X_Android11$ '''source build/envsetup.sh'''</p>
<p>test@test:~/ RK356X_Android11$ '''lunch rk3566_r-userdebug'''</p>
<p>test@test:~/ RK356X_Android11$ '''./build.sh -AUKu'''</p>|}</li></ol>
</li>
<li><p>编译完成后会打印下面的信息</p>
{| class="wikitable" style="width:800px;"
|-
|
<p>********rkImageMaker ver 2.1********</p>
<p>Generating new image, please wait...</p>
<p>Making update_spi_nvme.img OK.</p>
<p>Make update image ok!</p>
<p>/wspace3/RK3566/RK356X_Android11</p>|}</li>
<li><p>最终生成的镜像文件会放在'''rockdev/Image-rk3566_r/'''目录下。其中'''update.img'''就是用来烧录的安卓镜像文件是支持TF卡和eMMC启动镜像,'''update_spi_nvme.img'''是NVME SSD启动镜像</p>
{| class="wikitable" style="width:800px;" |-| <p>[mailto:test@test:~OrangePi_4/rk3399-android-8.1$ test@test:~/RK356X_Android11$] '''cd rockdev/Image-rk3566_r'''</p><p>[mailto:test@test:~OrangePi_4/rk3399-android-8.1$ test@test:~/RK356X_Android11/rockdev/Image-rk3566_r $] '''ls update.img*'''</p><p>update.img update_spi_nvme.img</p>|}</li></ol>
= '''附录''' =
== 用户手册更新历史 ==
{| class="wikitable" style="width:800px;text-align: center;"
|-
| '''版本'''
== 镜像更新历史 ==
{| class="wikitable" style="width:800px;"
|-
| style="text-align:center;" | '''日期'''| style="text-align:center;" | '''更新说明'''
|-
| style="text-align:center;" | 2023-08-29
|
Orangepicm4_1.0.0_ubuntu_focal_server_linux5.10.160.7z
Orangepicm4_1.0.0_debian_bookworm_desktop_xfce_linux5.10.160.7z
OrangePiCM4_RK3566_Android11_v1.0.0.tar.gz
OrangePiCM4_RK3566_Android11_lcd_spi-nvme_v1.0.0.tar.gz
* 初始版本
|-
| style="text-align:center;" | 2023-09-05
|
Opios-arch-aarch64-xfce-opicm4-23.09-linux5.10.160.img.xz
* 初始版本
|}