SAMA5D4 Xplained Ultra Board BSP
guowenxue
2019-08-19 2e7235d10c6dbff81960282e1a1e2e798f9b8db8
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/******************************************************************************
 *
 * Copyright(c) 2015 - 2016 Realtek Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 *
 ******************************************************************************/
#define _RTW_SDIO_C_
 
#include <drv_types.h>        /* struct dvobj_priv and etc. */
#include <drv_types_sdio.h>    /* RTW_SDIO_ADDR_CMD52_GEN */
 
/*
 * Description:
 *    Use SDIO cmd52 or cmd53 to read/write data
 *
 * Parameters:
 *    d    pointer of device object(struct dvobj_priv)
 *    addr    SDIO address, 17 bits
 *    buf    buffer for I/O
 *    len    length
 *    write    0:read, 1:write
 *    cmd52    0:cmd52, 1:cmd53
 *
 * Return:
 *    _SUCCESS    I/O ok.
 *    _FAIL        I/O fail.
 */
static u8 sdio_io(struct dvobj_priv *d, u32 addr, void *buf, size_t len, u8 write, u8 cmd52)
{
    int err;
 
 
    if (cmd52)
        addr = RTW_SDIO_ADDR_CMD52_GEN(addr);
 
    if (write)
        err = d->intf_ops->write(d, addr, buf, len, 0);
    else
        err = d->intf_ops->read(d, addr, buf, len, 0);
    if (err) {
        RTW_INFO("%s: [ERROR] %s FAIL! error(%d)\n",
             __FUNCTION__, write ? "write" : "read", err);
        return _FAIL;
    }
 
    return _SUCCESS;
}
 
u8 rtw_sdio_read_cmd52(struct dvobj_priv *d, u32 addr, void *buf, size_t len)
{
    return sdio_io(d, addr, buf, len, 0, 1);
}
 
u8 rtw_sdio_read_cmd53(struct dvobj_priv *d, u32 addr, void *buf, size_t len)
{
    return sdio_io(d, addr, buf, len, 0, 0);
}
 
u8 rtw_sdio_write_cmd52(struct dvobj_priv *d, u32 addr, void *buf, size_t len)
{
    return sdio_io(d, addr, buf, len, 1, 1);
}
 
u8 rtw_sdio_write_cmd53(struct dvobj_priv *d, u32 addr, void *buf, size_t len)
{
    return sdio_io(d, addr, buf, len, 1, 0);
}
 
u8 rtw_sdio_f0_read(struct dvobj_priv *d, u32 addr, void *buf, size_t len)
{
    int err;
    u8 ret;
 
 
    ret = _SUCCESS;
    addr = RTW_SDIO_ADDR_F0_GEN(addr);
 
    err = d->intf_ops->read(d, addr, buf, len, 0);
    if (err) {
        RTW_INFO("%s: [ERROR] Read f0 register FAIL!\n", __FUNCTION__);
        ret = _FAIL;
    }
 
 
    return ret;
}