正点原子alpha开发板—系统移植和文件系统重构

操作系统移植和根文件系统构建

烧写官方系统镜像:

USB OTG 方式固化到 emmc

使用正点原子提供的烧录工具mfgtool。将主机USB与板卡的USB_OTG链接,注意不要接错,将拨码拨到 0100_0000,烧写时需要用电源线供电,使用OTG烧写时,iMX6ULL开发板不能插入SD卡

烧写原理:MfgTool 其实是先通过 USB OTG 先将 uboot、 kernel 和.dtb(设备树)这是三个文件下载到开发板的 DDR 中, 注意不需要下载 rootfs,相当于直接在开发板的 DDR上启动 Linux 系统,等 Linux 系统启动以后再向 EMMC 中烧写完整的系统,包括 uboot、linux kernel、.dtb(设备树)rootfs。

Mfgtool2-eMMC-ddr512-eMMC.vbs

Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC"" -s ""ddr=512"" -s ""board=emmc"" -s ""boot=""  "
Set wshShell = Nothing

在这里插入图片描述

脚本方式固化到 emmc/nand

在虚拟机中先用脚本固化到SD卡,拷贝mfgtool->Profiles->Linux->OS Firmware->files 整个文件夹到 Ubuntu 虚拟机。

sudo ./imx6mksdboot.sh -device /dev/sdb -flash emmc -ddrsize 512

拷贝files 文件夹到制作好的 TF系统启动卡里面的/home/root 目录,板子插入SD卡,然后从SD卡启动,在从SD卡固化到EMMC。固化完成后,即可EMMC启动。

./imx6mkemmcboot.sh -device /dev/mmcblk1 -ddrsize 512

U-Boot

是一个裸机程序。是一个bootloader,用于启动linux或其它系统。主要作用就是初始化DDR,因为linux是运行在DDR里面的。一般linux镜像zImage(uImage)+设备树(.dtb)存放在SD、EMMC、NAND、SPI FLASH等外置区域。需要从外置FLSAH拷贝到DDR中,再去启动。

编译U-Boot

将uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2拷贝到虚拟机

tar -vxjf uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean #会清除工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
编译完成后会生成一个u-boot.bin,必须向u-boot.bin添加头部信息。u-boot编译最后会通过/tools/mkimage软件添加头部信息,生成u-boot.imx。

为方便开发,建议直接在u-boot顶层Makefile里设置好ARCH和CROSS_COMPILE变量。

u-boot命令使用

带有调试性质的开发,uboot都是烧写到SD卡的,因为方便烧写。同样用imxdownload烧写。

./imxdownload u-boot.bin /dev/sdb

help命令
信息查询

bdinfo U-Boot信息查询命令

printenv 查看板子当前的环境变量

环境变量

setenv 设置环境变量,自定义环境变量,也可以删除环境变量。setenv xxx 'xxx'

saveenv 保存环境变量

内存操作命令

