全志V3S嵌入式驱动开发(基于usb otg的spi-nor镜像烧入)

news2024/9/20 22:50:49

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

        说到了用usb otg来实现spi nand flash的烧入,这中间主要用到了PhoenixSuit软件。那么怎么用usb otg来实现spi nor flash的烧入呢?这里就不得不提到sunxi-tools这个工具。这个工具目前有windows本版本和linux版本。中间还会涉及到libusb这个库,为了使用的方便,我们决定用linux版本的sunxi-tools来实现spi nor flash的烧入。

1、将 usb otg口导入到virtualbox当中

         上一篇文章的时候,我们说过v3s怎么进入usb otg了。主要就是这么几个步骤,拔掉sd卡、同时按下s6和s5、先松开s5、几秒后再松开s6即可。前面说过,在windows环境下用PhoenixSuit安装对应的驱动就可以了。如果是linux,那么就需要先让虚拟机里面的ubuntu看到这个usb设备,本质上,这和u盘、usb camera是一样的。

        有了上面这个操作之后,每次usb设备插入的时候,只要虚拟机开着,都会被虚拟机优先接管过来。

2、安装sunxi-tools工具

        将usb设备导入到虚拟机ubuntu之后,下一步就是安装sunxi-tools工具。下载的地址如下所示,注意一定是v3s-spi这个分支,

https://github.com/Icenowy/sunxi-tools/tree/v3s-spi

        网上关于sunxi-tools的下载地址很多,使用的同学最好多多测试,选用比较适合自己的版本。下载好代码之后,接着就是解压和编译。编译的过程中,最好先安装下libusb库,

sudo apt-get install libusb-1.0-0-dev

        编译本身就很简单了,进入目录直接make就好了。如果过程当中没有什么问题的话,那么就可以生成我们需要的sunxi-fel这个工具了。

make

3、替换nandflash为norflash

        之前的开发板使用的是nandflash,型号是mx35lf1ge4ab。这次为了测试,我们需要换一个norflash,不失一般性,选用了mx25l25645这款芯片。两款芯片都属于mxic公司的。一般来说nandflash大一点,会有512m、1g、2g这样的几个规格。而norflash则小得多,一般也就是128m、256m比较常见。

        这里,我们选用mx25l25645,其大小是256m bit,换成byte是32m。主要也是考虑了将来的用户使用情况。此外,之前的nandflash是qfn封装,可以选用热风枪来吹下来,而换上去的mx25l25645则引脚较长,直接用烙铁替换即可,注意一下方向就行。

4、使用sunxi-tools

        换好了norflash之后,就可以开始准备测试了。这个时候flash本身还是一个白片,里面没有任何的系统。此外,我们还拔掉了sd卡,所以直接上电之后,v3s就会自己进入usb状态,在ubuntu中开始输入sunxi-fel命令确认,usb设备已经被找到,

