快讯
HOME
快讯
正文内容
nand 最小驱动 嵌入式Linux系列第5篇:Nand Flash根文件系统制作
发布时间 : 2024-10-08
作者 : 小编
访问数量 : 23
扫码分享至微信

嵌入式Linux系列第5篇:Nand Flash根文件系统制作

1.引言

之前系列的文章介绍了如何编译Uboot、Kernel以及使用默认的ramdisk根文件系统来构建一个完整的嵌入式Linux系统,本篇文章介绍如何从头制作一个放在NAND Flash上的根文件系统。经过我这段时间的总结,rootfs相关的编译、配置等工作还是比较麻烦的。所以你可能会看到一般做核心板的第三方厂家会建议初学者直接使用现成提供的文件系统,比如一个做NUC972核心板的厂家,其文档里这么描述:

再比如另外一个做NXP I.MX6核心板的厂家,其文档里这么描述:

他们都建议初学者直接使用他们提供好的文件系统。但是我还是强烈建议大家自己一步一步的去操作制作一次,因为一是这有助于你理解根文件系统是怎么来的,最小的能用的根文件系统包含了哪些东西,二是将来你很有可能需要对文件系统做一些定制化的裁剪和修改工作,只有自己做了一遍你对会明白这个东西到底是怎么回事,比如我原来就搞不清楚Busybox、Buildroot、Yocto这些名词在Linux中的作用,现在随着实践增多,就大概知道他们的用处了。

2.环境介绍

2.1.硬件

因为本系列博客都会以NUC972为平台来介绍。

2.2.软件

本篇新用到的软件工具一个是busybox,它用来生成文件系统里的几个最基本的文件夹,二是打包工具mkyaffs2,它用来生成能直接烧录到板子里的镜像文件。

大家有没有注意,我为什么每次都把这个官方的链接放过来,让大家自己去下载,原因是我们要知道我们用的东西的源头在哪里,最官方的资料渠道在哪里,这很重要。

我们这次要实现的目标是:自己亲手制作的文件系统能够跑起来,同时能够运行我们第二篇文章介绍的Helloworld程序。

3.使用Busybox制作根文件系统

1)进入到nuc972文件夹,新建一个tool文件夹,用来存放busybox、mkyaffs2等工具,把上面下载的NUC970_Linux_Applications-master.zip文件解压到tool文件夹里,因为解压后含有NUC970_Linux_Applications-master,我们把里面的内容移出来,然后删除掉空的NUC970_Linux_Applications-master文件夹和NUC970_Linux_Applications-master.zip源文件。然后进入到busybox目录里。同样的,在编译前要设置交叉编译的环境变量。

cd ~/nuc972

mkdir tool

unzip NUC970_Linux_Applications-master.zip

cd NUC970_Linux_Applications-master

