6ull--系统移植(U-Boot、内核kernel、根文件系统rootfs)

1、摘要

  1. 版本型号:ubuntu18.04        ARM板型号:imx6ull-emmc-8g核心板

  2. 要在Linux内核中进行驱动的编写,因此要找到kernel源码,适配内核kernel到板子上。

  3. 本文主要记录对imx6ull进行系统移植

    1. U-Boot是官方自带的,没有再重新烧录。里面也有如何移植正点原子的U-Boot

    2. 内核kernel是正点原子配置好的,不是由出厂源码NXP改的。

    3. 根文件系统rootfs需要自己配置搭建,没有现成的

  4. 配置移植前提:配置好网络、IP、nfs以及tftp等其他

  5. 本文参照【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81、以及正点原子6ull教学视频,内容都能在文档中找到只是提取了我用到的,会将链接附在后面。

2、说明流程

正点原子驱动开发指南里第一次看是会一头懵, 里面有两类。

  1. 如果你想直接使用只是为了编写驱动,那么就移植正点原子配置好的U-boot以及kernel,就是本文的顺序。
  2. 如果想要由NXP提供的 Linux 源码开始配置,就按照教程中第三十七章步骤配置

移植顺序:

  1. 要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader 有很多,常用的就是 U-Boot
  2. 移植好 U-Boot 以后再移植 Linux 内核,移植完 Linux 内核以后Linux 还不能正常启动。
  3. 还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。
U-Boot Linux kernel rootfs 这三者一起构成了一个完整的 Linux 系统,一个可以正常使用、功能完善的 Linux 系统。

3、移植U-Boot

其实并不用移植U-Boot,因为板子自带的U-Boot就可以使用,如果想要学如何配置U-Boot,就看一下这节或者看视频,如果不用就可以跳过此节。

3.1 参照视频:

https://www.bilibili.com/video/BV1DK411P775/?p=100&vd_source=4b1e60ea63d719404f67042d7e6c32d1

 3.2 正点原子有可以直接使用的uboot

uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2

 

创建一个uboot文件夹。将压缩包解压

3.3 修改部分内容

如果是第一次编译,需要输入指令sudo apt-get install libncurses5-dev安装ncurses 库。

输入命令,将内容写进入。

vi mx6ull_alientek_emmc.sh

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_nand_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
  1. 修改权限:chmod 777 mx6ull_alientek_emmc.sh
  2. 运行./mx6ull_alientek_emmc.sh,此时会生成u-boot.bin

3.3 使用SD卡烧录

  • 将SD卡插到电脑上,先格式化,随后连接到Ubuntu

  • imxdownload移动到.bin目录下

  • 终端指令ls /dev/sd* -l查看是哪个区,可以看到是/dev/sdb

  • 输入指令:./imxdownload u-boot.bin /dev/sdb

  • 将板子的启动BOOT拨码拨到SD卡启动模式(板子上有标记)

  • 将卡入重新启动复位。此时是烧录进去了。但是启动的时候修改环境变量使用saveenv 保存后,下次再重启的时候之前保存的都没了。看他提示保存到NAND里面,没有保存到 Flash 里面

 4、移植Linux内核

移植Linux内核使用的是正点原子配置好的,因此只需要修改部分内容就可以用了。

4.1 参考视频

https://www.bilibili.com/video/BV1DK411P775?p=129&vd_source=4b1e60ea63d719404f67042d7e6c32d1

4.2 修改文件

  1. 编译内核之前需要先在 ubuntu 上安装 lzop 库 :sudo apt-get install lzop

  2. 新建文件alientek_linux,将内核复制到该文件夹中linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2解压

  3. 创建脚本文件:vi mx6ull_alientek_emmc.sh,填写下面内容

  4. #!/bin/sh
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
  5. 修改权限chmod 777 mx6ull_alientek_emmc.sh ./mx6ull_alientek_emmc.sh

  6. 将生成好的zImage复制到tftp目录下:cp ./arch/arm/boot/zImage ~/nfs/tftpboot/ -f

  7. 修改顶层Makefile

  8. 在顶层目录下运行:make imx6ull-14x14-emmc-7-1024x600-c.dtb

  9. 将该文件也复制到tftp目录下。