md 命令用于显示内存值,md[.b, .w, .l] address [# of objects]命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值。address 就是要查看的内存起始地址,[# of objects]表示要查看的数据长度。

uboot 命令中的数字都是十六进制的。

在这里插入图片描述

nm 命令用于修改指定地址的内存值,nm [.b, .w, .l] address

mm 命令也是修改指定地址内存值的,mm [.b, .w, .l] address使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。

mw命令用于使用一个指定的数据填充一段内存,mw [.b, .w, .l] address value [count]

cp是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中。cp [.b, .w, .l] source target countcp 命令同样可以以.b、.w 和.l 来指定操作格式,source 为源地址,target 为目的地址,count为拷贝的长度。

cmp是比较命令,用于比较两段内存的数据是否相等,cmp [.b, .w, .l] addr1 addr2 count

网络操作命令

网线插到ENET2,确保开发板与电脑在同一网段。环境变量设置如下:

setenv ipaddr 192.168.137.15		IP地址
setenv ethaddr b8:ae:1d:01:00:00	MAC地址
setenv gatewayip 192.168.137.1		网关
setenv netmask 255.255.255.0		子网掩码
setenv serverip 192.168.137.128		服务器IP
saveenv

ping 验证开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信。

dhcp 从路由器获取 IP 地址

开发板uboot无法ping通主机(PC或虚拟机)问题

实验过程:直接用网线将开发板和PC相连,设置以太网卡IP状态。(这里的IP不手动写也是可以ping通虚拟机的,这里是为了ping通PC主机设置的)

虚拟机网卡设置为桥接模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置虚拟机IPV4地址和子网掩码、虚拟机网卡状态。

此时运行板卡,进入系统,设置开发板ip ifconfig eth0 192.168.137.15ping 192.168.137.128

在这里插入图片描述

此时在linux系统下与虚拟机成功ping通。
在这里插入图片描述
在这里插入图片描述

复位板卡,进入u-boot界面,设置ip信息。ping 192.168.137.128 失败

在这里插入图片描述

再次复位/烧录开发板,进入系统,重复上述步骤又出现下面的错误。

在这里插入图片描述

逐步排除问题,重新调试

192.168.137.128是设置的ubuntu虚拟机IP、192.168.137.10是设置的PC端的以太网2接口IP,出现下述虚拟机能ping通而以太网2不能ping通的情况,原因暂时不清楚。(防火墙问题)

在这里插入图片描述

  • 修改防火墙入站规则,启用文件和打印机共享(回显请求 - ICMPv4-In)的公用配置,ping主机就能通了。

  • 在这里插入图片描述

  • 在这里插入图片描述

进入u-boot,依然失败。

在这里插入图片描述

wifi断开校园网链接,ok!

在这里插入图片描述

总结:首先网线连接PC和板卡,设置虚拟机为桥接模式,设置虚拟机IP。设置板卡IP为虚拟机IP同一网段,wifi不能链接校园网(!就不能连接wifi,第一次ping不行,ping通了就可以了)可能是因为这时的虚拟机"自动"桥接到wifi网卡上了(具体没有深究),这时板卡就能够与虚拟机ping通了。

  • 交换机能直接ping通,设置同一网段IP就可以。

  • 注意:uboot只能ping其他机器,其他机器ping不了uboot,uboot里面并没有对ping命令进行处理!

nfs nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。

开启nfs服务:

sudo apt-get install nfs-kernel-server rpcbind
sudo vi /etc/exports

添加/home/animzls/linux/nfs *(rw,sync,no_root_squash)/etc/exports

重启服务sudo /etc/init.d/nfs-kernel-server restart

nfs 命令nfs [loadAddress] [[hostIPaddr:]bootfilename]

示例:nfs 80800000 192.168.137.128:/home/animzls/linux/nfs/zImage

ubuntu中环境配置正确,也能够ping通。但是使用uboot得nfs下载命令会报错,入图所示错误(Loading: *** ERROR: File lookup fail):
在这里插入图片描述

导致此错误得原因是:uboot中使用得NFS版本为V2版本,而ubuntu中的NFS版本为V3,V4及以上版本,从而导致uboot不能再NFS服务器中找到文件。

解决办法为:让ubuntu中得NFS兼容V2。修改/etc/default/nfs-kernel-server 文件。

  1 # Number of servers to start up
  2 #RPCNFSDCOUNT=8
  3 RPCNFSDCOUNT="-V 2 8"
  4 
  5 # Runtime priority of server (see nice(1))
  6 RPCNFSDPRIORITY=0
  7 
  8 # Options for rpc.mountd.
  9 # If you have a port-based firewall, you might want to set up
 10 # a fixed port here using the --port option. For more information, 
 11 # see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
 12 # To disable NFSv4 on the server, specify '--no-nfs-version 4' here
 13 #RPCMOUNTDOPTS="--manage-gids"
 14 RPCMOUNTDOPTS="-V 2 --manage-gids"
 15 
 16 # Do you want to start the svcgssd daemon? It is only required for Kerberos
 17 # exports. Valid alternatives are "yes" and "no"; the default is "no".
 18 NEED_SVCGSSD=""
 19 
 20 # Options for rpc.svcgssd.
 21 #RPCSVCGSSDOPTS=""
 22 RPCSVCGSSDOPTS="--nfs-version 2,3,4 --debug --syslog"

重启NFS服务sudo service nfs-kernel-server restart,再次在u-boot下运行nfs命令。

在这里插入图片描述

下载完成以后查看 0x80800000 地址处的数据。
在这里插入图片描述

tftp tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议,Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器,需要安装 tftp-hpa 和 tftpd-hpa

sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd

mkdir /home/animzls/linux/tftpboot
chmod 777 /home/animzls/linux/tftpboot

配置 tftp,新建文件/etc/xinetd.d/tftp

	server tftp
	{
		socket_type = dgram
		protocol = udp
		wait = yes
		user = root
		server = /usr/sbin/in.tftpd
		server_args = -s /home/zuozhongkai/linux/tftpboot/
		disable = no
		per_source = 11
		cps = 100 2
		flags = IPv4
	}

sudo service tftpd-hpa start启动 tftp 服务

打开/etc/default/tftpd-hpa 文件

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/zuozhongkai/linux/tftpboot"
TFTP_ADDRESS=":69" 
TFTP_OPTIONS="-l -c -s"

sudo service tftpd-hpa restart重启 tftp 服务器

chmod 777 /home/animzls/linux/tftpboot/zImage不给权限会报错

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]和 nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。示例:tftp 80800000 zImage

