全志V3S嵌入式驱动开发(spi-nand驱动)

news2024/11/25 0:53:31

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

        nand flash相信大家并不陌生,现在很多的固态硬盘上面,其实有很多的nand flash。只不过根据存储单元,分成slc、mlc和tlc三种。早在差不多20年前,那个时候大家还都是学习s3c2440,标准的核心板就是soc+ddr+nandflash,或者是soc+ddr+norflash。那时,norflash一般是spi接口的,nandflash一般是专门的ip controller直接控制的。

        后来随着nandflash成本的快速降低,出现了很多种nandflash的存储产品,这里面有nvme ssd、有sata ssd、有emmc、还有今天所说的spi nand flash。这些产品的共同特点就是,都使用了nandflash,但是外部的接口是不一样的,有的简单一些,有的比较复杂,甚至内部添加了很多的算法来解决nand flash固有的一些缺点。

        之前我们在刚学v3s的时候,有一张v3s芯片手册上的启动图,不知道大家还有没有印象,

         这张图清晰地说明了soc启动的四个顺序,分别是usb启动、sd卡启动、spi norflash启动、spi nandflash启动四种方式。前面我们测试的时候一直走的是sd卡启动,但是从成本和稳定性上说,spi nandflash其实是最合适的。

        虽然spi norflash也可以当成v3s的启动媒介,但是一般来说,norflash不是很大,存储的东西有限。稍微多一点的图片、视频和动态库,norflash就放不下了。而sd卡虽然放的东西比较多,但是本身成本略贵,且由于是机械插入,在一些机器人领域,或者说存在震动场景的领域,sd卡也有点不太合适的。所以,综合来说,很多厂家都会选择spi nandflash当成启动和存储系统数据的基本介质,用户自己的sd卡可以作为补充,保存一些自己的资料,待v3s启动之后,mount到系统上面即可。

        另外有一个比较有意思的现象,大家也可以注意下,那就是目前v3s和其他芯片沟通比较多的是哪几种协议。除了和flash沟通的spi,还有和点屏芯片沟通的gpio,和触控芯片沟通的iic,以及和wifi芯片沟通的sd接口。此外,串口232、485也经常用,不过这一类的驱动就不写在底层,一般是通过上层app去写,这一点和网络设备的驱动有点类似。

1、原理图

         系统使用的芯片是mx35lf1ge4ab,这部分大家不要看到spi接口的flash,就默认为norflash,其实可以把mx35lf1ge4ab的芯片手册找过来看下,上面就写的非常明白,

         接口部分就是常规的spi四线接口,这部分没有疑问,主要就是cs、clk、miso、mosi。这其中miso上有一个按键s6,这个需要注意下,主要用于usb烧入的时候使用,防止系统默认用spi nandflash加载系统。如果按键被按下,那么miso的数据就没有办法被v3s访问到,就不会从spi加载系统了。

2、设备树文件

        默认sun8i-v3s-licheepi-zero.dtsi文件当中是没有spi的相关内容的。所以,这部分的脚本需要自己手动添加一下,

&spi0 {
        pinctrl-names = "default";
        pinctrl-0 = <&spi0_pins>;
        status = "okay";

        flash@0 {
                #address-cells = <1>;
                #size-cells = <1>;
                compatible = "spi-nand";
                reg = <0>;
                spi-max-frequency = <40000000>;

        partitions {
                compatible = "fixed-partitions";
                #address-cells = <1>;
                #size-cells = <1>;

            partition@0 {
                label = "all";
                reg = <0x000000 0x8000000>;
            };
        };
        };
};

3、驱动代码

        关于驱动代码这部分,由于我们这次所要驱动的芯片是spi-nandflash的部分。所以驱动其实很容易就分成两部分,一部分是spi、一部分是nandflash。本质上来说,驱动就是用v3s的spi接口按照mx35lf1ge4ab芯片手册的命令要求,通过命令去访问或者写入flash里面的数据。一开始的时候,很自然地我们会去找drivers/spi和drivers/mtd/nand对应的驱动代码。

        后来,随着一些资料的查找,我们发现在kernel 4.19之后,spi nandflash被作为独立的一个class,在驱动里面被单独分割了出来。从某种意义上说,只要升级kernel,修改一下.config配置文件,就可以实现相关的驱动加载了。

