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

news2024/11/26 4:34:04

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盘)-基础资料

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

X86+FPGA方案:铁路货车装载视频智能监视系统应用

如果说高铁技术的问世开启了铁路运输的“速度革命”&#xff0c;那么人工智能技术的应用则将造就铁路出行的“智能革命”。铁路是国民经济的大动脉&#xff0c;铁路运输安全不仅影响铁路本身的效率和效益&#xff0c;更直接影响了整个社会的生产生活和稳定和谐。铁路货物运输是…

【笔记】1/4被动悬架垂向动力学仿真+频域特性分析

1/4被动悬架 代码&#xff1a; %书第156页、159页 clc clear close all %% 一.悬架参数 ms320; mw50; Ks22000; Cs1500; Kw195000; f00.07; %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 二.垂向振动动力学仿真 %% 二.1.状态方程 A [0 1 0 -1;.…

LlamaIndex三 配置

前言 在上篇LlamIndex二 RAG应用开发 - 掘金 (juejin.cn)中&#xff0c;我们学习到LlamaIndex对RAG的全面支持。这篇文章&#xff0c;我们就来细化这个过程&#xff0c;尝试各种配置选项&#xff0c;满足不同场景需求。学习过后&#xff0c;大家再开发RAG应用&#xff0c;会更…

数据库优化sql的方案

一&#xff1a; 插入数据的优化 1.insert 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化 优化方案一 批量插入数据 Insert into tb_test values(1,Tom),(2,Cat),(3,Jerry); 优化方案二 start transaction; insert into tb_test values(…

qwen2 vllm推理部署;openai接口调用

参考: https://qwenlm.github.io/zh/blog/qwen2/ 下载 https://huggingface.co/Qwen 下载的Qwen2-7B-Instruct使用: export HF_ENDPOINT=https://hf-mirror.comhuggingface-cli download --resume-download --local-dir-use-symlinks False Qwen/Qwen2-7B-Instruct

webpack 优化构建速度的插件

1.HardSourceWebpackPlugin本地缓存 HardSourceWebpackPlugin这个插件比DLL动态链接库更优秀 HardSourceWebpackPlugin是webpack的插件&#xff0c;为模块提供中间缓存步骤。为了查看结果&#xff0c;您需要使用此插件运行webpack两次&#xff1a;第一次构建将花费正常的时间…

mysql中事务的简介

大家好。我们在日常开发过程中肯定都或多或少的用到过事务&#xff0c;而且在面试时&#xff0c;数据库的事务也是必问内容之一。今天我们就来说说mysql的事务。 为了方便我们下面内容的讲解&#xff0c;我们也先建立一个讲事务必用的表–account表&#xff0c;并在表中插入两…

zoomeye api报错 request invalid, validate usage and try again

项目场景&#xff1a; 调用zoomeye的api接口进行数据拿取 问题描述 之前接口一直通着今天突然报错&#xff0c;以下为源代码 pip install zoomeye from zoomeye.sdk import ZoomEye zm ZoomEye(api_key"34A8B452-D874-C63E0-8471-F3D4f89766f") zm.dork_search(a…

Python 将CSV文件转为PDF文件

CSV文件通常用于存储大量的数据&#xff0c;而PDF文件则是一种通用的文档格式&#xff0c;便于与他人共享和打印。将CSV文件转换成PDF文件可以帮助我们更好地管理和展示数据。本文将介绍如何通过Python编程将CSV文件导出为PDF文件。 Python Excel库安装及介绍 在 Python 中&am…

《手把手教你》系列练习篇之12-python+ selenium自动化测试(详细教程)

1. 简介 前面文章我们了解了如何获取元素的text属性值&#xff0c;和判断元素是否显示在页面&#xff08;is_displayed()方法&#xff09;&#xff0c;本文我们来学习下&#xff0c;判断一个控件是否被选中状态、获取页面元素的大小、组合键-全选文字、组合键-退格键删除文本和…

