Just Do It

IMX287A Linux4.14移植

uboot2017.09移植
http://blog.centerking.top/index.php/2019/12/12/imx287a-uboot2017-09/

主要步骤已加粗
下载源码
https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.gz
解压

tar zxvf linux-4.14.tar.gz

修改Makefile添加

CROSS_COMPILE ?= arm-fsl-linux-gnueabi-
ARCH ?= arm

编译

make distclean
make mxs_defconfig
make zImage

初次移植只是为了能正常启动,所以这里直接用了kernel提供的配置文件;由于使用uImage每次编译时需要加入LOADADDR较为麻烦,这里我直接使用zImage。make完后生成文件在arch\arm\boot下

在linux3.1之后kernel加入了设备树(dts),本次升级内核的主要目的也就是学习设备树的使用。设备树文件在arch\arm\boot\dts下,这里使用imx28-evk.dts这个设备树文件,修改该文件。由于还没具体学习设备树,在这里我将其余部分全部删除,只留下了nand和duart部分,同时注意duart下的

pinctrl-0 = <&duart_pins_a>;

改为

pinctrl-0 = <&duart_pins_b>;
#include "imx28.dtsi"

/ {
    model = "Freescale i.MX28 Evaluation Kit";
    compatible = "fsl,imx28-evk", "fsl,imx28";

    memory {
        reg = <0x40000000 0x08000000>;
    };

    apb@80000000 {
        apbh@80000000 {
            gpmi-nand@8000c000 {
                pinctrl-names = "default";
                pinctrl-0 = <&gpmi_pins_a &gpmi_status_cfg>;   
                status = "okay";
            };
   
        };

        apbx@80040000 {
            duart: serial@80074000 {
                pinctrl-names = "default";
                pinctrl-0 = <&duart_pins_b>;
                status = "okay";
            };
        };
    };
};

编译设备树

make dtbs

生成文件为imx28-evk.dtb
到此kernel部分准备完毕

接下来修改uboot部分,这里使用之前移植过的uboot2017.09,链接如下
http://blog.centerking.top/index.php/2019/12/12/imx287a-uboot2017-09%e7%a7%bb%e6%a4%8d/
在此基础上进行修改,在这里只需要对环境变量进行一些修改即可,修改完后编译生成imx28_ivt_uboot.sb文件
对于nand flash的分区暂时直接使用zlg同样的分区

#define MTDPARTS_DEFAULT            \
    "mtdparts=gpmi-nand:"           \
        "3m(bootloader)ro,"     \
        "512k(environment),"        \
        "512k(redundant-environment),"  \
        "4m(kernel),"           \
        "512k(fdt),"            \
        "8m(ramdisk),"          \
        "-(filesystem)"

改为

#define MTDPARTS_DEFAULT            \
    "mtdparts=gpmi-nand:"           \
        "12m(boot),"\
                "512k(environment),"\
                "512k(reserve),"\
                "2m(bmp),"\
                "512k(reserve),"\
                "64m(rootfs),"\
                "-(opt)"
*/

同时更改启动命令,这里预计将zImage文件下载到0x200000,dtb文件下载到0x780000的位置

#define CONFIG_EXTRA_ENV_SETTINGS \
    "fdt_addr=0x41000000\0"\
    "kernel_size=0x500000\0" \
    "fdt_size=0x10000\0" \
    "bootargs_nand=mtdparts default;setenv bootargs console=ttyAMA0,115200n8 ubi.mtd=5 root=ubi0 rootfstype=ubifs ${mtdparts} rw\0"\
    "nand_boot=run bootargs_nand;nand read.jffs2 ${loadaddr} 0x200000 ${kernel_size};nand read.jffs2 ${fdt_addr} 0x780000 ${fdt_size};"\
                "bootz ${loadaddr} - ${fdt_addr};\0"
#define CONFIG_BOOTCOMMAND "run nand_boot"

对上面的环境变量做一些简单的解释。
bootargs中需要有console,文件系统位置,以及nand的分区信息。、
bootargs可以在uboot中,dts文件中,以及kenel中进行修改,其中优先级为uboot>dtb>kernel

对bootargs进行一些更改,console的值由ttyAM0变成了ttyAMA0,这里在menuconfig中可以查到
Device Drivers > Character devices > Serial drivers下选中了 <*> ARM AMBA PL011 serial port support
或者源码drivers/tty/serial下被编译了的amba-pl011.c中有

static struct console amba_console = {
        .name           = "ttyAMA",
        .write          = pl011_console_write,
        .device         = uart_console_device,
        .setup          = pl011_console_setup,
        .match          = pl011_console_match,
        .flags          = CON_PRINTBUFFER | CON_ANYTIME,
        .index          = -1,
        .data           = &amba_reg,
};

mtdparts default;执行完后会有一个mtdparts的环境变量,然后再用${mtdparts}调用加入到bootargs中。或者可以直接将${mtdparts}改为

mtdparts==gpmi-nand:12m(boot),512k(environment),512k(reserve),2m(bmp),512k(reserve),64m(rootfs),-(opt)

是一样的效果

文件系统
方便起见这里直接使用zlg制作的文件系统,不过需要改一个地方,先将压缩文件解压

tar jxvf rootfs.tar.bz2

修改etc/inittab

ttyAM0::respawn:/sbin/getty -L ttyAM0 115200 vt100 # GENERIC_SERIAL

中的ttyAM0改为ttyAMA0

ttyAMA0::respawn:/sbin/getty -L ttyAMA0 115200 vt100 # GENERIC_SERIAL

压缩回去

tar jcvf rootfs.tar.bz2 *

下载
使用MfgTool
先将前面的imx28_ivt_uboot.sb,zImage,imx28-evk.dtb,rootfs.tar.bz2都拷贝到Profiles\MX28 Linux Update\OS Firmware\files下。
MfgTool烧录原理是先下载一个固定uboot进去,然后用命令烧录我们需要的文件(在烧录过程中可以看到)
修改MfgTool的烧录配置将dtb文件加进去
在Profiles\MX28 Linux Update\OS Firmware下的ucl.xml是需要修改的文件

<CMD type="push" body="send" file="files/uImage">Sending firmware</CMD>
<CMD type="push" body="$ mtdwrite -f $FILE -a 0x200000 -b 0x680000">Flashing firmware</CMD>
<CMD type="push" body="$ mtdwrite -f $FILE -a 0x780000 -b 0xc00000">Flashing firmware</CMD>

改为

<CMD type="push" body="send" file="files/zImage">Sending firmware</CMD>
<CMD type="push" body="$ mtdwrite -f $FILE -a 0x380000 -b 0x880000">Flashing firmware</CMD>
<CMD type="push" body="send" file="files/imx28-evk.dtb">Sending dtb</CMD>
<CMD type="push" body="$ mtdwrite -f $FILE -a 0x880000 -b 0x890000">Flashing dtb</CMD>

具体的这里不做详细介绍

To Be Continued…

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注