启动流程
emmc启动:从 EMMC 启动也就是将编译出来的 Linux 镜像文件 zImage 和设备树文件保存在 EMMC,然后uboot读取到这些到DDR内存中去运行,启动内核
1、先移植一个bootloader启动linux内核常用的是U-Boot
uboot在启动内核之前,我们还可以对uboot进行操作,要是3秒内没操作默认挂掉进入内核
2、移植内核
3、根文件系统(rootfs),根文件系统中包含了一些最常用的命令和文件
uboot
正点原子官方的uboot编译
编译生成bin文件后
注意要是通过图形优化界面配置了uboot,执行脚本的第一步就会清除配置,要说码源配置就没啥关系
在我们后面的uboot调试时候,一般都是将系统烧写到sd卡中,这样一般是和裸机程序烧写步骤一样
uboot命令的使用
在uboot开始启动的时候,有三秒倒计时,在那个时候按下enter就可以进去uboot设置
1、基础命令2、
2、内存与网络,命令
nfs可以把开发板与电脑空间共享
3、mmc和文件操作命令
4、NAND和BOO命令
5、boot操作命令
启动linux需要将linux镜像和设备树文件拷贝到DRAM中,可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文 件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。 不管用那种方法,只要能将 Linux 镜像和设备树文件存到 DRAM 中就行ootz 命令用于启动 zImage 镜像文件
uboot源码分析
目录分析
注意:比如board文件里面有很多板子的文件,我们要选择我们需要的模板然后做或者不做适当的修改,不是单单只有一个。
u-boot.bin 编译出来的可执行uboot镜像文件
二、uboot启动流程分析
1、设置cpu为管理模式
2、关看门狗
3、关中断
4、设置时钟频率
5、关mmu,初始化各个bank
6、进入board_init_f()函数(初始化定时器,GPIO,串口,划分内存区域)
7、重定位 复制uboot,然后修改SDRAM上的uboot链接地址
8、清bss
9、跳转到board_init_r函数,启动流程结束
启动内核
bootm加命令行参数
uboot移植实验
重要概念
环境变量 bootcmd
bootcmd 保存着 uboot 默认命令,uboot 倒计时结束以
后就会执行 bootcmd 中的命令。这些命令一般都是用来启动 Linux 内核的,比如读取 EMMC 或
者 NAND Flash 中的 Linux 内核镜像文件和设备树文件到 DRAM 中,然后启动 Linux 内核。可
以在 uboot 启动以后进入命令行设置 bootcmd 环境变量的值。如果 EMMC 或者 NAND 中没有
保存 bootcmd 的值,那么 uboot 就会使用默认的值,板子第一次运行 uboot 的时候都会使用默
认值来设置 bootcmd 环境变量。打开文件 include/env_default.h
bootcmd来判断在emmc还是sd卡或在网络中读取内核镜像和设备树,一个个空间去查找
环境变量 bootargs
bootargs 保存着 uboot 传递给 Linux 内核的参
将 NXP 官方的 uboot 移植到正点 原子的 I.MX6ULL 开发板上,学习如何在 uboot 中添加我们自己的板子
ddr就是开发板的内存,SD卡,mmc就是硬盘
1、添加板子默认配置文件
这个一般在原来的模板上修改
2、添加板子默认头文件
3、添加板子对应板级文件夹
4、修改uboot配置界面
内核移植
一、创建VSCode工程
1、将NXP官方的linux内核拷贝到Ubuntu。
2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
二、NXP官方开发板Linux内核编译
编译NXP官方EVK开发板对应的Linux系统,默认配置文件存放路径arch/arm/configs。最终编译出:zImage,和 imx6ull-14x14-evk-emmc.dtb,imx6ull-14x14-evk.dtb。
将zImage,和 imx6ull-14x14-evk-emmc.dtb拷贝到tftpboot目录下,然后在uboot中通过tftp服务启动。
经过测试,发现NXP官方开发板对应的zImage和.dtb可以在正点原子开发板上启动。
三、使能8线EMMC
修改设备树,imx6ull-alientek-emmc.dts。节点usdhc2。
四、网络驱动修改
为何要一开始就修改网络驱动??在做Linux驱动开发的时候一般都是通过网络调试的。
修改网络复位IO和PHY ID以后,Linux内核内部通用PHY驱动已经正常工作。
LAN8720的生产厂家是SMSC。使能SMSC驱动,然后重新编译Linux内核,并启动,tftp启动。
三、在Linux中添加自己的开发板
2、一个就是imx6_alientek_emmc_defconfig默认配置文件。
3、imx6ull-alientek-emmc.dts编译出来就是.dtb文件。
复制arch/arm/configs/imx_v7_mfg_defconfig文件为imx_alientek_emmc_defconfig。
复制arch/arm/boot/dts/imx6ull-14x14-evk.dts文件为imx6ull-alientek-emmc.dts
修改arch/arm/boot/dts/Makefile,
四、CPU主频和网络驱动修改
1、修改驱动之前,要先保证板子能够正常启动。
2、根文件系统处理好,使用现成根文件系统。保证EMMC烧写了系统,设置bootcmd和bootargs。
Bootcmd设置默认从网络启动,通过TFTP。
Setenv bootcmd ‘tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000;’
Bootargs设置,根文件系统存放在EMMC的分区2里面,命令如下:
Setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
现在的问题就是EMMC驱动有问题,在imx6ull-alientek-emmc.dts中找到usdhc2节点。将usdhc2改为:
&usdhc2 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc2_8bit>;
pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
bus-width = <8>;
non-removable;
status = "okay";
};
完了以后编译设备树。使用如下命令:
Make dtbs。
1、配置主频
超频到696MHz,NXP官方宣传为700MHz。打开imx6ull.dtsi文件,
根文件系统移植
roofs是实际的目录,下面是ubuntu的roofs
一、根文件系统简介
根文件系统也叫做rootfs。大家学习STM32的W25Q256、SD卡的时候接触过FATFS文件系统。Rootfs?=FATFS。不等于!
FATFS这类的文件系统属于Linux内核的一部分,属于软件代码。
那么ROOTFS是什么,根文件系统=“根”、“文件”、“系统”。根文件系统就是一堆的文件、比如软件、配置文件等,这些文件是Linux运行所必须的,将他们组合在一起就构成了跟文件系统。
根文件系统就是一个“文件夹”,此“文件夹”有很多个文件,这些文件是linux运行所必须的,但是无法放到内核里面去的。比如命令、库、配置文件等等。所有这些软件需要我们自己构建。
/就是Linux根文件系统。
二、BusyBox构建根文件系统
构建根文件系统,busybox。还有很多成熟化的根文件系统构建方式,buildroot,yocto。构建的根文件系统调试我们通过nfs网络挂载,也就是跟文件系统存放到ubuntu下,开发板启动以后通过nfs服务使用ubuntu下的跟文件系统。
三、根文件系统初步测试
四、完善根文件系统
五、根文件系统其他功能测试