https://github.com/torvalds/linux/tree/v4.18/drivers/mtd/nand
https://github.com/torvalds/linux/tree/v4.19/drivers/mtd/nand

        另外,结合v3s上面的linux分支代码,我们最终决定把内核升级到5.2.y,同时还需要进行两个设置。这里只是升级了kernel,编译器还是之前的6.3。首先,打开menuconfig配置表,

make ARCH=arm menuconfig

        首先,使能mtd,

         接着使能spi nand,

         有了这两个部分,下面就可以开始编译了,

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

        有些同学害怕配置出错,担心把原来的配置文件弄坏,其实没有关系,这个时候只需要把之前的文件.config保存备份一下。如果后续实验成功了,只需要diff一下两个.config文件的区别是什么就可以了,

4、烧入image和dtb文件

        编译好之后,需要分别烧入image和dtb文件到sd卡,因为这两个文件都发生了改动。

sudo cp /home/feixiaoxing/Desktop/linux-zero-5.2.y/arch/arm/boot/zImage .
sudo cp /home/feixiaoxing/Desktop/linux-zero-5.2.y/arch/arm/boot/dts/sun8i-v3s-licheepi-zero-with-480x272-lcd.dtb .

5、开始测试和验证

        查看mtd驱动是不是真的加载到开发板上面了,主要看两个地方就可以了。第一,就是看下启动起来的时候,日志里面有没有nandflash被正确加载的打印,

[    0.763876] spi-nand spi0.0: Macronix SPI NAND was found.
[    0.769366] spi-nand spi0.0: 128 MiB, block size: 128 KiB, page size: 2048, OOB size: 64
[    0.778279] 1 fixed-partitions partitions found on MTD device spi0.0
[    0.784638] Creating 1 MTD partitions on "spi0.0":
[    0.789525] 0x000000000000-0x000008000000 : "all"

        第二,等系统正常启动之后,可以ls -l /dev/mtd*一下,如果没有问题的话,应该可以看到对应的设备节点,

# ls -l /dev/mtd0*
crw-------    1 root     root       90,   0 Jan  1 00:00 /dev/mtd0
crw-------    1 root     root       90,   1 Jan  1 00:00 /dev/mtd0ro

        有了上面的内容,基本就可以认为说,目前为止,nandflash已经被正确加载了。

6、后续的工作

        目前的nandflash,只是作为sd卡启动后的一个外设存在的。我们对它的了解还比较基础,有兴趣的朋友可以移植一下mtd-utils工具,进一步对/dev/mtd0进行操作,相信会有更多的收获。

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

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

相关文章

人机融合与因果关系

苏格兰哲学家大卫.休谟认为因果关系很难被认识&#xff0c;主要是因为他认为我们的认识是通过经验得来的&#xff0c;而经验只能告诉我们事件的先后顺序&#xff0c;而不能告诉我们事件之间的必然联系。他提出了“常见的联想”&#xff08;常见的经验&#xff09;和“原则的联想…

使用 MATLAB 进行气象激光雷达图像分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

状态模式(二十四)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了 解释器模式(二十三), 如果没有看过, 请观看上一章 一. 状态模式 引用 菜鸟教程里面 状态模式介绍: https://www.runoob.com/design-pattern/state-pattern.html 在状态模式&#xff08;State Pattern&#xff09;中&…

go常用特性(embed、插件化开发)、常用包(并发)

go常用特性及常用包 1 常用特性 1.1 go:build //go:build !windows //go:build是前缀指令&#xff0c;!windows是逻辑判断的条件。这个指令的作用是在Windows系统外&#xff0c;编译当前源文件。// build !windows // build是前缀指令&#xff0c;!windows是编译标记。这个指…

CSDN如何获得铁粉?

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

springboot+vue的校园疫情防控系统(附数据库,源码)

&#x1f495;&#x1f495;作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&…

责任链模式(二十六)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了策略模式(二十五), 如果没有看过, 请观看上一章 一. 责任链模式 引用 菜鸟教程里面的责任链模式介绍: https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html 顾名思义&#xff0c;责任链模式…

Science Advance||个体动态脑中鲁棒的大脑状态

文章目录 个体化动态方法&#xff08;INSCAPE 方法&#xff09;&#xff1a;&#xff08;A&#xff09;生成脑共同激活状态的组模板&#xff1a;&#xff08;B&#xff09;个体水平分析&#xff1a; 不同的大脑状态有特定的协同激活模式&#xff08;coactivation patterns&…

ai写作怎么搞?我来教你几招

