Linux系统移植之对NXP的Uboot修改后移植
Linux系统移植之对NXP的Uboot修改后移植
- 一,总体修改的几个方向
- 1.板级配置文件
- 2.板子的头文件(板级头文件)
- 3.开发板对应的板级文件夹
- 二.LCD驱动的修改
- 三.网络驱动修改
- 1.PHY芯片
- 2.网络驱动具体修改
- 四.bootcmd和bootargs分析
- 1.bootcmd
- 2.bootargs
- 五.相关小之知识
- 1.Uboot启动,DDR中会怎么样
- 2.启动时怎么样找到配置文件的
- 3.Emmc和Nand flash区别
- 4.DDR和DRAM
一,总体修改的几个方向
1.板级配置文件
这里是两个空格开头要在uboot中添加自己的开发板,首先在configs目录下复制mx6ull_14x14_evk_emmc_defconfig( 板级配置文件),重新命名为mx6ull_alientek_emmc_defconfig。这个板级配置文件作用就是,告诉uboot该做什么,怎么做,告诉uboot板子的硬件信息,支持那些功能,定义启动流程,从而让uboot适应不同的硬件平台。对于该板子具体就是:①告诉uboot这个板子的信息是:IMX6ULL芯片,用emmc存储,有俩网卡,,②告诉uboot启动的时候从emmc加载内核,网卡初始化好,③启动时候将这些参数传递到内核中。
2.板子的头文件(板级头文件)
选取include/configs/mx6ullevk.h拷贝为mx6ull_alientek_emmc.h,其主要作用是为硬件平台提供必要的宏定义,配置参数和硬件初始化代码,如果我们自己要想使能或者禁止 uboot 的某些功能,那就在mx6ull_alientek_emmc.h 里面做修改即可。
具体功能:
①定义硬件平台的基本信息,如芯片型号(IMX6ULL),开发板名称(Alientek)和存储介质(emmc)。
②对存储设备进行配置,比如设置emmc的设备号和分区布局。
③配置外设,网口,串口和调试口等。
④定义内存布局,比如DDR即DRAM的起始地址0x80000000和大小512MB,Uboot的加载地址,内核镜像和设备树文件加载地址。
⑤配置启动参数,bootcmd和bootrags。
⑥启用或者禁止某些功能。
⑦硬件初始化,如DDR内存,配置时钟,电源管理,初始化DDR设备。
3.开发板对应的板级文件夹
拷贝mx6ullevk,重命名为mx6ull_alientek_emmcm,对其中的内容进行修改。其中的mx6ull_alientek_emmc.c函数,针对板子提供初始化代码和硬件配置,初始化硬件(如 DDR、eMMC、网络等)。提供板级函数,供 U-Boot 或 Linux 内核调用,适配特定的硬件设计,与设备树配合,读取硬件配置信息。后面对LCD驱动的修改和网卡驱动的修改,就是改这个.h和.c文件。
二.LCD驱动的修改
LCD驱动修改,①使用的GPIO,查看IO的配置是否正确,这个在.c文件中修改即可。②背光引脚,这个与官方NXP用的引脚一样,不用修改。③配置的参数。
根据这个TFT4384屏幕的真实参数,将其对应进行添加。
三.网络驱动修改
IMX6ULL有MAC外设,但是需要PHY芯片实现通信,针对这个PYH外设修改网络驱动,采用SR8201F芯片。
1.PHY芯片
PHY(Physical Layer Device)芯片负责物理信号的转换,将数字信号转坏为模拟信号,或者相反,具体就是网口接到信号,传到PHY中,PYH将模拟信号转化为数值信号,到MAC设备中。PYH外接网口,另一端通过RMII接口与IMX6ULL连接在一起。
MAC设备(Media Access Control),负责链路层控制,数据帧的封装,解封装和错误检测。IMX6ULL内部集成MAC控制器。
2.网络驱动具体修改
①复位引脚的初始化,I.MX6U-ALPHA 开发板的 ENET1 复位引脚
ENET1_RST 接到了 I.M6ULL 的 SNVS_TAMPER7 这个引脚上,因此在代码中进行配置。
②SR8201F 的器件 ID。
默认CONFIG_FEC_ENET_DEV 为1,即ENET2,其对应的PHY地址0x1,还有一个网口ENET1,其PYH地址为0x2。
③驱动修改,对默认网络结构体数组进行添加,以及添加网络复位IO初始化代码。
fec1_pads即网口ENET1,添加网口的IO配置参数。
setup_iomux_fec函数就是根据fec1_pads和fec2_pads网络IO配置进行初始化IO。
四.bootcmd和bootargs分析
1.bootcmd
bootcmd保存uboot默认命令,当uboot倒计时结束后,会执行bootcmd中的命令,一般用于启动Linux内核,比如读取EMMC中的镜像文件zImage和设备树文件到DDR(DRAM)中,然后调用bootz 启动内核。
NXP用的bootcmd是属于shell脚本文件,这种是通用的,即对于很多设备和板子都能来用,也可以设置对单独对我用的这个板子。
这个是通用的BOOTCMD文件,其内容等效为:mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ullalientek-emmc.dtb; bootz 80800000 - 83000000。
2.bootargs
bootargs保存uboot传递给Linux内核的参数。其中console设置linux中端,即linux是通过什么和外接进行交互,由于串口1设备文件在/dev/ttymxc0中,因此采用串口交互,波特率115200。root即设置根文件系统的位置,指明根文件系统存放在mmcblk1的设备分区2中。其中/dev/mmcblkx(x=0-n)表示 mmc 设备,而/dev/mmcblkxpy(x=0-n,y=1-n)表示 mmc 设备x 的分区 y。当时就因为这个分区,没注意这句话,把1看成l,一直运行不了…
在uboot中设置: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-alientek-emmc.dtb; bootz 80800000 - 83000000;’,然后运行run bootcmd即可。
五.相关小之知识
1.Uboot启动,DDR中会怎么样
Uboot启动过程中,uboot镜像文件,Linux内核镜像文件(zImage)和设备树都会被加载到DDR中。镜像文件放到0x80800000,设备树放到0x83000000,这个uboot应该是放到87800000位置。
2.启动时怎么样找到配置文件的
Uboot不会去读取mx6ull_alientek_emmc_defconfig配置文件,而是使用该配置文件生成的镜像。首先执行mx6ull_alientek_emmc_defconfig编译时生成.config文件,包含所有实际的编译选项,uboot构建系统会根据这些选项编译出适合这个板子的uboot镜像。
3.Emmc和Nand flash区别
4.DDR和DRAM
SRAM:用于CPU高速缓存,即cache(L1,L2,L3),位于 CPU 和主内存(DRAM)之间的一种高速存储器,用于存储 CPU 频繁访问的数据和指令,以减少访问主内存的延迟。
DRAM:用于主内存,比如操作系统或者应用程序加载进来运行,程序运行时候的变量,堆栈数据放到其中。(电脑的运行内存就是DRAM)