全志V3S嵌入式驱动开发(spi-nor image制作)

news2024/11/15 19:43:34

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        其实,我们之前就讨论过怎么把image烧入到v3s的spi-nor当中去。当时使用的方法是借助于sunxi-fel工具,烧入的image也比计较小,只是一个uboot bin文件。今天,我们就来讨论一下,一个完整的spi-nor镜像应该如何创建和烧入。

1、创建根文件系统bin文件

        关于根文件系统如何编译,之前在buildroot那篇文章已经讲过。这里讨论的是,怎么把根文件系统压缩成镜像文件。一个完整的镜像文件根本上取决于spi-nor的大小。因为我们选择的存储芯片是MX25L25645G,自身大小是32M,所以给rootfs的空间其实可以这么来安排,

        即0x0~0x100000是uboot空间,0x100000~0x110000是dtb空间,0x110000~0x610000是kernel空间,剩下来的0x610000~都是rootfs的空间。所以rootfs的大小是,

32M-1M-64K-5M=0x19F0000

        创建image过程中涉及到mtd-utils工具安装,

sudo apt-get install mtd-utils

        在用mtd-utils创建image之前,一般先修改下rootfs目录下面文件的权限,不然启动后执行有问题,

sudo chown root * -R 

        设置完权限之后就可以创建镜像文件了,我们选择的文件系统是jffs2,其中0x100表示一个page大小,0x10000表示一个sector大小,0x19f0000表示镜像大小,

 mkfs.jffs2 -s 0x100 -e 0x10000 -p 0x19F0000 -d target/ -o jffs2.img

        注意实际生成的jffs2.img不等于0x19F0000,它还需要copy到总的flashimg.bin当中去。0x19F0000只是表示它可以占领这么大的空间。

2、修改uboot代码

        uboot选用的还是v3s-spi-experimental这个分支,

https://github.com/Lichee-Pi/u-boot/tree/v3s-spi-experimental

        uboot最主要的工作就是修改头文件,位于include/configs/sun8i.h,在“#include <configs/sunxi-common.h> ”的前边添加,

#define CONFIG_BOOTCOMMAND   "sf probe 0; "                           \
                            "sf read 0x41800000 0x100000 0x10000; "  \
                            "sf read 0x41000000 0x110000 0x500000; " \
                            "bootz 0x41000000 - 0x41800000"

#define CONFIG_BOOTARGS      "console=ttyS0,115200 earlyprintk panic=5 rootwait " \
                            "mtdparts=spi0.0:1M(uboot)ro,64k(dtb)ro,5M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2"

        这里面内容比较多,我们可以依次介绍下。

        sf probe 0表示选择第一个 nor flash;

        sf read 0x41800000 0x100000 0x10000表示从flash 0x100000的位置拷贝64k到内存0x41800000的位置;

        sf read 0x41000000 0x110000 0x500000表示从flash 0x110000的位置拷贝5M到内存0x41000000的位置;

        bootz 0x41000000 - 0x41800000表示告诉cpu kernel和dtb位于这两个位置,稍后cpu会跳到kernel的位置继续执行。

        CONFIG_BOOTARGS稍微复杂点,里面有几个地方需要注意下。第一,mtdparts中间一定要写成spi0.0,不能写成spi32766.0,老的kernel版本,比如4.14.y也许可以这样写,但是5.2.y的新kernel一定要写成spi0.0形式;第二,mtdparts中各个部分布局一定要和之前规划的大小一致;第三,kernel的大小一定是5M空间,新的kernel用4M空间已经装不下了。

3、修改kernel

        kernel中有两个地方需要添加一下配置。第一个是“Command line partition table parsing”,

         另外一个,就是“ Journalling Flash File System v2 (JFFS2) support”,它的主要功能就是让kernel支持jffs2文件系统,

         有了这两个配置,重新输入make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-即可。spi的部分,复用之前spi-nor驱动的修改就行,不需要修改设备树。

4、uboot初步尝试

         此时,我们已经准备好了uboot、kernel、dtb和jffs2.img,似乎可以奔着最终的目标去了。不过这里,还是建议大家先借助于uboot+y modem的方法确认kernel和dtb为运行是否ok,没问题了再继续推进。首先还是先用sunxi-fel烧入uboot,等uboot起来之后,借助于uboot下的loady命令将kernel和dtb拷贝到内存当中,再借助于sf erase和sf write将内存中的数据写入flash,这样就可以开始测试uboot了,依次输入命令,

