Difference between revisions of "APITestPage"

From FriendlyELEC WiKi
Jump to: navigation, search
(updated by API)
(updated by API)
Line 1: Line 1:
===mpv播放器===
+
[[Buildroot for RK3399/zh|查看中文]]
FriendlyCore预装了基于 ffmpeg 实现的命令行视频播放器,除了 mpv 播放器本身,也包含了 libmpv 库文件,方便在程序里调用。<br />
+
 
mpv播放器支持 Rockchip MPP,所以支持4K硬解播放,mpv的参数较多,为了简化使用,我们提供了一个脚本 '''start-mpv''',简化后,只要传文件名给它,就可以播放视频了:
+
==Buildroot简介==
 +
Buildroot是Linux平台上一个构建嵌入式Linux系统的框架,由Makefile脚本和Kconfig配置文件构成,旨在简化系统制作步骤,可实现一站式生成可烧写的系统固件,最终的固件包含boot-loader、kernel和rootfs,以及rootfs中的各种库和应用程序 (例如qt, gstreamer, busybox等)。<br />
 +
<br />
 +
由 FriendlyELEC 提供的 Buildroot 项目是基于Rockchip原厂的 linux-sdk 制作, 项目使用 git 管理,与原厂的linux sdk更新保持同步;
 +
<br />
 +
Rockchip原厂Buildroot项目: https://github.com/rockchip-linux/buildroot<br />
 +
Buildroot官网: https://buildroot.org<br />
 +
<br />
 +
Buildroot for RK3399运行界面如下:
 +
<div><ul>
 +
<li style="display: inline-block;">[[File:AndroidHW01.png|400px]]</li>
 +
<li style="display: inline-block;">[[File:AndroidHW02.png|400px]] </li>
 +
</ul></div>
 +
 
 +
 
 +
==获取项目源代码==
 +
===安装 repo 工具===
 +
首先需要安装 repo 工具:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
start-mpv /home/pi/demo.mp4
+
git clone https://github.com/friendlyarm/repo
 +
cp repo/repo /usr/bin/
 
</syntaxhighlight>
 
</syntaxhighlight>
需要注意的是,播放时需要使用pi用户登录,因为其它用户的目录里没有mpv相关的设置,当然你可以从pi用户目录复制一份过来也是可以的,mpv的设置文件存放在以下路径:
+
===下载项目源代码===
 +
有以下两种途径获取项目源代码,中国大陆用户建议使用方法1的途径下载:
 +
====方法一:使用网盘里的repo压缩包====
 +
