imx6q uboot與linux的移植

imx6q 筆記  環境:Ubuntu 17.10

一、安裝編譯工具(二選一):
下載地址:http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/arm-linux-gnueabihf/
1、下載編譯工具:gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2;下載地址:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
2、命令安裝交叉工具鏈: sudo apt-get install gcc-arm-linux-gnueabi

二、交叉編譯sfdisk
1、下載:https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.23.1.tar.bz2
2、解壓:tar -xjf util-linux-2.23.1.tar.bz2
3、配置:./configure --host=arm-linux CC=arm-linux-gnueabi-gcc --prefix=/home/lonnox/work/tools/util-linux-2.23.1/_install --without-ncurses
4、編譯:make&&make install

三、搭建網絡文件系統
1、tar zxvf rootfs.tgz
2、sudo apt-get install nfs-kernel-server portmap
3、sudo vim /etc/exports
   添加:/home/lonnox/work/imx6/nfs_root *(rw,sync,no_root_squash)
4、sudo /etc/init.d/nfs-kernel-server restart
5、測試nfs是否成功:sudo mount -t nfs 127.0.0.1:/home/lonnox/work/imx6/nfs_root /mnt
    如果出錯 svc: failed to register lockdv1 RPC service (errno 111).
    添加-o nolock,命令改成:mount -o nolock -t nfs 192.168.1.104:/home/lonnox/work/imx6/nfs_root /mnt
6.網絡文件系統的方式啓動
setenv bootargs console=ttySAC0,115200 ${displayArgs} root=/dev/nfs rw nfsroot=192.168.1.104:/home/lonnox/work/imx6/nfs_root,v3,tcp ip=192.168.1.106:192.168.1.104:192.168.1.1:255.255.255.0
mmc dev 3;mmc read ${loadaddr} 0x800 0x3000;setenv bootargs ${bootargs};bootm