MMC命令

mmc info 于输出当前选中的 mmc info 设备的信息

mmc rescan 扫描当前开发板上所有的 MMC 设备

mmc list 查看当前开发板一共有几个 MMC 设备

mmc dev 用于切换当前 MMC 设备 示例:mmc dev 1 0切换到mmc分区0

mmc part 查看MMC 设备分区

mmc read 读取 mmc 设备的数据 mmc read addr blk# cnt addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,cnt 是要读取的块数量(十六进制)。

mmc write 写数据到 MMC 设备 mmc write addr blk# cnt 可以利用这个指令烧写系统,千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!

mmc dev 1 0 //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 32E //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0 //分区配置,EMMC 需要这一步!SD卡不需要。

mmc erase 擦除 MMC 设备的指定块

FAT格式文件系统操作命令

fatinfo 命令 fatinfo <interface> [<dev[:part]>] interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区。

fatls 命令 fatls <interface> [<dev[:part]>] [directory] interface 是要查询的接口,比如 mmc,dev 是要查询的设备号,part 是要查询的分区,directory是要查询的目录。

fstype 命令 查看 MMC 设备某个分区的文件系统格式

fatload 命令 用于将指定的文件读取到 DRAM 中,u-boot启动就用到了这个命令,fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]] 示例·:fatload mmc 1:1 80800000 zImage

fatwrite 命令 用于将 DRAM 中的数据写入到 MMC 设备中。fatwrite <interface> <dev[:part]> <addr> <filename> <bytes> interface 为接口,比如 mmc,dev 是设备号,part 是分区,addr 是要写入的数据在 DRAM中的起始地址,filename 是写入的数据文件名字,bytes 表示要写入多少字节的数据。**同样可以用于更新镜像。**uboot 默认没有使能 fatwrite 命令,需要修改板子配置头文件。

#define CONFIG_FAT_WRITE 	/* 使能 fatwrite 命令 */
EXT格式文件系统操作命令

ext2load、ext2ls、ext4load、ext4lsext4write等同于fatload、fatls fatwrite,但针对 ext 文件系统。示例:ext4ls mmc 1:2

BOOT操作命令

bootz 命令 要启动 Linux,需要先将 zImage,dtb拷贝到 DRAM 中。bootz 命令用于启动 zImage 镜像文件 bootz [addr [initrd[:size]] [fdt]]bootz 有三个参数,addr 是 Linux 镜像文件在 DRAM 中的位置,initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用-代替即可,fdt 就是设备树文件在 DRAM 中的地址。

通过 tftp 和 bootz 命令从网络启动Linux 系统

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

在这里插入图片描述

从emmc启动

fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

在这里插入图片描述

boot命令 boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统,bootcmd 是一个很重要的环境变量。

setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
savenev
boot

reset 命令 复位

go 命令 跳到指定的地址处执行应用,go addr [arg ...] addr 是应用在 DRAM 中的首地址。我们可以编译一下裸机例程的实验 13_printf,然后将编译出来的 printf.bin 拷贝到 Ubuntu 中的 tftpboot 文件夹里面,注意,这里要拷贝 printf.bin 文件,不需要在前面添加 IVT 信息,因为 uboot 已经初始化好了 DDR 了。使用 tftp 命令将 printf.bin下载到开发板 DRAM 的 0X87800000 地址处,因为裸机例程的链接首地址就是 0X87800000,最后使用 go 命令启动 printf.bin 这个应用,命令如下:

tftp 87800000 printf.bin
go 87800000

