嵌入式开发实践系列文章 - 目录/tcjy1000/article/details/123701482
平台
操作系统:win10 64位
虚拟机:VMware® Workstation 14 Pro
虚拟机操作系统:ubuntu 18.04 64位ubuntu-18.04.2-desktop-amd64.iso
开发板:迅为 iMX6Q
前言
最近一直想加强一下嵌入式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 /external/imx/linux-imx
【imx uboot】
git clone /external/imx/uboot-imx
现在大型的软件工程,git是一个不错的代码与版本管理工具。
(4)进入git clone下来的uboot目录,默认的分支应该是master,通过命令切换到自己想要的分支。
git branch -va(查看所有的本地与远程分支)
git checkout -bimx_v.03_4.14.98_2.0.0_ga origin/imx_v.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内核的编译环境。