4.3 配置板子

  1. 启动模式选用默认的EMMC启动模式

  2. 配置板子的ip:setenv ipaddr 192.168.1.203

  3. 配置主机的ip:setenv serverip 192.168.1.200

  4. 保存一下ethaddr:setenv ethaddr 00:04:9f:04:d2:35

  5. saveenv

  6. tftp 80800000 zImage

  7. tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb

  8. bootz 0x80800000 - 0x83000000

可以看到这里下载的内核时间是正确的,代表烧录进去了。

 

最后这里是提示没有根文件系统。属于正常的,因为还没有配根文件 。

可以将上面6、7、8三个命令存储到环境变量中,尽量自己手打,否则很容易出错,这样就可以保证复位之后自动下载进去了,而不是手动敲命令。

至此内核移植成功。 

 5、移植根文件系统rootfs 

对应【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 第三十八章 根文件系统构建

根文件系统正点原子没有提供现成的,因此需要自己配置一个根文件系统。

构建根文件系统,可以构建的软件:busybox(用于学习)、buildroot(用于做产品,更加集成方便)、yocto。这里用的busybox

5.1 修改内容

  • 复制压缩包busybox到目录下,解压

  • 修改顶层Makefile

    • 这个在安装的交叉编译环境中,可以进入根目录查找:cd /user/local/arm/,注意替换的内容
    • 以及

  • 修改busybox,使其支持中文字符

    • 打开文件busybox-1.29.0/libbb/printable_string.c,找到函数printable_string,修改两处内容

    • 打开文件 busybox-1.29.0/libbb/unicode.c,找到函数unicode_conv_to_printable2,修改两处内容

 5.2 配置busybox

  • 使用默认配置,输入命令:make defconfig,.config表示成功

  • 打开图形化界面修改部分配置命令:make menuconfig

    • Location: -> Settings -> Build static binary (no shared libs)不选中,这个是来决定是静态编译 busybox 还是动态编译,这里要动态编译所以不勾选。

    • Location: -> Settings -> vi-style line editing commands选中

    • Location: -> Linux Module Utilities -> Simplified modutils不选中

    • Location: -> Linux System Utilities -> mdev (16 kb)确保下面的全部选中,默认都是选中的
    • Location: -> Settings -> Support Unicode 选中 -> Check $LC_ALL, $LC_CTYPE and $LANG environment variables 选中

5.3 编译busybox

  • 将编译的结果存放到创建的nfs目录下的rootfs目录中:

      make install CONFIG_PREFIX=/home/linux/nfs/rootfs

此时可以看到创建成功了,在自己的nfs目录下的rootfs中。 

5.4 增加lib文件

  • 根文件系统中添加动态库:mkdir lib

  • 进入到/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

  • 将此目录下所有的*so*和.a文件都拷贝到 rootfs/lib 目录中

      cp *so* *.a ~/nfs/rootfs/lib/ -d(-d不要省略)

  • 切换到nfs/rootfs/lib中,可以看到已经复制过来了,但是还要修改

  • 输入命令ls ld-linux-armhf.so.3 -l查看此文件详细信息,可以看到是软连接文件,相当于快捷方式。

  • 删除nfs/rootfs/lib目录下的ld-linux-armhf.so.3rm ld-linux-armhf.so.3

  • 进入到/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib,输入指令:cp ld-linux-armhf.so.3 ~/nfs/rootfs/lib/

    • 此时在rootfs下可以看到ld-linux-armhf.so.3不是软链接

  • 进入目录:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib

  • cp *so* *.a ~/nfs/rootfs/lib/ -d

  • 成功

 5.5 向 rootfs 的“usr/lib”目录添加库文件

  • 在rootfs/usr/下创建一个lib目录:mkdir lib

  • 进入到/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib

cp *so* *.a ~/nfs/rootfs/usr/lib/ -d

  • 此时可以看到成功了

  •   可以查看大小:du ./lib ./usr/lib/ -sh

5.6 创建其他的文件夹

mkdir dev proc mnt sys tmp root

5.7 板子修改环境变量绑定

这个命令要自己去看一下是什么意思,要自己手敲,注意空格和符号不能错

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.200:/home/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.203:192.168.1.200:192.168.1.1:255.255.255.0::eth0:off'

saveenv

5.8 完善根文件系统

在rootfs目录下,创建/etc/init.d/rcS 文件 ,输入以下内容,再修改权限chmod 777 rcS,这里rcS文件是一个shell脚本,可以在最后一行将想要开机自启动的程序的可执行文件写进去,就可以实现开机自动执行该程序。

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

