ZYNQ-Linux为QSPI Flash 配置UBIFS

2023-10-28 10:50
文章标签 配置 linux flash zynq qspi ubifs

本文主要是介绍ZYNQ-Linux为QSPI Flash 配置UBIFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

操作系统:Ubuntu16.04

工具版本:PetaLinux 2018.2

测试硬件:Zynq7010

  •  关于UBIFS

UBIFS是一个新兴的应用于MTD上的有效的文件系统,是更加强壮的FLASH文件系统,在很多嵌入式系统都用到了UBIFS。它可以有效的组织flash的坏块和peb的负载平衡,同时提供访问速度,减小内存消耗,是JFFS2的后续增强版。

Xilinx PetaLinux 2018.2同时也支持UBIFS文件系统,只需要在Linux/Kernel里添加相应的配置选项,就可以在QSPI Flash创建UBIFS文件系统。

  • 为Linux Kernel添加UBIFS配置选项

$ cd <plnx-proj-root>

$ petalinux-config -c kernel

  • 进入内核配置界面,完成如下配置。

可以直接修改.config配置文件(<plnx-proj-root>/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.14-xilinx-v2018.2+gitAUTOINC+ad4cd988ba-r0/linux-plnx_zynq7-standard-build/.config)

CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
# CONFIG_MTD_UBI_GLUEBI is not set
# CONFIG_MTD_UBI_BLOCK is not set
CONFIG_UBIFS_FS=y
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_UBIFS_ATIME_SUPPORT=y
# CONFIG_UBIFS_FS_ENCRYPTION is not set
CONFIG_UBIFS_FS_SECURITY=y
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_LZO=y
# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set

保存配置执行petalinux-build 编译工程。

  • 根据需要,定义FLASH分区大小

启动后,在Linux里通过命令cat /proc/mtd检查。

root@pkk:~# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00500000 00010000 "boot"
mtd1: 00020000 00010000 "bootenv"
mtd2: 00a80000 00010000 "kernel"
mtd3: 00000000 00010000 "spare"

把mtd3分区挂载为UBIFS文件系统,需要先定义FLASH分区大小。

$ cd <plnx-proj-root>

$ petalinux-config

选择-*- Subsystem AUTO Hardware Settings  --->Flash Settings

调整spare size = 0x150000,保存退出。

编译完成后启动,重新通过cat /proc/mtd检查

dev:    size   erasesize  name
mtd0: 00500000 00010000 "boot"
mtd1: 00020000 00010000 "bootenv"
mtd2: 00930000 00010000 "kernel"
mtd3: 00150000 00010000 "spare

  • Linux下创建和挂载UBIFS分区

这里主要用到的ubi命令有:ubiformat、ubiattach、ubimkvol。用到的这些ubi工具位于mtd-utils中,要使用这些命令,需要配置使能mtd-utils。

$ cd <plnx-proj-root>

$ petalinux-config -c rootfs

依次选择Filesystem Packages  → base  → mtd-utils

保存配置并编译工程。

如果是第一次启动,在Linux里创建和挂载UBIFS分区,分别执行如下命令:

root@pkk:/# mkdir -p /qspi_fs
root@pkk:/# ubiformat /dev/mtd3
ubiformat: mtd3 (nor), size 1376256 bytes (1.3 MiB), 21 eraseblocks of 65536 bytes (64.0 KiB), min. I/O size 1 bytes
libscan: scanning eraseblock 20 -- 100 % complete  
ubiformat: 21 eraseblocks are supposedly empty
ubiformat: formatting eraseblock 20 -- 100 % complete 

root@pkk:/# ubiattach /dev/ubi_ctrl -m 3
ubi0: attaching mtd3
ubi0: scanning is finished
ubi0: attached mtd3 (name "spare", size 1 MiB)
ubi0: PEB size: 65536 bytes (64 KiB), LEB size: 65408 bytes
ubi0: min./max. I/O unit sizes: 1/256, sub-page size 1
ubi0: VID header offset: 64 (aligned 64), data offset: 128
ubi0: good PEBs: 21, bad PEBs: 0, corrupted PEBs: 0
ubi0: user volume: 0, internal volumes: 1, max. volumes count: 128
ubi0: max/mean erase counter: 0/0, WL threshold: 4096, image sequence number: 2111101756
ubi0: available PEBs: 17, total reserved PEBs: 4, PEBs reserved for bad PEB handling: 0
ubi0: background thread "ubi_bgt0d" started, PID 794
UBI device number 0, total 21 LEBs (1373568 bytes, 1.3 MiB), available 17 LEBs (1111936 bytes, 1.1 MiB), LEB size 65408 bytes (63.9 KiB)