在当今信息化时代&#xff0c;ai技术的发展已经进入到了一个全新的阶段&#xff0c;越来越多的人们开始运用ai技术进行写作。作为一种创新性的工具&#xff0c;ai写作已经成为了许多企业和个人写作必不可少的工具之一。但是&#xff0c;对于初学者来说&#xff0c;如何快速上手…

【网络技术】NAT是什么?它的工作原理是什么?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、NAT是什么&#xff1f; 二、NAT的实现方式&#xff08;三种&#xff09; 1、静态转换&#xff08;Static Nat&#xff09; 2、动…

css line-height

项目中看到 line-height&#xff1a;1 所以来总结一下 line-height 属性。 line-height 定义 line-height 属性设置行间的距离&#xff08;行高&#xff09;。 line-height 不允许使用负值。 属性可能的值 值描述normal默认。设置合理的行间距。number设置数字&#xff0…

手机技巧:安卓微信 8.0.38 内测版本功能一览

2023年6月14号安卓版本的微信8.0.38又开始内测了&#xff0c;今天就赶紧下载体验一下&#xff0c;下面就来给大家一一介绍&#xff0c;本次安卓微信内测版本功能更新&#xff0c;感兴趣的朋友可以文末下载体验一下&#xff01; 首先看一下官方的更新内容&#xff1a; 本次更新…

【Axure 教程】中继器(基础篇)

一、初识中继器 中继器是 Axure 中一个比较高阶的应用&#xff0c;它可以让我们在纯静态网页中模拟出类似带有后台数据交互的增删改查的效果&#xff0c;虽然它没有真正意义上帮我们存储任何的数据&#xff0c;但是当我们在一次项目体验过程中&#xff0c;它却可以给我们带来更…

字节跳动提出高性能 transformer 推理库,获 IPDPS 2023 最佳论文奖

动手点关注 干货不迷路 字节跳动与英伟达, 加州大学河滨分校联合发表的论文 《ByteTransformer: A High-Performance Transformer Boosted for Variable-Length》在第 37 届 IEEE 国际并行和分布式处理大会&#xff08;IPDPS 2023&#xff09;中&#xff0c;从 396 篇投稿中脱颖…

广东省高校人工智能产教融合院长研讨会召开,校企协同探索AI教育新范式

为深化产教融合、促进校企合作&#xff0c;着力推进人工智能产业和高校人才培养体系相融合&#xff0c;深入探讨校企合作、产教融合与课程建设规划等事宜&#xff0c;2023年6月9日下午&#xff0c;百度飞桨联合广东省计算机学会、华南理工大学计算机科学与工程学院、荔峰科技&a…

这世界好神奇,我们其实并不了解自己的身体

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 文案 / 粒粒 产品统筹 / bobo 场地支持 / 声湃轩北京站 这是一次突发奇想的天马行空&#xff0c;三个人猝不及防地坐下来大开脑洞&#xff0c;从诗词歌赋聊到人生哲学&#xff…

CVPR 2023 | 美团技术团队精选论文解读

本文精选了美团技术团队被CVPR 2023收录的8篇论文进行解读。这些论文既有自监督学习、领域自适应、联邦学习等通用学习范式方面的技术迭代&#xff0c;也涉及目标检测、跟踪、分割、Low-level Vision等典型视觉任务的性能&#xff0c;体现了美团在基础通用技术和垂直领域技术上…

HotSpot虚拟机对象探索与OutOfMemoryError异常

HotSpot虚拟机对象探索与OutOfMemoryError异常 1.HotSpot虚拟机对象探索 1.1对象的创建 不是一直有一个笑话,别人问程序员有没有对象,程序员会说我没有对象,但是我可以new一个出来 这里就可以判断他学过c或者java等语言 在java中对象的创建一般我们都是通过new来创建的,但…

MyBatis01

ORM&#xff1a;对象关系映射 O&#xff08;Object&#xff09;&#xff1a;Java虚拟机中的Java对象 R&#xff08;Relational&#xff09;&#xff1a;关系型数据库 M&#xff08;Mapping&#xff09;&#xff1a;将Java虚拟机中的Java对象映射到数据库表中一行记录&#xff0…

【王道·操作系统】第三章 内存管理

一、内存管理 1.1 内存的基础知识 内存可存放数据&#xff0c;程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾内存地址从0开始&#xff0c;每个地址对应一个存储单元 按字节编址&#xff1a;每个存储单元大小为1字节(B)&#xff0c;即8个二进制位按…