#开机自启动,这个是自己想要启动的程序,可以删掉不要
cd /driver
./hello &
cd /

在 rootfs 中创建/etc/fstab 文件,输入以下内容

#<file system> <mount point> <type>   <options> <dump> <pass>
proc            /proc         proc     defaults  0      0
tmpfs           /tmp          tmpfs    defaults  0      0
sysfs           /sys          sysfs    defaults  0      0

在 rootfs 中创建/etc/inittab 文件,输入以下内容

#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

可以创建一个driver文件夹用来存放自己的文件

5.9 根文件报错

[    8.670640] gpio_dvfs: disabling 
[    8.673955] VSD_3V3: disabling 
[    8.677024] can-3v3: disabling 
[    8.680346] ALSA device list: 
[    8.683327]   #0: wm8960-audio

解决方案:https://blog.csdn.net/HuangChen666/article/details/132273615

6、效果

这个是最终配置好的效果,佛祖这个代码是在rcS文件中最后一行可执行程序hello运行结果

7、总结

该文件用到的所有资料都是在正点原子官网上下载的,叫:【正点原子】阿尔法Linux开发板(A盘)-基础资料

配置根文件系统是比较麻烦的,如果有不理解的地方还是建议看一下驱动开发文档,里面说明很详细,我这里只是自己做的一个总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/686280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序 UI 风格,独具匠心

小程序 UI 风格&#xff0c;独具匠心

Day33 登录注册功能实现

​ 本章节实现了登录注册功能,以及登录成功后,跳转到系统首页 一.登录注册页面的切换 在 Material Design 中,有一个 Transitioner 控件,也就是切换面板控件,它可同时容纳多个不同的窗口内容。其中就有一个属性值:SelectedIndex,根据该属性值来切换呈现不同的选中页内容…

前端实现大文件分片并行上传、断点续传、秒传(完整解析)

一、总体流程图 二、具体步骤 简单理解&#xff1a;前端先将文件切割多份&#xff0c;在进行上传&#xff0c;由后端进行切片合并操作。 具体逻辑&#xff1a; 1. 前端选中上传文件&#xff08;如果是批量上传就把选中的文件存入选中文件列表数组中&#xff0c;后续在遍历上…

学习笔记——路由网络基础——缺省(默认)路由

3、缺省(默认)路由 1、定义 缺省路由(默认路由)&#xff1a;是目的地址和掩码都为全0的特殊路由。全0代表任意网络。缺省路由在路由表中的形式为&#xff1a;0.0.0.0/0缺省路由也被叫默认路由。缺省路由优先级比直连路由低 缺省路由是一种特殊的路由&#xff0c;当报文没有在…

elementUI el-table高度heght和总结summary 同时使用 表格样式异常

背景 同时使用height和 show-summary 样式错位 解决方案 在钩子函数updated 中重新渲染此表格 <el-table :height"autoHeight" show-summary ref"dataTable" >updated() {this.$nextTick(() >{this.$refs.dataTable.doLayout();})},更改后的效果 …

Git使用总结(git使用,git实操,git命令和常用指令)

简介&#xff1a;Git是一款代码版本管理工具&#xff0c;可以记录每次提交的代码&#xff0c;防止代码丢失&#xff0c;可实现版本迭代&#xff0c;解决代码冲突&#xff0c;常用的远程Git仓库&#xff1a;Gitee&#xff08;国内&#xff09;、GitHub&#xff08;国外&#xff…

海南聚广众达电子商务咨询有限公司引领抖音电商新风尚

在数字化浪潮汹涌澎湃的今天&#xff0c;电商行业正迎来前所未有的发展机遇。作为电商领域的一颗璀璨明星&#xff0c;海南聚广众达电子商务咨询有限公司凭借其专业的抖音电商服务&#xff0c;成功吸引了众多商家的目光&#xff0c;成为了业界的一匹黑马。 海南聚广众达电子商…

【前端】响应式布局笔记——自适应布局

自适应布局 自适应布局是不同设备对应不同的html(局部自适应)&#xff0c;通过判断设备的类型或控制局部的变化。 1、获取设备是移动端还是pc端 // 获取设备的信息let userAgent navigator.userAgent.toLowerCase();// 使用正则表达式来判断类型let device /ipad|iphone|m…