网盘下载地址: [http://download.friendlyarm.com/{{#replace:{{#replace:{{BASEPAGENAME}}| |}}|/zh|}} 点击进入]<br />
 +
文件位于网盘的以下路径:sources/linuxsdk-friendlyelec-YYYYMMDD.tar (YYYYMMDD表示打包的日期)<br />
 +
从网盘中获取的 repo 压缩包在解压之后,需要执行一下以下命令做一次解包动作:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
/home/pi/.config/mpv/mpv.conf
+
tar xvf /path/to/netdisk/sources/linuxsdk-friendlyelec-YYYYMMDD.tar
 +
cd linuxsdk-friendlyelec
 +
repo sync -l
 
</syntaxhighlight>
 
</syntaxhighlight>
mpv.conf的文件内容如下所示:
+
用此方法得到的源代码版本是repo打包时的版本,如果想拉取到官方最新的版本,可以去掉 -l 参数,执行一次 repo sync, 例如:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
vo=gpu
+
cd linuxsdk-friendlyelec
gpu-context=drm
+
repo sync
hwdec=rkmpp
+
demuxer-max-bytes=41943040
+
demuxer-max-back-bytes=41943040
+
drm-osd-plane-id=1
+
drm-video-plane-id=0
+
audio-device=alsa/default:CARD=rockchiphdmi
+
 
</syntaxhighlight>
 
</syntaxhighlight>
这些都是比较重要的,会传递给 mpv 的参数,其中hwdec需要指定为rkmpp才能开启硬件解码,audio-device用于指定音频输出设备,默认输出到HDMI,你可以用以下命令来查询系统中有哪些音频设备:
+
====方法二:从github下载====
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
mpv --audio-device=help
+
mkdir linuxsdk-friendlyelec
 +
cd linuxsdk-friendlyelec
 +
repo init -u https://github.com/friendlyarm/buildroot_manifests -b master -m rk3399_linux_release.xml --repo-url=https://github.com/rockchip-linux/repo
 +
repo sync -c
 
</syntaxhighlight>
 
</syntaxhighlight>
另一个比较重要的参数是 drm-osd-size,当全屏播放视频时,drm-osd-size指定为屏幕的分辨率即可,这个参数由start-mpv自动获取屏幕参数并传给mpv,start-mpv脚本除此之外,还会做一件更重要的事情,它需要保证系统中的 libmali 库用了正确的版本,因为 mpv 是通过 gbm 来渲染画面的,所以 libmali.so 需要使用这个版本: libmali-midgard-t86x-r14p0-gbm.so,这也意味着,这个版本的mpv只能在FriendlyCore下使用,不能在X11 Desktop下使用,具体细节可以自已查看 start-mpv 的脚本内容。<br />
+
====同步项目到最新版本====
mpv使用说明:https://github.com/mpv-player/mpv/wiki <br />
+
<syntaxhighlight lang="bash">
 +
cd linuxsdk-friendlyelec
 +
repo sync -c
 +
</syntaxhighlight>
 +
同步过程中,由于网络原因出现中断,可以使用下面脚本同步代码:
 +
<syntaxhighlight lang="bash">
 +
#! /bin/bash
 +
repo sync -c
 +
while [ $? -ne 0 ];
 +
do 
 +
    repo sync -c
 +
done
 +
</syntaxhighlight>
 +
 
 +
==如何编译==
 +
===搭建编译环境===
 +
在PC的Ubuntu系统下,执下以下命令安装所需的软件:
 +
<syntaxhighlight lang="bash">
 +
sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-
 +
compiler gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-
 +
tools linaro-image-tools autoconf autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make
 +
binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio python unzip rsync file bc wget
 +
libncurses5 libqt4-dev libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git mercurial rsync openssh-
 +
client subversion asciidoc w3m dblatex graphviz python-matplotlib libc6:i386 libssl-dev texinfo
 +
liblz4-tool genext2fs lib32stdc++6
 +
</syntaxhighlight>
 +
 
 +
===全自动方式编译===
 +
<syntaxhighlight lang="bash">
 +
./build.sh
 +
</syntaxhighlight>
 +
===部分编译===
 +
====kernel====
 +
<syntaxhighlight lang="bash">
 +
./build.sh kernel
 +
</syntaxhighlight>
 +
====u-boot====
 +
<syntaxhighlight lang="bash">
 +
./build.sh uboot
 +
</syntaxhighlight>
 +
====rootfs====
 +
<syntaxhighlight lang="bash">
 +
./build.sh rootfs
 +
</syntaxhighlight>
 +
===生成sdcard固件===
 +
<syntaxhighlight lang="bash">
 +
./build.sh sd-img
 +
</syntaxhighlight>
 +
或者直接将固件烧写到sd卡:
 +
<syntaxhighlight lang="bash">
 +
./friendlyelec/rk3399/sd-fuse_rk3399/fusing.sh /dev/sdX buildroot
 +
</syntaxhighlight>
 +
其中,/dev/sdX请替换为真实的SD卡设备文件名。
 +
===生成emmc (eflasher) 固件===
 +
<syntaxhighlight lang="bash">
 +
./build.sh emmc-img
 +
</syntaxhighlight>
 +
 
 +
===查看帮助===
 +
<syntaxhighlight lang="bash">
 +
# ./build.sh help
 +
====USAGE: build.sh modules====
 +
uboot              -build uboot
 +
kernel            -build kernel
 +
rootfs            -build default rootfs, currently build buildroot as default
 +
buildroot          -build buildroot rootfs
 +
ramboot            -build ramboot image
 +
yocto              -build yocto rootfs, currently build ros as default
 +
ros                -build ros rootfs
 +
debian            -build debian rootfs
 +
pcba              -build pcba
 +
recovery          -build recovery
 +
all                -build uboot, kernel, rootfs, recovery image
 +
cleanall          -clean uboot, kernel, rootfs, recovery
 +
firmware          -pack all the image we need to boot up system
 +
updateimg          -pack update image
 +
sd-img            -build sd-card image
 +
emmc-img          -build sd-card image
 +
save              -save images, patches, commands used to debug
 +
default            -build all module
 +
</syntaxhighlight>
 +
重点参数说明:<br />
 +
uboot              -单独编译uboot<br />
 +
kernel            -单独编译kernel<br />
 +
rootfs            -单独编译buildroot<br />
 +
buildroot          -同上<br />
 +
sdimg              -生成用于dd到sd卡的image文件,以及用于eFlasher工具使用的eMMC烧写文件<br />
 +
<br />
 +
 
 +
==Buildroot定制与开发==
 +
===目录结构===
 +
<syntaxhighlight lang="bash">
 +
├── linuxsdk-friendlyelec
 +
│  ├── app
 +
│  ├── buildroot buildroot根文件系统的编译目录
 +
│  ├── build.sh -> device/rockchip/common/build.sh 全自动编译脚本
 +
│  ├── device 编译相关配置文件
 +
│  ├── distro debian根文件系统生成目录
 +
│  ├── docs 文档
 +
│  ├── envsetup.sh -> buildroot/build/envsetup.sh
 +
│  ├── external
 +
│  ├── friendlyelec 用于适配友善电子RK3399开发板的文件
 +
│  ├── kernel 内核
 +
│  ├── Makefile -> buildroot/build/Makefile
 +
│  ├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh rockdev链接更新脚本
 +
│  ├── prebuilts
 +
│  ├── rkbin
 +
│  ├── rkflash.sh -> device/rockchip/common/rkflash.sh 烧写脚本
 +
│  ├── rootfs debian根文件系统编译目录
 +
│  ├── tools 烧写、打包工具
 +
│  └── u-boot u-boot
 +
</syntaxhighlight>
 +
====更改Buildroot配置====
 +
* 列出当前可用的配置
 +
<syntaxhighlight lang="bash">
 +
cd buildroot
 +
make list-defconfigs
 +
</syntaxhighlight>
 +
显示所下:<br />
 +
rockchip_rk3399_defconfig          - Build for rockchip_rk3399<br />
 +
* 使用menuconfig更改配置
 +
<syntaxhighlight lang="bash">
 +
make rockchip_rk3399_defconfig
 +
make menuconfig
 +
make savedefconfig
 +
diff .defconfig configs/rockchip_rk3399_defconfig
 +
cp .defconfig configs/rockchip_rk3399_defconfig
 +
</syntaxhighlight>
 +
* 重新编译
 +
<syntaxhighlight lang="bash">
 +
cd ../
 +
./build.sh rootfs
 +
</syntaxhighlight>
 +
===预装文件到文件系统===
 +
将文件放在 friendlyelec/rk3399/fs-overlay-64,然后重新编译 rootfs。
 +
===修改u-boot和kernel===
 +
直接修改u-boot和kernel目录下的文件即可。
 +
===使用sdk里的交叉编译器===
 +
<syntaxhighlight lang="bash">
 +
export PATH=$PWD/buildroot/output/rockchip_rk3399/host/bin/:$PATH
 +
aarch64-buildroot-linux-gnu-g++ -v
 +
</syntaxhighlight>
 +
显示版本如下:<br />
 +
gcc 版本 6.4.0 (Buildroot 2018.02-rc3-g4f000a0797)
 +
===交叉编译Qt程序===
 +
<syntaxhighlight lang="bash">
 +
git clone https://github.com/friendlyarm/QtE-Demo.git
 +
cd QtE-Demo
 +
../buildroot/output/rockchip_rk3399/host/bin/qmake QtE-Demo.pro
 +
make
 +
</syntaxhighlight>
 +
要实现开机自动运行你的Qt程序,可将QtE-Demo拷贝到开发板上,然后修改 /etc/init.d/下的S50launcher,将/usr/local/QLauncher/QLauncher &这一行改为QtE-Demo的文件路径即可。

Revision as of 10:00, 8 March 2019

查看中文

1 Buildroot简介

Buildroot是Linux平台上一个构建嵌入式Linux系统的框架,由Makefile脚本和Kconfig配置文件构成,旨在简化系统制作步骤,可实现一站式生成可烧写的系统固件,最终的固件包含boot-loader、kernel和rootfs,以及rootfs中的各种库和应用程序 (例如qt, gstreamer, busybox等)。

由 FriendlyELEC 提供的 Buildroot 项目是基于Rockchip原厂的 linux-sdk 制作, 项目使用 git 管理,与原厂的linux sdk更新保持同步;
Rockchip原厂Buildroot项目: https://github.com/rockchip-linux/buildroot
Buildroot官网: https://buildroot.org

Buildroot for RK3399运行界面如下:

  • AndroidHW01.png
  • AndroidHW02.png


2 获取项目源代码

2.1 安装 repo 工具

首先需要安装 repo 工具:

git clone https://github.com/friendlyarm/repo
cp repo/repo /usr/bin/

2.2 下载项目源代码

有以下两种途径获取项目源代码,中国大陆用户建议使用方法1的途径下载:

2.2.1 方法一:使用网盘里的repo压缩包

网盘下载地址: 点击进入
文件位于网盘的以下路径:sources/linuxsdk-friendlyelec-YYYYMMDD.tar (YYYYMMDD表示打包的日期)
从网盘中获取的 repo 压缩包在解压之后,需要执行一下以下命令做一次解包动作:

tar xvf /path/to/netdisk/sources/linuxsdk-friendlyelec-YYYYMMDD.tar
cd linuxsdk-friendlyelec
repo sync -l

用此方法得到的源代码版本是repo打包时的版本,如果想拉取到官方最新的版本,可以去掉 -l 参数,执行一次 repo sync, 例如:

cd linuxsdk-friendlyelec
repo sync

2.2.2 方法二:从github下载

mkdir linuxsdk-friendlyelec
cd linuxsdk-friendlyelec
repo init -u https://github.com/friendlyarm/buildroot_manifests -b master -m rk3399_linux_release.xml --repo-url=https://github.com/rockchip-linux/repo
repo sync -c

2.2.3 同步项目到最新版本

cd linuxsdk-friendlyelec
repo sync -c

同步过程中,由于网络原因出现中断,可以使用下面脚本同步代码:

#! /bin/bash
repo sync -c
while [ $? -ne 0 ]; 
do  
    repo sync -c
done

3 如何编译

3.1 搭建编译环境

在PC的Ubuntu系统下,执下以下命令安装所需的软件:

sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-
compiler gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-
tools linaro-image-tools autoconf autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make
binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio python unzip rsync file bc wget
libncurses5 libqt4-dev libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git mercurial rsync openssh-
client subversion asciidoc w3m dblatex graphviz python-matplotlib libc6:i386 libssl-dev texinfo
liblz4-tool genext2fs lib32stdc++6

3.2 全自动方式编译

./build.sh

3.3 部分编译

3.3.1 kernel

./build.sh kernel

3.3.2 u-boot

./build.sh uboot

3.3.3 rootfs

./build.sh rootfs

3.4 生成sdcard固件

./build.sh sd-img

或者直接将固件烧写到sd卡:

./friendlyelec/rk3399/sd-fuse_rk3399/fusing.sh /dev/sdX buildroot

其中,/dev/sdX请替换为真实的SD卡设备文件名。

3.5 生成emmc (eflasher) 固件

./build.sh emmc-img

3.6 查看帮助

# ./build.sh help
====USAGE: build.sh modules====
uboot              -build uboot
kernel             -build kernel
rootfs             -build default rootfs, currently build buildroot as default
buildroot          -build buildroot rootfs
ramboot            -build ramboot image
yocto              -build yocto rootfs, currently build ros as default
ros                -build ros rootfs
debian             -build debian rootfs
pcba               -build pcba
recovery           -build recovery
all                -build uboot, kernel, rootfs, recovery image
cleanall           -clean uboot, kernel, rootfs, recovery
firmware           -pack all the image we need to boot up system
updateimg          -pack update image
sd-img             -build sd-card image
emmc-img           -build sd-card image
save               -save images, patches, commands used to debug
default            -build all module

重点参数说明:
uboot -单独编译uboot
kernel -单独编译kernel
rootfs -单独编译buildroot
buildroot -同上
sdimg -生成用于dd到sd卡的image文件,以及用于eFlasher工具使用的eMMC烧写文件

4 Buildroot定制与开发

4.1 目录结构

├── linuxsdk-friendlyelec
│   ├── app
│   ├── buildroot buildroot根文件系统的编译目录
│   ├── build.sh -> device/rockchip/common/build.sh 全自动编译脚本
│   ├── device 编译相关配置文件
│   ├── distro debian根文件系统生成目录
│   ├── docs 文档
│   ├── envsetup.sh -> buildroot/build/envsetup.sh
│   ├── external
│   ├── friendlyelec 用于适配友善电子RK3399开发板的文件
│   ├── kernel 内核
│   ├── Makefile -> buildroot/build/Makefile
│   ├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh rockdev链接更新脚本
│   ├── prebuilts
│   ├── rkbin 
│   ├── rkflash.sh -> device/rockchip/common/rkflash.sh 烧写脚本
│   ├── rootfs debian根文件系统编译目录
│   ├── tools 烧写、打包工具
│   └── u-boot u-boot

4.1.1 更改Buildroot配置

  • 列出当前可用的配置
cd buildroot
make list-defconfigs

显示所下:
rockchip_rk3399_defconfig - Build for rockchip_rk3399

  • 使用menuconfig更改配置
make rockchip_rk3399_defconfig
make menuconfig
make savedefconfig
diff .defconfig configs/rockchip_rk3399_defconfig 
cp .defconfig configs/rockchip_rk3399_defconfig
  • 重新编译
cd ../
./build.sh rootfs

4.2 预装文件到文件系统

将文件放在 friendlyelec/rk3399/fs-overlay-64,然后重新编译 rootfs。

4.3 修改u-boot和kernel

直接修改u-boot和kernel目录下的文件即可。

4.4 使用sdk里的交叉编译器

export PATH=$PWD/buildroot/output/rockchip_rk3399/host/bin/:$PATH
aarch64-buildroot-linux-gnu-g++ -v

显示版本如下:
gcc 版本 6.4.0 (Buildroot 2018.02-rc3-g4f000a0797)

4.5 交叉编译Qt程序

git clone https://github.com/friendlyarm/QtE-Demo.git
cd QtE-Demo
../buildroot/output/rockchip_rk3399/host/bin/qmake QtE-Demo.pro
make

要实现开机自动运行你的Qt程序,可将QtE-Demo拷贝到开发板上,然后修改 /etc/init.d/下的S50launcher,将/usr/local/QLauncher/QLauncher &这一行改为QtE-Demo的文件路径即可。