shell> sudo ../sunxi-tools-3s-spi/sunxi-fel version
AWUSBFEX soc=00001681(V3s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000

        如果看到这样的打印,就可以确认usb已经接入了。如果还是不确认,我们可以换一个命令试一下,

shell> sudo ../sunxi-tools-3s-spi/sunxi-fel -l
USB device 001:054   Allwinner V3s     12c00001:54304620:79304914:2c2c0f50

        看到设备接进来之后,下面一步需要做的就是确认spiflash设备同样被识别到了,继续输入命令,

shell> sudo ../sunxi-tools-3s-spi/sunxi-fel spiflash-info
Manufacturer: Macronix (C2h), model: 20h, size: 33554432 bytes.

        从C2h和Macronix的打印来说,说明我们焊接上去的norflash已经被识别到了。下面需要做的就是通过sunxi-fel让uboot跑起来。因为之前的uboot是基于sd卡编译和运行起来的,那么可以通过sunxi-fel先将之前的uboot下载到v3s内部的ram空间里面,再从ram运行起来。当然这一次uboot的运行在系统复位之后就丢失了,这个需要注意下,

shell> sudo ../sunxi-tools-3s-spi/sunxi-fel uboot u-boot-sunxi-with-spl.bin

        如果这个时候,开发板上还有一个串口的话,就可以看到这样的信息打印,

U-Boot SPL 2017.01-rc2 (Jun 20 2023 - 21:50:26)
DRAM: 64 MiB
Trying to boot from FEL

U-Boot 2017.01-rc2 (Jun 20 2023 - 21:50:26 +0800) Allwinner Technology

CPU:   Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM:  64 MiB
MMC:   SUNXI SD/MMC: 0
Card did not respond to voltage select!
*** Warning - MMC init failed, using default environment

Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In:    serial@01c28000
Out:   serial@01c28000
Err:   serial@01c28000


U-Boot 2017.01-rc2 (Jun 20 2023 - 21:50:26 +0800) Allwinner Technology

CPU:   Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM:  64 MiB
MMC:   SUNXI SD/MMC: 0
Card did not respond to voltage select!
*** Warning - MMC init failed, using default environment

Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In:    serial@01c28000
Out:   serial@01c28000
Err:   serial@01c28000
Net:   No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot:  0 
Card did not respond to voltage select!
Card did not respond to voltage select!
** Bad device mmc 0 **
Card did not respond to voltage select!
Card did not respond to voltage select!
** Bad device mmc 0 **
=> 
=> 

        上面这个内容中有一句打印,即Trying to boot from FEL。这说明uboot本身确实是从fel启动的,既不是从nandflash、也不是从norflash,当然更不可能是从sd卡启动了。

5、编译spi norflash的uboot

        前面我们虽然也运行起来了uboot,但是那个是通过sunxi-fel命令完成的。本身uboot并没有保存到norflash里面。因此,我们需要找到一个支持spi norflash启动的uboot,并且把通过sunxi-fel把它烧入到norflash里面,这样开机后v3s就可以自己从spi norflash启动起来了。

        首先下载uboot-spi代码,注意是v3s-spi-experimental这个分支,

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

        下载解压好后,首先是基础配置,


make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig

        完成配置之后,我们还需要进入menuconfig添加两个配置。第一个就是让uboot支持大容量的norflash,即超过16M的flash;第二个,就是让uboot支持mxic的norflash,因为默认uboot只支持winbond品牌。


make ARCH=arm menuconfig

        选择Device Drivers->SPI Flash Support,

         配置好之后,开始输入命令编译即可,

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

        稍微等待一会,就可以看到文件u-boot-sunxi-with-spl.bin,这就是我们最终需要烧入到norflash的文件,和之前是一样的。

6、烧入、运行新的uboot

        新的uboot出来之后,下面就是准备烧入了。首先还是让v3s进入usb otg状态,用sunxi-fel version确认设备已经接上,

shell> sudo ../sunxi-tools-3s-spi/sunxi-fel ver
AWUSBFEX soc=00001681(V3s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000

        确认没有问题之后,就可以用spiflash-write子命令来进行烧入了,

shell> sudo ../sunxi-tools-3s-spi/sunxi-fel -p spiflash-write 0x0 u-boot-sunxi-with-spl.bin 
100% [================================================]   414 kB,   28.1 kB/s 

        烧入到100%之后,一般这个时候我们并不着急确认uboot是不是真的烧入进去,而是用spiflash-read把烧入进去的数据读一小部分回来,看看和烧进去的数据比较一下,是否一致。

sudo ../sunxi-tools-3s-spi/sunxi-fel -p spiflash-read 0x0 0x1000 4k.bin
100% [================================================]     4 kB,   14.9 kB/s 

        都回来之后,可以拷贝到windows系统,用notepad++的hex插件查看下,确认没有问题。

        接下来就可以拔掉usb otg线,按一下复位键,不出意外,这个时候已经可以看到打印,确认从spi norflash启动系统了,

U-Boot SPL 2017.01-rc2 (Jun 22 2023 - 16:02:17)
DRAM: 64 MiB
Trying to boot from sunxi SPI

U-Boot 2017.01-rc2 (Jun 22 2023 - 16:02:17 +0800) Allwinner Technology

CPU:   Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM:  64 MiB
MMC:   SUNXI SD/MMC: 0
SF: Detected mx25l25635f with page size 256 Bytes, erase size 64 KiB, total 32 MiB
*** Warning - bad CRC, using default environment

Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In:    serial@01c28000
Out:   serial@01c28000
Err:   serial@01c28000


U-Boot 2017.01-rc2 (Jun 22 2023 - 16:02:17 +0800) Allwinner Technology

CPU:   Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM:  64 MiB
MMC:   SUNXI SD/MMC: 0
SF: Detected mx25l25635f with page size 256 Bytes, erase size 64 KiB, total 32 MiB
*** Warning - bad CRC, using default environment

Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In:    serial@01c28000
Out:   serial@01c28000
Err:   serial@01c28000
Net:   No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot:  0 

        注意下,这个打印和nand启动、fel启动和sd卡启动都不一样的,因为它中间多了一行Trying to boot from sunxi SPI,这个是之前没有看到过的。当然如果还不放心,就可以利用uboot的sf命令,把norflash的前面1M空间重新擦除,看看是不是还能正常启动,看看是不是v3s会再次进入到usb otg的状态。

=> sf probe 0;
SF: Detected mx25l25635f with page size 256 Bytes, erase size 64 KiB, total 32 MiB
=> sf erase 0x0 0x100000;
SF: 1048576 bytes @ 0x0 Erased: OK
=> reset
resetting ...

        不出意外的话,因为norflash里面的uboot已经被删除,所以这个时候事实上v3s会再次进入到usb otg状态的,大家可以自己实操一下。

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

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

相关文章

从零开始 Spring Boot 47:缓存

从零开始 Spring Boot 47:缓存 图源:简书 (jianshu.com) Spring 提供一个简单但使用的缓存(Cache)机制,我们可以利用它来优化代码执行效率。 简单示例 老规矩,我们从一个简单示例开始: Serv…

RedHat红帽认证---RHCSA

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! RHCSA node1 1.配置网络设置 将 node1 配置为具有以下网络配置:主机名:node1.domain250.example.comIP 地址:172.25.250.100子网…

基于Java+Swing实现聊天室

基于JavaSwing实现聊天室 一、系统介绍二、功能展示三、其它1.其他系统实现 四、获取源码 一、系统介绍 Java聊天室系统主要用于实现在线聊天,基本功能包括:服务端和客户端。本系统结构如下: (1)服务端: 1…

SpringBoot中使用Tomcat、Undertow、jetty等容器

文章目录 SpringBoot中使用Tomcat、Undertow、jetty等容器;1. 默认使用Tomcat容器,直接运行项目即可:Java -jar xxx.jar2. 使用undertow容器2-1 引入Maven依赖,同时屏蔽内置Tomcat2-2 Undertow容器的常用配置参考2-3 一个特别的报…

人工智能---D分离

D分离(D-Separation)是一种用来判断变量是否条件独立的图形化方法。相比于非图形化方法,D-Separation更加直观,且计算简单。对于一个DAG(有向无环图)E,D-Separation方法可以快速的判断出两个节点…

c++11 标准模板(STL)(std::basic_streambuf)(三)

定义于头文件 <streambuf> template< class CharT, class Traits std::char_traits<CharT> > class basic_streambuf; 类 basic_streambuf 控制字符序列的输入与输出。它包含下列内容并提供到它们的访问&#xff1a; 1) 受控制字符序列&#xff…

在Android手机上安装kali Linux 的 QA

本文仅提供在安装时遇到问题的解决方案&#xff0c;查看安装链接请进入教程页面。 教程 https://www.hestudio.net/posts/install-kali-on-android-renew.html 一些命令 这里只说明我的教程涉及到的命令&#xff0c;查看其他博主教程的命令请转到对应博主的文档里查看&…

Linux 学习记录38(C高级篇)

Linux 学习记录38(C高级篇) 本文目录 Linux 学习记录38(C高级篇)一、shell中的分支语句1. case...in语句2. shell中的通配符 二、shell中的循环结构1. while循环2. shell中的printf3. for循环(1. 类似C中的格式(2. shell中的格式(3. 连续列表 4. select ...in 语句5. 辅助控制关…

PyQt学习(二)-----图形的建立(柱状图,折线图,堆叠柱状图,饼图)

数据库列表如图所示&#xff0c;如何对其进行绘图&#xff1a; &#xff08;一&#xff09;柱状图的建立 (1)柱状图初始化 self.__iniBarChart() pyqtSlot()def __iniBarChart(self):chart QChart()chart.setTitle("Barchart 演示")chart.setAnimationOptions(QChar…

md5的特点以及加密原理

MD5的特点及加密原理 简介特点1.长度固定2.结果不可逆3.高度离散性4.抗碰撞性 适用场景1.用户密码保护2.文件传输完整性校验3.数字签名4.云盘秒传 加密原理一.1.对输入的内容进行补位使其长度变成 N * 512 448 &#xff08;即长度对512取余之后 余数为448&#xff09;2.再往后补…

【数据可视化】大作业(意向考研高校的数据可视化)

文章目录 前言一、数据介绍1.1 基本信息1.2 考研信息1.3 导师信息 二、预处理及分析2.1 数据预处理2.1.1 考研信息预处理2.1.2 导师信息预处理 2.2 数据分析 三、可视化方法及结果3.1 可视化方法3.2 可视化结果展示3.2.1 基本信息3.2.2 考研信息3.2.3 导师信息 四、总结五、附录…

pip install安装CPM-Bee出现ModuleNotFoundError: No module named ‘torch‘的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

WPF开发txt阅读器18:用json格式存储配置文件

文章目录 json参数保存 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录&#x1f48e;快捷键翻页字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f48e;快进…

网工大题题型总结(2)---设备类型及设备故障问题

&#xff08;一&#xff09;设备选择 2018年上半年 试题一 根据表 1-1 及图 1-1 可知&#xff0c;在图 1-1 中为了保护内部网络&#xff0c;实现包过滤功能&#xff0c;位置A 应部署(6)设备&#xff0c;其工作在(7)模式. &#xff08;6&#xff09;防火墙 &#xff08;7&a…

AIGC教育(续篇):探索掌握AIGC,引领未来的人才之路

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; 1 未来人才的核心竞争力&#xff1a; 蓬勃绽放的潜力 展望未来&#xff0c;我们不禁思考&#xff1a;当自动化工具日益普及&#xff0c;且代替人力的成本并不高昂时&#xff0c;每个人的工具属性在未来工作中所占比重必…

Git提交规范

目录 1、commit message format消息格式 2、还原 3、提交类型 4、Subject 5、Body 6、Footer 7、git-commit-plugin 插件 以下规范参考Angular提交的规范。 对于如何格式化git commit消息&#xff0c;我们有非常精确的规则。 这导致更多 在浏览项目历史时&#xff0c;易…

【Visual Studio】报错 C2653,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 这个 Bug 是我做这个工程时遇到的&#xff1a;【Visual Studio】Qt 的实时绘图曲线功能&#xff0c;使用 C 语言&#xff0c;配合 Qt 开发串口通信界面。 文…

【面试】标准库相关题型(一)

文章目录 1. vector底层实现原理1.1 类构成1.2 构造函数1.3 插入元素1.4 删除元素1.5 读取元素1.6 修改元素1.7 释放空间 2. vector内存增长机制2.1 特点2.2 内存增长特性2.3 内存增长过程2.4 内存清理2.5 注意事项 3. vector中reserve和resize的区别3.1 共同点3.2 区别3.3 应用…

LangChain入门介绍

原文首发于博客文章LangChain介绍 我们先看看官方的定义 LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序&#xff1a; 数据感知&#xff1a;将语言模型连接到其他数据源自主性&#xff1a;允许语言模型与其环境进行交互 LangChain的主要价值在于&…

现在可以使用开发者工具为苹果Vision Pro创建空间体验

库比蒂诺&#xff0c;加利福尼亚—苹果公司今天宣布&#xff0c;全新的软件工具及技术现已可供开发者使用&#xff0c;它们能够用于为苹果首款空间计算机—Apple Vision Pro&#xff0c;创造出独特且前所未有的应用体验。Vision Pro具备visionOS&#xff0c;这是全球首款空间操…