root@pkk:/# ubimkvol /dev/ubi0 -N qspi_ubi0 -m
Set volume size to 1111936
Volume ID 0, size 17 LEBs (1111936 bytes, 1.1 MiB), LEB size 65408 bytes (63.9 KiB), dynamic, name "qspi_ubi0", alignment 1
root@pkk:/# mount -t ubifs /dev/ubi0_0 /qspi_fs
UBIFS (ubi0:0): default file-system created
UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 797
UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "qspi_ubi0"
UBIFS (ubi0:0): LEB size: 65408 bytes (63 KiB), min./max. I/O unit sizes: 8 bytes/256 bytes
UBIFS (ubi0:0): FS size: 588672 bytes (0 MiB, 9 LEBs), journal size 457857 bytes (0 MiB, 5 LEBs)
UBIFS (ubi0:0): reserved for root: 27803 bytes (27 KiB)
UBIFS (ubi0:0): media format: w5/r0 (latest is w5/r0), UUID E5EA7B3D-BAAF-4E43-A9E3-6FBAD021CE48, small LPT model

如果不是第一次启动,直接在Linux里挂载UBIFS分区。

$ ubiattach /dev/ubi_ctrl -m 3
$ mount -t ubifs /dev/ubi0_0 /qspi_fs

进一步验证UBIFS文件系统存储功能:

$ cd /qspi_fs

$ touch ubifs.txt

创建一个ubifs.txt文件,重启系统,按照上述步骤重新挂载UBIFS,进入到qspi_fs文件夹,查看ubifs.txt文件存在。

ok,到这里配置UBIFS文件系统基本就完成了。

接下来需要写个脚本文件实现开机自动挂载UBIFS的功能,我把这些步骤添加到程序自启动脚本中,基本实现了自动挂载功能。

#!/bin/sh

DAEMON=/usr/bin/pkk
UBI0=/dev/ubi0_0

start ()
{
#------------------------------------------------------
    mkdir -p /qspi_fs
    ubiattach /dev/ubi_ctrl -m 3
    sleep 1
    if [-e $UBI0 ]; then
        mount -t ubifs $UBI0 /qspi_fs
    else
        ubiformat /dev/mtd3
        ubiattach /dev/ubi_ctrl -m 3
        ubimkvol /dev/ubi0 -N qspi_ubi0 -m
        mount -t ubifs $UBI0 /qspi_fs
    fi
#------------------------------------------------------
    echo " Starting pkk"
    start-stop-daemon -S -o --background -x $DAEMON
}
stop ()
{
    echo " Stoping pkk"
    start-stop-daemon -K -x $DAEMON
}
restart()
{
    stop
    start
}
[ -e $DAEMON ] || exit 1
    case "$1" in
        start)
            start; ;;
        stop)
            stop; ;;
        restart)
            restart; ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
    esac
exit $?

总结一下自己在配置过程中遇到最大的坑就是ubi命令工具找不到,刚开始参照Xilinx社区论坛里面的帖子:http://xilinx.eetrend.com/content/2019/100042628.html

按照上面的步骤一步步的进行配置,最终倒在了第二步,在u-boot里面添加ubifs配置上面,可能编译环境的差异或者还有其他一些关键配置选项没有使能,在编译过程中始终报错。接下来两天在网上各种搜索错误原因,期望解决编译错误,最后都已经放弃了,无意中在配置rootfs时发现mtd-utils选项,里面包括mtd-utils-ubifs配置选项,看到这个的一瞬间感觉希望来了,迫不及待的试了一下,果然成功了,致不期而遇的美好。

 

 

 

 

 

 

 

 

 

这篇关于ZYNQ-Linux为QSPI Flash 配置UBIFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292697

相关文章

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大