summaryrefslogtreecommitdiff
path: root/bsp/raspberry-pi/raspi-dm2.0/drivers/drv_sd.h
blob: 506b1fafd9357d24fd383db13b0ce39cfd3efb01 (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
 * Copyright (c) 2006-2024 RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-10-28     zhujiale     The first version
 */

#ifndef __DRV_SD_BCM2835_H_
#define __DRV_SD_BCM2835_H_
#include <drivers/dev_mmcsd_core.h>
#include <rtthread.h>
#include <drivers/mmcsd_cmd.h>
#include <drivers/mmcsd_host.h>
struct sdhci_bcm2835 {
    struct sdhci_host *host;
    struct rt_platform_device *pdev;
    struct rt_mmcsd_req *mrq;

    void *ioaddr;
    rt_mutex_t mutex;
};
#define SDCMD  0x00 /* Command to SD card              - 16 R/W */
#define SDARG  0x04 /* Argument to SD card             - 32 R/W */
#define SDTOUT 0x08 /* Start value for timeout counter - 32 R/W */
#define SDCDIV 0x0c /* Start value for clock divider   - 11 R/W */
#define SDRSP0 0x10 /* SD card response (31:0)         - 32 R   */
#define SDRSP1 0x14 /* SD card response (63:32)        - 32 R   */
#define SDRSP2 0x18 /* SD card response (95:64)        - 32 R   */
#define SDRSP3 0x1c /* SD card response (127:96)       - 32 R   */
#define SDHSTS 0x20 /* SD host status                  - 11 R/W */
#define SDVDD  0x30 /* SD card power control           -  1 R/W */
#define SDEDM  0x34 /* Emergency Debug Mode            - 13 R/W */
#define SDHCFG 0x38 /* Host configuration              -  2 R/W */
#define SDHBCT 0x3c /* Host byte count (debug)         - 32 R/W */
#define SDDATA 0x40 /* Data to/from SD card            - 32 R/W */
#define SDHBLC 0x50 /* Host block count (SDIO/SDHC)    -  9 R/W */

#define SDCMD_NEW_FLAG          0x8000
#define SDCMD_FAIL_FLAG         0x4000
#define SDCMD_BUSYWAIT          0x800
#define SDCMD_NO_RESPONSE       0x400
#define SDCMD_LONG_RESPONSE     0x200
#define SDCMD_WRITE_CMD         0x80
#define SDCMD_READ_CMD          0x40
#define SDCMD_CMD_MASK          0x3f

#define SDCDIV_MAX_CDIV         0x7ff

#define SDHSTS_BUSY_IRPT        0x400
#define SDHSTS_BLOCK_IRPT       0x200
#define SDHSTS_SDIO_IRPT        0x100
#define SDHSTS_REW_TIME_OUT     0x80
#define SDHSTS_CMD_TIME_OUT     0x40
#define SDHSTS_CRC16_ERROR      0x20
#define SDHSTS_CRC7_ERROR       0x10
#define SDHSTS_FIFO_ERROR       0x08
/* Reserved */
/* Reserved */
#define SDHSTS_DATA_FLAG        0x01

#define SDHSTS_TRANSFER_ERROR_MASK  (SDHSTS_CRC7_ERROR | \
                     SDHSTS_CRC16_ERROR | \
                     SDHSTS_REW_TIME_OUT | \
                     SDHSTS_FIFO_ERROR)

#define SDHSTS_ERROR_MASK       (SDHSTS_CMD_TIME_OUT | \
                     SDHSTS_TRANSFER_ERROR_MASK)

#define SDHCFG_BUSY_IRPT_EN BIT(10)
#define SDHCFG_BLOCK_IRPT_EN    BIT(8)
#define SDHCFG_SDIO_IRPT_EN BIT(5)
#define SDHCFG_DATA_IRPT_EN BIT(4)
#define SDHCFG_SLOW_CARD    BIT(3)
#define SDHCFG_WIDE_EXT_BUS BIT(2)
#define SDHCFG_WIDE_INT_BUS BIT(1)
#define SDHCFG_REL_CMD_LINE BIT(0)

#define SDVDD_POWER_OFF     0
#define SDVDD_POWER_ON      1

#define SDEDM_FORCE_DATA_MODE   BIT(19)
#define SDEDM_CLOCK_PULSE   BIT(20)
#define SDEDM_BYPASS        BIT(21)

#define SDEDM_WRITE_THRESHOLD_SHIFT 9
#define SDEDM_READ_THRESHOLD_SHIFT  14
#define SDEDM_THRESHOLD_MASK        0x1f

#define SDEDM_FSM_MASK      0xf
#define SDEDM_FSM_IDENTMODE 0x0
#define SDEDM_FSM_DATAMODE  0x1
#define SDEDM_FSM_READDATA  0x2
#define SDEDM_FSM_WRITEDATA 0x3
#define SDEDM_FSM_READWAIT  0x4
#define SDEDM_FSM_READCRC   0x5
#define SDEDM_FSM_WRITECRC  0x6
#define SDEDM_FSM_WRITEWAIT1    0x7
#define SDEDM_FSM_POWERDOWN 0x8
#define SDEDM_FSM_POWERUP   0x9
#define SDEDM_FSM_WRITESTART1   0xa
#define SDEDM_FSM_WRITESTART2   0xb
#define SDEDM_FSM_GENPULSES 0xc
#define SDEDM_FSM_WRITEWAIT2    0xd
#define SDEDM_FSM_STARTPOWDOWN  0xf

#define SDDATA_FIFO_WORDS   16

#define FIFO_READ_THRESHOLD 4
#define FIFO_WRITE_THRESHOLD    4
#define SDDATA_FIFO_PIO_BURST   8

#define PIO_THRESHOLD   1  /* Maximum block count for PIO (0 = always DMA) */

#endif