从 TF卡升级 f1c100s spinand

开发GUI 便宜好用的ARM 不多见了,f1c100s 作为首选,搜索相关spinand 启动支持 的uboot 帖子大多相当久远,随着uboot的升级 已经支持spinand 启动,但是spl 部分支持任然需要查询相关资料才行;

参考该博主文章,已经写的非常清楚了,但是有一些细节处理不好可能无法从spl 跳转到 uboot 中去

F1C100s支持从SPI-NAND启动了,顺便说下如何向 U-Boot SPL 添加一个Image Loader - IotaHydrae - 博客园 (cnblogs.com)

这里我采用uboot2023.01 地址 ftp.denx.de,测试发现小于该版本则spinand 无法支持 并且dts 设备树没有spi 节点,大于 该版本则编译 python 出错 凡是遇到python 却库或者版本对不上的很难弄 ;

将spl_spi_nand_sunxi.c 放入arch/arm/mach-sunxi/ 后,选择 MTD 支持:

勾选 mtd 命令

加入设备树支持:

&spi0 {pinctrl-names = "default";pinctrl-0 = <&spi0_pc_pins>;status = "okay";flash@0 {#address-cells = <1>;#size-cells = <1>;//compatible = "winbond,w25q128", "jedec,spi-nor";compatible = "spi-nand";reg = <0>;spi-max-frequency = <50000000>;};
};

保存,编译之 ;得到 u-boot-sunxi-with-spl.bin ,准备一张TF 卡,将之烧入,并且格式化为FAT 格式 方便烧入 spinand 中 ;

dd if=u-boot-sunxi-with-spl.bin of=/dev/sdx bs=1024 seek=8

由于spinand 页大小2K ,启动的spl 加载是1K 页加载,则需要把u-boot-sunxi-with-spl.bin 的spl部分打包为1K 页:用到脚本 gen_sunxi_spinand_onlyboot_img.sh 如下 :

#!/usr/bin/env bash
#
# Copyright (C) 2019 Benedikt-Alexander Mokroß (iCOGNIZE GmbH)
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#set -ex
[ $# -eq 4 ] || [ $# -eq 6 ] || {echo "SYNTAX: $0 <outputfile> <u-boot image> <nand page size> <nand block size in KiB> [<spl copies> <u-boot copies>]"echo "Given: $@"exit 1
}OUTPUT="$1"
UBOOT="$2"
PAGESIZE="$3"
BLOCKSIZE="$4"
SPLCOPIES="0"
UBOOTCOPIES="0"[ $# -eq 6 ] && {SPLCOPIES=$(($5 - 1))UBOOTCOPIES=$(($6 - 1))
}# SPL-Size is an uint32 at 16 bytes offset contained in the SPL header
SPLSIZE=$(od -An -t u4 -j16 -N4 "$UBOOT" | xargs)
# The u-boot size is at offset 12 (4. 32-bit int) from the start of u-boot, which is padded 0x2000 bytes (observed) after the SPL
UBOOTSIZE=$(od --endian=big -An -t u4 -j $(($SPLSIZE + 8192 + 12)) -N4 "$UBOOT" | xargs)ALIGNCHECK=$(($PAGESIZE%1024))
if [ "$ALIGNCHECK" -ne "0" ]; thenecho "Page-size is not 1k alignable and thus not supported by EGON"exit -1
fiKPAGESIZE=$(($PAGESIZE/1024))
SPLBLOCKS=$(($SPLSIZE/1024))
LOOPSPLBLOCKS=$(($SPLBLOCKS-1))
SPLENTRYSTEPS=$(($KPAGESIZE * 32))
TOTALSPLSIZE=$((($SPLENTRYSTEPS * $SPLCOPIES) + $SPLBLOCKS))
NEXTPEB=$(($TOTALSPLSIZE + $BLOCKSIZE - ($TOTALSPLSIZE % $BLOCKSIZE)))
UBOOTPEBS=$((($UBOOTSIZE/1024) + $BLOCKSIZE - ($UBOOTSIZE/1024) % $BLOCKSIZE))echo "$@" > $OUTPUT.imgmeta
echo "SPL-size $SPLSIZE">> $OUTPUT.imgmeta
echo "u-boot-size $UBOOTSIZE">> $OUTPUT.imgmeta
echo "block-size 1 KiB" >> $OUTPUT.imgmeta
echo "Page-size $KPAGESIZE KiB">> $OUTPUT.imgmeta
echo "PEB-size $BLOCKSIZE KiB">> $OUTPUT.imgmeta
echo "SPL-count $(($SPLCOPIES + 1))">> $OUTPUT.imgmeta
echo "u-boot-count $(($UBOOTCOPIES + 1))">> $OUTPUT.imgmeta
printf "SPL-entry-steps 0x%x\n" $(($SPLENTRYSTEPS*1024))>> $OUTPUT.imgmeta
echo "SPL-blocks $TOTALSPLSIZE">> $OUTPUT.imgmeta
echo "u-boot-block $UBOOTPEBS">> $OUTPUT.imgmeta
echo "first-u-boot $NEXTPEB">> $OUTPUT.imgmeta
echo "## Layout ##">> $OUTPUT.imgmeta# The BROM of the SUNXI is only able to load 1k per page from SPI-NAND
# Thus, even if we have an 2k or 4k page-size, we have to chunk the SPL in 1k pieces
#
# Entry-Pages:
#          32,      64,      96,      128,      160,      192,      224
# 1k:  0x8000, 0x10000, 0x18000   0x20000,  0x28000,  0x30000,  0x38000
# 2k: 0x10000, 0x20000, 0x30000,  0x40000,  0x50000,  0x60000,  0x70000
# 4K: 0x20000, 0x40000, 0x60000,  0x80000,  0xA0000,  0xC0000,  0xE0000
# 8K: 0x40000, 0x80000, 0xC0000, 0x100000, 0x140000, 0x180000, 0x1C0000echo "Generating 0-image for boot part of size $SPLSIZE ($SPLBLOCKS blocks)"
dd if="/dev/zero" of="$OUTPUT" bs=1024 count=$(($SPLBLOCKS * ($SPLCOPIES + 1)))for splcopy in `seq 0 $SPLCOPIES`;
doecho "SPL Copy $splcopy"printf "spl-%u 0x%x\n" $splcopy $(($SPLENTRYSTEPS * $splcopy * 1024)) >> $OUTPUT.imgmetaecho "Copying block 0 to $(($SPLENTRYSTEPS * $splcopy))"dd if="$UBOOT" of="$OUTPUT" bs=1024 count=2 seek=$(($SPLENTRYSTEPS * $splcopy)) skip=0 conv=notruncfor from in `seq 1 $LOOPSPLBLOCKS`;doto=$((($SPLENTRYSTEPS * $splcopy) + ($from*$KPAGESIZE)))echo "Copying block $from to $to"dd if="$UBOOT" of="$OUTPUT" bs=1024 count=1 seek=$to skip=$from conv=notruncdonedone# it was observed, that u-boot is padded 0x2000 behind the spl. so add 0x2000 (= 8192 -> 8x1024k blocks) to the splsize to get the uboot-entry
for ubootcopy in `seq 0 $UBOOTCOPIES`;
doecho "Appending u-boot to chunked SPL at block $(($NEXTPEB + ($UBOOTPEBS * $ubootcopy))) (origin: $SPLBLOCKS)"dd if="$UBOOT" of="$OUTPUT" bs=1024 seek=$(($NEXTPEB + ($UBOOTPEBS * $ubootcopy))) skip=$(($SPLBLOCKS + 8)) conv=notruncprintf "u-boot-%u 0x%x\n" $ubootcopy $((($NEXTPEB + ($UBOOTPEBS * $ubootcopy)) * 1024)) >> $OUTPUT.imgmeta
done

使用如下,将uboot 打包为 spinand 烧录文件

./gen_sunxi_spinand_onlyboot_img.sh u-boot-sunxi-spinand.bin u-boot-sunxi-with-spl.bin 2048 128

将文件 u-boot-sunxi-spinand.bin 烧写到 TF卡 第一个 FAT 分区下,方便下一步

启动后首先应该加载的TF 卡uboot ,进入uboot 后输入命令 mtd list ,可以扫描到 spinand 

接下来 使用mtd命令 加载 uboot 到 spinand 中 :

完成后断电 ,取下TF 卡 可以看到能从spinand 启动;不过遇到的新的问题,那就是 启动后卡在了 SPL

使用bin查看器 查看uboot-sunxi-spinand.bin  :

这里uboot 的位置 在 8192 ,也就是 8192*16 = 0x2000 的位置 ,查看uboot menuconfig 地址偏移设置 :

将该地址设置为0x20000 ,重新编译,打包spinand烧录文件,烧写启动如下 :

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

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

相关文章

Kubernetes从零到精通(07-工作负载-StatefulSet)

StatefulSet示例 正如Deployment管理无状态应用程序的资源&#xff0c;StatefulSet用来管理有状态应用程序&#xff08;如kafka、redis、zookeeper集群等&#xff09;的资源&#xff0c;它为每个 Pod 分配一个固定的名称和存储&#xff0c;以确保它们可以保留状态&#xff0c;无…

PHP仓库物资出入库管理系统小程序源码

仓库物资出入库管理系统&#xff1a;让库存管理变得井井有条 **&#x1f4e6; 开篇&#xff1a;告别混乱&#xff0c;拥抱智能库存时代 还在为仓库里堆积如山的物资和繁琐的出入库记录而头疼吗&#xff1f;是时候告别那些混乱的日子了&#xff01;“仓库物资出入库管理系统”应…

Redis的持久化和高可用性

目录 一、淘汰策略 1、背景 2、淘汰策略 二、持久化 1、背景 2、fork进程写时复制机制 3、Redis持久化方式 1、aof 2、rdb 三、高可用 1、主从复制 2、Redis哨兵模式 3、Redis cluster集群 一、淘汰策略 1、背景 首先Redis是一个内存数据库&#xff0c;将所有数…

【Python机器学习】序列到序列建模和注意力机制——编码-解码架构

LSTM非常擅长处理序列&#xff0c;但我们需要一对而不是一个LSTM。我们将构建一个模块化的架构&#xff0c;称为编码-解码架构。 编码-解码架构的前半部分是序列编码器&#xff0c;该网络将序列&#xff08;如自然语言文本&#xff09;转换为较低维的表示形式&#xff08;如思…

重生奇迹MU 红龙剑士的风采 游戏玩家的记忆

在重生奇迹MU游戏中&#xff0c;剑士是一个老牌职业&#xff0c;而其中红龙剑士更是备受瞩目的角色。红龙剑士选手身着一身红色龙王装&#xff0c;仿佛已经沐浴了敌人的鲜血&#xff0c;是一个经验丰富的剑手。很多老玩家都信任剑士这个职业&#xff0c;并视其为忠实的伙伴&…

[每周一更]-(第114期):介绍GitLab不同角色对应的权限

文章目录 GitLab 角色及其权限项目级别角色组级别角色 使用场景示例 工作中一直使用Gitlab搭建了公司内网的代码管理工具&#xff0c;但是不同的用户会分配相应的权限&#xff0c;来管理不同用户及角色的权限信息&#xff0c;我们来介绍下角色的信息&#xff0c;方便我们管理公…

C++教程(一):超详细的C++矩阵操作和运算(附实例代码,与python对比)

python教程&#xff08;一&#xff09;&#xff1a;超详细的numpy矩阵操作和运算&#xff08;附实例代码&#xff09; 在之前的章节中&#xff0c;我们详细介绍了python中numpy的矩阵操作。但在自动驾驶开发中&#xff0c;我们一般采用C进行功能开发&#xff0c;因此C矩阵运算…

重学SpringBoot3-集成RocketMQ(二)

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成RocketMQ&#xff08;二&#xff09; 1. 基础概念2. 准备工作3. 实现事务消息的生产者4. 事务监听器实现5. 消费者示例6. 发送事务消息7. 测试7.1 模…

【新片场-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

如何用SQL Server和Oracle进行数据同步?

数据同步是大数据应用中非常重要的环节&#xff0c;它可以保证数据的实时性和一致性&#xff0c;为数据分析和决策提供重要依据。常见的数据同步方式包括ETL实时同步和实时ETL工具&#xff0c;其中实时ETL工具又可以分为基于日志追踪和基于触发器两种。 针对不同的数据库系统&…

在grafana上配置显示全部node资源信息概览

在grafana上配置显示全部node资源信息概览&#xff0c;便于巡检 1&#xff0c;注册grafana官网账号&#xff1a;Grafana dashboards | Grafana Labs&#xfeff; 2、寻找可以展示所有node资源概览信息的dashboard&#xff0c;并下载支持prometheus数据源的dashboard&#xff…

DevOps 中常常被忽略却至关重要的一个工具

在今天的云原生开发时代&#xff0c;DevOps 已经成为许多企业提高开发和运维效率的标准流程。DevOps 工具链广泛而复杂&#xff0c;涵盖了从规划、开发、测试到部署、监控和运维的多个环节。例如&#xff1a;规划与项目管理工具 GitLab、Jira&#xff1b;版本控制工具 Git&…

c++—多态【万字】【多态的原理】【重写的深入学习】【各种继承关系下的虚表查看】

目录 C—多态1.多态的概念2.多态的定义及实现2.1多态的构成条件2.2虚函数的重写2.2.1虚函数重写的两个例外&#xff1a;2.2.1.1协变2.2.1.2析构函数的重写 2.3 c11的override和final2.3.1final2.3.2override 2.4 重载、重写、重定义的对比 3.抽象类3.1抽象类的概念3.2接口继承和…

搜索树和Map

一.搜索树 1.概念 二叉搜索树又叫二叉排序树&#xff0c;它可以是一颗空树也可以是具有以下性质的二叉树 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左子树也分别为二…

Redis 篇-深入了解使用 Redis 中的 GEO 数据结构实现查询附近店铺、BitMap 实现签到功能、HyperLogLog 实现 UV 流量统计

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 GEO 数据结构的基本用法 1.1 使用 GEO 导入数据 1.2 使用 GEO 实现查找附近店铺功能 2.0 BitMap 基本用法 2.1 使用 BitMap 实现签到功能 2.2 统计连续签到功能 3…

windows server2012 配制nginx安装为服务的时候,直接跳要安装.net框架,用自动的安装,直接失败的解决。

1、上一个已成功在安装过程中的图&#xff1a; 2、之前安装过程中错误的图&#xff1a; 3、离线安装解决&#xff1a; 下载.net framework 3.5&#xff0c;然后解压后&#xff0c;选择指定备用源路径&#xff0c;然后选择.net安装包所在目录&#xff1a; 只要指定上面全路径就…

4G模块点对点传输手把手教程!如何实现远程设备直接通信

使用4G模块进行点对点传输&#xff0c;可以实现远程设备的直接通信&#xff0c;广泛应用于工业控制、远程监控、物联网等领域。本教程将详细讲解如何通过4G模块&#xff0c;构建设备之间的点对点&#xff08;P2P&#xff09;传输系统&#xff0c;从配置设备、建立通信通道到实际…

Delphi Web和Web服务开发目前有哪些选择

Delphi Web和Web服务开发目前有哪些选择 Delphi Web和Web服务开发目前有以下几个选择&#xff1a; Delphi MVC Framework&#xff08;https://github.com/delphimvcframework/delphimvcframework&#xff09;&#xff1a;这是一个开源的Delphi Web框架&#xff0c;基于MVC&am…

【Linux】基本指令及其周边知识

1.准备阶段 在介绍Linux的基本指令之前&#xff0c;我先先向大家介绍一下我的Linux平台&#xff0c;首先我是在阿里云买了个服务器&#xff0c;然后使用Xshell来远程登录Linux&#xff0c;之后有关Linux上的操作都是在这上面进行的。如果你也买了相关的服务器并且设置了相关示…

Parallels Desktop19中文版2024九月最新

Parallels Desktop可以使轻松地在 MAC上运行成千上万款 Windows应用程序&#xff0c;如Excel&#xff0c;会计交易软件等。针对最新版 windows11和macOS Sonoma 进行优化。在 MAC虚拟机中跨多个操作系统开发和测试。包含 Parallels Toolbox – 40 多个适用于 Mac 和 PC 的一键…