uboot学习(4)-uboot移植

文章目录

  • 1. 板子驱动检查
  • 2. 实战
    • 2.1 更改编译配置文件
    • 2.2 添加开发板对应头文件
    • 2.3 添加开发板对应板级文件夹
    • 2.4 修改u-boot图形界面配置文件
    • 2.5 使用新添加的配置编译u-boot
  • 3. 移植流程分析
    • 3.1 编译流程刨析
  • 4. 遇到的问题
    • 4.1 烧录sd卡不成功
    • 4.2 sd卡格式化

1. 板子驱动检查

直接将原厂提供的uboot驱动移植到板子上运行,查看各个驱动是否能正常加载。

mmc dev 0
mmc info

2. 实战

2.1 更改编译配置文件

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

2.2 添加开发板对应头文件

include/configs/mx6ullevk.h 复制为 include/configs/user_emmc.h
并更改头文件定义

#ifndef __USER_EMMC_H
#define __USER_EMMC_H

2.3 添加开发板对应板级文件夹

将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

2.4 修改u-boot图形界面配置文件

修改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"

2.5 使用新添加的配置编译u-boot

其他都一样,只是采取了新添加的配置

#!/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

随后进行烧录即可
uboot学习(4)-uboot移植_第1张图片

3. 移植流程分析

其实在做为上述的一系列操作后,并不知道自己在干啥。。。为什么要这么做,看正点原子提供的文档,并没有介绍这方面。出于技术人的求知角度来说,决定从头捋一遍,至少之后如果真正去进行u-boot移植的时候,知道自己需要干什么,为什么这么干。

3.1 编译流程刨析

1)make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
首先是编译的第一步,也就是make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
这里很清晰,之前看过makefile的人都能看出来,这里是在进行编译产物的清理。那么来到uboot的顶层Makefile看下。
对应在Makefile中的地方为
uboot学习(4)-uboot移植_第2张图片
uboot学习(4)-uboot移植_第3张图片
这里的.PHONY是Makefile中的伪目标,伪目标的作用可以参考
https://www.cnblogs.com/hnrainll/archive/2011/04/12/2014082.html
最主要的一个作用,是防止文件与目标同名的情况下,造成一些误解。

这里可以看到目标变量中加上了distclean目标,此时看一下distclean的依赖及实现
uboot学习(4)-uboot移植_第4张图片
这里可以用echo 把变量打印出来,方便对这边的理解,打印结果如下。
uboot学习(4)-uboot移植_第5张图片
其中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
这一步,则是开始真正的编译过程了。

4. 遇到的问题

4.1 烧录sd卡不成功

烧录u-boot.bin完总是提示主频69MHZ。
uboot学习(4)-uboot移植_第6张图片

每次烧录到SD卡时,速度都达到了605MB/S,速度感觉很不正常。
uboot学习(4)-uboot移植_第7张图片

后来发现 /dev/sdb灰色,明显权限都不对,是一个虚假的挂载节点。
image.png

SD卡格式是exFAT模式,而此时看虚拟机内也报错,提示mount:unknown filesystem type ‘exfat‘,于是安装了exFAT格式支持,并删除了虚假的设备节点,重新插拔SD卡使其重新挂载。
sudo apt-get install exfat-utils
sudo rm -rf /dev/sdb

最后重新烧录提示成功
uboot学习(4)-uboot移植_第8张图片

总结原因,主要是因为ubuntu未安装对exFAT格式的支持,导致SD卡插上后,并未真正挂载上,而是一个虚假的设备节点,在安装文件系统格式支持后,成功解决该问题~

4.2 sd卡格式化

1)SD卡分区
若无分区要求,只想格式化SD卡,可直接跳过这一步。
输入m可查看帮助信息,基本常用的操作都在里面
uboot学习(4)-uboot移植_第9张图片
输入p可查看当前的分区信息
uboot学习(4)-uboot移植_第10张图片
可以看到当前SD卡中,无分区,可直接输入n创建一个新分区,分区的具体参数,可以直接回车选择默认。
uboot学习(4)-uboot移植_第11张图片
分区创建成功,直接输入w进行保存,分区就创建完毕啦。如果想删除原有分区,可以直接输入d,删除原有分区。
2)SD卡格式化为exFAT格式
sudo mkfs.exfat -n LABEL /dev/sdb1
sudo fsck.exfat /dev/sdb1 //检查SD卡是否格式化成功
uboot学习(4)-uboot移植_第12张图片
如上图格式化成功!可以愉快使用啦

你可能感兴趣的:(Linux驱动/内核编程,ubuntu,linux,驱动开发)