mv ./* ../

cd ..

rm NUC970_Linux_Applications-master -fr

rm NUC970_Linux_Applications-master.zip

cd busybox-1.22.1/

source ~/nuc972//toolchain/environment.sh

2)make menuconfig 进入配置界面

make menuconfig

我们这里就设置一个地方,其他的全部使用默认配置。

修改make install生成的文件夹路径,我们把默认的./_install改成nuc972目录下的rootfs。

Busybox Settings --->

Installation Options ("make install" behavior) --->

(../../rootfs) BusyBox installation prefix

3)make 编译

make

编译成功后显示如下:

编译完成之后我们可以查看一下busybox的文件属性,可以看到如下信息,说明我们交叉编译的没问题。

4)make install 安装

make install

这样就在前面我们设置的地方生成一个rootfs的文件夹,进到里面看一下

cd ~/nuc972/rootfs

ls

bin、sbin、usr :存放一些命令

linuxrc :挂载根文件系统时,第一个执行的文件

4)再创建几个文件夹

mkdir etc lib dev

5)在 rootfs 目录的dev目录下创建设备节点

cd dev

sudo mknod console c 5 1

sudo mknod null c 1 3

6)在根文件系统rootfs/etc目录下创建一个inittab 文件,在文件里面填写:.console::askfirst:-/bin/sh

cd ../etc

vim inittab

4.文件系统打包

1)进入到tool文件夹的yaffs2utils目录里

cd yaffs2utils

2)编译,生成mkyaffs2

make clean

make

注:编译这个工具,不需要修改Makefile,用file看下属性,它是在x86-64运行的,这是没问题的,因为它就是在Ubuntu下使用的,不是在嵌入式环境下去执行使用的。

将它复制到/usr/bin下以后用起来方便了,可以直接使用这个指令了,你可一在终端敲mkya,然后TAB建看不能出来。

sudo cp mkyaffs2 /usr/bin/

4) 生成文件系统

sudo mkyaffs2 --inband-tags -p 2048 rootfs rootfs_yaffs2.img

5.内核修改

内核也要做一定的修改,具体如下:

1)make menuconfig进入到内核配置界面

make menuconfig

2)默认用的RAM filesytem 需要去掉

General setup —>

[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support

3)默认的Boot option需要修改成如下:

Boot options --->

(noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 rootflags=inband-tags console=ttyS0,115200n8 rdinit=/sbin/init mem=64M)

4)NAND Flash驱动相关配置

Device Drivers --->

Generic Driver Options --->

<*> Nuvoton NUC970 FMI function selection

Select FMI device to support (Support MTD NAND Flash) --->

5)选中MTD的支持

Device Drivers --->

<*> Memory Technology Device (MTD) support --->

<*> Caching block device access to MTD devices

-*- NAND Device Support --->

-*- Nuvoton NUC970 MTD NAND --->

NUC970 NAND Flash pin selection (Port C) --->

6)选中yaff2文件系统的支持

File systems --->

[*] Miscellaneous filesystems --->

<*> yaffs2 file system support

7)保存配置,编译

6.结果查看

6.1.验证文件系统是否可用

1)将上述生成的kernel 970uimage、文件系统rootfs_yaffs2.img、还有之前第三讲生成的uboot.bin,uboot-spl.bin,以及env.txt 下载到板子里,env.txt做了一些改动,主要是加入了boocmd那一行,这样下载进去就能直接启动了。

baudrate=115200

bootcmd=nboot 0x7fc0 0 0x200000; bootm 0x7fc0

bootdelay=1

ethact=emac

ethaddr=00:00:00:11:66:88

stderr=serial

stdin=serial

stdout=serial

烧写前,最好对芯片进行一次Erase。几个文件的烧写类型及地址大家注意下,别搞错了。

2)上电,看看效果,调试串口打印信息如下:

这一次很顺利啊,一次就成功了,这就说明我们上述做的根文件系统是可以正常使用的了。

6.2.验证helloworld能否在板子上运行

我们还要看看我们之前编译的helloworld程序能不能运行,我们把helloworld放到板子里去,怎么把这个文件放到板子上呢?有以下几种方式:

a) 把Helloworld在Ubuntu下放到rootfs文件夹里,然后按照上述的方法打包、下载进去。

b)通过scp或者NFS服务,直接通过网口放到板子里

c) 先放到U盘里,然后U盘插入到板子上,再复制过去

方法a)自然没问题,不过有些麻烦,方法b)现阶段我们的文件系统并不支持,暂时先不弄了,下一篇文章会介绍scp的移植,我们来试试方法c)吧

1)插入U盘到电脑上,把helloworld拷贝过去

2)把U盘插入到板子上,这时调试串口会自动输出如下信息,提示我们有USB Mass Storage设备接入了,看来内核已经把USB这部门驱动已经做进去了。这不是有点像我们给PC机重装Windows系统的过程,默认鼠标键盘也是可以直接使用的。

我们进入到/dev目录里,可以看到有sda1设备,LINUX所有的存储设备都是映射成"文件"来访问的,包括U盘、光驱、硬盘等。这个sda1就对应我们刚插入的U盘。

那么该如何访问U盘的东西呢?

我们需要挂载,使用mount指令,我们执行以下命令:

mkdir mnt

cd mnt

mkdir usb

cd usb

mount -t vfat /dev/sda1 /mnt/usb

cd /

mkdir opt

cp /mnt/usb/helloworld /opt

完成的事情是把sda1挂载到了/mnt/usb目录上,这样/mt/usb目录里就有了U盘里的内容,然后再复制到了系统的/opt目录。

我们在/opt目录里执行./helloworld,提示如下错误:

-/bin/sh: ./helloworld: not found

这是怎么回事呢?原因很简单,helloworld的执行是需要依赖一些库的,不可能系统里什么都没有就执行能执行成功了。所以需要我们把交叉编译链~/nuc972/toolchain/arm-2014.05/arm-none-linux-gnueabi/libc/lib里的库文件复制到板子的lib目录里。

可以先到arm-2014.05/arm-none-linux-gnueabi/libc/lib目录中,压缩下

tar -cvf lib.bin *

然后通过U盘放到板子的/lib目录中解压

tar -xvf lib.bin

这样操作之后,再次执行helloword,结果如下:

另外可以对板子断电-再上电,看看我们之前操作的内容都还在,因为它是存到NAND Flash里的,所以断电是不丢失的。

7.结束语

如果你亲自动手实现了这篇文章介绍的所有内容,相信你对根文件系统一定有了一个非常感官的认识。包括这篇在内,我用了5篇文章一直在介绍嵌入式Linux基础环境相关的内容,你应该也能感受到这和我们以前接触的单片机开发还是有着较大的差异。从下一篇文章开始,我们就正式进入到具体的应用了。我会陆续介绍GPIO、UART使用;网络通信;WIFI使用;摄像头采集数据;EC20 4G模块使用;QT编程;Opencv使用等。

半导体知识分类大全

说起半导体,或许大家心中会有一些疑问,什么是半导体?半导体产品又有哪些?

在此之前,咱们先来了解一下导体。

导体的最外层电子极易挣脱原子核的束缚成为自由电子,在外电场的作用下产生定向移动,形成电流,其导电性很好,称为导体。高价元素(如惰性气体)或高分子材料(如橡胶),它们的最外层电子受原子核束缚力很强,很难形成自由电子,所以导电性极差,称为绝缘体。而常用的半导体材料硅(Si)和锗(Ge)均为四价元素,它们的最外层电子既不像导体那么容易挣脱原子核的束缚,也不像绝缘体那样被原子核束缚得那么紧,在常温下导电性介于二者之间。在形成晶体结构的半导体中,人为地掺入特定的杂质元素时,导电性能具有可控性,并且,在光照和热辐射条件下,其导电性还有明显的变化,这些特殊的性质就决定了半导体可以制成各种电子器件。

半导体产品的类别应该怎么去区分呢?

按照国际通行的半导体产品标准方式进行分类,半导体可以分为四类:集成电路,分立器件,传感器和光电子器件,这四类可以统称为半导体元件。

图:半导体的分类

下面的数据统计了在2017-2019年中全球半导体元件产品的年总销售额,可以发现每一年的销售额都突破4000亿美元,并且持续增长:

集成电路又可以分为模拟电路、微处理器、逻辑电路、存储器四个细分领域,这四个领域2017-2019年的销售情况如下:

从半导体销售额中的市场份额来看,在整个半导体产业中集成电路无疑是产业核心,作为半导体产业中最大的消费领域,其长期占据半导体总销售额 80%以上。由于集成电路在半导体产业市场规模占比极高,所以很多人对半导体元件和集成电路之间的概念并没有分得这么清楚。其实半导体产品的分类方式有很多,我们可以从以下几个方面进行探讨。

按照处理信号分类

处理模拟信号的芯片叫做模拟芯片,处理数字信号的芯片叫做数字芯片。

那模拟信号和数字信号又是什么呢?

信号是反映消息的物理量,例如工业控制中的温度、压力、流量、自然界的声音等,因而信号是消息的表现形式。由于电信号容易传播、处理和控制,人们常将非电的物理量通过各种传感器转换成电信号,以达到提取、传送、交换、存储等目的。信号的形式是多种多样的,例如:根据信号是否具有随机性分为确定信号和随机信号,根据信号是否具有周期性分为周期信号和非周期信号,根据对时间的取值分为连续时间信号和离散时间信号等等。

模拟信号在时间和数值上具有连续性,即对应于任意时间t均有确定的函数值u或i与之对应,简单地理解模拟信号就是连续信号,比如我们发出的声音就是最典型的正弦波连续信号,如下图所示:

来源:百度图片

与模拟信号不同,数字信号在时间和数值上均具有离散性,电压或电流的变化在时间上不连续,总是发生在离散的瞬间。离散的数字信号(如用 0 和 1 两个逻辑电平来表示的二进制码)进行算术和逻辑运算的集成电路,其基本组成单位为逻辑门电路。

来源:百度图片

大多数物理量所转换成的电信号均为模拟信号。外界非电物理量经传感器转化为电信号后,在模拟芯片构成的系统里进行进一步的放大、滤波等处理。处理后的模拟信号既可以通过数据转换器输出到数字系统进行处理,也可以直接输出到执行器。芯片对信号的处理并不是单纯处理模拟信号或数字信号。芯片里面有既能处理模拟信号的部分,也能处理数字信号的部分。分类的重要标准是元件对哪种信号占比更大,如果处理模拟信号的部分多一些,就叫做模拟芯片,反之叫做数字芯片。

模拟芯片产品种类多,常见的有集成运算放大器、数模转换器、乘法器、集成稳压器、定时器、信号发生器、比较器等,每一类产品根据客户对产品性能需求的不同会有很多个系列的产品。单一产品往往可以用在不同客户、不同领域,模拟芯片生命周期很长,终端客户需求稳定,周期性很弱。

数字芯片是近年来应用最广、发展最快的IC品种,可分为通用数字IC和专用数字IC。通用IC是指那些用户多、使用领域广泛、标准型的电路,如存储器(DRAM、Flash等)、微型元件(微处理器MPU、微控制器MCU、数字处理器DSP等)、逻辑电路(门阵列、显示驱动器等)等,反映了数字IC的现状和水平。专用IC(ASIC)是指为特定的用户、某种专门或特别的用途而设计的电路。

按照制造工艺分类

这种分类可能是我们最为常见的,比如时常听到的14nm芯片、7nm芯片等就是按照制造工艺来划分芯片的。此处的7nm、14nm 是指芯片内部晶体管栅极的最小线宽(栅宽),下图展示国际上芯片制造工艺的进展。

工艺制程反映半导体制造技术先进性,从当前的制程工艺发展情况来看,一般是以28nm为分水岭,来区分先进制程和传统制程。小于28nm的制程被称为先进制程。5nm、3nm等制程目前还没有进入量产阶段,能进入这几个制程节点的企业不多,台积电和三星是目前仅有量产计划的企业,据悉两家企业在2020年会陆续推出5nm制程芯片。

一般情况下,工艺制程越先进,芯片的性能越高,但制程先进的芯片制造成本也高。市调机构指出,通常情况下,一款 28nm芯片的设计研发投入约 1-2 亿元,14nm 芯片约 2-3 亿元,研发周期约 1-2 年。现在工艺制程的发展已经逼近极限,从平衡成本和性能上来考虑,工艺制程并非越先进越好,而是选择合适的更好。不同种类的芯片在制程最优选择上会有差异,比如数字芯片对先进制程要求高,但是模拟芯片则不一定。

按照使用功能分类

此种分类方式应该是半导体元件分类中最复杂,但也是最常用的方式。

计算功能

这类芯片主要用来计算分析的,和人体大脑类似,分为主控芯片和辅助芯片。主控芯片中有CPU/SoC/FPGA/MCU,辅助芯片有主管图形图像处理的GPU和主打人工智能计算的AI芯片。

数据存储功能

DRAM,SDRAM,ROM,NAND等,主要是用于数据存储。

感知功能

主要为传感器,如MEMS,指纹芯片,CIS等,主要通过望闻问切来感知外部世界。

传输功能

蓝牙、wifi,NB-IOT,宽带,USB接口,以太网接口,HDMI接口,驱动控制等,用于数据传输。

能源供给功能

电源芯片,DC-AC,LDO等,用于能源供给。

按照设计方式分类

以设计方式分类,当今的半导体设计有两大阵营:FPGA 和 ASIC。其中FPGA发展在先,目前仍是主流应用。

简单来说FPGA是通用可编程逻辑芯片,可以DIY编程实现各种各样的数字电路;ASIC是上文所说的专用数字芯片,设计好数字电路后,流片生成出来的是不可以更改的芯片。前者的特点在于可重新定义芯片功能,灵活性强;后者的专用性强,一般是针对某一特定应用定制开发。

两种芯片都是随着半导体工艺发展和物联网应用需求而来,从几十纳米到现在的7纳米制程,性能都在不断提升。应用方向差异却逐渐明显:FPGA在上市速度、一次性测试成本、配置性上表现突出;而ASIC在运算性能、量产成本上远胜于FPGA。不过,因为ASIC 是固定的电路,如果设计更新,新一代芯片就要重新设计,定模,加工。双方算是各有所长。

小结

看到这里,相信大家对半导体产品分类都有了比较清晰的认知,但还要特别注意的是,各个分类之间是相互独立的,半导体产品根据不同的分类方式有不同的定位,形容一款半导体产品时,可以根据场景的需要采用不同的分类方式,也可以采用多种分类方式同时描述一款芯片。

相关问答

三位共阳极数码管的 最小驱动 电压是多大啊?它和单片机的i/o口...

[最佳回答]数码管由发光二极管组成,是二极管的一种.电流与电压的关系是指数关系.普通发光二极管的导通电压约1.8V,高亮度蓝色和白色约3.1V.一般用过串接的限流...

假显卡怎么安装 驱动 - 懂得

我来做个详细的解答话有GPU硅芯片面积,然后在网上找参数就能确定你显卡是什么系列,然后按着显卡系列去英伟达官方下载驱动,进入页面找到驱动程序,然...

NVIDIA Drivers是什么软件啊?有什么用吗?不用的话卸载了有影响吗?

NVIDIA是显卡的牌子,drivers是驱动,这个应该是显卡驱动程序,千万不能卸载。如果卸载了的话直接显卡完蛋,不能驱动,连最小化估计都要3秒钟。有兴趣的话楼主...

英伟达显卡 驱动 有必要更新吗?

显卡驱动对显卡性能的发挥和稳定性是非常重要的,而且NVIDIA总会不定期对显卡驱动程序进行更新,这些驱动一方面是为了保障...NVIDIA作为两大独立显卡GPU厂商之一,...

n卡重新下载屏幕变大怎么办?

如果您的N卡重新下载后屏幕变大,请按照以下步骤进行处理:1.确保您的驱动程序已正确安装并更新至最新版本。您可以从NVIDIA官方网站上下载最新的驱动程序,并...

1500w直流电机的 驱动 调速 最小 速度、最大速度、加速度时间及...

[最佳回答]这是和你的调速器有关,你是电流调速还是电压?一般来说低于150转时会出现丢失扭矩的现象所以最好是150转-最大转速最大转速是电机本身的设定,有1500R...

igbt和mos管哪个容易 驱动 ?

IGBT是达林顿结构,MOS不是。IGBT和MOS都需要一定的门槛电压(VGSth)来触发打开但是由于IGBT的达林顿结构导致寄生电容偏大,故需要一定的门极驱动能力,MOS相...

场效应管g极供电是多少伏?

通常场效应管的g极(类似三极管b极),供电电压,各个厂家的场效应管数值都不一样,最常用的的是正负15v以内都可以,典型的g点最小驱动电压3v能导通,但内阻可能...

AOS MOS管的结构、工作原理、开启全过程、 驱动 应用等方面,有哪些注意事项呢?

已经详细介绍了MOS管的工作机制,那么我们再来看datasheet这些参数就一目了然了。极限值参数代表应用时的最高范围,功耗和散热是高功率应用时的重点。...四...

计算机 最小 系统的安装步骤?

接着,插入操作系统光盘并进行安装,安装过程中需设置一些基本参数;最后,安装完毕后重启计算机,并进行一些基本设置,例如网络配置、驱动程序安装等。然后,设置...

 豕交兽畜  银行从业人员资格证 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部