四、交叉編譯mkfs.ext3
1、下載:https://netix.dl.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.44.3/e2fsprogs-1.44.3.tar.gz
2、解壓 tar -xzf e2fsprogs-1.44.3.tar.gz
3、./configure --host=arm-linux CC=arm-linux-gnueabi-gcc --prefix=/home/lonnox/work/tools/e2fsprogs-1.44.3/_install
//=============================================================
///vim tmp_build.sh
#! /bin/sh
CC=arm-linux-gnueabi-gcc ./configure --enable-elf-shlibs --host=arm --prefix=/home/lonnox/work/tools/e2fsprogs-1.44.3/_install
//=============================================================
4、編譯:make&&make install
5.拷貝
cp -a  bin/* ../../../imx6/nfs_root/usr/bin/
cp -a  sbin/* ../../../imx6/nfs_root/usr/sbin/
cp -a  lib/* ../../../../imx6/nfs_root/lib/
6、查看分區信息cat /proc/partitions

五、編譯uboot
1、下載uboot:git clone https://source.codeaurora.org/external/imx/uboot-imx -b u-boot/master
2、修改board/freescale/mx6qarm2/imximage.cfg
/* DCD */    
DATA 4, 0x020e0798, 0x000C0000    
DATA 4, 0x020e0758, 0x00000000    
DATA 4, 0x020e0588, 0x00000030    
DATA 4, 0x020e0594, 0x00000030    
DATA 4, 0x020e056c, 0x00000030    
DATA 4, 0x020e0578, 0x00000030    
DATA 4, 0x020e074c, 0x00000030    
DATA 4, 0x020e057c, 0x00000030    
DATA 4, 0x020e058c, 0x00000000    
DATA 4, 0x020e059c, 0x00000030    
DATA 4, 0x020e05a0, 0x00000030    
DATA 4, 0x020e078c, 0x00000030    
DATA 4, 0x020e0750, 0x00020000    
DATA 4, 0x020e05a8, 0x00000018    
DATA 4, 0x020e05b0, 0x00000018    
DATA 4, 0x020e0524, 0x00000018    
DATA 4, 0x020e051c, 0x00000018    
DATA 4, 0x020e0518, 0x00000018    
DATA 4, 0x020e050c, 0x00000018    
DATA 4, 0x020e05b8, 0x00000018    
DATA 4, 0x020e05c0, 0x00000018    
DATA 4, 0x020e0774, 0x00020000    
DATA 4, 0x020e0784, 0x00000018    
DATA 4, 0x020e0788, 0x00000018    
DATA 4, 0x020e0794, 0x00000018    
DATA 4, 0x020e079c, 0x00000018    
DATA 4, 0x020e07a0, 0x00000018    
DATA 4, 0x020e07a4, 0x00000018    
DATA 4, 0x020e07a8, 0x00000018    
DATA 4, 0x020e0748, 0x00000018    
DATA 4, 0x020e05ac, 0x00000018    
DATA 4, 0x020e05b4, 0x00000018    
DATA 4, 0x020e0528, 0x00000018    
DATA 4, 0x020e0520, 0x00000018    
DATA 4, 0x020e0514, 0x00000018    
DATA 4, 0x020e0510, 0x00000018    
DATA 4, 0x020e05bc, 0x00000018    
DATA 4, 0x020e05c4, 0x00000018    
DATA 4, 0x021b0800, 0xa1390003    
DATA 4, 0x021b080c, 0x001F001F    
DATA 4, 0x021b0810, 0x001F001F    
DATA 4, 0x021b480c, 0x001F001F    
DATA 4, 0x021b4810, 0x001F001F    
DATA 4, 0x021b083c, 0x43180330    
DATA 4, 0x021b0840, 0x03180310    
DATA 4, 0x021b483c, 0x43200330    
DATA 4, 0x021b4840, 0x0320025C    
DATA 4, 0x021b0848, 0x40363838    
DATA 4, 0x021b4848, 0x38362E3C    
DATA 4, 0x021b0850, 0x3E3C4840    
DATA 4, 0x021b4850, 0x44364640    
DATA 4, 0x021b081c, 0x33333333    
DATA 4, 0x021b0820, 0x33333333    
DATA 4, 0x021b0824, 0x33333333    
DATA 4, 0x021b0828, 0x33333333    
DATA 4, 0x021b481c, 0x33333333    
DATA 4, 0x021b4820, 0x33333333    
DATA 4, 0x021b4824, 0x33333333    
DATA 4, 0x021b4828, 0x33333333    
DATA 4, 0x021b08b8, 0x00000800    
DATA 4, 0x021b48b8, 0x00000800    
DATA 4, 0x021b0004, 0x00020036    
DATA 4, 0x021b0008, 0x09444040    
DATA 4, 0x021b000c, 0x8A8F7955    
DATA 4, 0x021b0010, 0xFF328F64    
DATA 4, 0x021b0014, 0x01FF00DB    
DATA 4, 0x021b0018, 0x00001740    
DATA 4, 0x021b001c, 0x00008000    
DATA 4, 0x021b002c, 0x000026D2    
DATA 4, 0x021b0030, 0x008F1023    
DATA 4, 0x021b0040, 0x00000047    
DATA 4, 0x021b0000, 0x841A0000    
DATA 4, 0x021b001c, 0x04088032    
DATA 4, 0x021b001c, 0x00008033    
DATA 4, 0x021b001c, 0x00048031    
DATA 4, 0x021b001c, 0x09408030    
DATA 4, 0x021b001c, 0x04008040    
DATA 4, 0x021b0020, 0x00005800    
DATA 4, 0x021b0818, 0x00011117    
DATA 4, 0x021b4818, 0x00011117    
DATA 4, 0x021b0004, 0x00025576    
DATA 4, 0x021b0404, 0x00011006    
DATA 4, 0x021b001c, 0x00000000     
/* set the default clock gate to save power */    
DATA 4 0x020c4068 0x00C03F3F    
DATA 4 0x020c406c 0x0030FC03    
DATA 4 0x020c4070 0x0FFFC000    
DATA 4 0x020c4074 0x3FF00000    
DATA 4 0x020c4078 0x00FFF300    
DATA 4 0x020c407c 0x0F0000C3    
DATA 4 0x020c4080 0x000003FF     
/* enable AXI cache for VDOA/VPU/IPU */    
DATA 4 0x020e0010 0xF00000CF    
/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */    
DATA 4 0x020e0018 0x007F007F    
DATA 4 0x020e001c 0x007F007F

