更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
mtd_partition.h
浏览该文件的文档.
1/*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/**
33 * @defgroup filesystem FileSystem
34 * @defgroup mtd_partition Multi Partition
35 * @ingroup filesystem
36 */
37#ifndef _MTD_PARTITION_H
38#define _MTD_PARTITION_H
39
40#include "sys/types.h"
41#include "los_mux.h"
42#include "mtd_list.h"
43
44#ifdef __cplusplus
45#if __cplusplus
46extern "C" {
47#endif /* __cplusplus */
48#endif /* __cplusplus */
49
50/**
51 * @brief
52 * @verbatim
53* flash按照内部存储结构不同,分为两种:nor flash和nand flash
54* Nor FLASH使用方便,易于连接,可以在芯片上直接运行代码,稳定性出色,传输速率高,
55 在小容量时有很高的性价比,这使其很适合应于嵌入式系统中作为 FLASH ROM。
56 Nor Flash架构提供足够的地址线来映射整个存储器范围。
57* NandFLASH强调更高的性能,更低的成本,更小的体积,更长的使用寿命。
58 这使Nand FLASH很擅于存储纯资料或数据等,在嵌入式系统中用来支持文件系统。
59 缺点包括较慢的读取熟读和I/O映射类型或间接接口
60
61* 在通信方式上Nor Flash 分为两种类型:CFI Flash和 SPI Flash。即采用的通信协议不同.
62SPI Flash(serial peripheral interface)串行外围设备接口,是一种常见的时钟同步串行通信接口。
63 有4线(时钟,两个数据线,片选线)或者3线(时钟,两个数据线)通信接口,由于它有两个数据线能实现全双工通信,
64 读写速度上较快。拥有独立的数据总线和地址总线,能快速随机读取,允许系统直接从Flash中读取代码执行;
65 可以单字节或单字编程,但不能单字节擦除,必须以Sector为单位或对整片执行擦除操作,在对存储器进行重新编程之前需要对Sector
66 或整片进行预编程和擦除操作。
67CFI Flash
68 英文全称是common flash interface,也就是公共闪存接口,是由存储芯片工业界定义的一种获取闪存芯片物理参数
69 和结构参数的操作规程和标准。CFI有许多关于闪存芯片的规定,有利于嵌入式对FLASH的编程。现在的很多NOR FLASH 都支持CFI,
70 但并不是所有的都支持。
71 CFI接口,相对于串口的SPI来说,也被称为parallel接口,并行接口;另外,CFI接口是JEDEC定义的,
72 所以,有的又成CFI接口为JEDEC接口。所以,可以简单理解为:对于Nor Flash来说,
73 CFI接口=JEDEC接口=Parallel接口 = 并行接口
74 特点在于支持的容量更大,读写速度更快。
75 缺点由于拥有独立的数据线和地址总线,会浪费电路电子设计上的更多资源。
76
77SPI Flash : 每次传输一个bit位的数据,传输速度慢,但是价格便宜,任意地址读数据,擦除按扇区进行
78CFI Flash : 每次传输一个字节 ,速度快,任意地址读数据,擦除按扇区进行
79Nand Flash:芯片操作是以“块”为基本单位.NAND闪存的块比较小,一般是8KB,然后每块又分成页,
80 页大小一般是512字节.要修改NandFlash芯片中一个字节,必须重写整个数据块,读和写都是按照扇区进行的。
81
82参考:https://blog.csdn.net/zhejfl/article/details/78544796
83 * @endverbatim
84 */
85
86#define SPIBLK_NAME "/dev/spinorblk" ///< nor spi flash | 块设备
87#define SPICHR_NAME "/dev/spinorchr" ///< nor spi flash | 字符设备
88
89#define NANDBLK_NAME "/dev/nandblk" ///< nand flash | 块设备
90#define NANDCHR_NAME "/dev/nandchr" ///< nand flash | 字符设备
91
92
93/**
94 * @brief 通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90)
95 * @verbatim
96存储器技术设备(英语:Memory Technology Device,缩写为 MTD),是Linux系统中设备文件系统的一个类别,
97主要用于闪存的应用,是一种闪存转换层(Flash Translation Layer,FTL)。创造MTD子系统的主要目的是提供
98一个介于闪存硬件驱动程序与高端应用程序之间的抽象层。
99因为具备以下特性,所以 MTD 设备和硬盘相较之下,处理起来要复杂许多:
100
101* 具有 eraseblocks 的特微,而不是像硬盘一样使用集群。
102* eraseblocks (32KiB ~ 128KiB) 跟硬盘的 sector size(512 到 1024 bytes)比起来要大很多。
103* 操作上主要分作三个动作: 从 eraseblock 读取、写入 eraseblock 、还有就是清除 eraseblock 。
104* 坏掉的 eraseblocks 无法隐藏,需要软件加以处理。
105* eraseblocks 的寿命大约会在 104 到 105 的清除动作之后结束。
106像U盘、多媒体记忆卡(MMC)、SD卡、CF卡等其他流行的可移动存储器要和MTD区分开来,虽然它们也叫"flash",但它们不是使用MTD技术的存储器[1]。
107
108[1] http://www.linux-mtd.infradead.org/faq/general.html#L_ext2_mtd
109http://www.linux-mtd.infradead.org/
110
111
112在Linux内核中,引入MTD层为
113NOR FLASH和NAND FLASH设备提供统一接口。MTD将文件系统与底层FLASH存储器进行了隔离。
114
115字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问;同时,两者读写数据的基本单元不同。
116字符设备,以字节为基本单位,在Linux中,字符设备实现的比较简单,不需要缓冲区即可直接读写,
117
118内核例程和用户态API一一对应,用户层的Read函数直接对应了内核中的Read例程,这种映射关系由字符设备的
119file_operations维护。
120
121块设备,则以块为单位接受输入和返回输出。对这种设备的读写是按块进行的,其接口相对于字符设备复杂,
122read、write API没有直接到块设备层,而是直接到文件系统层,然后再由文件系统层发起读写请求。
123同时,由于块设备的IO性能与CPU相比很差,因此,块设备的数据流往往会引入文件系统的Cache机制。
124
125MTD设备既非块设备也不是字符设备,但可以同时提供字符设备和块设备接口来操作它。
126MTD设备通常可分为四层
127这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。
128参考: https://blog.csdn.net/lwj103862095/article/details/21545791
129 * @endverbatim
130 */
131typedef struct mtd_node {
132 UINT32 start_block; ///< 开始块索引
133 UINT32 end_block; ///< 结束块索引
134 UINT32 patitionnum; ///< 分区编号
135 CHAR *blockdriver_name; ///< 块设备驱动名称 例如: /dev/spinorblk0p0
136 CHAR *chardriver_name; ///< 字符设备驱动名称 例如: /dev/nandchr0p2
137 CHAR *mountpoint_name; ///< 挂载点名称 例如: /
138 VOID *mtd_info; /* Driver used by a partition *///分区使用的驱动程序
139 LOS_DL_LIST node_info;///< 双循环节点,挂在首个分区节点上
140 LosMux lock; ///< 每个分区都有自己的互斥锁
141 UINT32 user_num; ///< 使用数量
143
144/**
145 * @brief 分区参数描述符,一个分区既可支持按块访问也可以支持按字符访问,只要有驱动程序就阔以
146 */
147typedef struct par_param {
148 mtd_partition *partition_head; ///< 首个分区,其他分区都挂在.node_info节点上
149 struct MtdDev *flash_mtd; ///< flash设备描述符,属于硬件驱动层
150 const struct block_operations *flash_ops; ///< 块方式的操作数据
151 const struct file_operations_vfs *char_ops; ///< 字符方式的操作数据
152 CHAR *blockname; ///< 块设备名称
153 CHAR *charname; ///< 字符设备名称
154 UINT32 block_size; ///< 块单位(4K),对文件系统而言是按块读取数据,方便和内存页置换
156
157
158#define CONFIG_MTD_PATTITION_NUM 20 ///< 分区数量的上限
159
160#define ALIGN_ASSIGN(len, startAddr, startBlk, endBlk, blkSize) do { \
161 (len) = (((len) + ((blkSize) - 1)) & ~((blkSize) - 1)); \
162 (startAddr) = ((startAddr) & ~((blkSize) - 1)); \
163 (startBlk) = (startAddr) / (blkSize); \
164 (endBlk) = (len) / (blkSize) + ((startBlk) - 1); \
165} while (0)
166
167#define PAR_ASSIGNMENT(node, len, startAddr, num, mtd, blkSize) do { \
168 (node)->start_block = (startAddr) / (blkSize); \
169 (node)->end_block = (len) / (blkSize) + ((node)->start_block - 1); \
170 (node)->patitionnum = (num); \
171 (node)->mtd_info = (mtd); \
172 (node)->mountpoint_name = NULL; \
173} while (0)
174
178
179/**
180 * @ingroup mtd_partition
181 * @brief Add a partition.
182 *
183 * @par Description:
184 * <ul>
185 * <li>This API is used to add a partition according to the passed-in parameters.</li>
186 * </ul>
187 * @attention
188 * <ul>
189 * <li>None.</li>
190 * </ul>
191 *
192 * @param type [IN] Storage medium type, support "nand" and "spinor" currently.
193 * @param startAddr [IN] Starting address of a partition.
194 * @param length [IN] Partition size.
195 * @param partitionNum [IN] Partition number, less than the value defined by CONFIG_MTD_PATTITION_NUM.
196 *
197 * @retval #-ENODEV The driver is not found.
198 * @retval #-EINVAL Invalid parameter.
199 * @retval #-ENOMEM Insufficient memory.
200 * @retval #ENOERR The partition is successfully created.
201 *
202 * @par Dependency:
203 * <ul><li>mtd_partition.h: the header file that contains the API declaration.</li></ul>
204 * @see delete_mtd_partition
205 */
206extern INT32 add_mtd_partition(const CHAR *type, UINT32 startAddr, UINT32 length, UINT32 partitionNum);
207
208/**
209 * @ingroup mtd_partition
210 * @brief Delete a partition.
211 *
212 * @par Description:
213 * <ul>
214 * <li>This API is used to delete a partition according to its partition number and storage medium type.</li>
215 * </ul>
216 * @attention
217 * <ul>
218 * <li>None.</li>
219 * </ul>
220 *
221 * @param partitionNum [IN] Partition number, less than the value defined by CONFIG_MTD_PATTITION_NUM.
222 * @param type [IN] Storage medium type, support "nand" and "spinor" currently.
223 *
224 * @retval #-EINVAL Invalid parameter.
225 * @retval #ENOERR The partition is successfully deleted.
226 *
227 * @par Dependency:
228 * <ul><li>mtd_partition.h: the header file that contains the API declaration.</li></ul>
229 * @see add_mtd_partition
230 */
231extern INT32 delete_mtd_partition(UINT32 partitionNum, const CHAR *type);
232
233#ifdef __cplusplus
234#if __cplusplus
235}
236#endif /* __cplusplus */
237#endif /* __cplusplus */
238
239#endif /* _MTD_PARTITION_H */
INT32 add_mtd_partition(const CHAR *type, UINT32 startAddr, UINT32 length, UINT32 partitionNum)
Add a partition.
INT32 delete_mtd_partition(UINT32 partitionNum, const CHAR *type)
Delete a partition.
signed int INT32
Definition: los_typedef.h:60
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
struct par_param partition_param
分区参数描述符,一个分区既可支持按块访问也可以支持按字符访问,只要有驱动程序就阔以
mtd_partition * GetSpinorPartitionHead(VOID)
Definition: mtd_partition.c:86
partition_param * GetNandPartParam(VOID)
partition_param * GetSpinorPartParam(VOID)
Definition: mtd_partition.c:81
struct mtd_node mtd_partition
通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90)
flash MTD 层 描述符
Definition: mtd_dev.h:76
Definition: los_mux.h:73
通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90)
CHAR * mountpoint_name
挂载点名称 例如: /
CHAR * blockdriver_name
块设备驱动名称 例如: /dev/spinorblk0p0
LosMux lock
每个分区都有自己的互斥锁
UINT32 patitionnum
分区编号
VOID * mtd_info
UINT32 user_num
使用数量
CHAR * chardriver_name
字符设备驱动名称 例如: /dev/nandchr0p2
UINT32 end_block
结束块索引
UINT32 start_block
开始块索引
LOS_DL_LIST node_info
双循环节点,挂在首个分区节点上
分区参数描述符,一个分区既可支持按块访问也可以支持按字符访问,只要有驱动程序就阔以
CHAR * blockname
块设备名称
const struct file_operations_vfs * char_ops
字符方式的操作数据
CHAR * charname
字符设备名称
mtd_partition * partition_head
首个分区,其他分区都挂在.node_info节点上
const struct block_operations * flash_ops
块方式的操作数据
struct MtdDev * flash_mtd
flash设备描述符,属于硬件驱动层
UINT32 block_size
块单位(4K),对文件系统而言是按块读取数据,方便和内存页置换