S5P6818_系统篇(2)源码编译及烧录

news2024/12/1 0:37:48

源码获取

源码获取和操作流程

1.下载liunux下的系统制作脚本,可以烧录系统和构建镜像

git clone https://github.com/friendlyarm/sd-fuse_s5p6818.git

如果出现git错误可使用如下方法:

git config --global http.sslverify false

2.阅读该工具readme

sd-fuse_s5p6818

简介

sd-fuse 提供一些工具和脚本, 用于制作SD卡固件, 具体用途如下:

  • 制作分区镜像文件, 例如将rootfs目录打包成rootfs.img
  • 将多个分区镜像文件打包成可直接写SD卡的单一镜像文件
  • 简化内核和uboot的编译, 一键编译内核、第三方驱动, 并更新rootfs.img中的内核模块

其他语言版本: English

运行环境

  • 在电脑主机端使用
  • 推荐的操作系统: Ubuntu 18.04及以上64位操作系统
  • 推荐运行此脚本初始化开发环境: https://github.com/friendlyarm/build-env-on-ubuntu-bionic

支持的内核版本

sd-fuse 使用不同的git分支来支持不同的内核版本, 当前支持的内核版本为:

  • 4.4.y

其他内核版本, 请切换到相应的git分支

支持的目标板OS

  • lubuntu
  • friendlycore
  • friendlycore-arm64
  • friendlycore-lite-focal
  • friendlycore-lite-focal-arm64
  • android
  • android7
  • friendlywrt

这些OS名称是分区镜像文件存放的目录名, 在脚本内亦有严格定义, 所以不能改动, 例如要制作friendlycore-arm64的SD固件, 可使用如下命令:

./mk-sd-image.sh friendlycore-arm64

获得打包固件所需要的素材

制作固件所需要的素材有:

  • 内核源代码: 在网盘的 “07_源代码” 目录中, 或者从此github链接下载, 分支为nanopi2-v4.4.y
  • uboot源代码: 在网盘的 “07_源代码” 目录中, 或者从此github链接下载, 分支为nanopi2-v2016.01
  • 分区镜像文件: 在网盘的 “03_分区镜像文件” 目录中, 或者从此http链接下载
  • 文件系统压缩包: 在网盘的 “06_文件系统” 目录中, 或者从此http链接下载

如果没有提前准备好文件, 脚本亦会使用wget命令从http server去下载, 不过因为http服务器带宽不足的关系, 速度可能会比较慢。

脚本功能

  • fusing.sh: 将镜像烧写至SD卡
  • mk-sd-image.sh: 制作SD卡镜像
  • mk-emmc-image.sh: 制作eMMC卡刷固件(SD-to-eMMC)
  • build-boot-img.sh: 将指定目录打包成boot镜像(boot.img)
  • build-rootfs-img.sh: 将指定目录打包成文件系统镜像(rootfs.img)
  • build-kernel.sh: 编译内核,或内核头文件
  • build-uboot.sh: 编译uboot

如何使用

重新打包SD卡运行固件

注: 这里以friendlycore-arm64系统为例进行说明
下载本仓库到本地, 然后下载并解压friendlycore-arm64系统的分区镜像文件压缩包, 由于http服务器带宽的关系, wget命令可能会比较慢, 推荐从网盘上下载同名的文件:

git clone https://github.com/friendlyarm/sd-fuse_s5p6818 -b master sd-fuse_s5p6818
cd sd-fuse_s5p6818
wget http://112.124.9.243/dvdfiles/s5p6818/images-for-eflasher/friendlycore-arm64-images.tgz
tar xvzf friendlycore-arm64-images.tgz

解压后, 会得到一个名为friendlycore-arm64的目录, 可以根据项目需要, 对目录里的文件进行修改, 例如把rootfs.img替换成自已修改过的文件系统镜像, 或者自已编译的内核和uboot等, 准备就绪后, 输入如下命令将系统映像写入到SD卡 (其中/dev/sdX是你的SD卡设备名):

sudo ./fusing.sh /dev/sdX friendlycore-arm64

或者, 打包成可用于SD卡烧写的单一镜像文件:

./mk-sd-image.sh friendlycore-arm64

命令执行成功后, 将生成以下文件, 此文件可烧写到SD卡运行:

out/s5p6818-sd-friendly-core-xenial-4.4-arm64-YYYYMMDD.img

重新打包 SD-to-eMMC 卡刷固件