3、修改board/freescale/mx6qarm2/mx6qarm2.c
//modify:添加uart1的引腳出事化
static void setup_iomux_uart(void)    
{        
    imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));    
}    

iomux_v3_cfg_t const uart1_pads[] = 
{    
    MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),    
    MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),    
};

iomux_v3_cfg_t const usdhc3_pads[] = 
{    
    MX6_PAD_SD3_CLK__SD3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_CMD__SD3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    //MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),//modify:uart1引腳衝突,註釋掉該語句
    //MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),//modify:uart1引腳衝突,註釋掉該語句
    
    MX6_PAD_NANDF_CS0__GPIO6_IO11  | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
};


網絡部分修改:
//modify:添加
vim include/configs/mx6qarm2.h
#define CONFIG_NET_RANDOM_ETHADDR
#define CONFIG_LIB_RAND

//modify:修改引腳
vim mx6qarm2.c
iomux_v3_cfg_t const enet_pads[] = {    
    MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET_RXD1__GPIO1_IO26 | MUX_PAD_CTRL(NO_PAD_CTRL),    
    MX6_PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL),
    MX6_PAD_RGMII_TXC__RGMII_TXC  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TD0__RGMII_TD0  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TD1__RGMII_TD1  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TD2__RGMII_TD2  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TD3__RGMII_TD3  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),        
    MX6_PAD_RGMII_RXC__RGMII_RXC  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RD0__RGMII_RD0  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RD1__RGMII_RD1  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RD2__RGMII_RD2  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RD3__RGMII_RD3  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_ENET_REF_CLK__ENET_TX_CLK  | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

//modify:添加初始化
int board_early_init_f(void)
{
    volatile unsigned int i = 0x88888;
    setup_iomux_uart();
    setup_iomux_enet();
    //reset_ar8035();
    /* Reset AR8031 PHY */
    gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
    while(i--);//mdelay(10);
    gpio_set_value(IMX_GPIO_NR(1, 25), 1);
    //udelay(100);
    return 0;
}

SD卡部分修改:
SD卡掛載在ESDHC2上
int board_mmc_init(bd_t *bis)
{
    int ret;
    u32 index = 0;
 
    usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);//modify:修改爲MXC_ESDHC2_CLK
    usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
 
    for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
        switch (index) {
        case 0:
            imx_iomux_v3_setup_multiple_pads(
                usdhc2_pads, ARRAY_SIZE(usdhc2_pads));//modify:修改爲 usdhc2_pads
            break;
        case 1:
            imx_iomux_v3_setup_multiple_pads(
                usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
            break;
        default:
            printf("Warning: you configured more USDHC controllers"
                "(%d) then supported by the board (%d)\n",
                index + 1, CONFIG_SYS_FSL_USDHC_NUM);
            return -EINVAL;
        }
 
        ret = fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
        if (ret)
            return ret;
    }
 
    return 0;
}
//modify:添加 usdhc2_pads
iomux_v3_cfg_t const usdhc2_pads[] = {
    MX6_PAD_SD2_CLK__SD2_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_CMD__SD2_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_GPIO_4__GPIO1_IO04  | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
};
//eMMC
iomux_v3_cfg_t const usdhc4_pads[] = {
    MX6_PAD_SD4_CLK__SD4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_CMD__SD4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
};

struct fsl_esdhc_cfg usdhc_cfg[2] = {
    {USDHC2_BASE_ADDR},//modify:修改 USDHC2_BASE_ADDR
    {USDHC4_BASE_ADDR},
};


int board_mmc_getcd(struct mmc *mmc)
{
    struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
    int ret;
 
    if (cfg->esdhc_base == USDHC2_BASE_ADDR) {//modify:修改 USDHC2_BASE_ADDR
        gpio_direction_input(IMX_GPIO_NR(1, 4));//modify:修改片選 IMX_GPIO_NR(1, 4)
        ret = !gpio_get_value(IMX_GPIO_NR(1, 4));//modify:修改片選 IMX_GPIO_NR(1, 4)
    } else if (cfg->esdhc_base == USDHC4_BASE_ADDR){
        ret = 1;/* eMMC is always present */
    }
    else{
        ret = -1;/* Don't have the CD GPIO pin on board */
    }
 
    return ret;
}
/* 此處不用修改                         
int board_mmc_get_env_dev(int devno)
{
    return devno - 1; 
}
*/
4.修改 include/configs/mx6qarm2.h
#define CONFIG_MXC_UART_BASE            UART1_BASE