sf probe 0; 
sf read 0x41800000 0x100000 0x10000;
sf read 0x41000000 0x110000 0x500000;

setenv bootargs console=ttyS0,115200 panic=5 rootwait mtdparts=spi0.0:1M(uboot)ro,64k(dtb)ro,5M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2;

bootz 0x41000000 - 0x41800000

        这部分内容和uboot代码修改最大的区别就是setenv命令,当然只是为了满足uboot交互输入的需要。做好了这几个步骤,基本上uboot可以顺利进入kernel了,只是暂时没办法加载根文件系统而已,如下面打印所示,

[    1.408568] VFS: Cannot open root device "31:03" or unknown-block(31,3): error -19
[    1.416257] Please append a correct "root=" boot option; here are the available partitions:
[    1.424673] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,3)
[    1.433020] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.2.0-licheepi-zero #10
[    1.440143] Hardware name: Allwinner sun8i Family
[    1.444877] [<c010ede4>] (unwind_backtrace) from [<c010b764>] (show_stack+0x10/0x14)
[    1.452618] [<c010b764>] (show_stack) from [<c06e1f98>] (dump_stack+0x88/0x9c)
[    1.459837] [<c06e1f98>] (dump_stack) from [<c011dce4>] (panic+0x110/0x2fc)
[    1.466797] [<c011dce4>] (panic) from [<c09012ec>] (mount_block_root+0x218/0x2f4)
[    1.474273] [<c09012ec>] (mount_block_root) from [<c0901594>] (prepare_namespace+0x144/0x188)
[    1.482790] [<c0901594>] (prepare_namespace) from [<c06f86c8>] (kernel_init+0x8/0x10c)
[    1.490701] [<c06f86c8>] (kernel_init) from [<c01010e8>] (ret_from_fork+0x14/0x2c)
[    1.498260] Exception stack(0xc3833fb0 to 0xc3833ff8)
[    1.503306] 3fa0:                                     00000000 00000000 00000000 00000000
[    1.511474] 3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[    1.519640] 3fe0: 00000000 00000000 00000000 00000000 00000013 00000000
[    1.526261] Rebooting in 5 seconds..

5、构建完整的镜像文件

        等uboot加载kernel没有问题之后,就可以着手构建完整的镜像文件了。因为我们之前都已经准备好了uboot、kernel、dtb和jffs2.img,那么再准备一个镜像生成的脚本就可以了,当然首先需要把它们这些文件都copy到同一个目录下面,

dd if=/dev/zero of=flashimg.bin bs=1M count=32
dd if=u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K conv=notrunc
dd if=sun8i-v3s-licheepi-zero-with-480x272-lcd.dtb of=flashimg.bin bs=1K seek=1024  conv=notrunc
dd if=zImage of=flashimg.bin bs=1K seek=1088  conv=notrunc
dd if=jffs2.img of=flashimg.bin  bs=1K seek=6208  conv=notrunc

        脚本共五条命令。第一条,创建一个32M的空白文件flashimg.bin。第二条,导入uboot。第三条导入dtb。第四条,导入kernel zImage。第五条,导入根文件系统jffs2.img。最后我们需要烧入的就是flashimg.bin这个文件。

6、烧入flashimg.bin和启动v3s

        前面我们说过,单纯用sunxi-fel烧入大文件比较容易失败。一个比较务实且快速的办法是,首先利用uboot里面的sf erase命令erase掉整个flash;然后用sd卡启动v3s后,利用dd命令copy flashimg.bin文件。

        第一步,uboot在erase整个flash的时候,不需要担心uboot自身是不是会崩溃。因为,uboot自己是运行在ddr空间里面,而erase的是norflash,

 sf erase 0x0 0x2000000;

        第二步,等v3s用sd卡启动linux之后,norflash就被当成linux的一个外设,所以直接用dd拷贝flashimg.bin即可,它的速度是sunxi-fel的几十倍,还很稳定,

dd if=flashimg.bin of=/dev/mtd0

        做好这一切之后,就可以拔掉sd卡,准备重启v3s开发板了,不出意外,就可以看到v3s顺利启动的打印信息了,甚至看一下mtd的布局,

