mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-19 23:22:16 +03:00
Merge branch 'esp8266' of https://github.com/Links2004/Arduino into Links2004-esp8266
This commit is contained in:
commit
0474b33dc7
@ -175,6 +175,9 @@ char* ICACHE_FLASH_ATTR strtok_r(char * str, const char * delimiters, char ** te
|
|||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
|
|
||||||
if(str == NULL) {
|
if(str == NULL) {
|
||||||
|
if(temp == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
start = *temp;
|
start = *temp;
|
||||||
} else {
|
} else {
|
||||||
start = str;
|
start = str;
|
||||||
@ -184,6 +187,10 @@ char* ICACHE_FLASH_ATTR strtok_r(char * str, const char * delimiters, char ** te
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(delimiters == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
end = start;
|
end = start;
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
@ -211,7 +218,9 @@ char* ICACHE_FLASH_ATTR strtok_r(char * str, const char * delimiters, char ** te
|
|||||||
}
|
}
|
||||||
|
|
||||||
char* ICACHE_FLASH_ATTR strtok(char * str, const char * delimiters) {
|
char* ICACHE_FLASH_ATTR strtok(char * str, const char * delimiters) {
|
||||||
return strtok_r(str, delimiters, NULL);
|
static char * ret = NULL;
|
||||||
|
ret = strtok_r(str, delimiters, &ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int strcasecmp(const char * str1, const char * str2) {
|
int strcasecmp(const char * str1, const char * str2) {
|
||||||
|
@ -345,8 +345,6 @@ boolean SDClass::begin(uint8_t csPin, uint32_t speed) {
|
|||||||
root.openRoot(volume);
|
root.openRoot(volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// this little helper is used to traverse paths
|
// this little helper is used to traverse paths
|
||||||
SdFile SDClass::getParentDir(const char *filepath, int *index) {
|
SdFile SDClass::getParentDir(const char *filepath, int *index) {
|
||||||
// get parent directory
|
// get parent directory
|
||||||
|
@ -33,9 +33,13 @@ static void spiSend(uint8_t b) {
|
|||||||
SPDR = b;
|
SPDR = b;
|
||||||
while (!(SPSR & (1 << SPIF)))
|
while (!(SPSR & (1 << SPIF)))
|
||||||
;
|
;
|
||||||
|
#else
|
||||||
|
#ifdef ESP8266
|
||||||
|
SPI.write(b);
|
||||||
#else
|
#else
|
||||||
SPI.transfer(b);
|
SPI.transfer(b);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/** Receive a byte from the card */
|
/** Receive a byte from the card */
|
||||||
static uint8_t spiRec(void) {
|
static uint8_t spiRec(void) {
|
||||||
@ -116,8 +120,14 @@ uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) {
|
|||||||
// send command
|
// send command
|
||||||
spiSend(cmd | 0x40);
|
spiSend(cmd | 0x40);
|
||||||
|
|
||||||
|
#ifdef ESP8266
|
||||||
|
// send argument
|
||||||
|
SPI.write32(arg, true);
|
||||||
|
#else
|
||||||
// send argument
|
// send argument
|
||||||
for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s);
|
for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// send CRC
|
// send CRC
|
||||||
uint8_t crc = 0xFF;
|
uint8_t crc = 0xFF;
|
||||||
@ -424,7 +434,14 @@ uint8_t Sd2Card::readData(uint32_t block,
|
|||||||
dst[n] = SPDR;
|
dst[n] = SPDR;
|
||||||
|
|
||||||
#else // OPTIMIZE_HARDWARE_SPI
|
#else // OPTIMIZE_HARDWARE_SPI
|
||||||
|
#ifdef ESP8266
|
||||||
|
// skip data before offset
|
||||||
|
SPI.transferBytes(NULL, NULL, offset_);
|
||||||
|
|
||||||
|
// transfer data
|
||||||
|
SPI.transferBytes(NULL, dst, count);
|
||||||
|
|
||||||
|
#else
|
||||||
// skip data before offset
|
// skip data before offset
|
||||||
for (;offset_ < offset; offset_++) {
|
for (;offset_ < offset; offset_++) {
|
||||||
spiRec();
|
spiRec();
|
||||||
@ -433,6 +450,7 @@ uint8_t Sd2Card::readData(uint32_t block,
|
|||||||
for (uint16_t i = 0; i < count; i++) {
|
for (uint16_t i = 0; i < count; i++) {
|
||||||
dst[i] = spiRec();
|
dst[i] = spiRec();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif // OPTIMIZE_HARDWARE_SPI
|
#endif // OPTIMIZE_HARDWARE_SPI
|
||||||
|
|
||||||
offset_ += count;
|
offset_ += count;
|
||||||
@ -463,7 +481,11 @@ void Sd2Card::readEnd(void) {
|
|||||||
while (!(SPSR & (1 << SPIF)))
|
while (!(SPSR & (1 << SPIF)))
|
||||||
;
|
;
|
||||||
#else // OPTIMIZE_HARDWARE_SPI
|
#else // OPTIMIZE_HARDWARE_SPI
|
||||||
|
#ifdef ESP8266
|
||||||
|
SPI.transferBytes(NULL, NULL, (514-offset_));
|
||||||
|
#else
|
||||||
while (offset_++ < 514) spiRec();
|
while (offset_++ < 514) spiRec();
|
||||||
|
#endif
|
||||||
#endif // OPTIMIZE_HARDWARE_SPI
|
#endif // OPTIMIZE_HARDWARE_SPI
|
||||||
chipSelectHigh();
|
chipSelectHigh();
|
||||||
inBlock_ = 0;
|
inBlock_ = 0;
|
||||||
@ -479,7 +501,11 @@ uint8_t Sd2Card::readRegister(uint8_t cmd, void* buf) {
|
|||||||
}
|
}
|
||||||
if (!waitStartBlock()) goto fail;
|
if (!waitStartBlock()) goto fail;
|
||||||
// transfer data
|
// transfer data
|
||||||
|
#ifdef ESP8266
|
||||||
|
SPI.transferBytes(NULL, dst, 16);
|
||||||
|
#else
|
||||||
for (uint16_t i = 0; i < 16; i++) dst[i] = spiRec();
|
for (uint16_t i = 0; i < 16; i++) dst[i] = spiRec();
|
||||||
|
#endif
|
||||||
spiRec(); // get first crc byte
|
spiRec(); // get first crc byte
|
||||||
spiRec(); // get second crc byte
|
spiRec(); // get second crc byte
|
||||||
chipSelectHigh();
|
chipSelectHigh();
|
||||||
@ -646,13 +672,21 @@ uint8_t Sd2Card::writeData(uint8_t token, const uint8_t* src) {
|
|||||||
|
|
||||||
#else // OPTIMIZE_HARDWARE_SPI
|
#else // OPTIMIZE_HARDWARE_SPI
|
||||||
spiSend(token);
|
spiSend(token);
|
||||||
|
#ifdef ESP8266
|
||||||
|
// send argument
|
||||||
|
SPI.writeBytes((uint8_t *)src, 512);
|
||||||
|
#else
|
||||||
for (uint16_t i = 0; i < 512; i++) {
|
for (uint16_t i = 0; i < 512; i++) {
|
||||||
spiSend(src[i]);
|
spiSend(src[i]);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif // OPTIMIZE_HARDWARE_SPI
|
#endif // OPTIMIZE_HARDWARE_SPI
|
||||||
|
#ifdef ESP8266
|
||||||
|
SPI.write16(0xFFFF, true);
|
||||||
|
#else
|
||||||
spiSend(0xff); // dummy crc
|
spiSend(0xff); // dummy crc
|
||||||
spiSend(0xff); // dummy crc
|
spiSend(0xff); // dummy crc
|
||||||
|
#endif
|
||||||
status_ = spiRec();
|
status_ = spiRec();
|
||||||
if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) {
|
if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) {
|
||||||
error(SD_CARD_ERROR_WRITE);
|
error(SD_CARD_ERROR_WRITE);
|
||||||
|
@ -36,6 +36,7 @@ typedef union {
|
|||||||
SPIClass SPI;
|
SPIClass SPI;
|
||||||
|
|
||||||
SPIClass::SPIClass() {
|
SPIClass::SPIClass() {
|
||||||
|
useHwCs = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPIClass::begin() {
|
void SPIClass::begin() {
|
||||||
@ -54,9 +55,26 @@ void SPIClass::end() {
|
|||||||
pinMode(SCK, INPUT);
|
pinMode(SCK, INPUT);
|
||||||
pinMode(MISO, INPUT);
|
pinMode(MISO, INPUT);
|
||||||
pinMode(MOSI, INPUT);
|
pinMode(MOSI, INPUT);
|
||||||
|
if(useHwCs) {
|
||||||
|
pinMode(SS, INPUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::setHwCs(bool use) {
|
||||||
|
if(use) {
|
||||||
|
pinMode(SS, SPECIAL); ///< GPIO15
|
||||||
|
SPI1U |= (SPIUCSSETUP | SPIUCSHOLD);
|
||||||
|
} else {
|
||||||
|
if(useHwCs) {
|
||||||
|
pinMode(SS, INPUT);
|
||||||
|
SPI1U &= ~(SPIUCSSETUP | SPIUCSHOLD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
useHwCs = use;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPIClass::beginTransaction(SPISettings settings) {
|
void SPIClass::beginTransaction(SPISettings settings) {
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
setFrequency(settings._clock);
|
setFrequency(settings._clock);
|
||||||
setBitOrder(settings._bitOrder);
|
setBitOrder(settings._bitOrder);
|
||||||
setDataMode(settings._dataMode);
|
setDataMode(settings._dataMode);
|
||||||
@ -198,13 +216,19 @@ void SPIClass::setClockDivider(uint32_t clockDiv) {
|
|||||||
SPI1CLK = clockDiv;
|
SPI1CLK = clockDiv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void SPIClass::setDataBits(uint16_t bits) {
|
||||||
|
const uint32_t mask = ~((SPIMMOSI << SPILMOSI) | (SPIMMISO << SPILMISO));
|
||||||
|
bits--;
|
||||||
|
SPI1U1 = ((SPI1U1 & mask) | ((bits << SPILMOSI) | (bits << SPILMISO)));
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t SPIClass::transfer(uint8_t data) {
|
uint8_t SPIClass::transfer(uint8_t data) {
|
||||||
while(SPI1CMD & SPIBUSY)
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
;
|
// reset to 8Bit mode
|
||||||
|
setDataBits(8);
|
||||||
SPI1W0 = data;
|
SPI1W0 = data;
|
||||||
SPI1CMD |= SPIBUSY;
|
SPI1CMD |= SPIBUSY;
|
||||||
while(SPI1CMD & SPIBUSY)
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
;
|
|
||||||
return (uint8_t) (SPI1W0 & 0xff);
|
return (uint8_t) (SPI1W0 & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,3 +254,177 @@ uint16_t SPIClass::transfer16(uint16_t data) {
|
|||||||
return out.val;
|
return out.val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SPIClass::write(uint8_t data) {
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
// reset to 8Bit mode
|
||||||
|
setDataBits(8);
|
||||||
|
SPI1W0 = data;
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::write16(uint16_t data) {
|
||||||
|
write16(data, !(SPI1C & (SPICWBO | SPICRBO)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::write16(uint16_t data, bool msb) {
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
// Set to 16Bits transfer
|
||||||
|
setDataBits(16);
|
||||||
|
if(msb) {
|
||||||
|
// MSBFIRST Byte first
|
||||||
|
SPI1W0 = (data >> 8) | (data << 8);
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
} else {
|
||||||
|
// LSBFIRST Byte first
|
||||||
|
SPI1W0 = data;
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
}
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::write32(uint32_t data) {
|
||||||
|
write32(data, !(SPI1C & (SPICWBO | SPICRBO)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::write32(uint32_t data, bool msb) {
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
// Set to 32Bits transfer
|
||||||
|
setDataBits(32);
|
||||||
|
if(msb) {
|
||||||
|
union {
|
||||||
|
uint32_t l;
|
||||||
|
uint8_t b[4];
|
||||||
|
} data_;
|
||||||
|
data_.l = data;
|
||||||
|
// MSBFIRST Byte first
|
||||||
|
SPI1W0 = (data_.b[3] | (data_.b[2] << 8) | (data_.b[1] << 16) | (data_.b[0] << 24));
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
} else {
|
||||||
|
// LSBFIRST Byte first
|
||||||
|
SPI1W0 = data;
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
}
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::writeBytes(uint8_t * data, uint32_t size) {
|
||||||
|
while(size) {
|
||||||
|
if(size > 64) {
|
||||||
|
writeBytes_(data, 64);
|
||||||
|
size -= 64;
|
||||||
|
data += 64;
|
||||||
|
} else {
|
||||||
|
writeBytes_(data, size);
|
||||||
|
size = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
// Set Bits to transfer
|
||||||
|
setDataBits(size * 8);
|
||||||
|
|
||||||
|
volatile uint32_t * fifoPtr = &SPI1W0;
|
||||||
|
uint32_t * dataPtr = (uint32_t*) data;
|
||||||
|
uint8_t dataSize = ((size + 3) / 4);
|
||||||
|
|
||||||
|
while(dataSize--) {
|
||||||
|
*fifoPtr = *dataPtr;
|
||||||
|
dataPtr++;
|
||||||
|
fifoPtr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) {
|
||||||
|
if(size > 64) return; //max Hardware FIFO
|
||||||
|
|
||||||
|
uint32_t byte = (size * repeat);
|
||||||
|
uint8_t r = (64 / size);
|
||||||
|
|
||||||
|
while(byte) {
|
||||||
|
if(byte > 64) {
|
||||||
|
writePattern_(data, size, r);
|
||||||
|
byte -= 64;
|
||||||
|
} else {
|
||||||
|
writePattern_(data, size, (byte / size));
|
||||||
|
byte = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::writePattern_(uint8_t * data, uint8_t size, uint8_t repeat) {
|
||||||
|
uint8_t bytes = (size * repeat);
|
||||||
|
uint8_t buffer[64];
|
||||||
|
uint8_t * bufferPtr = &buffer[0];
|
||||||
|
uint8_t * dataPtr;
|
||||||
|
uint8_t dataSize = bytes;
|
||||||
|
for(uint8_t i = 0; i < repeat; i++) {
|
||||||
|
dataSize = size;
|
||||||
|
dataPtr = data;
|
||||||
|
while(dataSize--) {
|
||||||
|
*bufferPtr = *dataPtr;
|
||||||
|
dataPtr++;
|
||||||
|
bufferPtr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
writeBytes(&buffer[0], bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::transferBytes(uint8_t * out, uint8_t * in, uint32_t size) {
|
||||||
|
while(size) {
|
||||||
|
if(size > 64) {
|
||||||
|
transferBytes_(out, in, 64);
|
||||||
|
size -= 64;
|
||||||
|
if(out) out += 64;
|
||||||
|
if(in) in += 64;
|
||||||
|
} else {
|
||||||
|
transferBytes_(out, in, size);
|
||||||
|
size = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::transferBytes_(uint8_t * out, uint8_t * in, uint8_t size) {
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
// Set in/out Bits to transfer
|
||||||
|
|
||||||
|
setDataBits(size * 8);
|
||||||
|
|
||||||
|
volatile uint32_t * fifoPtr = &SPI1W0;
|
||||||
|
uint8_t dataSize = ((size + 3) / 4);
|
||||||
|
|
||||||
|
if(out) {
|
||||||
|
uint32_t * dataPtr = (uint32_t*) out;
|
||||||
|
while(dataSize--) {
|
||||||
|
*fifoPtr = *dataPtr;
|
||||||
|
dataPtr++;
|
||||||
|
fifoPtr++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no out data only read fill with dummy data!
|
||||||
|
while(dataSize--) {
|
||||||
|
*fifoPtr = 0xFFFFFFFF;
|
||||||
|
fifoPtr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
|
||||||
|
if(in) {
|
||||||
|
volatile uint8_t * fifoPtr8 = (volatile uint8_t *) &SPI1W0;
|
||||||
|
dataSize = size;
|
||||||
|
while(dataSize--) {
|
||||||
|
*in = *fifoPtr8;
|
||||||
|
in++;
|
||||||
|
fifoPtr8++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ public:
|
|||||||
SPIClass();
|
SPIClass();
|
||||||
void begin();
|
void begin();
|
||||||
void end();
|
void end();
|
||||||
|
void setHwCs(bool use);
|
||||||
void setBitOrder(uint8_t bitOrder);
|
void setBitOrder(uint8_t bitOrder);
|
||||||
void setDataMode(uint8_t dataMode);
|
void setDataMode(uint8_t dataMode);
|
||||||
void setFrequency(uint32_t freq);
|
void setFrequency(uint32_t freq);
|
||||||
@ -71,7 +72,21 @@ public:
|
|||||||
void beginTransaction(SPISettings settings);
|
void beginTransaction(SPISettings settings);
|
||||||
uint8_t transfer(uint8_t data);
|
uint8_t transfer(uint8_t data);
|
||||||
uint16_t transfer16(uint16_t data);
|
uint16_t transfer16(uint16_t data);
|
||||||
|
void write(uint8_t data);
|
||||||
|
void write16(uint16_t data);
|
||||||
|
void write16(uint16_t data, bool msb);
|
||||||
|
void write32(uint32_t data);
|
||||||
|
void write32(uint32_t data, bool msb);
|
||||||
|
void writeBytes(uint8_t * data, uint32_t size);
|
||||||
|
void writePattern(uint8_t * data, uint8_t size, uint32_t repeat);
|
||||||
|
void transferBytes(uint8_t * out, uint8_t * in, uint32_t size);
|
||||||
void endTransaction(void);
|
void endTransaction(void);
|
||||||
|
private:
|
||||||
|
bool useHwCs;
|
||||||
|
void writeBytes_(uint8_t * data, uint8_t size);
|
||||||
|
void writePattern_(uint8_t * data, uint8_t size, uint8_t repeat);
|
||||||
|
void transferBytes_(uint8_t * out, uint8_t * in, uint8_t size);
|
||||||
|
inline void setDataBits(uint16_t bits);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern SPIClass SPI;
|
extern SPIClass SPI;
|
||||||
|
@ -23,7 +23,7 @@ compiler.S.flags=-c -g -x assembler-with-cpp -MMD
|
|||||||
compiler.c.elf.ldscript=eagle.app.v6.ld
|
compiler.c.elf.ldscript=eagle.app.v6.ld
|
||||||
compiler.c.elf.flags=-nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-T{compiler.c.elf.ldscript}"
|
compiler.c.elf.flags=-nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-T{compiler.c.elf.ldscript}"
|
||||||
compiler.c.elf.cmd=xtensa-lx106-elf-gcc
|
compiler.c.elf.cmd=xtensa-lx106-elf-gcc
|
||||||
compiler.c.elf.libs=-lm -lc -lgcc -lhal -lphy -lnet80211 -llwip -lwpa -lmain -lpp -lsmartconfig
|
compiler.c.elf.libs=-lm -lgcc -lhal -lphy -lnet80211 -llwip -lwpa -lmain -lpp -lsmartconfig
|
||||||
|
|
||||||
compiler.cpp.cmd=xtensa-lx106-elf-g++
|
compiler.cpp.cmd=xtensa-lx106-elf-g++
|
||||||
compiler.cpp.flags=-c -Os -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -std=c++11 -MMD
|
compiler.cpp.flags=-c -Os -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -std=c++11 -MMD
|
||||||
|
Loading…
x
Reference in New Issue
Block a user