NXP官方kernel编译
1、安装库
sudo apt-get install lzop
2、官网获取kernel包
linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2
解压缩:
tar -vxjf linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2
3、根目录创建脚本文件
mx6ull_alientek_emmc.sh
1
#
!
/bin/sh
2
make ARCH
=
arm CROSS_COMPILE
=
arm
-
linux
-
gnueabihf
-
distclean
3
make ARCH
=
arm CROSS_COMPILE
=
arm
-
linux
-
gnueabihf
-
imx_v7_defconfig
4
make ARCH
=
arm CROSS_COMPILE
=
arm
-
linux
-
gnueabihf
-
menuconfig
5
make ARCH
=
arm CROSS_COMPILE
=
arm
-
linux
-
gnueabihf
-
all
-
j16
赋予运行权限
chmod 777
mx6ull_alientek_emmc.sh
./mx6ull_alientek_emmc.sh
编译的过程中会弹出kernel编译的图形配置界面,
按两下esc退出,继续编译。编译完成界面:
Linux
内核编译完成以后会在
arch/arm/boot
目录下生成
zImage
镜像文件。
NXP官方kernel移植到自己的开发板
将官方的kernel包重命名
mv linux-imx-rel_imx_4.1.15_2.1.0_ga linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
修改顶层 Makefile
直接在顶层
Makefile
文件里面定义
ARCH
和
CROSS_COMPILE
这两
个的变量值为
arm
和
arm-linux-gnueabihf-
,
配置并编译 Linux 内核
make clean
make imx_v7_mfg_defconfig //配置
Linux
内核
make -j16 //编译linux内核
Linux
内核编译完成以后会在
arch/arm/boot
目录下生成
zImage
镜像文件,如果使用设备树
的话还会在
arch/arm/boot/dts
目录下开发板对应的
.dtb(
设备树
)
文件,比如
imx6ull-14x14-evk.dtb
就是
NXP
官方的
I.MX6ULL EVK
开发板对应的设备树文件。至此我们得到两个文件:
①、
Linux
内核镜像文件:
zImage
。
②、
NXP
官方
I.MX6ULL EVK
开发板对应的设备树文件:
imx6ull-14x14-evk.dtb
。
根文件系统缺失错误
Linux
内核启动以后是需要根文件系统的,根文件系统存在哪里是由
uboot
的
bootargs
环境
变 量 指 定 ,
bootargs
会 传 递 给
Linux
内 核 作 为 命 令 行 参 数 。 比 如 上 一 小 节 设 置
root=/dev/mmcblk1p2
,也就是说根文件系统存储在
/dev/mmcblk1p2
中,也就是
EMMC
的分区
2
中。
如果新做的板子,那么第一次上电是没有 根文件系统的
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
添加开发板默认配置文件
将
arch/arm/configs
目 录 下 的
imx_v7_mfg_defconfig
重 新 复 制 一 份 , 命 名 为
imx_alientek_emmc_defconfig
,命令如下:
cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig
打开
imx_alientek_emmc_defconfig
文件,找到“
CONFIG_ARCH_MULTI_V6=y
”这一行,
将其屏蔽掉
因为
I.MX6ULL
是
ARMV7
架构的,因此要屏蔽掉
V6
相关选项。
使用如下命令来配置正点原子
EMMC
版开发板对应的
Linux
内核了:
make imx_alientek_emmc_defconfig
添加开发板对应的设备树文件
1、进入目录
arch/arm/boot/dts
中,复制一
份
imx6ull-14x14-evk.dts
,然后将其重命名为
imx6ull-alientek-emmc.dts
,命令如下:
cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts/
2、修 改 文 件 arch/arm/boot/dts/Makefile
, 找 到 “
dtb-
$(CONFIG_SOC_IMX6ULL)
”配置项,在此配置项中加入“
imx6ull-alientek-emmc.dtb
”
第
422
行为“
imx6ull-alientek-emmc.dtb
”,这样编译
Linux
的时候就可以从
imx6ull-alientek
emmc.dts
编译出
imx6ull-alientek-emmc.dtb
文件。
编译测试
创 建 一 个 编 译 脚 本 ,
imx6ull_alientek_emmc.sh
,脚本内容如下:
1
#
!
/bin/sh
2
make ARCH
=
arm CROSS_COMPILE
=
arm
-
linux
-
gnueabihf
-
distclean
3
make ARCH
=
arm CROSS_COMPILE
=
arm
-
linux
-
gnueabihf
imx_alientek_emmc_defconfig
4
make ARCH
=
arm CROSS_COMPILE
=
arm
-
linux
-
gnueabihf
-
menuconfig
5
make ARCH
=
arm CROSS_COMPILE
=
arm
-
linux
-
gnueabihf
-
all
-
j16
赋予权限和执行
chmod 777 imx6ull_alientek_emmc.sh //给予可执行权限
./imx6ull_alientek_emmc.sh
修改emm为8bit传输数据
Linux
内核驱动里面
EMMC
默认是
4
线模式的,
4
线模式肯定没有
8
线模式的速度快,所
以本节我们将
EMMC
的驱动修改为
8
线模式。修改方法很简单,直接修改设备树即可,打开文
件
imx6ull-alientek-emmc.dts
,找到如下所示内容
734
&
usdhc2
{
735
pinctrl
-
names
=
"default"
;
736
pinctrl
-
0
= <&
pinctrl_usdhc2
>;
737
non
-
removable
;
738
status
=
"okay"
;
739
};
修改为如下内容:
734
&
usdhc2
{
735
pinctrl
-
names
=
"default"
,
"state_100mhz"
,
"state_200mhz"
;
736
pinctrl
-
0
= <&
pinctrl_usdhc2_8bit
>;
737
pinctrl
-
1
= <&
pinctrl_usdhc2_8bit_100mhz
>;
738
pinctrl
-
2
= <&
pinctrl_usdhc2_8bit_200mhz
>;
739
bus
-
width
= <
8
>;
740
non
-
removable
;
741
status
=
"okay"
;
742
};
修改1.8V供电到3.3V供电
734
&
usdhc2
{
735
pinctrl
-
names
=
"default"
,
"state_100mhz"
,
"state_200mhz"
;
736
pinctrl
-
0
= <&
pinctrl_usdhc2_8bit
>;
737
pinctrl
-
1
= <&
pinctrl_usdhc2_8bit_100mhz
>;
738
pinctrl
-
2
= <&
pinctrl_usdhc2_8bit_200mhz
>;
739
bus
-
width
= <
8
>;
740
non
-
removable
;
741
no-1-8-v
;
742
status
=
"okay"
;
743
};
第
741
行就是加入的“
no-1-8-v
”选项。
修改完成以后保存一下
imx6ull-alientek-emmc.dts
,然后使用命令“
make dtbs
”重新编译一
下设备树,编译完成以后使用新的设备树重启
Linux
系统即可。不需要重新编译linux内核。