农业乡村振兴,绿意盎然谱新篇

乡村振兴&#xff0c;不仅是经济的繁荣&#xff0c;更是文化的传承和生态的保护。让我们以更加饱满的热情&#xff0c;投身到乡村建设中来&#xff0c;助力农业现代化&#xff0c;提升农村居民生活品质。 农业乡村振兴的吴总说&#xff1a;在这片热土上&#xff0c;农业承载着国…

简单聊聊大数据分析的方法有什么

大数据分析是指对规模巨大的数据集合进行的分析过程。 这些数据集合通常具有以下几个特点&#xff0c;可以概括为5个V&#xff1a; 1.数据量大&#xff08;Volume&#xff09;&#xff1a;大数据分析处理的数据量巨大&#xff0c;远远超出了传统数据处理软件的能力范围。 2.…

Diffusers代码学习: IP-Adapter

从操作的角度来看&#xff0c;IP-Adapter和图生图是很相似的&#xff0c;都是有一个原始的图片&#xff0c;加上提示词&#xff0c;生成目标图片。但它们的底层实现方式是完全不一样的&#xff0c;我们通过源码解读来看一下。以下是ip adapter的实现方式 # 以下代码为程序运行…

语音降噪算法库介绍

一.语音降噪技术方向介绍 软件上进行语音降噪目前主要是两个方向&#xff1a;传统降噪算法和AI降噪算法&#xff0c;他们各有千秋&#xff0c;目前看他们各有千秋&#xff0c;有各自适用场景。 推荐一个不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;内容全面&#…

【Python报错】已解决AttributeError: list object has no attribute items ( Solved )

解决Python报错&#xff1a;AttributeError: list object has no attribute ‘items’ (Solved) 在Python中&#xff0c;AttributeError通常表示你试图访问的对象没有你请求的属性或方法。如果你遇到了AttributeError: list object has no attribute items的错误&#xff0c;这…

Si3N4/SiC纳米复相陶瓷综合性能明显提升 下游可应用范围广泛

Si3N4/SiC纳米复相陶瓷综合性能明显提升 下游可应用范围广泛 Si3N4/SiC纳米复相陶瓷&#xff0c;是以碳化硅&#xff08;SiC&#xff09;纳米颗粒为第二相&#xff0c;弥散进入氮化硅&#xff08;Si3N4&#xff09;基体相制备得到的新型陶瓷材料&#xff0c;对碳化硅陶瓷具有强…

【AIOT-Robot】3D pos 相关

1. Mediapipe 3D detection 使用移动增强现实(AR)会话数据(session data),开发了新的数据pipeline。大部分智能手机现在都具备了增强现实的功能,在这个过程中捕捉额外的信息,包括相机姿态、稀疏的3D点云、估计的光照和平面。 利用相机的姿势、检测到的平面、估计的照明,来生…

从LangChain迈出学习人工智能第一步入门指南

什么是langchain LangChain是一个用于开发由语言模型驱动的应用程序的框架,致力于简化AI模型应用的开发.简单来说,langchain就是一个帮助开发者轻松完成AI模型应用开发的框架,现在支持python和js两个版本,它集成多种大语言模型及第三方api. 对于使用langchain,把它当作一个第三…

禁用layui树形表格的多选框checkbox

1. 背景 在使用树形表格渲染数据时&#xff0c;需要对数据进行批量操作。相对于选中数据后&#xff0c;再做错误提示。直接把数据的多选框禁用掉更加直观。 2. 实现 DisabledTableCheckBox: () > {// 获取所有行 var tableElem $(".layui-table-fixed-l");var …

Vue3+vite部署nginx的二级目录,使用hash模式

修改router访问路径 import { createRouter, createWebHashHistory } from vue-routerconst router createRouter({history: createWebHashHistory (/mall4pc-bbc/),routes: [XXX,] })配置package.json文件 "build:testTwo": "vite build --mode testing --ba…