/*
* This program attempts to initialize an SD card and analyze its structure.
*/
#include "SdFat.h"
#include "sdios.h"
/*
Set DISABLE_CS_PIN to disable a second SPI device.
For example, with the Ethernet shield, set DISABLE_CS_PIN
to 10 to disable the Ethernet controller.
*/
const int8_t DISABLE_CS_PIN = -1;
/*
Change the value of SD_CS_PIN if you are using SPI
and your hardware does not use the default value, SS.
Common values are:
Arduino Ethernet shield: pin 4
Sparkfun SD shield: pin 8
Adafruit SD shields and modules: pin 10
*/
// SDCARD_SS_PIN is defined for the built-in SD on some boards.
#ifndef SDCARD_SS_PIN
const uint8_t SD_CS_PIN = SS;
#else // SDCARD_SS_PIN
const uint8_t SD_CS_PIN = SDCARD_SS_PIN;
#endif // SDCARD_SS_PIN
// Try to select the best SD card configuration.
#if HAS_SDIO_CLASS
#define SD_CONFIG SdioConfig(FIFO_SDIO)
#elif ENABLE_DEDICATED_SPI
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(16))
#else // HAS_SDIO_CLASS
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SD_SCK_MHZ(16))
#endif // HAS_SDIO_CLASS
//------------------------------------------------------------------------------
SdFs sd;
cid_t m_cid;
csd_t m_csd;
uint32_t m_eraseSize;
uint32_t m_ocr;
static ArduinoOutStream cout(Serial);
//------------------------------------------------------------------------------
bool cidDmp() {
String ManufName = "Unknown";
if (int(m_cid.mid)==0) ManufName = "Invalid";
if (int(m_cid.mid)==1) ManufName = "Panasonic Corporation";
if (int(m_cid.mid)==2) ManufName = "Toshiba Corporation";
if (int(m_cid.mid)==3) ManufName = "Sandisk Corporation";
if (int(m_cid.mid)==6) ManufName = "Ritek Corporation (EXP 2018)";
if (int(m_cid.mid)==9) ManufName = "ATP Electronics Inc.";
if (int(m_cid.mid)==19) ManufName = "Kingmax Semiconductor Inc.(EXP 2014)";
if (int(m_cid.mid)==25) ManufName = "Dynacard Co., Ltd.";
if (int(m_cid.mid)==26) ManufName = "Power Quotient Intl. Co., Ltd (EXP 2017)";
if (int(m_cid.mid)==27) ManufName = "Samsung Electronics Co., Ltd.";
if (int(m_cid.mid)==29) ManufName = "ADATA Technology Co., Ltd.(AData, Corsair)";
if (int(m_cid.mid)==39) ManufName = "Phison Electronics Corp. (AgfaPhoto, Delkin, Integral, Lexar, Patriot, PNY, Polaroid, Sony, Verbatim";
if (int(m_cid.mid)==40) ManufName = "Barun Electronics (EXP 2019) (Lexar, PNY, ProGrade)";
if (int(m_cid.mid)==49) ManufName = "Silicon Power Computer & Comm., Inc. (EXP 2017)";
if (int(m_cid.mid)==54) ManufName = "Crucial";
if (int(m_cid.mid)==65) ManufName = "Kingston";
if (int(m_cid.mid)==69) ManufName = "MIXZA";
if (int(m_cid.mid)==81) ManufName = "STEC Inc. / SimpleTech (EXP 2010)";
if (int(m_cid.mid)==93) ManufName = "SwissBit AG";
if (int(m_cid.mid)==97) ManufName = "Netlist, Inc.";
if (int(m_cid.mid)==99) ManufName = "Cactus Technologies";
if (int(m_cid.mid)==115) ManufName = "Silicon Power?";
if (int(m_cid.mid)==116) ManufName = "Jiaelec Corp.";
if (int(m_cid.mid)==130) ManufName = "Jiang Tay Technical Co., Ltd.";
if (int(m_cid.mid)==131) ManufName = "Netcom Technology (HK) Ltd. (EXP 2015)";
if (int(m_cid.mid)==132) ManufName = "Strontium Technologies Pte Ltd (EXP 2019)";
if (int(m_cid.mid)==156) ManufName = "LD, MIXZA 333x";
if (int(m_cid.mid)==173) ManufName = "Shenzhen Longsys Electronics Co., Ltd (Lexar 2021)";
/*
if (int(m_cid.mid)==0) ManufName = "AGI Technology Co., Ltd";
if (int(m_cid.mid)==0) ManufName = "Biwin Storage Technology CO., LTD";
if (int(m_cid.mid)==0) ManufName = "BUFFALO INC.";
if (int(m_cid.mid)==0) ManufName = "Centon Electronics Inc.";
if (int(m_cid.mid)==0) ManufName = "Delidor Digital Technology Co., Limited";
if (int(m_cid.mid)==0) ManufName = "Delkin Devices";
if (int(m_cid.mid)==0) ManufName = "DIGILINK ELECTRONIC LIMITED";
if (int(m_cid.mid)==0) ManufName = "Edisk Technology Ltd.";
if (int(m_cid.mid)==0) ManufName = "G. Skill International Enterprises";
if (int(m_cid.mid)==0) ManufName = "Grand and Broad Technology Co. Limited";
if (int(m_cid.mid)==0) ManufName = "GTS Co. Ltd";
if (int(m_cid.mid)==0) ManufName = "Guangdong Transcend Semiconductor Co., Ltd.";
if (int(m_cid.mid)==0) ManufName = "Hagiwara Solutions Co., Ltd.";
if (int(m_cid.mid)==0) ManufName = "HOSIN Global Electronics Co., Limited";
if (int(m_cid.mid)==0) ManufName = "Innodisk Corp.";
if (int(m_cid.mid)==0) ManufName = "Integral Memory Plc";
if (int(m_cid.mid)==0) ManufName = "Keple Ltd";
if (int(m_cid.mid)==0) ManufName = "LEAPRO TECHNOLOGY CO., LTD.";
if (int(m_cid.mid)==0) ManufName = "Metorage Semiconductor technology Co., Ltd";
if (int(m_cid.mid)==0) ManufName = "REALTECH SEMICONDUCTOR TECHNOLOGY LIMITED";
if (int(m_cid.mid)==0) ManufName = "SC Global Company Co., Ltd";
if (int(m_cid.mid)==0) ManufName = "Shenzhen Dadongjia Industrial Co., Ltd.";
if (int(m_cid.mid)==0) ManufName = "Shenzhen Shenghua Youxin Semiconductor Technology Limited";
if (int(m_cid.mid)==0) ManufName = "Shenzhen YeKeSheng Digital Co.,Ltd.";
if (int(m_cid.mid)==0) ManufName = "SMART Modular Technologies (Global), Inc.";
if (int(m_cid.mid)==0) ManufName = "SPYRUS INC.";
if (int(m_cid.mid)==0) ManufName = "Taishin International Resources Co., Ltd.";
if (int(m_cid.mid)==0) ManufName = "Virtium LLC";
if (int(m_cid.mid)==0) ManufName = "WETOP TECHNOLOGY CORPORATION LIMITED";
if (int(m_cid.mid)==0) ManufName = "Wintec Industries, Inc.";
if (int(m_cid.mid)==0) ManufName = "Yuanchuang Digital Technology Limited";
*/
cout << F("\nManufacturer ID: ");
cout << uppercase << showbase << hex << int(m_cid.mid) << dec << endl;
cout << ManufName << endl;
cout << F("OEM ID: ") << m_cid.oid[0] << m_cid.oid[1] << endl;
cout << F("Product: ");
for (uint8_t i = 0; i < 5; i++) {
cout << m_cid.pnm[i];
}
cout << F("\nVersion: ");
cout << int(m_cid.prv_n) << '.' << int(m_cid.prv_m) << endl;
cout << F("Serial number: ") << hex << m_cid.psn << dec << endl;
cout << F("Manufacturing date: ");
cout << int(m_cid.mdt_month) << '/';
cout << (2000 + m_cid.mdt_year_low + 16* m_cid.mdt_year_high) << endl;
cout << endl;
return true;
}
//------------------------------------------------------------------------------
void clearSerialInput() {
uint32_t m = micros();
do {
if (Serial.read() >= 0) {
m = micros();
}
} while (micros() - m < 10000);
}
//------------------------------------------------------------------------------
bool csdDmp() {
bool eraseSingleBlock;
if (m_csd.v1.csd_ver == 0) {
eraseSingleBlock = m_csd.v1.erase_blk_en;
m_eraseSize = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low;
} else if (m_csd.v2.csd_ver == 1) {
eraseSingleBlock = m_csd.v2.erase_blk_en;
m_eraseSize = (m_csd.v2.sector_size_high << 1) | m_csd.v2.sector_size_low;
} else {
cout << F("m_csd version error\n");
return false;
}
m_eraseSize++;
cout << F("cardSize: ") << 0.000512 * sdCardCapacity(&m_csd);
cout << F(" MB (MB = 1,000,000 bytes)\n");
cout << F("flashEraseSize: ") << int(m_eraseSize) << F(" blocks\n");
cout << F("eraseSingleBlock: ");
if (eraseSingleBlock) {
cout << F("true\n");
} else {
cout << F("false\n");
}
return true;
}
//------------------------------------------------------------------------------
void errorPrint() {
if (sd.sdErrorCode()) {
cout << F("SD errorCode: ") << hex << showbase;
printSdErrorSymbol(&Serial, sd.sdErrorCode());
cout << F(" = ") << int(sd.sdErrorCode()) << endl;
cout << F("SD errorData = ") << int(sd.sdErrorData()) << endl;
}
}
//------------------------------------------------------------------------------
bool mbrDmp() {
MbrSector_t mbr;
bool valid = true;
if (!sd.card()->readSector(0, (uint8_t*)&mbr)) {
cout << F("\nread MBR failed.\n");
errorPrint();
return false;
}
cout << F("\nSD Partition Table\n");
cout << F("part,boot,bgnCHS[3],type,endCHS[3],start,length\n");
for (uint8_t ip = 1; ip < 5; ip++) {
MbrPart_t *pt = &mbr.part[ip - 1];
if ((pt->boot != 0 && pt->boot != 0X80) ||
getLe32(pt->relativeSectors) > sdCardCapacity(&m_csd)) {
valid = false;
}
cout << int(ip) << ',' << uppercase << showbase << hex;
cout << int(pt->boot) << ',';
for (int i = 0; i < 3; i++ ) {
cout << int(pt->beginCHS[i]) << ',';
}
cout << int(pt->type) << ',';
for (int i = 0; i < 3; i++ ) {
cout << int(pt->endCHS[i]) << ',';
}
cout << dec << getLe32(pt->relativeSectors) << ',';
cout << getLe32(pt->totalSectors) << endl;
}
if (!valid) {
cout << F("\nMBR not valid, assuming Super Floppy format.\n");
}
return true;
}
//------------------------------------------------------------------------------
void dmpVol() {
cout << F("\nScanning FAT, please wait.\n");
uint32_t freeClusterCount = sd.freeClusterCount();
if (sd.fatType() <= 32) {
cout << F("\nVolume is FAT") << int(sd.fatType()) << endl;
} else {
cout << F("\nVolume is exFAT\n");
}
cout << F("sectorsPerCluster: ") << sd.sectorsPerCluster() << endl;
cout << F("clusterCount: ") << sd.clusterCount() << endl;
cout << F("freeClusterCount: ") << freeClusterCount << endl;
cout << F("fatStartSector: ") << sd.fatStartSector() << endl;
cout << F("dataStartSector: ") << sd.dataStartSector() << endl;
if (sd.dataStartSector() % m_eraseSize) {
cout << F("Data area is not aligned on flash erase boundary!\n");
cout << F("Download and use formatter from www.sdcard.org!\n");
}
}
//------------------------------------------------------------------------------
void printCardType() {
cout << F("\nCard type: ");
switch (sd.card()->type()) {
case SD_CARD_TYPE_SD1:
cout << F("SD1\n");
break;
case SD_CARD_TYPE_SD2:
cout << F("SD2\n");
break;
case SD_CARD_TYPE_SDHC:
if (sdCardCapacity(&m_csd) < 70000000) {
cout << F("SDHC\n");
} else {
cout << F("SDXC\n");
}
break;
default:
cout << F("Unknown\n");
}
}
//------------------------------------------------------------------------------
void printConfig(SdSpiConfig config) {
if (DISABLE_CS_PIN < 0) {
cout << F(
"\nAssuming the SD is the only SPI device.\n"
"Edit DISABLE_CS_PIN to disable an SPI device.\n");
} else {
cout << F("\nDisabling SPI device on pin ");
cout << int(DISABLE_CS_PIN) << endl;
pinMode(DISABLE_CS_PIN, OUTPUT);
digitalWrite(DISABLE_CS_PIN, HIGH);
}
cout << F("\nAssuming the SD chip select pin is: ") << int(config.csPin);
cout << F("\nEdit SD_CS_PIN to change the SD chip select pin.\n");
}
//------------------------------------------------------------------------------
void printConfig(SdioConfig config) {
(void)config;
cout << F("Assuming an SDIO interface.\n");
}
//-----------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
// Wait for USB Serial
while (!Serial) {
SysCall::yield();
}
cout << F("SdFat version: ") << SD_FAT_VERSION_STR << endl;
printConfig(SD_CONFIG);
}
//------------------------------------------------------------------------------
void loop() {
// Read any existing Serial data.
clearSerialInput();
// F stores strings in flash to save RAM
cout << F("\ntype any character to start\n");
while (!Serial.available()) {
SysCall::yield();
}
uint32_t t = millis();
if (!sd.cardBegin(SD_CONFIG)) {
cout << F(
"\nSD initialization failed.\n"
"Do not reformat the card!\n"
"Is the card correctly inserted?\n"
"Is there a wiring/soldering problem?\n");
if (isSpi(SD_CONFIG)) {
cout << F(
"Is SD_CS_PIN set to the correct value?\n"
"Does another SPI device need to be disabled?\n"
);
}
errorPrint();
return;
}
t = millis() - t;
cout << F("init time: ") << t << " ms" << endl;
if (!sd.card()->readCID(&m_cid) ||
!sd.card()->readCSD(&m_csd) ||
!sd.card()->readOCR(&m_ocr)) {
cout << F("readInfo failed\n");
errorPrint();
return;
}
printCardType();
cidDmp();
csdDmp();
cout << F("\nOCR: ") << uppercase << showbase;
cout << hex << m_ocr << dec << endl;
if (!mbrDmp()) {
return;
}
if (!sd.volumeBegin()) {
cout << F("\nvolumeBegin failed. Is the card formatted?\n");
errorPrint();
return;
}
dmpVol();
}
Цена 485 рублей. Заказ во время не доставили.
Извинились. Прислали промокод на 500р (100% оплата).
Итог: карта и +15рублей.
Года три не покупаю память на али И НИ КОМУ НЕ СОВЕТУЮ!!!
И они вполне неплохо просматриваются, даже под черной краской. У остальных производителей карт дорожки разведены стандартно — под 0, 45 и 90 градусов.
отличить оригинал от подделки, кстати, можно даже не вскрывая коробку — на подделках печать хуже качеством, очень заметно, если есть с чем сравнивать. выявлено экспериментальным путем.
Например, торцы должно быть тоже белые (у белых карт).
У продавана с 98% рейтингом и покупок карт от 3000 мне прислали подделку.
Есть ссылки точно не на подделку?
вот тут ни разу не было ни одной подделки. то же по отзывам на форумах халявщиков, ни одного негативного не встречал.
я же покупал всё это добро по купонам почти с нулем вложений, поэтому экспериментировал с продавцами.
На 64 — Samsung и Kodak, около 7 баксов, стоят в телефонах больше года.
На 8 — Kingston, стремная упаковка, обошелся в бакс, брал для установки на него прошивки в тв-бокс, сдох при установке прошивки.
Остальные 16 SanDisk и 32 — Lexar, Samsung и Kodak, до 4 баксов стоят в неосновных устройствах или подарены, все живы.
Теперь такой шары на карточки нет.
По флешкам, дешевле найти в офлайне. Последнее что брал, Kingston DataTraveler 100 G3 32GB USB 3.0 за 3 бакса, с гарантией.
Так что с памятью с али не все так однозначно.
На фото 2 верхних нерабочие, нижние рабочие. Хранились в комнате, никаких экстремальных видов эксплуатации.
на самом деле у меня пачка этих переходников самых разных фирм, и обычно они либо работают и изредка не работают совсем. а чтоб глючили — повезло, не видел такого.
а на «вундервафлю» есть готовый проект:
kbiva.wordpress.com/2016/06/26/information-about-sd-card/
www.youtube.com/watch?v=ZAe61GZ-52Y
а вот зачем sid и на карте памяти
Делать из оригинальной неоригинальную, или наоборот
s3.ap-northeast-2.amazonaws.com/global.semi.static/SMCA_Win_P01_RC01_20191202.exe
проверил свое хозяйство, а именно — 6 карточек ЭВО плюс. 4 по 64 куплены в мвидео, 2 по 128 — на али в разное время у разных продавцов. все 6 оригинальные.
автору спасибо за наводку
название программы для поиска — Samsung Card-UFD Authentication Utility