run 命令 用于运行环境变量中定义的命令。可以通过“run bootcmd”来运行 bootcmd 中的启动命令,但是 run 命令最大的作用在于运行我们自定义的环境变量。定义环境变量 mybootemmc、mybootnet、mybootnand 等表示从哪里启动。如果要切换启动方式的话只需要运行“run mybootxxx(xxx 为 emmc、net 或 nand)”即可。

mtest 命令 mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR。mtest [start [end [pattern [iterations]]]] start 是要测试的 DRAM 开始地址,end 是结束地址。示例:mtest 80000000 80001000

U-Boot 顶层 Makefile

源码结构

为方便学习uboot 启动源码,编译u-boot源码并打包到windows

cd alientek_uboot 										//进入正点原子 uboot 源码目录
make -j12 												//编译 uboot
cd ../ 													//返回上一级目录
tar -vcjf alientek_uboot.tar.bz2 alientek_uboot 		//压缩

arch 文件夹 存放着和架构有关的文件,比如arm架构

alientek_uboot\arch\arm\cpu\u-boot.lds是 ARM 芯片所使用的 u-boot 链接脚本文件。

board 文件夹 存放板级文件夹,文件夹下每一个文件都代表一个开发板,用来描述这开发板的信息。对于alpha这个板子来说就是alientek_uboot\board\freescale\mx6ullevk

configs 文件夹 uboot 的默认配置文件目录,这些配置文件对应不同的板子。

.u-boot.xxx_cmd 文件 这一系列的文件,都是编译生成的,都是一些命令文件。

Makefile 文件 顶层 Makefile 文件,Makefile 是支持嵌套的,顶层 Makefile 可以调用子目录中的 Makefile 文件。

u-boot.xxx 文件 包括 u-boot、u-boot.bin、u-boot.cfg、u-boot.imx、u-boot.lds、u-boot.map、u-boot.srec、u-boot.sym 和 u-boot-nodtb.bin,这些文件的含义如下:

  • u-boot:编译出来的 ELF 格式的 uboot 镜像文件。
  • u-boot.bin:编译出来的二进制格式的 uboot 可执行镜像文件。
  • u-boot.cfg:uboot 的另外一种配置文件。
  • u-boot.imx:u-boot.bin 添加头部信息以后的文件,NXP 的 CPU 专用文件。
  • u-boot.lds:链接脚本。
  • u-boot.map:uboot 映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
  • u-boot.srec:S-Record 格式的镜像文件。
  • u-boot.sym:uboot 符号文件。
  • u-boot-nodtb.bin:和 u-boot.bin 一样,u-boot.bin 就是 u-boot-nodtb.bin 的复制文件。

.config 文件 保存了详细的uboot 配置信息,使用命令“make xxx_defconfig”配置 uboot 以后就会自动生成。

README 描述 uboot 的详细信息。

顶层Makefile分析:略。。。

U-Boot 移植

编译 NXP 官方开发板对应的uboot 烧写到正点原子开发板中发现:

  • uboot 启动正常, DRAM 识别正确, SD 卡和 EMMC 驱动正常。
  • uboot 里面的 LCD 驱动默认是给 4.3 寸 480x272 分辨率的,如果使用的其他分辨率的屏幕需要修改驱动。
  • 网络不能工作,识别不出来网络信息,需要修改驱动。
U-Boot 中添加自己的开发板
  • 添加开发板默认配置文件

先在 configs 目录下创建默认配置文件,复制 mx6ull_14x14_evk_emmc_defconfig,然后重命名为 mx6ull_alientek_emmc_defconfig.

cd configs
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig

mx6ull_alientek_emmc_defconfig 文件

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_alientek_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y
CONFIG_CMD_GPIO=y
  • 添加开发板对应的头文件

在目录 include/configs下添加 I.MX6ULL-ALPHA开发板对应的头文件,复制 include/configs/mx6ullevk.h,并重命名为 mx6ull_alientek_emmc.h ,然后修改头文件内容,头文件中的宏定义用于配置uboot和配置项目。

cp include/configs/mx6ullevk.h include/configs/mx6ull_alientek_emmc.h

