mtd: support mtd block model
Attach the mtd driver to block device, then we can call common interface (blk_dread & blk_dwrite) to operate storage in application layer. Usage: Open CONFIG_MTD_BLK & CONFIG_MTD. Change-Id: I47a969322e2d20c12d46898bdc88f4104e1a15bf Signed-off-by: Jason Zhu <jason.zhu@rock-chips.com>
This commit is contained in:
parent
4b7e9c7e37
commit
054229abb7
|
|
@ -28,7 +28,7 @@ static const char *if_typename_str[IF_TYPE_COUNT] = {
|
|||
[IF_TYPE_SPINAND] = "spinand",
|
||||
[IF_TYPE_SPINOR] = "spinor",
|
||||
[IF_TYPE_RAMDISK] = "ramdisk",
|
||||
|
||||
[IF_TYPE_MTD] = "mtd",
|
||||
};
|
||||
|
||||
static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = {
|
||||
|
|
@ -46,6 +46,7 @@ static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = {
|
|||
[IF_TYPE_SPINAND] = UCLASS_SPI_FLASH,
|
||||
[IF_TYPE_SPINOR] = UCLASS_SPI_FLASH,
|
||||
[IF_TYPE_RAMDISK] = UCLASS_RAMDISK,
|
||||
[IF_TYPE_MTD] = UCLASS_MTD,
|
||||
[IF_TYPE_SYSTEMACE] = UCLASS_INVALID,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,12 @@ config MTD
|
|||
flash, RAM and similar chips, often used for solid state file
|
||||
systems on embedded devices.
|
||||
|
||||
config MTD_BLK
|
||||
bool "Enable mtd block model for MTD drivers"
|
||||
depends on MTD
|
||||
help
|
||||
Enable mtd block model for Memory Technology Devices (MTD).
|
||||
|
||||
config MTD_NOR_FLASH
|
||||
bool "Enable parallel NOR flash support"
|
||||
help
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAN
|
|||
obj-y += mtdcore.o mtd_uboot.o
|
||||
endif
|
||||
obj-$(CONFIG_MTD) += mtd-uclass.o
|
||||
obj-$(CONFIG_MTD_BLK) += mtd_blk.o
|
||||
obj-$(CONFIG_MTD_PARTITIONS) += mtdpart.o
|
||||
obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
|
||||
obj-$(CONFIG_ALTERA_QSPI) += altera_qspi.o
|
||||
|
|
|
|||
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <nand.h>
|
||||
#include <dm/device-internal.h>
|
||||
|
||||
ulong mtd_dread(struct udevice *udev, lbaint_t start,
|
||||
lbaint_t blkcnt, void *dst)
|
||||
{
|
||||
struct blk_desc *desc = dev_get_uclass_platdata(udev);
|
||||
|
||||
if (!desc)
|
||||
return 0;
|
||||
|
||||
if (blkcnt == 0)
|
||||
return 0;
|
||||
|
||||
if (desc->devnum == BLK_MTD_NAND) {
|
||||
int ret = 0;
|
||||
size_t rwsize = blkcnt * 512;
|
||||
struct mtd_info *mtd = dev_get_priv(udev->parent);
|
||||
struct nand_chip *chip = mtd_to_nand(mtd);
|
||||
loff_t off = (loff_t)(start * 512);
|
||||
|
||||
if (!mtd) {
|
||||
puts("\nno mtd available\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!chip) {
|
||||
puts("\nno chip available\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = nand_read_skip_bad(&chip->mtd, off, &rwsize,
|
||||
NULL, chip->mtd.size,
|
||||
(u_char *)(dst));
|
||||
if (ret)
|
||||
return 0;
|
||||
else
|
||||
return blkcnt;
|
||||
} else if (desc->devnum == BLK_MTD_SPI_NAND) {
|
||||
/* Not implemented */
|
||||
return 0;
|
||||
} else if (desc->devnum == BLK_MTD_SPI_NOR) {
|
||||
/* Not implemented */
|
||||
return 0;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ulong mtd_dwrite(struct udevice *udev, lbaint_t start,
|
||||
lbaint_t blkcnt, const void *src)
|
||||
{
|
||||
/* Not implemented */
|
||||
return 0;
|
||||
}
|
||||
|
||||
ulong mtd_derase(struct udevice *udev, lbaint_t start,
|
||||
lbaint_t blkcnt)
|
||||
{
|
||||
/* Not implemented */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mtd_blk_probe(struct udevice *udev)
|
||||
{
|
||||
struct blk_desc *desc = dev_get_uclass_platdata(udev);
|
||||
|
||||
sprintf(desc->vendor, "0x%.4x", 0x2207);
|
||||
memcpy(desc->product, "MTD", sizeof("MTD"));
|
||||
memcpy(desc->revision, "V1.00", sizeof("V1.00"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct blk_ops mtd_blk_ops = {
|
||||
.read = mtd_dread,
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
.write = mtd_dwrite,
|
||||
.erase = mtd_derase,
|
||||
#endif
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(mtd_blk) = {
|
||||
.name = "mtd_blk",
|
||||
.id = UCLASS_BLK,
|
||||
.ops = &mtd_blk_ops,
|
||||
.probe = mtd_blk_probe,
|
||||
};
|
||||
|
|
@ -38,10 +38,15 @@ enum if_type {
|
|||
IF_TYPE_SPINAND,
|
||||
IF_TYPE_SPINOR,
|
||||
IF_TYPE_RAMDISK,
|
||||
|
||||
IF_TYPE_MTD,
|
||||
IF_TYPE_COUNT, /* Number of interface types */
|
||||
};
|
||||
|
||||
/* define mtd device devnum */
|
||||
#define BLK_MTD_NAND 0
|
||||
#define BLK_MTD_SPI_NAND 1
|
||||
#define BLK_MTD_SPI_NOR 2
|
||||
|
||||
#define BLK_VEN_SIZE 40
|
||||
#define BLK_PRD_SIZE 20
|
||||
#define BLK_REV_SIZE 8
|
||||
|
|
|
|||
Loading…
Reference in New Issue