[    1.411951] vcc3v0: disabling
[    1.414930] vcc3v3: disabling
[    1.417894] vcc5v0: disabling
[    1.420925] ALSA device list:
[    1.423892]   No soundcards found.
[    1.429620] random: fast init done
[    1.473493] random: crng init done
[    4.350019] VFS: Mounted root (jffs2 filesystem) on device 31:3.
[    4.357361] devtmpfs: mounted
[    4.361668] Freeing unused kernel memory: 1024K
[    4.366360] Run /sbin/init as init process
Starting logging: OK
Initializing random number generator... done.
Starting network: OK

Welcome to Buildroot
buildroot login: root
# ls -l
total 0
# ls -l /dev/mtd*
crw-------    1 root     root       90,   0 Jan  1 00:00 /dev/mtd0
crw-------    1 root     root       90,   1 Jan  1 00:00 /dev/mtd0ro
crw-------    1 root     root       90,   2 Jan  1 00:00 /dev/mtd1
crw-------    1 root     root       90,   3 Jan  1 00:00 /dev/mtd1ro
crw-------    1 root     root       90,   4 Jan  1 00:00 /dev/mtd2
crw-------    1 root     root       90,   5 Jan  1 00:00 /dev/mtd2ro
crw-------    1 root     root       90,   6 Jan  1 00:00 /dev/mtd3
crw-------    1 root     root       90,   7 Jan  1 00:00 /dev/mtd3ro

        最后,再确认一下,留给客户的mtd空间大约还剩下多少,

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                26560      5744     20816  22% /
devtmpfs                 27520         0     27520   0% /dev
tmpfs                    28032         0     28032   0% /dev/shm
tmpfs                    28032        20     28012   0% /tmp
tmpfs                    28032        16     28016   0% /run

        32M的总空间,uboot留了1M,dtb可以忽略,kernel大约5M,rootfs大约6M,剩下来的空间也就是32M -1M -5M -6M= 20M的空间了。如果没有图片和视频的话,这个空间用来存储一些程序和配置文件的话,还是比较富余的。

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

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

相关文章

2. 计算点到平面的投影

参考 https://www.cnblogs.com/nobodyzhou/p/6145030.html 所以用各种平面提取算法后&#xff0c;得到的平面方程, 注意此处的平面方程abcd已经是归一化了。 a x b y c z d 0 ax by cz d 0 axbyczd0 此时的原点到该平面点的投影点为 C P ( − a d , − b d , − c …

渗透测试内网基础知识

点赞后看&#xff0c;养成习惯 喜欢的话 可以点个关注哟 你们的点赞支持对博主们来说很重要哦 &#xff01;&#xff01;&#xff01; 为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 内网概述02 工作组03 域04 活动目录05 域控制器和活动目录的…

【C/C++】使用类和对象 设计点和圆的关系案例

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

误删除boot目录 修复办法

误删除boot目录 修复办法 本次演示系统为kylin-v10-sp3-20230324&#xff0c;kernel&#xff1a;4.19.90-52.22.v2207.ky10.x86_64 文章目录 误删除boot目录 修复办法1.报错现象2.正常机器boot目录结构3.误删除boot目录4.故障修复挂载光盘&#xff0c;进入救援模式 5.非正常情况…

mysql8.0.26忘记密码后重置(centos8)

1、查看配置文件地址 mysql --help|grep my.cnf 2、编辑/etc/my.cnf配置文件 vim /etc/my.cnf增加跳过密码配置 [mysqld] skip-grant-tables 3、重启mysql service mysqld restart4、修改密码 use mysql; update user set authentication_string where userroot; FLUSH pr…

NoSQL之Redis配置与优化(初级)理论较多

目录 一、关系数据库与非关系型数据库 1、 关系型数据库 2、 非关系型数据库 二、关系型数据库和非关系型数据库区别 1、 数据存储方式不同 2、 扩展方式不同 3、 对事务性的支持不同 三、非关系型数据库产生背景 1、可用于应对Web2.0纯动态网站类型的三高问题&#xf…

大数据Doris(五十一):Export语法和结果

文章目录 Export语法和结果 一、语法 二、结果 Export语法和结果 一、语法 Export 需要借助 Broker 进程访问远端存储&#xff0c;不同的 Broker 需要提供不同的参数&#xff0c;这里以导出到HDFS为例介绍Export 写法&#xff0c;也可以通过"help export "命令查…

Azure CLI - Premium SSD V1磁盘迁移至Premium SSD V2

目录 1.从服务器卸载Premium SSD V1 磁盘 2.创建Premium SSD V1磁盘snapshot 3.创建Premium SSD V2磁盘 4.挂载Premium SSD V2磁盘到服务器 已经在生产使用的Premium SSD V1磁盘&#xff0c;通过制作快照后&#xff0c;购买Premium SSD V2磁盘。 1.从服务器卸载Premium SSD…

