Skip to content

Commit 7464dbe

Browse files
committed
feat: support new SD pins management
Fixe #47 Signed-off-by: Frederic Pillon <[email protected]>
1 parent 7eca2b0 commit 7464dbe

File tree

8 files changed

+541
-22
lines changed

8 files changed

+541
-22
lines changed

Diff for: README.md

+101-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ http://www.arduino.cc/en/Reference/SD
1212

1313
## Dependency
1414

15-
This library is based on FatFs, a generic FAT file system module for small embedded systems.
15+
This library is based on FatFs, a generic FAT file system module for small embedded systems.
1616
[http://elm-chan.org/fsw/ff](http://elm-chan.org/fsw/ff/00index_e.html)
1717

1818
The FatFs has been ported as Arduino library [here](https://github.com/stm32duino/FatFs).
@@ -31,11 +31,105 @@ User can provide his own defined options by adding his configuration in a file n
3131
### SD
3232

3333
Some default definitions can be overridden using:
34-
* board `variant.h`
35-
* `build_opt.h`: see [Customize build options](https://github.com/stm32duino/wiki/wiki/Customize-build-options-using-build_opt.h)
36-
37-
* `hal_conf_extra.h`: see [HAL configuration](https://github.com/stm32duino/wiki/wiki/HAL-configuration)
38-
34+
* board `variant*.h`
35+
* `build_opt.h`: see [Customize build options](https://github.com/stm32duino/Arduino_Core_STM32/wiki/Customize-build-options-using-build_opt.h)
36+
37+
* `hal_conf_extra.h`: see [HAL configuration](https://github.com/stm32duino/Arduino_Core_STM32/wiki/HAL-configuration)
38+
39+
#### SDIO/SDMMC pins definition
40+
41+
Since STM32 core v2.6.0, the `PinMap_SD[]` array defined in the `PeripheralPins*.c` has been split per signals:
42+
```C
43+
PinMap_SD_CK[]
44+
PinMap_SD_DATA0[]
45+
PinMap_SD_DATA1[]
46+
PinMap_SD_DATA2[]
47+
PinMap_SD_DATA3[]
48+
PinMap_SD_DATA4[]
49+
PinMap_SD_DATA5[]
50+
PinMap_SD_DATA6[]
51+
PinMap_SD_DATA7[]
52+
/* Only for SDMMC */
53+
PinMap_SD_CKIN[]
54+
PinMap_SD_CDIR[]
55+
PinMap_SD_D0DIR[]
56+
PinMap_SD_D123DIR[]
57+
```
58+
59+
This allows to define the SDIO/SDMMC pins to use instead of using all the pins defined in the old array.
60+
By default, if no pins are explicitly defined, the first one from each array is used.
61+
62+
* To redefine the default one, use the following macros:
63+
64+
* `SDX_D0`
65+
* `SDX_D1`
66+
* `SDX_D2`
67+
* `SDX_D3`
68+
* `SDX_CMD`
69+
* `SDX_CK`
70+
71+
* Only for `SDMMC`:
72+
* `SDX_CKIN`
73+
* `SDX_CDIR`
74+
* `SDX_D0DIR`
75+
* `SDX_D123DIR`
76+
77+
* or redefine the default one before call of `begin()` of `SDClass` or `init()` of `Sd2Card`, use the following methods:
78+
79+
* `setDx(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3)`
80+
* `setCK(uint32_t ck)`
81+
* `setCK(PinName ck)`
82+
* `setCMD(uint32_t cmd)`
83+
* `setCMD(PinName cmd)`
84+
85+
* Only for `SDMMC`:
86+
* `setCKIN(uint32_t ckin)`
87+
* `setCKIN(PinName ckin)`
88+
* `setCDIR(uint32_t cdir)`
89+
* `setCDIR(PinName cdir)`
90+
* `setDxDIR(uint32_t d0dir, uint32_t d123dir)`
91+
* `setDxDIR(PinName d0dir, PinName d123dir)`
92+
93+
*Code snippet:*
94+
```C++
95+
Sd2Card card;
96+
card.setDx(PE12, PE13, PE14, PE15);
97+
card.setCMD(PB_14); // using PinName
98+
card.setCK(PB15);
99+
card.init();
100+
```
101+
or
102+
```C++
103+
SD.setDx(PE12, PE13, PE14, PE15);
104+
SD.setCMD(PB14);
105+
SD.setCK(PB_15); // using PinName
106+
SD.begin();
107+
```
108+
109+
* or using the `begin()` of `SDClass` or `init()` of `Sd2Card` methods:
110+
111+
* For `SDIO`:
112+
* `SDClass`:
113+
* `begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd)`
114+
* `begin(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD, uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR);`
115+
* `Sd2Card`:
116+
* `init(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd)`
117+
* `init(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD);`
118+
119+
* For `SDMMC`:
120+
* `SDClass`:
121+
* `begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd, uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir);`
122+
* `begin(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD, uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR);`
123+
*
124+
* * `Sd2Card`:
125+
* `init(uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD, uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR)`
126+
* `init(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD, uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR);`
127+
128+
*Code snippet:*
129+
```C++
130+
card.init(PE12, PE13, PE14, PE15, PB14, PB15);
131+
SD.begin(SD_DETECT_PIN, PE12, PE13, PE14, PE15, PB14, PB15);
132+
```
39133

40134
#### SD configurations
41135

@@ -68,4 +162,4 @@ Some default definitions can be overridden using:
68162
#### SD detect and timeout
69163
* `SD_DETECT_PIN` pin number
70164

71-
* `SD_DATATIMEOUT` constant for Read/Write block
165+
* `SD_DATATIMEOUT` constant for Read/Write block

Diff for: keywords.txt

+7-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,13 @@ open KEYWORD2
2424
close KEYWORD2
2525
seek KEYWORD2
2626
position KEYWORD2
27-
size KEYWORD2
27+
size KEYWORD2
28+
setDx KEYWORD2
29+
setCK KEYWORD2
30+
setCMD KEYWORD2
31+
setCKIN KEYWORD2
32+
setCDIR KEYWORD2
33+
setDxDIR KEYWORD2
2834

2935
#######################################
3036
# Constants (LITERAL1)

Diff for: src/SD.cpp

+58-3
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,68 @@ SDClass SD;
5959
/**
6060
* @brief Link SD, register the file system object to the FatFs mode and configure
6161
* relatives SD IOs including SD Detect Pin if any
62-
* @param None
62+
* @param data0: data0 pin number (default SDX_D0)
63+
* @param data1: data1 pin number (default SDX_D1)
64+
* @param data2: data2 pin number (default SDX_D2)
65+
* @param data3: data3 pin number (default SDX_D3)
66+
* @param ck: ck pin number (default SDX_CK)
67+
* @param cmd: cmd pin number (default SDX_CMD)
68+
* @param ckin: ckin pin number only for SDMMC (default SDX_CKIN)
69+
* @param cdir: cdir pin number only for SDMMC (default SDX_CDIR)
70+
* @param d0dir: d0dir pin number only for SDMMC (default SDX_D0DIR)
71+
* @param d123dir: d123dir pin number only for SDMMC (default SDX_D123DIR)
6372
* @retval true or false
6473
*/
65-
bool SDClass::begin(uint32_t detectpin)
74+
#if defined(SDMMC1) || defined(SDMMC2)
75+
bool SDClass::begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3,
76+
uint32_t ck, uint32_t cmd, uint32_t ckin, uint32_t cdir,
77+
uint32_t d0dir, uint32_t d123dir)
78+
{
79+
return begin(SD_DETECT_NONE, data0, data1, data2, data3, ck, cmd, ckin, cdir, d0dir, d123dir);
80+
}
81+
82+
#else
83+
bool SDClass::begin(uint32_t data0, uint32_t data1, uint32_t data2,
84+
uint32_t data3, uint32_t ck, uint32_t cmd)
6685
{
86+
return begin(SD_DETECT_NONE, data0, data1, data2, data3, ck, cmd);
87+
}
88+
#endif
89+
90+
/**
91+
* @brief Link SD, register the file system object to the FatFs mode and configure
92+
* relatives SD IOs including SD Detect Pin if any
93+
* @param detect: detect pin number (default SD_DETECT_NONE)
94+
* @param data0: data0 pin number (default SDX_D0)
95+
* @param data1: data1 pin number (default SDX_D1)
96+
* @param data2: data2 pin number (default SDX_D2)
97+
* @param data3: data3 pin number (default SDX_D3)
98+
* @param ck: ck pin number (default SDX_CK)
99+
* @param cmd: cmd pin number (default SDX_CMD)
100+
* @param ckin: ckin pin number only for SDMMC (default SDX_CKIN)
101+
* @param cdir: cdir pin number only for SDMMC (default SDX_CDIR)
102+
* @param d0dir: d0dir pin number only for SDMMC (default SDX_D0DIR)
103+
* @param d123dir: d123dir pin number only for SDMMC (default SDX_D123DIR)
104+
* @retval true or false
105+
*/
106+
#if defined(SDMMC1) || defined(SDMMC2)
107+
bool SDClass::begin(uint32_t detect, uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3,
108+
uint32_t ck, uint32_t cmd, uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir)
109+
#else
110+
bool SDClass::begin(uint32_t detect, uint32_t data0, uint32_t data1, uint32_t data2,
111+
uint32_t data3, uint32_t ck, uint32_t cmd)
112+
#endif
113+
{
114+
setDx(data0, data1, data2, data3);
115+
setCK(ck);
116+
setCMD(cmd);
117+
#if defined(SDMMC1) || defined(SDMMC2)
118+
setCKIN(ckin);
119+
setCDIR(cdir);
120+
setDxDIR(d0dir, d123dir);
121+
#endif
67122
/*##-1- Initializes SD IOs #############################################*/
68-
if (_card.init(detectpin)) {
123+
if (_card.init(detect)) {
69124
return _fatFs.init();
70125
}
71126
return false;

Diff for: src/STM32SD.h

+68-2
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,75 @@ class File {
8484
class SDClass {
8585

8686
public:
87-
8887
/* Initialize the SD peripheral */
89-
bool begin(uint32_t detectpin = SD_DETECT_NONE);
88+
#if defined(SDMMC1) || defined(SDMMC2)
89+
bool begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd,
90+
uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir
91+
);
92+
bool begin(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1,
93+
uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD,
94+
uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR
95+
);
96+
#else
97+
bool begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd);
98+
bool begin(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1,
99+
uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CMD, uint32_t cmd = SDX_CMD
100+
);
101+
#endif
102+
103+
// set* have to be called before begin()
104+
void setDx(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3)
105+
{
106+
_card.setDx(data0, data1, data2, data3);
107+
};
108+
void setCK(uint32_t ck)
109+
{
110+
_card.setCK(ck);
111+
};
112+
void setCMD(uint32_t cmd)
113+
{
114+
_card.setCMD(cmd);
115+
};
116+
117+
void setDx(PinName data0, PinName data1, PinName data2, PinName data3)
118+
{
119+
_card.setDx(data0, data1, data2, data3);
120+
};
121+
void setCK(PinName ck)
122+
{
123+
_card.setCK(ck);
124+
};
125+
void setCMD(PinName cmd)
126+
{
127+
_card.setCMD(cmd);
128+
};
129+
#if defined(SDMMC1) || defined(SDMMC2)
130+
void setCKIN(uint32_t ckin)
131+
{
132+
_card.setCKIN(ckin);
133+
};
134+
void setCDIR(uint32_t cdir)
135+
{
136+
_card.setCDIR(cdir);
137+
};
138+
void setDxDIR(uint32_t d0dir, uint32_t d123dir)
139+
{
140+
_card.setDxDIR(d0dir, d123dir);
141+
};
142+
143+
void setCKIN(PinName ckin)
144+
{
145+
_card.setCKIN(ckin);
146+
};
147+
void setCDIR(PinName cdir)
148+
{
149+
_card.setCDIR(cdir);
150+
};
151+
void setDxDIR(PinName d0dir, PinName d123dir)
152+
{
153+
_card.setDxDIR(d0dir, d123dir);
154+
};
155+
#endif
90156
static File open(const char *filepath, uint8_t mode = FA_READ);
91157
static bool exists(const char *filepath);
92158
static bool mkdir(const char *filepath);

Diff for: src/Sd2Card.cpp

+30-3
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,37 @@
3737
#include <Arduino.h>
3838
#include "Sd2Card.h"
3939

40-
bool Sd2Card::init(uint32_t detectpin)
40+
#if defined(SDMMC1) || defined(SDMMC2)
41+
bool Sd2Card::init(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd,
42+
uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir)
4143
{
42-
if (detectpin != SD_DETECT_NONE) {
43-
PinName p = digitalPinToPinName(detectpin);
44+
return init(SD_DETECT_NONE, data0, data1, data2, data3, ck, cmd, ckin, cdir, d0dir, d123dir);
45+
}
46+
#else
47+
bool Sd2Card::init(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd)
48+
{
49+
return init(SD_DETECT_NONE, data0, data1, data2, data3, ck, cmd);
50+
}
51+
#endif
52+
53+
#if defined(SDMMC1) || defined(SDMMC2)
54+
bool Sd2Card::init(uint32_t detect, uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3,
55+
uint32_t ck, uint32_t cmd, uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir)
56+
#else
57+
bool Sd2Card::init(uint32_t detect, uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3,
58+
uint32_t ck, uint32_t cmd)
59+
#endif
60+
{
61+
setDx(data0, data1, data2, data3);
62+
setCK(ck);
63+
setCMD(cmd);
64+
#if defined(SDMMC1) || defined(SDMMC2)
65+
setCKIN(ckin);
66+
setCDIR(cdir);
67+
setDxDIR(d0dir, d123dir);
68+
#endif
69+
if (detect != SD_DETECT_NONE) {
70+
PinName p = digitalPinToPinName(detect);
4471
if ((p == NC) || \
4572
BSP_SD_DetectPin(set_GPIO_Port_Clock(STM_PORT(p)),
4673
STM_LL_GPIO_PIN(p)) != MSD_OK) {

0 commit comments

Comments
 (0)