注: 这里以friendlycore-arm64系统为例进行说明
下载本仓库到本地, 然后下载并解压分区镜像文件压缩包, 这里需要下载friendlycore-arm64和eflasher系统的文件:

git clone https://github.com/friendlyarm/sd-fuse_s5p6818 -b master sd-fuse_s5p6818
cd sd-fuse_s5p6818
wget http://112.124.9.243/dvdfiles/s5p6818/images-for-eflasher/friendlycore-arm64-images.tgz
tar xvzf friendlycore-arm64-images.tgz
wget http://112.124.9.243/dvdfiles/s5p6818/images-for-eflasher/emmc-flasher-images.tgz
tar xvzf emmc-flasher-images.tgz

再使用以下命令, 打包卡刷固件, autostart=yes参数表示使用此固件开机时,会自动进入烧写流程:

./mk-emmc-image.sh friendlycore-arm64 autostart=yes

命令执行成功后, 将生成以下文件, 此文件可烧写到SD卡运行:

out/s5p6818-eflasher-friendly-core-xenial-4.4-arm64-YYYYMMDD.img

定制文件系统

注: 这里以friendlycore-arm64系统为例进行说明
下载本仓库到本地, 然后下载并解压分区镜像压缩包:

git clone https://github.com/friendlyarm/sd-fuse_s5p6818 -b master sd-fuse_s5p6818
cd sd-fuse_s5p6818
wget http://112.124.9.243/dvdfiles/s5p6818/images-for-eflasher/friendlycore-arm64-images.tgz
tar xvzf friendlycore-arm64-images.tgz

下载文件系统压缩包并解压, 需要使用root权限, 因此解压命令需要加上sudo:

wget http://112.124.9.243/dvdfiles/s5p6818/rootfs/rootfs-friendlycore.tgz
sudo tar xzf rootfs-friendlycore.tgz

可以根据需要, 对文件系统目录进行更改, 例如:

sudo sh -c 'echo hello > friendlycore-arm64/rootfs/root/welcome.txt'

用以下命令将文件系统目录打包成 rootfs.img:

sudo ./build-rootfs-img.sh friendlycore-arm64/rootfs friendlycore-arm64

最后打包成SD卡镜像文件:

./mk-sd-image.sh friendlycore-arm64

或生成SD-to-eMMC卡刷固件:

./mk-emmc-image.sh friendlycore-arm64

文件系统Tips:

  • 可利用debootstrap工具对文件系统进行定制, 预装软件包等

编译内核

注: 这里以friendlycore-arm64系统为例进行说明
下载本仓库到本地, 然后下载并解压分区镜像压缩包:

git clone https://github.com/friendlyarm/sd-fuse_s5p6818 -b master sd-fuse_s5p6818
cd sd-fuse_s5p6818
wget http://112.124.9.243/dvdfiles/s5p6818/images-for-eflasher/friendlycore-arm64-images.tgz
tar xvzf friendlycore-arm64-images.tgz

从github克隆内核源代码到本地, 用环境变量KERNEL_SRC来指定本地源代码目录:

export KERNEL_SRC=$PWD/kernel
git clone https://github.com/friendlyarm/linux -b nanopi2-v4.4.y --depth 1 ${KERNEL_SRC}

根据需要配置内核:

cd $KERNEL_SRC
touch .scmversion
make ARCH=arm nanopi3_linux_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig     # 根据需要改动配置
make ARCH=arm CROSS_COMPILE=arm-linux- savedefconfig
cp defconfig ./arch/arm/configs/my_defconfig                  # 保存配置 my_defconfig
git add ./arch/arm/configs/my_defconfig
cd -

使用KCFG环境变量指定内核的配置 (KERNEL_SRC指定源代码目录), 使用你的配置编译内核:

export KERNEL_SRC=$PWD/kernel
export KCFG=my_defconfig
./build-kernel.sh friendlycore-arm64

编译 u-boot

注: 这里以friendlycore-arm64系统为例进行说明
下载本仓库到本地, 然后下载并解压分区镜像压缩包:

git clone https://github.com/friendlyarm/sd-fuse_s5p6818 -b master sd-fuse_s5p6818
cd sd-fuse_s5p6818
wget http://112.124.9.243/dvdfiles/s5p6818/images-for-eflasher/friendlycore-arm64-images.tgz
tar xvzf friendlycore-arm64-images.tgz

从github克隆与OS版本相匹配的u-boot源代码到本地, 环境变量UBOOT_SRC用于指定本地源代码目录:

export UBOOT_SRC=$PWD/uboot
git clone https://github.com/friendlyarm/u-boot -b nanopi2-v2016.01 --depth 1 ${UBOOT_SRC}
./build-uboot.sh friendlycore-arm64

Tips: 如何查询SD卡的设备文件名

在未插入SD卡的情况下输入:

ls -1 /dev > ~/before.txt

插入SD卡,输入以下命令查询:

ls -1 /dev > ~/after.txt
diff ~/before.txt ~/after.txt

安装交叉编译器

安装库:

apt install liblz4-tool android-tools-fsutils

下载交叉编译器:

git clone https://github.com/friendlyarm/prebuilts.git -b master --depth 1

在/opt目录下存放编译器:

sudo mkdir -p /opt/FriendlyARM/toolchain

将交叉编译器解压到/opt目录下:

Sudo tar xf prebuilts/gcc-x64/aarch64-cortexa53-linux-gnu-6.4.tar.xz -C /opt/FriendlyARM/toolchain/

编译

编译准备

编译前需要安装如下软件包:

#解决menuconfig报错问题
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
#解决编译设备树报错问题
sudo apt-get install device-tree-compiler
#解决内核报错openssl头文件找不到
sudo apt-get install libssl-dev

编译uboot

#参数根据自己要编译的系统而定,build-uboot脚本可能存在一些问题,比如指定的uboot源码路径在out目录下,根据情况自行修改。
./build-uboot.sh friendlycore-arm64

如图,编译完成后生成u-boot.bin,脚本使用该文件生成了fip-nonsecure.img,然后将该镜像更新到系统镜像目录用于烧录。

编译kernel

#系统类型根据情况自行修改
./build-kernel.sh friendlycore-arm64

内核编译完成生成boot.img,同时还会打包内核模块,重新生成文件系统,并且修改分区表,使用脚本编译使内核编译工作变得简单。

烧录

烧录命令:

sudo ./fusing.sh /dev/sdX friendlycore-arm64

指定烧录的SD卡设备名,后面跟系统名,即可一键烧录系统

本系列文章硬件使用友善 nanopi fire3

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

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

相关文章

Linux文件系统操作与磁盘管理

查看磁盘和目录的容量 使用 df 命令查看磁盘的容量 df在实验楼的环境中你将看到如下的输出内容: 但在实际的物理主机上会更像这样: 物理主机上的 /dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示…

Magisk Yyds.Msu定制方案 原理 ROOT隐藏 风控绕过

介绍 与市面上所有方案都不一样,基于最新Magisk代码分支,通过修改Magisk的挂载方式,解决了root隐藏的问题,可绕过如momo独立进程,挂载检测等各种风控,并因为个人项目原因,默认把Zygisk禁用&…

【手把手一起学习】(二) Altium Designer 20 工程创建

1 Altium Designer 20 工程创建 手把手一起学习,从零开始制作一款属于自己的STM32核心板,规范AD使用,养成良好习惯 1.1 新建工程 首先,创建工程,操作如图所示: 选择默认工程,输入工程名字和路…

吊炸天的1500亿,到底有多魔性

超1500亿的数据安全规模 数据安全是近几年来最热门的行业话题,数字化转型使得数据作为新型生产要素的重要性日益凸显,数据经济已成为经济发展的核心驱动力,数字经济的蓬勃催生了巨大的数据安全需求。 临近春节前夕,在工信部、国…

Java API 文档搜索引擎