5、編譯
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-    //arm-none-eabi-
make mx6qarm2_defconfig
make -j8

六、在uboot中查看uboot在emmc中的燒錄位置和數據
1、切換到當前板子使用的boot分區 mmc bootpart
2、切換到boot分區:mmc dev 3 1
3、也可以通過命令設置啓動分區到第一分區或其他分區:mmc dev 3 1
4、讀取boot分區第三個block(uboot燒錄是從第三個block開始)的數據到0x10800000中:mmc read 0x10800000 0x2 0x01 
5、查看0x10800000內容,對比可知就是u-boot.bin的數據:md.b 0x10800000

七、在uboot中查看uImage在emmc中的燒錄位置和數據
1、切換到0分區:mmc dev 3 0
2、讀取0分區第2048個block(uImage燒錄是從1M位置開始燒錄)的數據到0x10800000中:mmc read 0x10800000 0x800 0x01
3、查看0x10800000內容,對比可知就是uImage的數據:md.b 0x10800000

八、在linux中查看uImage在emmc中的燒錄位置和數據
1、mmcblk0p1:文件系統存放分區。
2、從emmc讀入uImage的數據:dd if=/dev/mmcblk0 of=456 bs=1M skip=1 count=2
    通過hexdump 456 -n 100可以知道和燒錄的uImage數據一致。
3、從emmc讀入u-boot.bin的數據: dd if=/dev/mmcblk0boot0 of=456 bs=512 skip=2 count=4
    通過hexdump 456 -n 100可以知道和燒錄的u-boot.bin數據一致。
    
    linux中EMMC寫入使能:echo 0 > /sys/block/mmcblk0boot0/force_ro
                         echo 0 > /sys/block/mmcblk0boot1/force_ro
                         echo 0 > /sys/block/mmcblk0/force_ro
                         //沒有該分區echo 0 > /sys/block/mmcblk0p1/force_ro
    linux中EMMC只讀使能:echo 1 > /sys/block/mmcblk0boot0/force_ro

    linux清除指令:    dd if=/dev/zero of=/dev/mmcblk0p1 bs=1M count=1
                    dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=2
                    
    skip=xxx是在備份時對if 後面的部分也就是原文件跳過多少塊再開始備份;
    seek=xxx則是在備份時對of 後面的部分也就是目標文件跳過多少塊再開始寫。    
                    
九、uboot中通過指令燒錄uboot                    
1、下載文件到內存:tftp 0x10800000 u-boot.imx    
2、切換到uboot分區:mmc dev 3 1
3、燒錄,根據u-boot.imx的大小確定塊數:mmc write 0x10800000 2 2B6


十、編譯內核
1、下載內核:git clone https://source.codeaurora.org/external/imx/linux-imx -b git.kernel.org/linux-stable/linux-4.18.y
    git checkout imx_4.9.88_2.0.0_ga
2、修改 imx6q-arm2.dts
//modify:添加
pinctrl_uart1: uart1grp {
    fsl,pins = <
        MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA 0x1b0b1
        MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA 0x1b0b1
    >;
};

&uart1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_uart1>;
    status = "okay";
};

&usdhc2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_usdhc2>;
    bus-width = <4>;
    cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
    wp-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
    status = "okay";
};

pinctrl_usdhc2: usdhc2grp {
    fsl,pins = <
        MX6QDL_PAD_SD2_CMD__SD2_CMD        0x17059
        MX6QDL_PAD_SD2_CLK__SD2_CLK        0x10059
        MX6QDL_PAD_SD2_DAT0__SD2_DATA0        0x17059
        MX6QDL_PAD_SD2_DAT1__SD2_DATA1        0x17059
        MX6QDL_PAD_SD2_DAT2__SD2_DATA2        0x17059
        MX6QDL_PAD_SD2_DAT3__SD2_DATA3        0x17059
        MX6QDL_PAD_NANDF_D4__SD2_DATA4        0x17059
        MX6QDL_PAD_NANDF_D5__SD2_DATA5        0x17059
        MX6QDL_PAD_NANDF_D6__SD2_DATA6        0x17059
        MX6QDL_PAD_NANDF_D7__SD2_DATA7        0x17059
    >;
};

