直接将原厂提供的uboot驱动移植到板子上运行,查看各个驱动是否能正常加载。
mmc dev 0
mmc info
configs目录
复制mx6ull_14x14_evk_emmc_defconfig为user_emmc_defconfig
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/user_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_USER_EMMC=y
CONFIG_CMD_GPIO=y
include/configs/mx6ullevk.h 复制为 include/configs/user_emmc.h
并更改头文件定义
#ifndef __USER_EMMC_H
#define __USER_EMMC_H
将board/freescale 目录下mx6ullevk 目录复制为user_emmc,创建一个新的板级文件夹,并进行一些修改
1)源文件修改
mx6ullevk.c 文 件 重 命 名 为 mx6ull_alientek_emmc.c
2)Makfile修改
修改为:obj**-**y **:= user_emmc.o,使依赖的.o目标为user_emmc.**o
3)修改imximage.cfg文件
修改cfg文件依赖的板级文件夹路径
PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000 修改为
PLUGIN board/freescale/user_emmc /plugin.bin 0x00907000
4)修改Kconfig文件
if TARGET_MX6ULL_ALIENTEK_EMMC
config SYS_BOARD
default "user_emmc"
config SYS_VENDOR
default "freescale"
config SYS_SOC
default "mx6"
config SYS_CONFIG_NAME
default "user_emmc"
endif
5)修改MAINTAINERS 文件
MX6ULL_ALIENTEK_EMMC BOARD
M: Peng Fan <peng.fan@nxp.com>
S: Maintained
F: board/freescale/user_emmc/
F: include/configs/user_emmc.h
修改arch/arm/cpu/armv7/mx6/Kconfig,添加如下
config TARGET_USER_EMMC
bool "Support user_emmc"
select MX6ULL
select DM
select DM_THERMAL
source "board/freescale/user_emmc/Kconfig"
其他都一样,只是采取了新添加的配置
#!/bin/bash
#change mx6ull_14x14_evk_emmc to user emmc
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- user_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
其实在做为上述的一系列操作后,并不知道自己在干啥。。。为什么要这么做,看正点原子提供的文档,并没有介绍这方面。出于技术人的求知角度来说,决定从头捋一遍,至少之后如果真正去进行u-boot移植的时候,知道自己需要干什么,为什么这么干。
1)make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
首先是编译的第一步,也就是make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
这里很清晰,之前看过makefile的人都能看出来,这里是在进行编译产物的清理。那么来到uboot的顶层Makefile看下。
对应在Makefile中的地方为
这里的.PHONY是Makefile中的伪目标,伪目标的作用可以参考
https://www.cnblogs.com/hnrainll/archive/2011/04/12/2014082.html
最主要的一个作用,是防止文件与目标同名的情况下,造成一些误解。
这里可以看到目标变量中加上了distclean目标,此时看一下distclean的依赖及实现
这里可以用echo 把变量打印出来,方便对这边的理解,打印结果如下。
其中find 命令的-name 代表查找文件名。
-o -name则是进行文件名查找的连接,用于同时进行多文件名查找。
-prune作用则是排除指定文件或目录。
-type f是代表查找的类型为文件
-print 则是将结果打印到标准输出
|xargs 用于承接删除命令。在这里的作用便是将上面find出来的结果通过管道打印到标准输出后,将值传递给后面的rm -f,执行删除操作。
那上面distclean目标的执行命令可大致理解为,在当前路径下,查找*.orig,.rej,.bak等等,并在这些结果中排除RCS_FIND_IGNORE变量值中代表的文件和文件夹(因为RCS_FIND_IGNORE变量值代表的文件和文件夹是不执行删除操作的),随后进行删除操作,完成清理编译文件的目的。
2)make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- user_emmc_defconfig
这一步,则是开始真正的编译过程了。
每次烧录到SD卡时,速度都达到了605MB/S,速度感觉很不正常。
后来发现 /dev/sdb灰色,明显权限都不对,是一个虚假的挂载节点。
SD卡格式是exFAT模式,而此时看虚拟机内也报错,提示mount:unknown filesystem type ‘exfat‘,于是安装了exFAT格式支持,并删除了虚假的设备节点,重新插拔SD卡使其重新挂载。
sudo apt-get install exfat-utils
sudo rm -rf /dev/sdb
总结原因,主要是因为ubuntu未安装对exFAT格式的支持,导致SD卡插上后,并未真正挂载上,而是一个虚假的设备节点,在安装文件系统格式支持后,成功解决该问题~
1)SD卡分区
若无分区要求,只想格式化SD卡,可直接跳过这一步。
输入m可查看帮助信息,基本常用的操作都在里面
输入p可查看当前的分区信息
可以看到当前SD卡中,无分区,可直接输入n创建一个新分区,分区的具体参数,可以直接回车选择默认。
分区创建成功,直接输入w进行保存,分区就创建完毕啦。如果想删除原有分区,可以直接输入d,删除原有分区。
2)SD卡格式化为exFAT格式
sudo mkfs.exfat -n LABEL /dev/sdb1
sudo fsck.exfat /dev/sdb1 //检查SD卡是否格式化成功
如上图格式化成功!可以愉快使用啦