1. 认识搜索引擎:在搜狗搜索的搜索结果页中, 包含了若干条结果, 每一个结果包含了图标, 标题, 描述, 展示URL等搜索引擎的本质:输入一个查询词, 得到若干个搜索结果, 每个搜索结果包含了标题, 描述, 展示URL和点击URL2. 搜索引擎思路:2.1 搜索的核心思路:当前我们有很多的网页(…

日志收集笔记(架构设计、Log4j2项目初始化、Lombok)

1 架构设计 ELK 技术栈架构设计图: 从左往右看, Beats:主要是使用 Filebeat,用于收集日志,将收集后的日志数据发送给 Kafka,充当 Kafka 的生产者Kafka:高性能消息队列,主要起缓冲…

GitHub标星30K+的Java面试八股文长啥样?

2023年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套1000道的Java面试手册我整理了整整1个月,上传到Git上目前star数达到了30K 一、32 道 MySQL 面试题 1&…

论文阅读:RA-Depth: Resolution Adaptive Self-Supervised Monocular Depth Estimation

中文标题: 分辨自适应自监督单目深度估计 提出问题 传统的无监督深度估计方法如果在固定分辨率上训练,则迁移到其他分辨率上存在严重退化。 创新点 提出一种分辨率自适应的无监督深度学习框架(RA-Depth)来学习场景深度尺度不变性。具体地…

postman入门到精通之【接口知识准备】(一)

postman入门到精通之【接口知识准备】(一) 目录:导读 前言 接口测试概念 接口测试 接口测试的原理 常用接口测试工具 接口测试基础知识 接口的定义 接口的分类 HTTP接口 Web Service接口 RESTful接口 HTTP请求 统一资源定位符&…

使用终端工具给你的电脑发送弹窗提醒

大家好,我是良许。 现在人手一部智能手机,这些智能手机都有个非常实用的功能,那就是弹窗提醒。当我们收到短信,或者微信信息时,手机就会弹窗显示信息的大致内容。有了这个功能你就不会错过重要信息了。 电脑上也有类…

Android 流量统计

Android 流量统计最近项目上有一个应用流量统计的功能需要实现,在此总结一下 流量统计架构 在Android9.0之前,流量监控是基于xt_qtaguid模块的,通过读取/proc/net/xt_qtaguid/stats文件内容进行解析获取对应流量数据。 Android9.0之后&…

51单片机学习笔记_12 LCD1602 原理及其模块化代码

LCD1602 liquid crystal display 液晶显示屏,一种字符型液晶显示模块,可以显示 16*2 个字符,每个字符是 5*7 点阵。 P0 P2 会和数码管、LED 一定程度上冲突。 地。 Vcc。 调对比度的。 RS:数据指令端。1代表 DB 是数据&#x…

想要去字节跳动面试Android岗,给你这些面试知识点

关于面试字节跳动,我总结一些面试点,希望可以帮到更多的小伙伴,由于篇幅问题这里没有把全部的面试知识点问题都放上来!!目录:1.网络2.Java 基础&容器&同步&设计模式3.Java 虚拟机&内存结构…

实操go开发环境的配置

1、Go 安装包下载,下载地址如下: go语言中文网下载(本人电脑的系统是Windows,这里以Windows版本的安装包为例,安装就是傻瓜式安装,只要点下一步–下一步–完成就可以了,本人安装在C盘下。 我…

AQS学习:ReentrantLock源码解析

前言 多线程知识中理解了ReentrantLock之后,对于整个AQS也会有大概的理解,后面再去看其它锁的源码就会比较容易。下面带大家一块来学习ReentrantLock源码。 概述 ReentrantLock是可重入的互斥锁,虽然具有与synchronized相同功能&#xff0…

App.vue中读取不到路由的信息

问题: ​ 首先定义了一个路由,并且在路由元里面存储了一个变量,在App.vue里面访问这个变量的时候却显示undefined!在路由对应的组件中却能访问到! 定义的路由元信息: 为啥访问不到…,懵逼的我在App.vue里…

宝塔面板公网ip非80端口非443端口部署ssl

有不少人使用家用宽带,虽然申请下来了公网ip,但是运营商封了80与443端口,但仍想使用ssl证书 一、仅封80端口 1、先在宝塔面板里创建网站,域名为test.xxx.cn:8085 2、再到域名运营商做A记录解析,此时可以通过http://…

不同语言下的定时器,你都掌握了吗?

我们大家都对定时器不陌生,无论是现实中还是项目中,都离不开定时。在现实中,它叫闹钟,在项目上,它叫定时器,即定时触发某件事情。它能帮助我们在某一个既定的时间节点上,来提醒我们做一些事情&a…

Markdown基本语法简介

前言:当你在git平台创建一个仓库时,平台会自动创建一个README.md文件,并将它的内容展现在web端页面,方面其他读者查阅。README.md实则是一个适用Markdown语法的文本文件,从他的后缀md即可看出它是Markdown的缩写。在gi…

实战:kubeadm方式搭建k8s集群(k8s-v1.22.2,containerd-v1.5.5)-2023.2.22(测试成功)

实验环境 1、硬件环境 3台虚机 2c2g,20g。(nat模式,可访问外网) 角色主机名ipmaster节点master1172.29.9.51node节点node1172.29.9.52node节点node2172.29.9.53 2、软件环境 软件版本操作系统centos7.6_x64 1810 mini(其他centos7.x版本也行)containerdv1.5.5ku…