《Kubernetes部署篇:基于Kylin V10+ARM64架构CPU+containerd一键离线部署容器版K8S1.26.15高可用集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署基于containerd容器版 K8S 1.26.15集群&…

45-1 waf绕过 - 文件上传绕过WAF方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后安装dvwa靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客打开dvwa靶场,先将靶场的安全等级调低,然后切换到文件上传 一、符号变异 在PHP中,由于其弱类型特性,有时候仅有一…

图像算法---自动对焦AF

一&#xff0c;CDAF反差对焦原理 CDAF&#xff0c;全称Contrast Detection Auto Focus&#xff0c;即反差式对焦或对比度检测自动对焦&#xff0c;是一种广泛应用于入门级数码相机和相机模块化智能手机上的自动对焦技术。以下是关于CDAF反差对焦的详细介绍&#xff1a; 工作原…

基于Python的实验室管理系统的设计与实现(论文+源码)_kaic

摘 要 随着实验室设备越来越多&#xff0c;实验室及其设备管理工作变得越来越繁重&#xff0c;还存在些管理模式仍旧处于手工管理模式和一些抢占实验室的不文明现象&#xff0c;传统的手工模式已经满足不了日益增长的管理需求&#xff0c;而本系统摒弃传统模式&#xff0c;开启…

Docker 快速入门Ubuntu版(1h速通)

Docker 快速入门Ubuntu版&#xff08;1h速通&#xff09; 写在前面&#xff0c;本教程主要参考Docker get started&#xff0c;ChatGPT-4o的回答&#xff0c;以及网络上查找到的其他资料&#xff0c;这里主要是记录了笔者的学习过程&#xff0c;难免会有批漏&#xff0c;还烦请…

手写mybatis-预编译后sql语句

sql表 mybatis数据库中的gxa_user表 /*Navicat Premium Data TransferSource Server : rootSource Server Type : MySQLSource Server Version : 80028Source Host : localhost:3306Source Schema : mybatisTarget Server Type : MySQLTarget…

苹果警告部分 iPhone 用户称他们遭到雇佣间谍软件攻击

苹果警告部分 iPhone 用户称他们遭到“雇佣间谍软件攻击 苹果正在提醒用户注意针对 iPhone 的新一轮已识别雇佣间谍软件攻击。可能的受害者已经收到来自苹果的电子邮件&#xff0c;其中描述了该攻击如何“远程破坏 iPhone”。据路透社报道&#xff0c;印度和其他 91 个国家的受…

前端图片在切换暗黑模式时太亮该怎么办?

通过css中的filter属性来实现&#xff0c;进行图片的色系反转、亮度、对比度调整等 1、invert 反转输入图像&#xff0c;值为 100% 则图像完全反转&#xff0c;值为 0% 则图像无变化 filter: invert(1); 2、blur 给元素应用高斯模糊效果。 filter: blur(5px); 3、brightnes…

港中文斯坦福提出SD加速模型PCM,一步即可生成图像和视频,可直接与SD1.5,SDXL,AnimateLCM结合!

又有新的SD加速模型可以用了&#xff0c;PCM解决了原来LCM模型的各种问题。并且对 AnimateLCM 也做了优化&#xff0c;用PCM直接生成动画也可以保证质量了。 PCM从这三个角度说明了LCM的设计空间是有限的并很好地解决了这些限制。 PCM主要改善了三个LCM原有的问题&#xff1a;…

SpringBoot Redis读写与数据序列化 RedisTemplate 与 StringRedisTemplate 防转字节

介绍 RedisTemplate 对象在底层默认会转成字节&#xff0c;造成了内存的开销很大&#xff0c;这是他底层进行处理的,造成可读性差&#xff0c;如需要转成简单的字符串存储需要进行序列化的配置。 RedisTemplate 配置类 Configuration public class RedisConfig {Beanpublic …

文本数据预处理

1.定义 数据预处理:在数据分析之前&#xff0c;对数据进行初步处理 缺失值填写噪声处理不一致数据修正中文分词等 2. 文本数据预处理相关操作 2.1. 中文分词 安装相关库pip install jiaba2.1.1 相关使用 全模式 一段文本种所有可能出现地词语都扫描出来&#xff0c;一段文…

基于pytorch的车牌识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、导入数据 from torchvision.transforms import transforms from torch.utils.data import DataLoader from torchvision import datase…