alientek_mx6ull_emmc.h 里面有很多宏定义,这些宏定义基本用于配置 uboot,也有一些I.MX6ULL 的配置项目。如果我们自己要想使能或者禁止 uboot 的某些功能,那就在alientek_mx6ull_emmc.h 里面做修改即可。 alientek_mx6ull_emmc.h 里面的内容比较多,去掉一些用不到的配置,精简后的内容如下:

/*
 * Copyright (C) 2016 Freescale Semiconductor, Inc.
 *
 * Configuration settings for the Freescale i.MX6UL 14x14 EVK board.
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */
#ifndef __MX6ULL_ALEITENK_EMMC_CONFIG_H
#define __MX6ULL_ALEITENK_EMMC_CONFIG_H


#include <asm/arch/imx-regs.h>
#include <linux/sizes.h>
#include "mx6_common.h"
#include <asm/imx-common/gpio.h>

/* uncomment for PLUGIN mode support */
/* #define CONFIG_USE_PLUGIN */

/* uncomment for SECURE mode support */
/* #define CONFIG_SECURE_BOOT */

#ifdef CONFIG_SECURE_BOOT
#ifndef CONFIG_CSF_SIZE
#define CONFIG_CSF_SIZE 0x4000
#endif
#endif

#define is_mx6ull_9x9_evk()	CONFIG_IS_ENABLED(TARGET_MX6ULL_9X9_EVK)

#ifdef CONFIG_TARGET_MX6ULL_9X9_EVK
#define PHYS_SDRAM_SIZE		SZ_256M
#define CONFIG_BOOTARGS_CMA_SIZE   "cma=96M "
#else
#define PHYS_SDRAM_SIZE		SZ_512M
#define CONFIG_BOOTARGS_CMA_SIZE   ""
/* DCDC used on 14x14 EVK, no PMIC */
#undef CONFIG_LDO_BYPASS_CHECK
#endif

/* SPL options */
/* We default not support SPL
 * #define CONFIG_SPL_LIBCOMMON_SUPPORT
 * #define CONFIG_SPL_MMC_SUPPORT
 * #include "imx6_spl.h"
*/

#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG

#define CONFIG_DISPLAY_CPUINFO
#define CONFIG_DISPLAY_BOARDINFO

/* Size of malloc() pool */
#define CONFIG_SYS_MALLOC_LEN		(16 * SZ_1M)

#define CONFIG_BOARD_EARLY_INIT_F
#define CONFIG_BOARD_LATE_INIT

#define CONFIG_MXC_UART
#define CONFIG_MXC_UART_BASE		UART1_BASE

/* MMC Configs */
#ifdef CONFIG_FSL_USDHC
#define CONFIG_SYS_FSL_ESDHC_ADDR	USDHC2_BASE_ADDR

/* NAND pin conflicts with usdhc2 */
#ifdef CONFIG_SYS_USE_NAND
#define CONFIG_SYS_FSL_USDHC_NUM	1
#else
#define CONFIG_SYS_FSL_USDHC_NUM	2
#endif
#endif

/* I2C configs */
#define CONFIG_CMD_I2C
#ifdef CONFIG_CMD_I2C
#define CONFIG_SYS_I2C
#define CONFIG_SYS_I2C_MXC
#define CONFIG_SYS_I2C_MXC_I2C1		/* enable I2C bus 1 */
#define CONFIG_SYS_I2C_MXC_I2C2		/* enable I2C bus 2 */
#define CONFIG_SYS_I2C_SPEED		100000

/* PMIC only for 9X9 EVK */
#define CONFIG_POWER
#define CONFIG_POWER_I2C
#define CONFIG_POWER_PFUZE3000
#define CONFIG_POWER_PFUZE3000_I2C_ADDR  0x08
#endif

#define CONFIG_SYS_MMC_IMG_LOAD_PART	1

#ifdef CONFIG_SYS_BOOT_NAND
#define CONFIG_MFG_NAND_PARTITION "mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs) "
#else
#define CONFIG_MFG_NAND_PARTITION ""
#endif

#define CONFIG_MFG_ENV_SETTINGS \
	"mfgtool_args=setenv bootargs console=${console},${baudrate} " \
	    CONFIG_BOOTARGS_CMA_SIZE \
		"rdinit=/linuxrc " \
		"g_mass_storage.stall=0 g_mass_storage.removable=1 " \
		"g_mass_storage.file=/fat g_mass_storage.ro=1 " \
		"g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF "\
		"g_mass_storage.iSerialNumber=\"\" "\
		CONFIG_MFG_NAND_PARTITION \
		"clk_ignore_unused "\
		"\0" \
	"initrd_addr=0x83800000\0" \
	"initrd_high=0xffffffff\0" \
	"bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};\0" \

