刚开始使用nxp的LSDK碰到一些问题,浪费了不少时间去理解,因此写下来供大家参考,以免走弯路。
首先要说LSDK是什么,LSDK是nxp发布的一个用于layerscape系列的linux使用开发sdk,其实是一个完整的构建工具,你可以用它来完成如下工作:
1.构建linux的rootfs镜像,比如 ubuntu/Debian userland, Centos. builder-root等等
2.构建u-boot镜像,支持从sd卡,nor flash,启动
3.编译应用APP
4.提供二进制的firmware用于构建完整镜像
整个构建过程是通过一系列脚本来完成的,在某种意义上来说和openwrt很类似或者说buildroot以及yocto类似,都是通过运行程序,下载源程序到本地然后构建交叉编译工具,再进行编译,最后生成镜像可以安装到sd卡或者用u-boot更新。
支持的操作系统是ubuntu18.04(在有些18.04上也不能正常运行,原因我看了一下脚本,脚本会检查交叉编译器,如果已经安装了交叉编译器并且不符合就会导致检查不通过,这种情况下只能用docker了)
如果运行flex-builder时出现如下提示就需要使用docker运行环境了:
The existing toolchain version 8.x is not tested in this distro
Please build on Ubuntu 18.04 host or in docker to use the verified toolchain
构建docker环境也很简单,直接运行flex-builder docker即可,系统就会自己下载安装运行环境
lsdk的主要文档在doc目录下,建议这个目录下面的说明文件要好好阅读一下(下面的使用方法主要翻译自这几个说明文件):
构建脚本主要有:
flex-builder 主要的构建脚本,通过运行参数可以生成镜像
flex-installer 生成最终烧写的安装镜像和安装
在目录下运行 . setup.env,可以自动设置环境变量,然后就可以运行flex-builder和flex-installer
说几个常用的命令:
一、构建相关镜像(由于构建过程中需要下载大量的源程序,如果网络不好会很慢,而且很多在国外,建议增加代理,可以看一下文档中对于proxy的说明)
flex-builder - i -m -c -r
-i 指令参数 包括 auto 自动构建所有必须的镜像, mkrfs构建 rootfs mkfw 构建组合firmware clean 清除编译完成的文件
-m 板子类型,包括 ls1012afrwy, ls1021atwr, ls1028ardb, ls1043ardb, ls1046ardb, ls1088ardb, ls2088ardb, lx2160ardb_rev2, etc
-r 发行版的类型,包括 ubunut, centos buildroot等等,也可以是 a:b的形式,其中 a 是发行版名称,b是类型,比如 ubuntu:mate ubuntu:lite等等
-c 构建组件类型: 常用的 包括 firmware 固件, apps 运行app, linux linux发行版, atf, atf估件 rcw, layerscape的特有rcw配置字
-r rootfs的类型,包括 ubuntu|debian|centos|android|buildroot:main|devel|mate|lite|tiny
-b 启动的类型,包括sd, emmc, qspi, xspi, nor, nand,
构建完成以后通常会生成3个文件, bootparitionxxx.tgz, rootfsxxx.tgz ,firmwarexxxx.img,第一个是分区表打包文件,第二个是rootfs打包文件,第三个是固件及启动镜像。
生成完整的sd卡镜像应该采用如下命令:
flex-install -i mksdcard -b bootpaxxxx.tgz -r rootfxxxx.tgz -f fimwarexxx.img xxx.img
最后的xxx.img就是生成sd卡镜像的名字
如果要更新组合的固件,可在uboot下用tftp更新,
tftp a0000000 firmware_<machine>_uboot_sdboot.mg
mmc write a0000000 8 1f000
要注意从第八个block开始写,因为这个镜像没有开始的8个block,
而系统默认是从0x1000处开始读取rcw字节的,所以如果你把这个镜像烧写到从0开始的block就会发生悲剧,导致系统无法启动。这点和openwrt不一样,openwrt已经生成了完整的镜像,所以就不用加这个8个block的偏移了,从0开始的镜像需要用上面说的sd卡镜像生成命令,
如果想自定义RCW怎么办?
1.修改packages/firmware/u-boot/board/freescale/xxx.cfg 对于不同的配置有不同的cfg文件,对于sd 启动是ls102xa_rcw_sd_ifc.cfg,对于qspi是ls102xa_rcw_sd_qspi.cfg,具体的可以参考configs/board/ls1021atwr/manifest文件,里面有每个配置对应的文件名字,可以根据自己的实际配置修改对应的cfg文件
2.运行flex-builder -c uboot -m xxxx -b xxx
如果想自定义u-boot怎么办?
1.设定环境变量 ARCH=arm32|arm64, CROSS_COMPILE=arm-linux-gnueabihf-
2.进入packages/firmware/u-boot,运行make menuconfig 修改相关配置并保存
3.此时运行flex-builder会出错,所以运行make savedefconfig,把u-boot目录下的defconfig覆盖configs下对应的xxxxdefconfig,然后再运行 make mkproper以清除修改内容,当然也可以直接修改xxxdefconfig的内容也能达到同样的目的
4,运行flex-builder -c uboot -m xxxx -b xxx 生成u-boot镜像
如果想自定内核怎么办:
很简单,运行flex-builder -c linux:custom -a xxxx 进入menuconfig界面修改并保存,然后运行
flex-builder -c linux -a xxx -a
如果想修改自己程序怎么办?
进入目录apckages/apps然后编辑自己的应用和源程序及makefile.
然后运行-c 参数就可以单独编译,然后再运行 -i merge-component 合并文件,运行packrfs打包文件