linux内核移植

一、资源来源

移植一般采用半导体厂商提供的 Linux BSP 包,再通过自己的开发板的硬件资源来进行修改,从而实现kernel能够在自己开发板运行。

二、移植主要过程

①、在bsp包中查找可以参考的板子配置文件
②、编译参考板子对应zimage核.dtb文件
③、测试zimage与.dtb是否可行
④、若启动成功,修改相应的驱动如网络驱动,lcd驱动等外部设备,对于SD卡、EMMC、NAND Flash等块设备驱动半导体厂商内核中已经提供。
⑤、linux内核启动完成需要挂载根文件系统,所谓的init空闲进程就在根文件系统中,若没根文件系统则系统会崩溃。

三、修改NXP源码

(1)、修改顶层Makefile文件中的环境变量
①、ARCH ?=arm
②、CROSS_COMPILE ?=arm-linux-guneabihf- (交叉编译器)
③、修改原因方便编译时不用输入很长命令
(2)、创建.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_mfg_defconfig 
4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j4

四、在NXP_linux源码添加自己的开发板

(1)、添加开发板配置文件

cd arch/arm/configs
cp imx_v7_mfg_defconfig  cling_emmc_defconfig

(2)、添加开发板对应设备树
①、先将对应设备树复制一份

cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts cling-emmc.dts

②、修改设备树下arch/arm/boot/dts/Makefile文件添加上复制的.dtb文件否则会编译不出来

421 imx6ull-14x14-evk-usb-certi.dtb \
422 cling-emmc.dtb \

(3)、开始编译与测试
①、修改编译脚本cling_emmc.sh

1 #!/bin/sh
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf  cling_emmc_defconfig
4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j4

②、开发板配置

setenv bootcmd ‘tftp 808000000 zImage;tftp tftp 83000000 cling-emmc.dtb;bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' 
saveenv

五、使能8线EMMC驱动

(1)、通过直接修改设备树cling-emmc.dts中原来的内容替换如下

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)、修改原因
开发板中负责管理MAC物理地址的网络PHY芯片与NXP使用不同型号,由 KSZ8081 换为了 LAN8720A,且连个 PHY 芯片的复位 IO 也不同,所以需要修改才可以使用。
(2)、修改LAN8720复位引脚驱动
①、得知LAN8720芯片复位引脚分别连接在开发板SNVS_TAMPER7、SNVS_TAMPER8引脚上
②、打开设备树cling-emmc.dts 删除SNVS_TAMPER7、SNVS_TAMPER8作为spi4 IO相关代码,将其作为复位IO

584 pinctrl_spi4: spi4grp {
585 fsl,pins = <
586 MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
587 MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
588 MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1   //在文件中删除
589 MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000  //在文件中删除 spi4也将使用不了
590 >;
591 };

③、继续在cling-emmc.dts中寻找

126 compatible = "spi-gpio";
127 pinctrl-names = "default";
128 pinctrl-0 = <&pinctrl_spi4>;
129 pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;//删除
......
133 cs-gpios = <&gpio5 7 0>;//删除

④、在cling-emmc.dts中修改ENET1与ENET1初始化配置

319 MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0/* ENET1 RESET */ /*在319行添加该代码*/
...............
335 MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 /* ENET2 RESET */ /*在335处添加*/

(3)、修改LAN8720A的PHY地址
①、在cling-emmc.dts中寻找&fec1 &fec2代码块

176 phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
177 phy-reset-duration = <200>;  /*设置高电平200ms*/

186 phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
187 phy-reset-duration = <200>;/*设置低电平有效 200ms*/

194 ethphy0: ethernet-phy@0 {
196 smsc,disable-energy-detect; /*指定芯片公司*/
197 reg = <0>;

200 ethphy1: ethernet-phy@1 {
202 smsc,disable-energy-detect;
203 reg = <1>;

最后保存cling-emmc.dts退出
(4)、修改fec_main.c文件(内核源码)

3455 void __iomem *IMX6U_ENET1_TX_CLK;
3456 void __iomem *IMX6U_ENET2_TX_CLK;
3457
3458 IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);
3459 writel(0X14, IMX6U_ENET1_TX_CLK);
3460 
3461 IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);
3462 writel(0X14, IMX6U_ENET2_TX_CLK);

在3455~3462 上新加入代码,如果要在 I.MX6ULL 上使用 LAN8720A 就需要设置
ENET1 和 ENET2 的 TX_CLK 引脚复位寄存器的 SION 位为 1。
(5)、配置linux内核,使能LAN8720驱动
①、输入make menuconfig 图形配置界面,使能LAN8720A的驱动。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值