#if defined(CONFIG_SYS_BOOT_NAND)
#define CONFIG_EXTRA_ENV_SETTINGS \
	CONFIG_MFG_ENV_SETTINGS \
	"panel=TFT43AB\0" \
	"fdt_addr=0x83000000\0" \
	"fdt_high=0xffffffff\0"	  \
	"console=ttymxc0\0" \
	"bootargs=console=ttymxc0,115200 ubi.mtd=4 "  \
		"root=ubi0:rootfs rootfstype=ubifs "		     \
		CONFIG_BOOTARGS_CMA_SIZE \
		"mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs)\0"\
	"bootcmd=nand read ${loadaddr} 0x4000000 0x800000;"\
		"nand read ${fdt_addr} 0x5000000 0x100000;"\
		"bootz ${loadaddr} - ${fdt_addr}\0"

#else
#define CONFIG_EXTRA_ENV_SETTINGS \
	CONFIG_MFG_ENV_SETTINGS \
	"script=boot.scr\0" \
	"image=zImage\0" \
	"console=ttymxc0\0" \
	"fdt_high=0xffffffff\0" \
	"initrd_high=0xffffffff\0" \
	"fdt_file=undefined\0" \
	"fdt_addr=0x83000000\0" \
	"boot_fdt=try\0" \
	"ip_dyn=yes\0" \
	"panel=TFT43AB\0" \
	"mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \
	"mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \
	"mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
	"mmcautodetect=yes\0" \
	"mmcargs=setenv bootargs console=${console},${baudrate} " \
		CONFIG_BOOTARGS_CMA_SIZE \
		"root=${mmcroot}\0" \
	"loadbootscript=" \
		"fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
	"bootscript=echo Running bootscript from mmc ...; " \
		"source\0" \
	"loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
	"loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
	"mmcboot=echo Booting from mmc ...; " \
		"run mmcargs; " \
		"if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
			"if run loadfdt; then " \
				"bootz ${loadaddr} - ${fdt_addr}; " \
			"else " \
				"if test ${boot_fdt} = try; then " \
					"bootz; " \
				"else " \
					"echo WARN: Cannot load the DT; " \
				"fi; " \
			"fi; " \
		"else " \
			"bootz; " \
		"fi;\0" \
	"netargs=setenv bootargs console=${console},${baudrate} " \
		CONFIG_BOOTARGS_CMA_SIZE \
		"root=/dev/nfs " \
	"ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
		"netboot=echo Booting from net ...; " \
		"run netargs; " \
		"if test ${ip_dyn} = yes; then " \
			"setenv get_cmd dhcp; " \
		"else " \
			"setenv get_cmd tftp; " \
		"fi; " \
		"${get_cmd} ${image}; " \
		"if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
			"if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
				"bootz ${loadaddr} - ${fdt_addr}; " \
			"else " \
				"if test ${boot_fdt} = try; then " \
					"bootz; " \
				"else " \
					"echo WARN: Cannot load the DT; " \
				"fi; " \
			"fi; " \
		"else " \
			"bootz; " \
		"fi;\0" \
		"findfdt="\
			"if test $fdt_file = undefined; then " \
				"if test $board_name = EVK && test $board_rev = 9X9; then " \
					"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
				"if test $board_name = EVK && test $board_rev = 14X14; then " \
					"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
				"if test $fdt_file = undefined; then " \
					"echo WARNING: Could not determine dtb to use; fi; " \
			"fi;\0" \

#define CONFIG_BOOTCOMMAND \
	   "run findfdt;" \
	   "mmc dev ${mmcdev};" \
	   "mmc dev ${mmcdev}; if mmc rescan; then " \
		   "if run loadbootscript; then " \
			   "run bootscript; " \
		   "else " \
			   "if run loadimage; then " \
				   "run mmcboot; " \
			   "else run netboot; " \
			   "fi; " \
		   "fi; " \
	   "else run netboot; fi"
#endif

/* Miscellaneous configurable options */
#define CONFIG_CMD_MEMTEST
#define CONFIG_SYS_MEMTEST_START	0x80000000
#define CONFIG_SYS_MEMTEST_END		(CONFIG_SYS_MEMTEST_START + 0x8000000)

