嵌入式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并且修改内容为如下图:
只是修改了第一行和第四行
添加开发板对应的头文件
在 目 录 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个地方需要我们修改:
修改 mx6ull_myboard_emmc 目录下的 Makefile 文件
修改 mx6ull_myboard_emmc 目录下的 imximage.cfg 文件
只修改了34行的这一句修改 mx6ull_myboard_emmc 目录下的 Kconfig 文件
修改 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文件中。下面我就以网络驱动为例介绍怎么修改:
- 网络 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 公司生产的。
- 删除 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,将这两行删除掉。
- 添加 I.MX6U-ALPHA 开发板网络复位引脚驱动
mx6ull_alientek_emmc.c 中找到fec1_pads修改为如下:
修改函数setup_iomux_fec如下:
分别对应 ENET1 和 ENET2 的复位 IO 初始化,将这两个 IO 设置为输出并且硬件复位一下 LAN8720A,这个硬件复位很重要!否则可能导致 uboot 无法识别 LAN8720A
- 修改 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移植篇相关推荐
- linux系统移植篇(二)—— Uboot使用介绍
linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...
- 外网访问arm嵌入式linux系统_嵌入式Linux系统移植的四大步骤
最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的命 ...
- STM32MP157系列教程连载-Linux系统移植篇4:STM32MP1微处理器之Bootloader移植
STM32MP157系列教程连载-Linux系统移植篇4:STM32MP1微处理器之Bootloader移植 第 1 章 BootLoader(Uboot)移植 1.1 实验原理 1.1.1 概念 简 ...
- 嵌入式Linux系统移植的四大步骤
最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的命 ...
- 深度实践嵌入式linux系,深度实践嵌入式Linux系统移植 完整pdf_操作系统教程_源雷技术空间...
资源名称:深度实践嵌入式Linux系统移植 完整pdf 第1章嵌入式系统架构与移植环境搭建2 第2章u-boot工程与编译系统14 第3章u-boot启动流程分析41 第4章ARM9/S3C2440 ...
- 嵌入式 Linux 开发工具篇问题整理//C语言测试(杨辉三角、递归调用实现阶乘、计算器、统计字符串出现次数)//2018.07.12.//
嵌入式 Linux 开发工具篇问题整理 1. 嵌入式开发与传统开发的区别?(同类问题:单片机开发与嵌入式开发的区别) 是否有无操作系统: 2. 移植操作系统的好处有哪些 ...
- 嵌入式Linux系统移植的四大步骤(详细长文,慎入!)
关注.星标公众号,直达精彩内容 来源:网路素材 最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们 ...
- 嵌入式linux rtsp移植,嵌入式网络收音机的ARM实现 - ARM - 电子发烧友网
3 系统的的软件设计 3.1 嵌入式Linux的移植 嵌入式Linux内核的版本很多,一般情况下版本越高,系统越稳定,驱动更完善,本系统选择了2.6.18的Linux内核.其实对于2.6以后版本的Li ...
- linux系统移植篇(四)—— 根文件系统使用介绍
linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...
- 嵌入式Linux 系统移植流程总结
嵌入式Linux系统移植主要由四大部分组成: 一.搭建交叉开发环境 二.bootloader的选择和移植 三.kernel的配置.编译.和移植 四.根文件系统的制作 第一部分:搭建交叉开发环境 先介绍 ...
最新文章
- 推荐百度地图的新功能--“三维”
- MyEclipse 导出 javadoc 乱码解决
- vuecli3的svgicon_vue-cli3引入svg图标全过程以及遇到的坑
- kubernetes实战篇之创建密钥自动拉取私服镜像
- python中如何对dict对象进行排序
- 使用protostuff进行序列化
- 我的java web之路(安装)
- OpenCV 填充多边形 fillConvexPoly 和 fillPoly
- 开课吧:人工智能技术会如何影响青年就业
- 3.2 LSTM、GRU RNN概述
- AFNetworking到底做了什么?(二)
- Android AlertDialog的一切
- 展讯SC9820E驱动配置之LCD配置
- 管家婆 经营历程 Date exceeds maximum of 19-12-31 报错解决补丁包
- 凤凰项目:一个IT运维的传奇故事--阅读心得
- 计算机中的c盘d盘,怎么把电脑中的D盘转换成C盘并删除原C盘系统
- 电子邮箱地址格式怎么写?企业电子邮箱格式教程
- 《区块链+》读书感想
- 【浅墨著作】 OpenCV3编程入门 内容简介 勘误 配套源代码下载
- 用AdGuard Home搭建一个内部的DNS服务器,开启局域网内无广告和追踪的浏览体验