Intellij IDEA detected unusually high memory use

一、IDEA如图 二、解决 2.1 修改IDEA的内存堆 运行IntelliJ IDEA的Java虚拟机&#xff08;JVM&#xff09;分配一些预定义的内存量。默认值取决于平台。如果您遇到速度减慢&#xff0c;可能需要增加内存堆。 为运行IDE分配的堆大小与编译应用程序的堆大小不同。如果要为编译代…

服务行业的企业所得税高,这是为何,该如何解决?

服务行业的企业所得税高&#xff0c;这是为何&#xff0c;该如何解决&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 服务行业的发展历程&#xff0c;源远流长。它是为了满足我们生活中的需要应运而生&#xff0c;大家眼…

广州华锐互动:建筑施工VR虚拟仿真实训系统

VR技术在施工现场安全教育中有着广泛的应用。随着VR技术的不断发展&#xff0c;越来越多的企业开始将其应用于施工现场安全教育中&#xff0c;以提高工人的安全意识和应对能力。 传统的施工现场安全教育往往需要大量的时间和人力物力投入&#xff0c;而且效果并不理想.而VR技术…

生物数据下载

目录 1. 获取数据下载的地址 2. 生物数据常用的下载站点 1、核酸数据库 2、非编码RNA数据库 &#xff08;1&#xff09;.非编码小RNA数据库 &#xff08;2&#xff09;.长非编码RNA数据库&#xff1a; &#xff08;3&#xff09;.非编码RNA家族数据库 &#xff08;4&a…

C++ day41

1、总结类和结构体的区别 结构体中是变量和函数&#xff1b;类中是成员属性(成员变量)、成员方法(成员函数)/行为类的成员变量和成员函数的默认访问权限是私有的&#xff1b;结构体的成员变量和成员函数的默认访问权限是公开的类创建一个对象后&#xff0c;对该对象的任何修改…

2022年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版

2022 年全国硕士研究生入学统一考试管理类专业学位联考数学试题 一、问题求解&#xff1a;第 1∼15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分。下列每题给出的 A、B、C、D、E 五个选项中&#xff0c;只有一项是符合试题要求的&#xff0c;请在答&#xff0e;题&#…

PC市场的寒冬,该如何看待?

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

prometheus告警发送到钉钉群机器人的全部署流程

前置条件&#xff1a;prometheus安装完成&#xff0c;创建钉钉群机器人&#xff0c;我这里使用的是指定ip的方式 定义告警规则 修改Prometheus配置文件prometheus.yml,添加以下配置&#xff1a; rule_files:- /usr/local/prometheus/rules/*.rulesalerting:alertmanagers:- s…

Spring、Bean 创建 和 使⽤

目录 前言 1、创建 Spring 项目 1.1、创建一个 Maven 项目 1.2、在 Maven 项目中&#xff0c;添加 Spring 框架支持&#xff08;spring-context&#xff0c;spring-beans&#xff09; 1.2.1添加依赖 1.2.2 配置国内源 1.2.3 添加maven 1.3、创建一个启动类 和 main 方法…

Mybatis 操作数据库的基本 CRUD 以及查询操作详析

目录 1. 什么是 MyBaits &#xff1f; 2. 搭建 MyBaits 环境 3. 了解 MyBaits 设计模式 MyBaits 操作数据库&#xff1a; 前置工作&#xff1a; &#xff08;1&#xff09;建库建表 &#xff08;2&#xff09; 添加实体类 &#xff08;3&#xff09;添加 Mapper 接口 &#xff…

CPU上下文切换原理剖析

CPU上下文 CPU上下文其实是一些环境正是有这些环境的支撑&#xff0c;任务得以运行&#xff0c;而这些环境的硬件条件便是CPU寄存器和程序计数器。CPU寄存器是CPU内置的容量非常小但是速度极快的存储设备&#xff0c;程序计数器则是CPU在运行任何任务时必要的&#xff0c;里面…

亿级数据过滤算法----布隆过滤器

在程序的世界中&#xff0c;布隆过滤器是程序员的一把利器&#xff0c;利用它可以快速地解决项目中一些比较棘手的问题。如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题。 布隆过滤器&#xff08;Bloom Filter&#xff09;是 1970 年由布隆提出的。它…