如何在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并且修改内容为如下图:


只是修改了第一行和第四行

添加开发板对应的头文件

在 目 录 include/configs 下 添 加开 发 板 对 应 的 头 文 件 , 复 制include/configs/mx6ullevk.h,并重命名为mx6ull_myboard_emmc.h,然后修改一下文件定义如图

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

uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。 NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,在这个目录下有个名为 mx6ullevk 的文件夹,这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件夹。复制 mx6ullevk文件夹,将其重命名为 mx6ull_myboard_emmc。将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_myboard_emmc.c

接下来还有4个地方需要我们修改:

  1. 修改 mx6ull_myboard_emmc 目录下的 Makefile 文件

  2. 修改 mx6ull_myboard_emmc 目录下的 imximage.cfg 文件

    只修改了34行的这一句

  3. 修改 mx6ull_myboard_emmc 目录下的 Kconfig 文件

  4. 修改 mx6ull_myboard_emmc 目录下的 MAINTAINERS 文件

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

改文件arch/arm/cpu/armv7/mx6/Kconfig(如果用的 I.MX6UL 的话,应该修改 arch/arm/Kconfig 这个文件),在 207 行处:

在最后一行的 endif 的前一行添加如下内容:

到了这里,板卡就已经添加进uboot了,剩下的就是编译工作。

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

在 uboot 根目录下新建一个名为 mx6ull_myboard_emmc.sh 的 shell 脚本,在这个 shell 脚本里面输入如下内容:

最后再给予权限编译就可以了:

等 待 编 译 完 成 , 编 译 完 成 以 后 输 入 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 地址修改


第 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,找到如下代码:

    绿色代码是要删除或者屏蔽的,下面两行是需要加上去的。ENET1 的复位引脚连接到 SNVS_TAMPER7 上,对应 GPIO5_IO07, ENET2 的复位引脚连接到 SNVS_TAMPER8 上,对应 GPIO5_IO08。
    接下来下面的函数都是与74LV595初始化相关的全部直接删除:




再找到board_init函数,board_init 会调用 imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化74lv595 的 GPIO,将这两行删除掉。

  1. 添加 I.MX6U-ALPHA 开发板网络复位引脚驱动
    mx6ull_alientek_emmc.c 中找到fec1_pads修改为如下:

    修改函数setup_iomux_fec如下:

分别对应 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 如下所示:

    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 UBoot移植篇相关推荐

  1. linux系统移植篇(二)—— Uboot使用介绍

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  2. 外网访问arm嵌入式linux系统_嵌入式Linux系统移植的四大步骤

    最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的命 ...

  3. STM32MP157系列教程连载-Linux系统移植篇4:STM32MP1微处理器之Bootloader移植

    STM32MP157系列教程连载-Linux系统移植篇4:STM32MP1微处理器之Bootloader移植 第 1 章 BootLoader(Uboot)移植 1.1 实验原理 1.1.1 概念 简 ...

  4. 嵌入式Linux系统移植的四大步骤

    最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的命 ...

  5. 深度实践嵌入式linux系,深度实践嵌入式Linux系统移植 完整pdf_操作系统教程_源雷技术空间...

    资源名称:深度实践嵌入式Linux系统移植 完整pdf 第1章嵌入式系统架构与移植环境搭建2 第2章u-boot工程与编译系统14 第3章u-boot启动流程分析41 第4章ARM9/S3C2440 ...

  6. 嵌入式 Linux 开发工具篇问题整理//C语言测试(杨辉三角、递归调用实现阶乘、计算器、统计字符串出现次数)//2018.07.12.//

    嵌入式 Linux 开发工具篇问题整理 1. 嵌入式开发与传统开发的区别?(同类问题:单片机开发与嵌入式开发的区别)             是否有无操作系统:     2. 移植操作系统的好处有哪些 ...

  7. 嵌入式Linux系统移植的四大步骤(详细长文,慎入!)

    关注.星标公众号,直达精彩内容 来源:网路素材 最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们 ...

  8. 嵌入式linux rtsp移植,嵌入式网络收音机的ARM实现 - ARM - 电子发烧友网

    3 系统的的软件设计 3.1 嵌入式Linux的移植 嵌入式Linux内核的版本很多,一般情况下版本越高,系统越稳定,驱动更完善,本系统选择了2.6.18的Linux内核.其实对于2.6以后版本的Li ...

  9. linux系统移植篇(四)—— 根文件系统使用介绍

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  10. 嵌入式Linux 系统移植流程总结

    嵌入式Linux系统移植主要由四大部分组成: 一.搭建交叉开发环境 二.bootloader的选择和移植 三.kernel的配置.编译.和移植 四.根文件系统的制作 第一部分:搭建交叉开发环境 先介绍 ...

最新文章

  1. 推荐百度地图的新功能--“三维”
  2. MyEclipse 导出 javadoc 乱码解决
  3. vuecli3的svgicon_vue-cli3引入svg图标全过程以及遇到的坑
  4. kubernetes实战篇之创建密钥自动拉取私服镜像
  5. python中如何对dict对象进行排序
  6. 使用protostuff进行序列化
  7. 我的java web之路(安装)
  8. OpenCV 填充多边形 fillConvexPoly 和 fillPoly
  9. 开课吧:人工智能技术会如何影响青年就业
  10. 3.2 LSTM、GRU RNN概述
  11. AFNetworking到底做了什么?(二)
  12. Android AlertDialog的一切
  13. 展讯SC9820E驱动配置之LCD配置
  14. 管家婆 经营历程 Date exceeds maximum of 19-12-31 报错解决补丁包
  15. 凤凰项目:一个IT运维的传奇故事--阅读心得
  16. 计算机中的c盘d盘,怎么把电脑中的D盘转换成C盘并删除原C盘系统
  17. 电子邮箱地址格式怎么写?企业电子邮箱格式教程
  18. 《区块链+》读书感想
  19. 【浅墨著作】 OpenCV3编程入门 内容简介 勘误 配套源代码下载
  20. 用AdGuard Home搭建一个内部的DNS服务器,开启局域网内无广告和追踪的浏览体验

热门文章

  1. 网页数据实时更新的三种简单方法
  2. java用正则表达式大全_Java 正则表达式 大全
  3. 表单美化+html+css
  4. 产品经理技能学习:流程图绘制及规范
  5. Python简单实现微博自动点赞
  6. c语言冒泡排序获取最小值,C语言 冒泡排序算法详解及实例
  7. 传感器采取船舶的_电容式传感器工作原理与电容式传感器行业应用
  8. 2022年Python最新面试题汇总及答案
  9. integnps 数控智能编程v19.3 数控切割机编程 切割机套料编程
  10. 微信小程序一键获取用户头像、昵称等基本信息