summaryrefslogtreecommitdiff
path: root/components/drivers/mtd/mtdnor.c
blob: 481d26167e736af3003dde7d2a9736aa33e62228 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author        Notes
   2018-09-10     heyuanjie87   first version

 */

#include <drivers/mtdnor.h>

#ifdef MTD_USING_NOR
static int _nor_erase(rt_mtd_t *mtd, loff_t addr, size_t len)
{
    rt_nor_t *nor;

    nor = (rt_nor_t *)mtd;
    return nor->ops->erase(nor, addr, len);
}

static int _nor_read(rt_mtd_t *mtd, loff_t from, struct mtd_io_desc *desc)
{
    rt_nor_t *nor;
    int ret;

    nor = (rt_nor_t *)mtd;
    ret = nor->ops->read(nor, from, desc->datbuf, desc->datlen);
    if (ret > 0)
    {
        desc->datretlen = ret;
        ret = 0;
    }

    return ret;
}

static int _nor_write(rt_mtd_t *mtd, loff_t to, struct mtd_io_desc *desc)
{
    rt_nor_t *nor;
    int ret;

    nor = (rt_nor_t *)mtd;
    ret = nor->ops->write(nor, to, desc->datbuf, desc->datlen);
    if (ret > 0)
    {
        desc->datretlen = ret;
        ret = 0;
    }

    return ret; 
}

static const struct mtd_ops _ops =
{
    _nor_erase,
    _nor_read,
    _nor_write,
    0,
    0
};

int rt_mtd_nor_init(rt_nor_t *nor, int blksize)
{
    nor->parent.sector_size = 1;
    nor->parent.block_size = blksize;
    nor->parent.ops = &_ops;
    nor->parent.type = MTD_TYPE_NOR;
    nor->parent.oob_size = 0;

    return 0;
}
#endif