嵌入式linux UBoot移植篇

如何在U-boot添加自己的linux板卡并启动呢?

uboot 的移植并不是说我们完完全全的从零开始将 uboot 移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的, 半导体厂商负责将 uboot 移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这个开发板就叫做原厂开发板。半导体厂商会将 uboot 移植到他们自己的原厂开发板上,测试好以后就会将这个 uboot 发布出去,这就是大家常说的原厂 BSP 包。我们一般做产品的时候就会参考原厂的开发板做硬件,然后在原厂提供的 BSP 包上做修改,将 uboot 或者 linux kernel 移植到我们的硬件上。下面我以修改NXP官方的evk开发板为例,改为自己的linux板卡。

添加开发板默认配置文件

先在 configs 目录下创建默认配置文件,复制 mx6ull_14x14_evk_emmc_defconfig,然后重命名为 mx6ull_myboard_emmc_defconfig并且修改内容为如下图:

嵌入式linux UBoot移植篇_第1张图片
只是修改了第一行和第四行

添加开发板对应的头文件

在 目 录 include/configs 下 添 加开 发 板 对 应 的 头 文 件 , 复 制include/configs/mx6ullevk.h,并重命名为mx6ull_myboard_emmc.h,然后修改一下文件定义如图
嵌入式linux UBoot移植篇_第2张图片

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

uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。 NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,在这个目录下有个名为 mx6ullevk 的文件夹,这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件夹。复制 mx6ullevk文件夹,将其重命名为 mx6ull_myboard_emmc。将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_myboard_emmc.c
嵌入式linux UBoot移植篇_第3张图片
接下来还有4个地方需要我们修改:

  1. 修改 mx6ull_myboard_emmc 目录下的 Makefile 文件
    嵌入式linux UBoot移植篇_第4张图片

  2. 修改 mx6ull_myboard_emmc 目录下的 imximage.cfg 文件
    嵌入式linux UBoot移植篇_第5张图片
    只修改了34行的这一句

  3. 修改 mx6ull_myboard_emmc 目录下的 Kconfig 文件
    嵌入式linux UBoot移植篇_第6张图片

  4. 修改 mx6ull_myboard_emmc 目录下的 MAINTAINERS 文件
    嵌入式linux UBoot移植篇_第7张图片

修改 U-Boot 图形界面配置文件

改文件arch/arm/cpu/armv7/mx6/Kconfig(如果用的 I.MX6UL 的话,应该修改 arch/arm/Kconfig 这个文件),在 207 行处:
嵌入式linux UBoot移植篇_第8张图片
在最后一行的 endif 的前一行添加如下内容:
嵌入式linux UBoot移植篇_第9张图片
到了这里,板卡就已经添加进uboot了,剩下的就是编译工作。

使用新添加的板子配置编译 uboot

在 uboot 根目录下新建一个名为 mx6ull_myboard_emmc.sh 的 shell 脚本,在这个 shell 脚本里面输入如下内容:
嵌入式linux UBoot移植篇_第10张图片
最后再给予权限编译就可以了:
在这里插入图片描述
等 待 编 译 完 成 , 编 译 完 成 以 后 输 入 grep -nR “mx6ull_myboard_emmc.h” , 查 看 一 下 添 加 mx6ull_myboard_emmc.h 这个头文件有没有被引用。如果有被引用就说明添加成功了!

必要驱动的修改

在我们启动uboot之后,就需要启动一些我们必要的驱动,比如说驱动lcd用于打印信息,启动网络驱动便于我们后续进行网络挂载根文件系统与linux内核启动。一般 uboot 中需要解决串口、 NAND、 EMMC 或 SD 卡、网络和 LCD 驱动,因为 uboot的主要目的就是启动 Linux 内核,所以不需要考虑太多的外设驱动。而这些驱动需要修改添加的地方就位于我们的mx6ull_myboard_emmc.h以及mx6ull_myboard_emmc.c文件中。下面我就以网络驱动为例介绍怎么修改:

  1. 网络 PHY 地址修改

嵌入式linux UBoot移植篇_第11张图片
第 345 行定了一个宏 CONFIG_PHY_MICREL,此宏用于使能 uboot 中 Micrel 公司的 PHY驱动, KSZ8081 这颗 PHY 芯片就是 Micrel 公司生产的,不过 Micrel 已经被 Microchip 收购了。如果要使用 LAN8720A,那么就得将 CONFIG_PHY_MICREL 改为 CONFIG_PHY_SMSC,也就是使能 uboot 中的 SMSC 公司中的 PHY 驱动,因为 LAN8720A 就是 SMSC 公司生产的。

  1. 删除 uboot 中 74LV595 的驱动代码
    uboot 中网络 PHY 芯片地址修改完成以后就是网络复位引脚的驱动修改了,打开mx6ull_myboard_emmc.c,找到如下代码:
    嵌入式linux UBoot移植篇_第12张图片
    绿色代码是要删除或者屏蔽的,下面两行是需要加上去的。ENET1 的复位引脚连接到 SNVS_TAMPER7 上,对应 GPIO5_IO07, ENET2 的复位引脚连接到 SNVS_TAMPER8 上,对应 GPIO5_IO08。
    接下来下面的函数都是与74LV595初始化相关的全部直接删除:

嵌入式linux UBoot移植篇_第13张图片
嵌入式linux UBoot移植篇_第14张图片
嵌入式linux UBoot移植篇_第15张图片
再找到board_init函数,board_init 会调用 imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化74lv595 的 GPIO,将这两行删除掉。
嵌入式linux UBoot移植篇_第16张图片

  1. 添加 I.MX6U-ALPHA 开发板网络复位引脚驱动
    mx6ull_alientek_emmc.c 中找到fec1_pads修改为如下:
    嵌入式linux UBoot移植篇_第17张图片
    修改函数setup_iomux_fec如下:
    嵌入式linux UBoot移植篇_第18张图片

分别对应 ENET1 和 ENET2 的复位 IO 初始化,将这两个 IO 设置为输出并且硬件复位一下 LAN8720A,这个硬件复位很重要!否则可能导致 uboot 无法识别 LAN8720A

  1. 修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link
    还差最后一步, uboot 中的 LAN8720A 驱动有点问题,打开文件drivers/net/phy/phy.c,找到函数 genphy_update_link,这是个通用 PHY 驱动函数,此函数用于更新 PHY 的连接状态和速度。使用 LAN8720A 的时候需要在此函数中添加一些代码,修改后的函数 genphy_update_link 如下所示:
    嵌入式linux UBoot移植篇_第19张图片
    225 行和237 行就是新添加的代码,为条件编译代码段,只有使用 SMSC 公司的 PHY 这段代码才会执行。第 229 行读取LAN8720A 的 BMCR 寄存器(寄存器地址为 0),此寄存器为 LAN8720A 的配置寄存器,这里先读取此寄存器的默认值并保存起来。 230 行向寄存器 BMCR 寄存器写入 BMCR_RESET(值为0X8000),因为 BMCR 的 bit15 是软件复位控制位,因此 230 行就是软件复位LAN8720A,复位完成以后此位会自动清零。第 231~233 行等待 LAN8720A 软件复位完成,也就是判断 BMCR的 bit15 位是否为 1,为 1 的话表示还没有复位完成。第 234 行重新向 BMCR 寄存器写入以前的值,也就是 229 行读出的那个值。
    至此网络的复位引脚驱动修改完成,重新编译 uboot

你可能感兴趣的:(linux驱动开发,linux,嵌入式)