#define CONFIG_SYS_LOAD_ADDR		CONFIG_LOADADDR
#define CONFIG_SYS_HZ			1000

#define CONFIG_STACKSIZE		SZ_128K

/* Physical Memory Map */
#define CONFIG_NR_DRAM_BANKS		1
#define PHYS_SDRAM			MMDC0_ARB_BASE_ADDR

#define CONFIG_SYS_SDRAM_BASE		PHYS_SDRAM
#define CONFIG_SYS_INIT_RAM_ADDR	IRAM_BASE_ADDR
#define CONFIG_SYS_INIT_RAM_SIZE	IRAM_SIZE

#define CONFIG_SYS_INIT_SP_OFFSET \
	(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
#define CONFIG_SYS_INIT_SP_ADDR \
	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)

/* FLASH and environment organization */
#define CONFIG_SYS_NO_FLASH

#ifdef CONFIG_SYS_BOOT_QSPI
#define CONFIG_FSL_QSPI
#define CONFIG_ENV_IS_IN_SPI_FLASH
#elif defined CONFIG_SYS_BOOT_NAND
#define CONFIG_SYS_USE_NAND
#define CONFIG_ENV_IS_IN_NAND
#else
#define CONFIG_FSL_QSPI
#define CONFIG_ENV_IS_IN_MMC
#endif

#define CONFIG_SYS_MMC_ENV_DEV		1   /* USDHC2 */
#define CONFIG_SYS_MMC_ENV_PART		0	/* user area */
#define CONFIG_MMCROOT			"/dev/mmcblk1p2"  /* USDHC2 */

#define CONFIG_CMD_BMODE

#ifdef CONFIG_FSL_QSPI
#define CONFIG_QSPI_BASE		QSPI0_BASE_ADDR
#define CONFIG_QSPI_MEMMAP_BASE		QSPI0_AMBA_BASE

#define CONFIG_CMD_SF
#define CONFIG_SPI_FLASH
#define CONFIG_SPI_FLASH_BAR
#define CONFIG_SF_DEFAULT_BUS		0
#define CONFIG_SF_DEFAULT_CS		0
#define CONFIG_SF_DEFAULT_SPEED	40000000
#define CONFIG_SF_DEFAULT_MODE		SPI_MODE_0
#define CONFIG_SPI_FLASH_STMICRO
#endif

/* NAND stuff */
#ifdef CONFIG_SYS_USE_NAND
#define CONFIG_CMD_NAND
#define CONFIG_CMD_NAND_TRIMFFS

#define CONFIG_NAND_MXS
#define CONFIG_SYS_MAX_NAND_DEVICE	1
#define CONFIG_SYS_NAND_BASE		0x40000000
#define CONFIG_SYS_NAND_5_ADDR_CYCLE
#define CONFIG_SYS_NAND_ONFI_DETECTION

/* DMA stuff, needed for GPMI/MXS NAND support */
#define CONFIG_APBH_DMA
#define CONFIG_APBH_DMA_BURST
#define CONFIG_APBH_DMA_BURST8
#endif

#define CONFIG_ENV_SIZE			SZ_8K
#if defined(CONFIG_ENV_IS_IN_MMC)
#define CONFIG_ENV_OFFSET		(12 * SZ_64K)
#elif defined(CONFIG_ENV_IS_IN_SPI_FLASH)
#define CONFIG_ENV_OFFSET		(768 * 1024)
#define CONFIG_ENV_SECT_SIZE		(64 * 1024)
#define CONFIG_ENV_SPI_BUS		CONFIG_SF_DEFAULT_BUS
#define CONFIG_ENV_SPI_CS		CONFIG_SF_DEFAULT_CS
#define CONFIG_ENV_SPI_MODE		CONFIG_SF_DEFAULT_MODE
#define CONFIG_ENV_SPI_MAX_HZ		CONFIG_SF_DEFAULT_SPEED
#elif defined(CONFIG_ENV_IS_IN_NAND)
#undef CONFIG_ENV_SIZE
#define CONFIG_ENV_OFFSET		(60 << 20)
#define CONFIG_ENV_SECT_SIZE		(128 << 10)
#define CONFIG_ENV_SIZE			CONFIG_ENV_SECT_SIZE
#endif