//modify:刪除 &usdhc3 節點和 pinctrl_usdhc3
//modify:修改網絡接口節點
pinctrl_enet: enetgrp {
fsl,pins = <
    MX6QDL_PAD_ENET_MDIO__ENET_MDIO        0x1b0b0
    MX6QDL_PAD_ENET_MDC__ENET_MDC        0x1b0b0
    MX6QDL_PAD_RGMII_TXC__RGMII_TXC        0x1b030
    MX6QDL_PAD_RGMII_TD0__RGMII_TD0        0x1b030
    MX6QDL_PAD_RGMII_TD1__RGMII_TD1        0x1b030
    MX6QDL_PAD_RGMII_TD2__RGMII_TD2        0x1b030
    MX6QDL_PAD_RGMII_TD3__RGMII_TD3        0x1b030
    MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL    0x1b030
    MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK    0x1b0b0
    MX6QDL_PAD_RGMII_RXC__RGMII_RXC        0x1b030
    MX6QDL_PAD_RGMII_RD0__RGMII_RD0        0x1b030
    MX6QDL_PAD_RGMII_RD1__RGMII_RD1        0x1b030
    MX6QDL_PAD_RGMII_RD2__RGMII_RD2        0x1b030
    MX6QDL_PAD_RGMII_RD3__RGMII_RD3        0x1b030
    MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL    0x1b030
    MX6QDL_PAD_GPIO_16__ENET_REF_CLK    0x4001b0a8
>;
};

3.編譯
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make imx_v7_defconfig
make uImage LOADADDR=0x12000000
make imx6q-arm2.dtb
4、在新uboot中啓動內核,掛載網絡文件系統
4.1先設置網卡參數
ifconfig ens38 192.168.1.103 netmask 255.255.255.0
route add default gw 192.168.1.1
setenv ipaddr 192.168.1.106
setenv serverip 192.168.1.101
setenv ethaddr 32:34:46:78:9A:DC
setenv gatewayip 192.168.1.1
4.2讀入內核&&掛載網絡文件系統
setenv bootargs 'noinitrd console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.103:/home/lonnox/work/imx6/nfs_root,v3,tcp ip=192.168.1.6:192.168.1.103:192.168.1.1:255.255.255.0'
//setenv bootargs 'noinitrd console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.104:/home/lonnox/work/imx6/nfs_root,v3,tcp ip=192.168.1.106:192.168.1.104:192.168.1.1:255.255.255.0'
tftp 0x11ffffc0 uImage
tftp 0x18000000 imx6q-arm2.dtb
setenv bootargs ${bootargs}
bootm 0x11ffffc0 - 0x18000000

5、在新uboot中燒錄uImage和imx6q-arm2.dtb
mmc dev 1 0
tftp 0x11ffffc0 uImage
mmc write 0x11ffffc0 0x800 0x4000
tftp 0x18000000 imx6q-arm2.dtb
mmc write 0x18000000 0x5000 0x800

setenv bootargs 'noinitrd console=ttymxc0,115200 loglevel=8 root=/dev/mmcblk3p1 rw init=/linuxrc'
setenv bootcmd 'mmc dev 1; mmc read 0x11ffffc0 0x800 0x4000; mmc read 0x18000000 0x5000 0x800; bootm 0x11ffffc0 - 0x18000000'
saveenv
run bootcmd

十一、製作文件系統
1、測試燒錄老版本文件系統
mksdcard.sh /dev/mmcblk1
//mkfs.ext3 -j /dev/mmcblk1p1    //???一定要使用mkfs.ext3
mke2fs -j /dev/mmcblk1p1  
mkdir -p /mnt/mmcblk1p0
mount -t ext3 /dev/mmcblk1p1 /mnt/mmcblk1p0
tar --numeric-owner -zxvf rootfs.tgz -C /mnt/mmcblk1p0
umount /mnt/mmcblk1p0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章