NXP MPU IMX 系列上的Linux Android HarmonyOS 开发从入门到放弃 (一)

如果说人生有什么意思(我们不讨论人生的意义),那就是充满不确定性. 要论技术有什么意思,就是总有一些新玩意让你折腾. 但是追逐新技术要适度,我们应该将80%的精力花费在那些流行了超 过10年以上的技术上(讨生活),然后将不到10%的精力花在那些你觉得可能有意思的技术上(谋机遇),
至于剩下的10%的精力请浪费在一些让你觉得美好和愉快的事情上. 好了,今天要讲的就是一个流行了二十来年的技术Linux(是的目前只讲Linux, Android HarmonyOS 后面再搞, 希望能坚持下去, 原谅我这个标题党), 这里仅聊皮毛, 各位大佬手下留情,不喜可喷.

我们今天只聊在SOC (ARM/RISC V + IP) 上跑LINUX(包括安卓). 如果说在SOC上跑跑LINUX和裸机(含RTOS)有啥好处,最大的好处在我看来无非两点:

  1. 业务层可以很方便的跨平台(硬件平台), 当然你可以说你业务代码框架做得好在裸机上也能方便移植,但对不起我们聊的不是一个东西.
  2. 可以充分的享受IT技术尤其是软件行业发展几十来的成果. 无穷无尽的现成开源代码,只要PC上能运行的,只要你的SOC硬件支持,拿来用就好了.

我并不是说RTOS一无是处,很多场合我们的硬件觉定了我们能跑什么,或者我们的业务觉定了我们能跑什么,有的时候硬件弱鸡可能连RTOS都跑不了,有的时候业务对实时性的要求我们只能跑RTOS(不要跟我讲LINUX有实时版,更不要跟我讲LINUX可以用硬件定时器去满足实时性,我只能呵呵,至少你得用RTOS做过一个相对复杂的业务才能体会到这种差异).

熟悉NXP官网

好了, 废话不多说,我们来看看在NXP的IMX8上跑LINUX怎么入门吧, 如果你用过国产的SOC平台,那不用接着往下看了,因为作为一个排雷兵你早就学会了如何布雷.

首先打开NXP的官网找到IMX8 MP 器件的相关页面

NXP官网

看着这个页面是不是有点茫然我也一样,不过至少跟INTEL的官网比起来NXP简直友好不要太多了. 懒得看面包屑导航, 粗暴一点能用扯的决不用解的^_^,直接CTRL+F “linux”, 这就出来了.如果你要找Andorid资料, 那么CTRL+F “Android”.

IMX8 MP linux

imx8 mp android

了解NXP SOC LINUX文档组成

我去,全是文档.说好的BSP呢?说好的SDK呢?说好的源码呢?不按套路出牌啊…

下载L5.10.52_2.1.0_LINUX_DOCS然后解压

这个时候有个大佬刘先生指点了我,让我看下<>这个文档. 大佬百忙这中抽空指点哪敢不从.

拿到文档看下文档结构先(那些都懒得给文档做目录的SOC厂商,你们看看人家NXP的SOC文档,你们好意思? 当然我知道你们的生意策略决定了你们就不会去好好写文档).

看了下没什么意思,无非是一些LINUX的FAQ, 我唯一感兴趣的只有怎么烧录和怎么编译LINUX系统. 再次使出搜索大法, 找到了.

下载工具, NXP提供的PC直接烧录板子的工具就UUU(名字有点傻屌).

IMX8 MP Universal update utility

制作SD/TF卡启动略过不看

IMX8 SD MMC boot

终于找到了我最感兴趣的部分, 怎样独立构建系统, 以及给BOOT加SPL头的方法.
IMX8 LINUX UBOOT KERNEL ROOTFS

但是妈的,这哪里是独立构建,要装Yocto, 我去….

IMX8 How to build U-Boot and Kernel in standalone environment

不过在文档的后面我找到了如何下载独立的源码包, 原来NXP的核心仓在source.codeaurora.org, 我说怎么在github上找不着, 毕竟NXP是一家欧洲公司,哈哈.
IMX8 MP linux sourcecode download

boot有了,kernel有了, 自己再构建个rootfs就结了,上buildroot咯,传统套路啦.

不过要构建大系统如ubuntu这种,还是上YOCTO吧, 想想在IMX8这种上面跑个ubuntu desktop不是好爽, 用上包管理器好多东西都不用自己再去交叉编译,直接sudo apt install …

所以我还是觉得装YOCTO. NXP的资料直是齐得一逼, YOCTO文档 << i.MX_Yocto_Project_User’s_Guide.pdf>> 就在刚才下载的那个包里.

照着上面步骤搞呗. 如果想了争Yocto更多信息,请查看 学习 https://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html.

安装Yocto

使用docker安装,一键搞定,但是我的SSD硬件实在是小,装不了这么多SOC的SDK,所以我仍然手动安装吧.

手动安装

先装Yocto依赖包(我爱命令行, 安装爽无双)

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
pylint3 xterm rsync curl

创建 BIN目录,

$ mkdir ~/bin (this step may not be needed if the bin folder already exists)
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

将bin目录添加到环境变量, 或写入.bashrc . 不过我不喜欢这两种方式,我喜欢直接在编译脚本中指定,那样好备份.

export PATH=~/bin:$PATH

配置git

$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
$ git config --list

创建BSP工作目录, 并clone和同步IMX8的git仓

$ mkdir imx-yocto-bsp
$ cd imx-yocto-bsp
$ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-hardknott -m imx-5.10.52-2.1.0.xml
$ repo sync


使用Yocto构建IMX8 MP镜像

运行 imx-setup-release.sh 配置NXP的不同IMX系列SOC的编译选项

注意IMX8不支持FrameBbuffer这种图形后端, 不同IMX系列支持的图形后端各不一样,按手册或者提示来, 在5.6一节有各种示例

对于 i.MX 8M Plus EVK 开发板, 执行如下命令

DISTRO=fsl-imx-wayland MACHINE=imx8mp-lpddr4-evk source imx-setup-release.sh -b build-wayland

按q, 然后输入 Y

编译镜像
bitbake imx-image-multimedia

开始漫长的等待吧… 然后看着硬盘可用空间一点点变小… 不要问我下载为什么那么快,因为我用了梯子进行科学上网.


按需求选择不同的Yocto工程镜像

Bitbake的可用选项

UBOOT 配置

构建 scenarios

Build scenarios

为 i.MX 8QuadXPlus MEK 构建支持 XWayland 的镜像
$ DISTRO=fsl-imx-xwayland MACHINE=imx8qxpmek source imx-setup-release.sh -b build-xwayland
$ bitbake imx-image-full
构建支持 QT5 的镜像
构建支持Chromium Browser浏览器的镜像
构建支持 Qt 5 and QtWebEngine browsers 的镜像

还有其它构建AI支持的选项,就不一一列举了.

镜像发布

生成的镜像位置在 “<build directory="">/tmp/deploy/images”</build>

将镜像烧写到SD卡, 先解压然后再dd, 老套路无啥新奇

bzcat <image_name>.wic.bz2 | sudo dd of=/dev/sd<partition> bs=1M conv=fsync
编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
popomao 头像