/* USB Configs */
#define CONFIG_CMD_USB
#ifdef CONFIG_CMD_USB
#define CONFIG_USB_EHCI
#define CONFIG_USB_EHCI_MX6
#define CONFIG_USB_STORAGE
#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
#define CONFIG_USB_HOST_ETHER
#define CONFIG_USB_ETHER_ASIX
#define CONFIG_MXC_USB_PORTSC  (PORT_PTS_UTMI | PORT_PTS_PTW)
#define CONFIG_MXC_USB_FLAGS   0
#define CONFIG_USB_MAX_CONTROLLER_COUNT 2
#endif

#ifdef CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MII
#define CONFIG_FEC_MXC
#define CONFIG_MII
#define CONFIG_FEC_ENET_DEV		1

#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE			ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR          0x2
#define CONFIG_FEC_XCV_TYPE             RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE			ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR		0x1
#define CONFIG_FEC_XCV_TYPE		RMII
#endif
#define CONFIG_ETHPRIME			"FEC"

#define CONFIG_PHYLIB
#define CONFIG_PHY_MICREL
#endif

#define CONFIG_IMX_THERMAL

#ifndef CONFIG_SPL_BUILD
#define CONFIG_VIDEO
#ifdef CONFIG_VIDEO
#define CONFIG_CFB_CONSOLE
#define CONFIG_VIDEO_MXS
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_SW_CURSOR
#define CONFIG_VGA_AS_SINGLE_DEVICE
#define CONFIG_SYS_CONSOLE_IS_IN_ENV
#define CONFIG_SPLASH_SCREEN
#define CONFIG_SPLASH_SCREEN_ALIGN
#define CONFIG_CMD_BMP
#define CONFIG_BMP_16BPP
#define CONFIG_VIDEO_BMP_RLE8
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX_VIDEO_SKIP
#endif
#endif

#define CONFIG_IOMUX_LPSR

#if defined(CONFIG_ANDROID_SUPPORT)
#include "mx6ullevk_android.h"
#endif

#endif

  • 添加开发板对应的板级文件夹

uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。在 board/freescale 目录下有个名为 mx6ullevk 的文件夹,这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件夹。复制 mx6ullevk,将其重命名为 mx6ull_alientek_emmc。

cd board/freescale/
cp mx6ullevk/ -r mx6ull_alientek_emmc

进 入 mx6ull_alientek_emmc 目 录 中 , 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c。

cd mx6ull_alientek_emmc
mv mx6ullevk.c mx6ull_alientek_emmc.c
  1. 修改mx6ull_alientek_emmc目录下的Makefile文件
  2. 修改mx6ull_alientek_emmc目录下的imximage.cfg文件
  3. 修改 mx6ull_alientek_emmc 目录下的 Kconfig 文件
  4. 修改 mx6ull_alientek_emmc 目录下的 MAINTAINERS 文件
  5. 修改 U-Boot 图形界面配置文件,修改文件arch/arm/cpu/armv7/mx6/Kconfig

LCD 驱动修改

V2.4底板网络驱动修改

6ULL网络方案采用内部MAC+外部PHY,6ULL官方开发板使用的PHY芯片是KSZ8081,正点原子用的是LAN8720A。

  • 网络 PHY 地址修改
#define CONFIG_FEC_ENET_DEV	1	//CONFIG_FEC_ENET_DEV 用于选择使用哪个网口
  • 删除 uboot 74LV595 的驱动代码
  • 添加 I.MX6U-ALPHA 开发板网络复位引脚驱动

在这里插入图片描述

bootcmd bootargs 环境变量

移植u-boot从emmc启动linux

ls mmc 1:1
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000;'

在这里插入图片描述
在这里插入图片描述

移植u-boot从网络启动linux

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

root=/dev/mmcblk1p2:指定根文件系统所在,如果网络挂载则

setenv bootargs ‘console=开发板串口,波特率 root=挂载方式 nfsroot=虚拟机IP地址:文件系统路径,proto=传输协议 读写权限 ip=开发板IP地址:虚拟机IP地址:网关地址:子网掩码::开发板网口:off’
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.137.128:/home/animzls/linux/nfs/rootfs,proto=tcp rw ip=192.168.137.10:192.168.137.128:192.168.137.1:255.255.255.0::eth0:off'

linux内核启动流程

  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ANIMZLS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值