笔记本电脑安装LinuxMint(续二)
在前面“笔记本电脑安装LinuxMint(续一)”中,已经安装好了嵌入式开发所需要的大部分可视化界面软件,接下来安装野火STM32MP157嵌入式Linux开发环境,此部分主要参考野火的官方文档进行。
首先安装Linux开发所必要的一些依赖和工具,执行“sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop git libncurses5-dev”进行安装,其中有些工具可能已经安装过了,它会自动跳过已安装的工具。
接下来安装并配置一下NFS服务。在命令行中执行“sudo apt install nfs-kernel-server”进行NFS服务端的安装,安装完成后,还需要配置一下才能正常使用,先执行“sudo mkdir /nfs-share” 在根目录下创建一个名为nfs-share的目录,然后执行“chmod 777 nfs-share” 把权限更改一下。完成后执行“sudo vim /etc/exports”打开NFS的配置文件,按I键进入插入模式,在文本最下面加入一句“/nfs-share *(rw,sync,no_root_squash)”(不包含引号,*号前面有空格,括号内不能有空格),如下图所示,保存退出。
由于所使用的笔记本电脑是TinkPad E40,拥有有线和无线共两块网卡。现通过有线网卡接到嵌入式开发板,使用无线上网,因此需要把无线上网共享给有线网卡,这样开发板也能通过共享的网卡分配到IP地址,也能上外网。在LinuxMint任务栏的右边单击无线上网图标,在弹出的菜单中单击“网络连接”,如下图所示。
在打开的对话框中选择以太网下面的名称(默认为Wired connection 1),如下图所示。
选中后,单击下方的齿轮按钮,会弹出一个编辑网络的对话框,在该对话框中选择“IPV4设置”标签页,如下图所示。
然后在方法后面下拉选择“与其它计算机共享”(如上图中所示),单击“保存”按钮即可。完成后可能需要重启一下系统才能生效,生效后,笔记本的有线网卡IP会被配置为10.42.0.1,而开发板则会动态分配一个属于该网段的IP地址,此时的开发板不仅连接了电脑,还能连接到外网。
接下来安装并编译野火STM32MP157嵌入式Linux开发板所需要的内核。先切换到/opt/目录下,把内核源码下载到这里,执行“git clone
https://gitee.com/Embedfire/ebf_linux_kernel_mp157_depth1”进行下载。下载完成后进入源码目录,它已经有一个内核编译的脚本文件,名为make_deb.sh,可使用vim打开它并修改build_opts="-j 4",4表示使用4核进行编译,这里需要根据自己的电脑配置进行恰当地修改,如下图所示。
完成后执行“sudo ./make_deb.sh”进行内核编译,内核编译会耗费较长时间。编译完成后,编译好的源码被放置在源码目录的build_image/build下,为后面开发驱动程序时所用。
接下来安装Qt开发环境,在“笔记本电脑安装LinuxMint(续一)”中已经安装了本地Qt开发 环境,这里主要是安装嵌入式开发板所用的交叉编译开发环境。由于Qt在嵌入式中主要依赖触摸屏来交互,所以需要先下载并安装tslib库,以 支持触摸屏。为了顺利进行安装,野火公司特意提供了一个下载安装的脚本文件,其内容如下:
#!/bin/sh
# set -v
HOST=arm-linux-gnueabihf
SCRIPT_PATH=$(pwd)
#添加交叉编译工具链路径
# CROSS_CHAIN_PREFIX=/opt/arm-gcc/bin/arm-linux-gnueabihf
CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf
#修改源码包解压后的名称
MAJOR_NAME=tslib
#修改需要下载的源码前缀和后缀
OPENSRC_VER_PREFIX=1
OPENSRC_VER_SUFFIX=.21
PACKAGE_NAME=${MAJOR_NAME}-${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}
#定义压缩包名称
COMPRESS_PACKAGE=${PACKAGE_NAME}.tar.bz2
#定义编译后安装--生成的文件,文件夹位置路径
INSTALL_PATH=/opt/${PACKAGE_NAME}
#无需修改--下载地址
DOWNLOAD_LINK=https://github.com/libts/${MAJOR_NAME}/releases/download/${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}/${COMPRESS_PACKAGE}
#下载源码包
do_download_src () {
echo "\033[1;33mstart download ${PACKAGE_NAME}...\033[0m"
if [ ! -f "${COMPRESS_PACKAGE}" ];then
if [ ! -d "${PACKAGE_NAME}" ];then
wget -c ${DOWNLOAD_LINK}
fi
fi
echo "\033[1;33mdone...\033[0m"
}
#解压源码包
do_tar_package () {
echo "\033[1;33mstart unpacking the ${PACKAGE_NAME} package ...\033[0m"
if [ ! -d "${PACKAGE_NAME}" ];then
tar -xf ${COMPRESS_PACKAGE}
fi
echo "\033[1;33mdone...\033[0m"
cd ${PACKAGE_NAME}
}
#配置选项
do_configure () {
echo "\033[1;33mstart configure ${PACKAGE_NAME}...\033[0m"
export CC=${CROSS_CHAIN_PREFIX}-gcc
./configure \
--prefix=${INSTALL_PATH} \
--host=${HOST} \
echo "\033[1;33mdone...\033[0m"
}
#编译并且安装
do_make_install () {
echo "\033[1;33mstart make and install ${PACKAGE_NAME} ...\033[0m"
make && make install
echo "\033[1;33mdone...\033[0m"
}
#删除下载的文件
do_delete_file () {
cd ${SCRIPT_PATH}
if [ -f "${PACKAGE_NAME}" ];then
sudo rm -f ${PACKAGE_NAME}
fi
}
do_download_src
do_tar_package
do_configure
do_make_install
# do_delete_file
exit $?
把上述内容写到一个名为build-tslib.sh的脚本文件中,执行该脚本即可进行下载安装,完成后程序被安装到了/opt/tslib-1.21/目录下。
除了触摸屏以外,声卡也需要支持。同样,野火公司也提供了声卡支持的下载安装脚本,其内容如下:
#!/bin/sh
HOST=arm-linux-gnueabihf
SCRIPT_PATH=$(pwd)
#修改源码包解压后的名称
MAJOR_NAME=alsa-lib
#修改需要下载的源码前缀和后缀
OPENSRC_VER_PREFIX=1.2
OPENSRC_VER_SUFFIX=.2
PACKAGE_NAME=${MAJOR_NAME}-${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}
#定义压缩包名称
COMPRESS_PACKAGE=${PACKAGE_NAME}.tar.bz2
#定义编译后安装--生成的文件,文件夹位置路径
INSTALL_PATH=/opt/${PACKAGE_NAME}
#添加交叉编译工具链路径
# CROSS_CHAIN_PREFIX=/opt/arm-gcc/bin/arm-linux-gnueabihf
CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf
#无需修改--下载地址
DOWNLOAD_LINK=ftp://ftp.alsa-project.org/pub/lib/${COMPRESS_PACKAGE}
#下载源码包
do_download_src () {
echo "\033[1;33mstart download ${PACKAGE_NAME}...\033[0m"
if [ ! -f "${COMPRESS_PACKAGE}" ];then
if [ ! -d "${PACKAGE_NAME}" ];then
wget -c ${DOWNLOAD_LINK}
fi
fi
echo "\033[1;33mdone...\033[0m"
}
#解压源码包
do_tar_package () {
echo "\033[1;33mstart unpacking the ${PACKAGE_NAME} package ...\033[0m"
if [ ! -d "${PACKAGE_NAME}" ];then
tar -xf ${COMPRESS_PACKAGE}
fi
echo "\033[1;33mdone...\033[0m"
cd ${PACKAGE_NAME}
}
#配置选项
do_configure () {
echo "\033[1;33mstart configure ${PACKAGE_NAME}...\033[0m"
mkdir -p ${INSTALL_PATH}/config
mkdir -p ${INSTALL_PATH}/plugin
export CC=${CROSS_CHAIN_PREFIX}-gcc
./configure \
--prefix=${INSTALL_PATH} \
--host=${HOST} \
# --enable-static \
--enable-shared \
--disable-python \
--with-configdir=${INSTALL_PATH}/config \
--with-plugindir=${INSTALL_PATH}/plugin
echo "\033[1;33mdone...\033[0m"
}
#编译并且安装
do_make_install () {
echo "\033[1;33mstart make and install ${PACKAGE_NAME} ...\033[0m"
make && make install
echo "\033[1;33mdone...\033[0m"
}
#删除下载的文件
do_delete_file () {
cd ${SCRIPT_PATH}
if [ -f "${PACKAGE_NAME}" ];then
sudo rm -f ${PACKAGE_NAME}
fi
}
do_download_src
do_tar_package
do_configure
do_make_install
# do_delete_file
exit $?
把上述内容写到一个名为build-alsa.sh的脚本文件中,执行该脚本即可进行下载安装,完成后程序被安装到了/opt/alsa-lib-1.2.2/目录下。
接下来安装Qt的交叉编译工具。本例使用的Qt5.11.3版本不能使用操作系统提供的7.5.0版本的交叉编译工具链,要使用更高版本的8.3.0交叉编译工具链。同样,野火公司也提供了该工具链的下载安装脚本,其内容如下:
#!/bin/sh
HOST=arm-linux-gnueabihf
SCRIPT_PATH=$(pwd)
#修改源码包解压后的名称
MAJOR_NAME=gcc-arm-linux-gnueabihf
#修改需要下载的源码版本前缀和后缀
OPENSRC_VER_PREFIX=8.3
OPENSRC_VER_SUFFIX=.0
PACKAGE_NAME=${MAJOR_NAME}-${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}
#定义压缩包名称
COMPRESS_PACKAGE=gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
#定义编译后安装--生成的文件,文件夹位置路径
INSTALL_PATH=/opt/${PACKAGE_NAME}
#无需修改--下载地址
DOWNLOAD_LINK=https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/${COMPRESS_PACKAGE}
#下载源码包
do_download_src () {
echo "\033[1;33mstart download ${COMPRESS_PACKAGE}...\033[0m"
if [ ! -f "${COMPRESS_PACKAGE}" ];then
if [ ! -d "${PACKAGE_NAME}" ];then
wget -c ${DOWNLOAD_LINK}
fi
fi
echo "\033[1;33mdone...\033[0m"
}
#解压源码包
do_tar_package () {
echo "\033[1;33mstart unpacking the ${PACKAGE_NAME} package ...\033[0m"
mkdir -p ${INSTALL_PATH}
if [ ! -d "${PACKAGE_NAME}" ];then
tar -xf ${COMPRESS_PACKAGE} -C ${INSTALL_PATH} --strip-components=1
fi
echo "\033[1;33mdone...\033[0m"
}
#删除下载的文件
do_delete_file () {
cd ${SCRIPT_PATH}
if [ -f "${PACKAGE_NAME}" ];then
sudo rm -f ${PACKAGE_NAME}
fi
}
do_download_src
do_tar_package
# do_delete_file
exit $?
把上述内容写到一个名为build-gcc.sh的脚本文件中,执行该脚本即可进行下载安装,完成后程序被安装到了/opt/gcc-arm-linux-gnueabihf-8.3.0/目录下。
最后安装Qt5.11.3的源码,并进行交叉编译。野火公司提供的脚本内容如下:
#!/bin/sh
# set -v
PLATFORM=my-linux-arm-qt
SCRIPT_PATH=$(pwd)
#修改源码包解压后的名称
MAJOR_NAME=qt-everywhere-src
#修改需要下载的源码前缀和后缀
OPENSRC_VER_PREFIX=5.11
OPENSRC_VER_SUFFIX=.3
#添加tslib交叉编译的动态库文件和头文件路径
TSLIB_LIB=/opt/tslib-1.21/lib
TSLIB_INC=/opt/tslib-1.21/include
#添加alsa交叉编译的动态库文件和头文件路径
ALSA_LIB=/opt/alsa-lib-1.2.2/lib
ALSA_INC=/opt/alsa-lib-1.2.2/include
#修改源码包解压后的名称
PACKAGE_NAME=${MAJOR_NAME}-${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}
#定义编译后安装--生成的文件,文件夹位置路径
INSTALL_PATH=/opt/${PACKAGE_NAME}
#添加交叉编译工具链路径
# CROSS_CHAIN_PREFIX=/opt/arm-gcc/bin/arm-linux-gnueabihf
CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf
#定义压缩包名称
COMPRESS_PACKAGE=${PACKAGE_NAME}.tar.xz
#无需修改--自动组合下载地址
OPENSRC_VER=${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}
case ${OPENSRC_VER_PREFIX} in
5.9 | 5.12 | 5.13 | 5.14 |5.15 )
DOWNLOAD_LINK=http://download.qt.io/official_releases/qt/${OPENSRC_VER_PREFIX}/${OPENSRC_VER}/single/${COMPRESS_PACKAGE}
;;
*)
DOWNLOAD_LINK=http://download.qt.io/new_archive/qt/${OPENSRC_VER_PREFIX}/${OPENSRC_VER}/single/${COMPRESS_PACKAGE}
;;
esac
#无需修改--自动组合平台路径
CONFIG_PATH=${SCRIPT_PATH}/${PACKAGE_NAME}/qtbase/mkspecs/${PLATFORM}
#无需修改--自动组合配置平台路径文件
CONFIG_FILE=${CONFIG_PATH}/qmake.conf
#下载源码包
do_download_src () {
echo "\033[1;33mstart download ${PACKAGE_NAME}...\033[0m"
if [ ! -f "${COMPRESS_PACKAGE}" ];then
if [ ! -d "${PACKAGE_NAME}" ];then
wget -c ${DOWNLOAD_LINK}
fi
fi
echo "\033[1;33mdone...\033[0m"
}
#解压源码包
do_tar_package () {
echo "\033[1;33mstart unpacking the ${PACKAGE_NAME} package ...\033[0m"
if [ ! -d "${PACKAGE_NAME}" ];then
tar -xf ${COMPRESS_PACKAGE}
fi
echo "\033[1;33mdone...\033[0m"
cd ${PACKAGE_NAME}
# 修复5.11.3 版本的bug
if [ ${OPENSRC_VER_PREFIX}=="5.11" -a ${OPENSRC_VER_SUFFIX}==".3" ]; then
sed 's/asm volatile /asm /' -i qtscript/src/3rdparty/javascriptcore/JavaScriptCore/jit/JITStubs.cpp
fi
}
#安装依赖项
do_install_config_dependent () {
sudo apt install python -y
sudo apt install g++ make qt3d5-dev-tools -y
sudo apt install qml-module-qtquick-xmllistmodel -y
sudo apt install qml-module-qtquick-virtualkeyboard qml-module-qtquick-privatewidgets qml-module-qtquick-dialogs qml -y
sudo apt install libqt53dquickscene2d5 libqt53dquickrender5 libqt53dquickinput5 libqt53dquickextras5 libqt53dquickanimation5 libqt53dquick5 -y
sudo apt install qtdeclarative5-dev qml-module-qtwebengine qml-module-qtwebchannel qml-module-qtmultimedia qml-module-qtaudioengine -y
}
#修改配置平台
do_config_before () {
echo "\033[1;33mstart configure platform...\033[0m"
if [ ! -d "${CONFIG_PATH}" ];then
cp -a ${SCRIPT_PATH}/${PACKAGE_NAME}/qtbase/mkspecs/linux-arm-gnueabi-g++ ${CONFIG_PATH}
fi
echo "#" > ${CONFIG_FILE}
echo "# qmake configuration for building with arm-linux-gnueabi-g++" >> ${CONFIG_FILE}
echo "#" >> ${CONFIG_FILE}
echo "" >> ${CONFIG_FILE}
echo "MAKEFILE_GENERATOR = UNIX" >> ${CONFIG_FILE}
echo "CONFIG += incremental" >> ${CONFIG_FILE}
echo "QMAKE_INCREMENTAL_STYLE = sublib" >> ${CONFIG_FILE}
echo "" >> ${CONFIG_FILE}
echo "include(../common/linux.conf)" >> ${CONFIG_FILE}
echo "include(../common/gcc-base-unix.conf)" >> ${CONFIG_FILE}
echo "include(../common/g++-unix.conf)" >> ${CONFIG_FILE}
echo "" >> ${CONFIG_FILE}
echo "# modifications to g++.conf" >> ${CONFIG_FILE}
echo "QMAKE_CC = ${CROSS_CHAIN_PREFIX}-gcc -lts" >> ${CONFIG_FILE}
echo "QMAKE_CXX = ${CROSS_CHAIN_PREFIX}-g++ -lts" >> ${CONFIG_FILE}
echo "QMAKE_LINK = ${CROSS_CHAIN_PREFIX}-g++ -lts" >> ${CONFIG_FILE}
echo "QMAKE_LINK_SHLIB = ${CROSS_CHAIN_PREFIX}-g++ -lts" >> ${CONFIG_FILE}
echo "" >> ${CONFIG_FILE}
echo "# modifications to linux.conf" >> ${CONFIG_FILE}
echo "QMAKE_AR = ${CROSS_CHAIN_PREFIX}-ar cqs" >> ${CONFIG_FILE}
echo "QMAKE_OBJCOPY = ${CROSS_CHAIN_PREFIX}-objcopy" >> ${CONFIG_FILE}
echo "QMAKE_NM = ${CROSS_CHAIN_PREFIX}-nm -P" >> ${CONFIG_FILE}
echo "QMAKE_STRIP = ${CROSS_CHAIN_PREFIX}-strip" >> ${CONFIG_FILE}
echo "load(qt_config)" >> ${CONFIG_FILE}
echo "" >> ${CONFIG_FILE}
echo "QMAKE_INCDIR=${TSLIB_INC}" >> ${CONFIG_FILE}
echo "QMAKE_LIBDIR=${TSLIB_LIB}" >> ${CONFIG_FILE}
cat ${CONFIG_FILE}
echo "\033[1;33mdone...\033[0m"
}
#配置选项
do_configure () {
echo "\033[1;33mstart configure ${PACKAGE_NAME}...\033[0m"
export CC="${CROSS_CHAIN_PREFIX}-gcc"
export CXX="${CROSS_CHAIN_PREFIX}-g++"
./configure \
-prefix ${INSTALL_PATH} \
-xplatform ${PLATFORM} \
-release \
-opensource \
-confirm-license \
-no-openssl \
-no-opengl \
-no-xcb \
-no-eglfs \
-no-compile-examples \
-no-pkg-config \
-no-iconv \
-no-glib \
-tslib \
-I"${TSLIB_INC}" \
-L"${TSLIB_LIB}" \
-alsa \
-I"${ALSA_INC}" \
-L"${ALSA_LIB}" \
echo "\033[1;33mdone...\033[0m"
}
#编译并且安装
do_make_install () {
echo "\033[1;33mstart make and install ${PACKAGE_NAME} ...\033[0m"
make -j4 && make install
echo "\033[1;33mdone...\033[0m"
}
#删除下载的文件
do_delete_file () {
cd ${SCRIPT_PATH}
if [ -f "${COMPRESS_PACKAGE}" ];then
sudo rm -f ${COMPRESS_PACKAGE}
fi
}
do_download_src
do_tar_package
do_install_config_dependent
do_config_before
do_configure
do_make_install
# do_delete_file
exit $?
把上述内容写到一个名为build-qt.sh的脚本文件中,执行该脚本即可进行下载安装(注意,编译Qt所需的时间非常长),完成后程序被安装到了/opt/qt-everywhere-src-5.11.3/目录下。
上述程序通过脚本安装后,其下载的源码文件会位于执行脚本所在的目录下,可以将其备份。相反,如果在安装时下载速度较慢甚至不能下载,可在Windows平台下通过迅雷等软件进行下载(下载地址在各自的脚本中寻找),然后拷到执行脚本所在的目录下,再运行相应的脚本文件即可跳过下载过程。
若希望在Linux下开发51单片机,可通过apt方式安装sdcc编译工具、python-serial串口工具,并执行“sudo git clone https://github.com/laborer/stcflash”下载烧写工具stcflash即可。
至此,在LinuxMint下建构嵌入式的开发环境就已经完成了,后续就能使用该电脑进行实际开发了。