操作系统:win10 64位
虚拟机:VMware® Workstation 14 Pro
虚拟机操作系统:ubuntu 18.04 64位 ubuntu-18.04.2-desktop-amd64.iso
开发板:迅为 iMX6Q
本次目标:uboot-imx编译环境搭建
最近一直想加强一下嵌入式Linux系统的开发,买了几本书,看了感觉效果不是很大,还是需要多与实践相结合。之前搞过Atmel的ARM9+Linux,但现在Linux内核版本已经很高很新了,现在想搞个较新的,在网上找了找,选择了IMX6Q(四核,ARM Cortex-A9架构),除了跑Linux,还可以运行Android,可以让自己的了解更多。
买了开发板,要了开发板的资料,自己还是想一步步入手,一步步入门。因此,还是从开发环境搭建开始研究。
(1)安装虚拟机,有免费的【Oracle VM VirtualBox】,还有付费(破解)的【VMware® Workstation】,这里选择VMware14。
(2)安装ubuntu18.04(较新)的Linux主机,用于嵌入式交叉编译环境的开发。
(3)下载IMX6Q的官方的代码。目前主要关注uboot,linux内核(目前NXP官方维护的)。
【imx内核源码】:
git clone https://source.codeaurora.org/external/imx/linux-imx
【imx uboot】
git clone https://source.codeaurora.org/external/imx/uboot-imx
现在大型的软件工程,git是一个不错的代码与版本管理工具。
(4)进入git clone下来的uboot目录,默认的分支应该是master,通过命令切换到自己想要的分支。
git branch -va(查看所有的本地与远程分支)
git checkout -b imx_v2018.03_4.14.98_2.0.0_ga origin/imx_v2018.03_4.14.98_2.0.0_ga(切到 linux 4.14.98 这个分支上)
git pull(同步一下分支)
(5)如果是新安装的ubuntu18.04系统,环境还需要配置一下,否则直接编译,连make命令都可能不识别。
这里我安装了uboot编译需要的软件包(可以不断的编译与尝试,ubuntu会提示安装):
sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install git
sudo apt install make
sudo apt install gcc
sudo apt install bison
sudo apt install flex
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo dpkg-reconfigure dash(这里选择【取消】,意思是选用sh,而不是dash)。
(6)编译uboot-imx
首先在uboot-imx根目录下:
ls configs
看一下开发板的板子配置文件,找一个与现有开发板(IMX6Q,这里Q应该是四核的四的意思)型号接近的。我这里先选择一个看看环境是否正常。
make imx6q_icore_nand_defconfig
make menuconfig(图形配置,如果不更改,可以直接点【save】保存,保存 .config,退出)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-(ubuntu 直接apt安装的,可以用)
第一次编译,很可能会不成功,如果不成功,看一下错误原因。
我遇到的错误为:
LD u-boot
arch/arm/mach-imx/built-in.o: In function `arch_preboot_os':
/home/imx6/share/uboot-imx/arch/arm/mach-imx/cpu.c:354: undefined reference to `ldo_mode_set'
Makefile:1304: recipe for target 'u-boot' failed
查看了一下报错的文件,/home/imx6/share/uboot-imx/arch/arm/mach-imx/cpu.c,发现这个错误,是一个函数没有定义或是头文件没有包含进来,造成函数名不识别的问题。
我的解决是找到这个宏 【CONFIG_LDO_BYPASS_CHECK】 ,在配置文件里去掉这个宏定义即可。
通过查看.config文件,发现了:CONFIG_LDO_BYPASS_CHECK=y(有效),因此,可以make menuconfig配置。
void arch_preboot_os(void)
{
#if defined(CONFIG_PCIE_IMX)
imx_pcie_remove();
#endif
#if defined(CONFIG_SATA)
sata_remove(0);
#if defined(CONFIG_MX6)
disable_sata_clock();
#endif
#endif
#if defined(CONFIG_LDO_BYPASS_CHECK)
ldo_mode_set(check_ldo_bypass());
#endif
#if defined(CONFIG_VIDEO_IPUV3)
/* disable video before launching O/S */
ipuv3_fb_shutdown();
#endif
#ifdef CONFIG_VIDEO_GIS
/* Entry for GIS */
mxc_disable_gis();
#endif
#if defined(CONFIG_VIDEO_MXS)
lcdif_power_down();
#endif
#if defined(CONFIG_VIDEO_IMXDCSS)
imx8m_fb_disable();
#endif
}
重新执行make menuconfig,去掉这个宏 【CONFIG_LDO_BYPASS_CHECK】相关的配置,
不勾选这个选项即可:【】Enable the LDO bypass checking and settting
再次编译uboot-imx通过。
这样,uboot-imx正常的编译通过,和之前用过的ARM9处理器,编译方式大同小异。但这仅仅是开始,还没有真正的了解这个IMX6Q的驱动与应用,还需要多看数据手册、原理图、教程文档、网络资源等。
更重要的是,重视每次的错误与失败,这都是成功的积累。
接下来,继续研究Linux内核的编译环境。