mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 13:53:55 -07:00
Merge pull request #91 from marshmellow42/master
lfdemod.c refactoring (+ bug fixes)
This commit is contained in:
commit
d5d6f22718
6 changed files with 457 additions and 684 deletions
|
@ -755,8 +755,8 @@ void CmdPSKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
|
||||||
void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol)
|
void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol)
|
||||||
{
|
{
|
||||||
uint8_t *dest = BigBuf_get_addr();
|
uint8_t *dest = BigBuf_get_addr();
|
||||||
const size_t sizeOfBigBuff = BigBuf_max_traceLen();
|
//const size_t sizeOfBigBuff = BigBuf_max_traceLen();
|
||||||
size_t size = 0;
|
size_t size;
|
||||||
uint32_t hi2=0, hi=0, lo=0;
|
uint32_t hi2=0, hi=0, lo=0;
|
||||||
int idx=0;
|
int idx=0;
|
||||||
// Configure to go in 125Khz listen mode
|
// Configure to go in 125Khz listen mode
|
||||||
|
@ -769,16 +769,16 @@ void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol)
|
||||||
|
|
||||||
DoAcquisition_default(-1,true);
|
DoAcquisition_default(-1,true);
|
||||||
// FSK demodulator
|
// FSK demodulator
|
||||||
size = sizeOfBigBuff; //variable size will change after demod so re initialize it before use
|
//size = sizeOfBigBuff; //variable size will change after demod so re initialize it before use
|
||||||
|
size = 50*128*2; //big enough to catch 2 sequences of largest format
|
||||||
idx = HIDdemodFSK(dest, &size, &hi2, &hi, &lo);
|
idx = HIDdemodFSK(dest, &size, &hi2, &hi, &lo);
|
||||||
|
|
||||||
if (idx>0 && lo>0){
|
if (idx>0 && lo>0 && (size==96 || size==192)){
|
||||||
// final loop, go over previously decoded manchester data and decode into usable tag ID
|
// go over previously decoded manchester data and decode into usable tag ID
|
||||||
// 111000 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0
|
if (hi2 != 0){ //extra large HID tags 88/192 bits
|
||||||
if (hi2 != 0){ //extra large HID tags
|
|
||||||
Dbprintf("TAG ID: %x%08x%08x (%d)",
|
Dbprintf("TAG ID: %x%08x%08x (%d)",
|
||||||
(unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
|
(unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
|
||||||
}else { //standard HID tags <38 bits
|
}else { //standard HID tags 44/96 bits
|
||||||
//Dbprintf("TAG ID: %x%08x (%d)",(unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF); //old print cmd
|
//Dbprintf("TAG ID: %x%08x (%d)",(unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF); //old print cmd
|
||||||
uint8_t bitlen = 0;
|
uint8_t bitlen = 0;
|
||||||
uint32_t fc = 0;
|
uint32_t fc = 0;
|
||||||
|
@ -833,8 +833,8 @@ void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// reset
|
// reset
|
||||||
hi2 = hi = lo = 0;
|
|
||||||
}
|
}
|
||||||
|
hi2 = hi = lo = idx = 0;
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
}
|
}
|
||||||
DbpString("Stopped");
|
DbpString("Stopped");
|
||||||
|
@ -859,15 +859,14 @@ void CmdEM410xdemod(int findone, int *high, int *low, int ledcontrol)
|
||||||
|
|
||||||
DoAcquisition_default(-1,true);
|
DoAcquisition_default(-1,true);
|
||||||
size = BigBuf_max_traceLen();
|
size = BigBuf_max_traceLen();
|
||||||
//Dbprintf("DEBUG: Buffer got");
|
|
||||||
//askdemod and manchester decode
|
//askdemod and manchester decode
|
||||||
|
if (size > 16385) size = 16385; //big enough to catch 2 sequences of largest format
|
||||||
errCnt = askmandemod(dest, &size, &clk, &invert, maxErr);
|
errCnt = askmandemod(dest, &size, &clk, &invert, maxErr);
|
||||||
//Dbprintf("DEBUG: ASK Got");
|
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
|
||||||
if (errCnt>=0){
|
if (errCnt<0) continue;
|
||||||
|
|
||||||
errCnt = Em410xDecode(dest, &size, &idx, &hi, &lo);
|
errCnt = Em410xDecode(dest, &size, &idx, &hi, &lo);
|
||||||
//Dbprintf("DEBUG: EM GOT");
|
|
||||||
if (errCnt){
|
if (errCnt){
|
||||||
if (size>64){
|
if (size>64){
|
||||||
Dbprintf("EM XL TAG ID: %06x%08x%08x - (%05d_%03d_%08d)",
|
Dbprintf("EM XL TAG ID: %06x%08x%08x - (%05d_%03d_%08d)",
|
||||||
|
@ -885,23 +884,17 @@ void CmdEM410xdemod(int findone, int *high, int *low, int ledcontrol)
|
||||||
(uint32_t)((lo>>16LL) & 0xFF),
|
(uint32_t)((lo>>16LL) & 0xFF),
|
||||||
(uint32_t)(lo & 0xFFFFFF));
|
(uint32_t)(lo & 0xFFFFFF));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (findone){
|
if (findone){
|
||||||
if (ledcontrol) LED_A_OFF();
|
if (ledcontrol) LED_A_OFF();
|
||||||
*high=lo>>32;
|
*high=lo>>32;
|
||||||
*low=lo & 0xFFFFFFFF;
|
*low=lo & 0xFFFFFFFF;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else{
|
|
||||||
//Dbprintf("DEBUG: No Tag");
|
|
||||||
}
|
}
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
hi = 0;
|
hi = lo = size = idx = 0;
|
||||||
lo = 0;
|
clk = invert = errCnt = 0;
|
||||||
clk=0;
|
|
||||||
invert=0;
|
|
||||||
errCnt=0;
|
|
||||||
size=0;
|
|
||||||
}
|
}
|
||||||
DbpString("Stopped");
|
DbpString("Stopped");
|
||||||
if (ledcontrol) LED_A_OFF();
|
if (ledcontrol) LED_A_OFF();
|
||||||
|
@ -925,7 +918,7 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol)
|
||||||
//fskdemod and get start index
|
//fskdemod and get start index
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
idx = IOdemodFSK(dest, BigBuf_max_traceLen());
|
idx = IOdemodFSK(dest, BigBuf_max_traceLen());
|
||||||
if (idx>0){
|
if (idx<0) continue;
|
||||||
//valid tag found
|
//valid tag found
|
||||||
|
|
||||||
//Index map
|
//Index map
|
||||||
|
@ -965,7 +958,7 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol)
|
||||||
version=facilitycode=0;
|
version=facilitycode=0;
|
||||||
number=0;
|
number=0;
|
||||||
idx=0;
|
idx=0;
|
||||||
}
|
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
}
|
}
|
||||||
DbpString("Stopped");
|
DbpString("Stopped");
|
||||||
|
|
|
@ -414,7 +414,10 @@ int ASKmanDemod(const char *Cmd, bool verbose, bool emSearch)
|
||||||
int invert=0;
|
int invert=0;
|
||||||
int clk=0;
|
int clk=0;
|
||||||
int maxErr=100;
|
int maxErr=100;
|
||||||
|
//param_getdec(Cmd, 0, &clk);
|
||||||
|
//param_getdec(Cmd, 1, &invert);
|
||||||
|
//maxErr = param_get32ex(Cmd, 2, 0xFFFFFFFF, 10);
|
||||||
|
//if (maxErr == 0xFFFFFFFF) maxErr=100;
|
||||||
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
|
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
|
||||||
sscanf(Cmd, "%i %i %i", &clk, &invert, &maxErr);
|
sscanf(Cmd, "%i %i %i", &clk, &invert, &maxErr);
|
||||||
if (invert != 0 && invert != 1) {
|
if (invert != 0 && invert != 1) {
|
||||||
|
@ -675,7 +678,7 @@ int ASKbiphaseDemod(const char *Cmd, bool verbose)
|
||||||
int offset=0, clk=0, invert=0, maxErr=0, ans=0;
|
int offset=0, clk=0, invert=0, maxErr=0, ans=0;
|
||||||
ans = sscanf(Cmd, "%i %i %i %i", &offset, &clk, &invert, &maxErr);
|
ans = sscanf(Cmd, "%i %i %i %i", &offset, &clk, &invert, &maxErr);
|
||||||
if (ans>0)
|
if (ans>0)
|
||||||
ans = ASKrawDemod(Cmd+2, FALSE);
|
ans = ASKrawDemod(Cmd+1, FALSE);
|
||||||
else
|
else
|
||||||
ans = ASKrawDemod(Cmd, FALSE);
|
ans = ASKrawDemod(Cmd, FALSE);
|
||||||
if (!ans) {
|
if (!ans) {
|
||||||
|
@ -1156,9 +1159,8 @@ int FSKrawDemod(const char *Cmd, bool verbose)
|
||||||
if (BitLen==0) return 0;
|
if (BitLen==0) return 0;
|
||||||
//get field clock lengths
|
//get field clock lengths
|
||||||
uint16_t fcs=0;
|
uint16_t fcs=0;
|
||||||
uint8_t dummy=0;
|
|
||||||
if (fchigh==0 || fclow == 0){
|
if (fchigh==0 || fclow == 0){
|
||||||
fcs = countFC(BitStream, BitLen, &dummy);
|
fcs = countFC(BitStream, BitLen, 1);
|
||||||
if (fcs==0){
|
if (fcs==0){
|
||||||
fchigh=10;
|
fchigh=10;
|
||||||
fclow=8;
|
fclow=8;
|
||||||
|
@ -1822,7 +1824,7 @@ int PSKDemod(const char *Cmd, bool verbose)
|
||||||
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
|
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
|
||||||
size_t BitLen = getFromGraphBuf(BitStream);
|
size_t BitLen = getFromGraphBuf(BitStream);
|
||||||
if (BitLen==0) return -1;
|
if (BitLen==0) return -1;
|
||||||
uint8_t carrier=countPSK_FC(BitStream, BitLen);
|
uint8_t carrier=countFC(BitStream, BitLen, 0);
|
||||||
if (carrier!=2 && carrier!=4 && carrier!=8){
|
if (carrier!=2 && carrier!=4 && carrier!=8){
|
||||||
//invalid carrier
|
//invalid carrier
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2083,19 +2085,19 @@ int CmdRawDemod(const char *Cmd)
|
||||||
char cmdp2 = Cmd[1];
|
char cmdp2 = Cmd[1];
|
||||||
int ans = 0;
|
int ans = 0;
|
||||||
if (cmdp == 'f' && cmdp2 == 's'){
|
if (cmdp == 'f' && cmdp2 == 's'){
|
||||||
ans = CmdFSKrawdemod(Cmd+3);
|
ans = CmdFSKrawdemod(Cmd+2);
|
||||||
} else if(cmdp == 'a' && cmdp2 == 'b'){
|
} else if(cmdp == 'a' && cmdp2 == 'b'){
|
||||||
ans = Cmdaskbiphdemod(Cmd+3);
|
ans = Cmdaskbiphdemod(Cmd+2);
|
||||||
} else if(cmdp == 'a' && cmdp2 == 'm'){
|
} else if(cmdp == 'a' && cmdp2 == 'm'){
|
||||||
ans = Cmdaskmandemod(Cmd+3);
|
ans = Cmdaskmandemod(Cmd+2);
|
||||||
} else if(cmdp == 'a' && cmdp2 == 'r'){
|
} else if(cmdp == 'a' && cmdp2 == 'r'){
|
||||||
ans = Cmdaskrawdemod(Cmd+3);
|
ans = Cmdaskrawdemod(Cmd+2);
|
||||||
} else if(cmdp == 'n' && cmdp2 == 'r'){
|
} else if(cmdp == 'n' && cmdp2 == 'r'){
|
||||||
ans = CmdNRZrawDemod(Cmd+3);
|
ans = CmdNRZrawDemod(Cmd+2);
|
||||||
} else if(cmdp == 'p' && cmdp2 == '1'){
|
} else if(cmdp == 'p' && cmdp2 == '1'){
|
||||||
ans = CmdPSK1rawDemod(Cmd+3);
|
ans = CmdPSK1rawDemod(Cmd+2);
|
||||||
} else if(cmdp == 'p' && cmdp2 == '2'){
|
} else if(cmdp == 'p' && cmdp2 == '2'){
|
||||||
ans = CmdPSK2rawDemod(Cmd+3);
|
ans = CmdPSK2rawDemod(Cmd+2);
|
||||||
} else {
|
} else {
|
||||||
PrintAndLog("unknown modulation entered - see help ('h') for parameter structure");
|
PrintAndLog("unknown modulation entered - see help ('h') for parameter structure");
|
||||||
}
|
}
|
||||||
|
|
|
@ -752,12 +752,10 @@ int CmdT55xxReadTrace(const char *Cmd)
|
||||||
uint32_t icr = PackBits(si, 3, DemodBuffer); si += 3;
|
uint32_t icr = PackBits(si, 3, DemodBuffer); si += 3;
|
||||||
uint32_t year = PackBits(si, 4, DemodBuffer); si += 4;
|
uint32_t year = PackBits(si, 4, DemodBuffer); si += 4;
|
||||||
uint32_t quarter = PackBits(si, 2, DemodBuffer); si += 2;
|
uint32_t quarter = PackBits(si, 2, DemodBuffer); si += 2;
|
||||||
uint32_t lotid = PackBits(si, 12, DemodBuffer); si += 12;
|
uint32_t lotid = PackBits(si, 14, DemodBuffer); si += 14;
|
||||||
uint32_t wafer = PackBits(si, 5, DemodBuffer); si += 5;
|
uint32_t wafer = PackBits(si, 5, DemodBuffer); si += 5;
|
||||||
uint32_t dw = PackBits(si, 15, DemodBuffer);
|
uint32_t dw = PackBits(si, 15, DemodBuffer);
|
||||||
|
|
||||||
year += 2000;
|
|
||||||
|
|
||||||
PrintAndLog("");
|
PrintAndLog("");
|
||||||
PrintAndLog("-- T55xx Trace Information ----------------------------------");
|
PrintAndLog("-- T55xx Trace Information ----------------------------------");
|
||||||
PrintAndLog("-------------------------------------------------------------");
|
PrintAndLog("-------------------------------------------------------------");
|
||||||
|
@ -766,7 +764,7 @@ int CmdT55xxReadTrace(const char *Cmd)
|
||||||
PrintAndLog(" CID : 0x%02X (%d) - %s", cid, cid, GetModelStrFromCID(cid));
|
PrintAndLog(" CID : 0x%02X (%d) - %s", cid, cid, GetModelStrFromCID(cid));
|
||||||
PrintAndLog(" ICR IC Revision : %d",icr );
|
PrintAndLog(" ICR IC Revision : %d",icr );
|
||||||
PrintAndLog(" Manufactured");
|
PrintAndLog(" Manufactured");
|
||||||
PrintAndLog(" Year/Quarter : %d/%d",year, quarter );
|
PrintAndLog(" Year/Quarter : 20?%d/%d",year, quarter);
|
||||||
PrintAndLog(" Lot ID : %d", lotid );
|
PrintAndLog(" Lot ID : %d", lotid );
|
||||||
PrintAndLog(" Wafer number : %d", wafer);
|
PrintAndLog(" Wafer number : %d", wafer);
|
||||||
PrintAndLog(" Die Number : %d", dw);
|
PrintAndLog(" Die Number : %d", dw);
|
||||||
|
|
|
@ -146,7 +146,7 @@ uint8_t GetPskCarrier(const char str[], bool printAns, bool verbose)
|
||||||
}
|
}
|
||||||
//uint8_t countPSK_FC(uint8_t *BitStream, size_t size)
|
//uint8_t countPSK_FC(uint8_t *BitStream, size_t size)
|
||||||
|
|
||||||
carrier = countPSK_FC(grph,size);
|
carrier = countFC(grph,size,0);
|
||||||
// Only print this message if we're not looping something
|
// Only print this message if we're not looping something
|
||||||
if (printAns){
|
if (printAns){
|
||||||
PrintAndLog("Auto-detected PSK carrier rate: %d", carrier);
|
PrintAndLog("Auto-detected PSK carrier rate: %d", carrier);
|
||||||
|
@ -232,8 +232,7 @@ uint8_t fskClocks(uint8_t *fc1, uint8_t *fc2, uint8_t *rf1, bool verbose)
|
||||||
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
|
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
|
||||||
size_t size = getFromGraphBuf(BitStream);
|
size_t size = getFromGraphBuf(BitStream);
|
||||||
if (size==0) return 0;
|
if (size==0) return 0;
|
||||||
uint8_t dummy = 0;
|
uint16_t ans = countFC(BitStream, size, 1);
|
||||||
uint16_t ans = countFC(BitStream, size, &dummy);
|
|
||||||
if (ans==0) {
|
if (ans==0) {
|
||||||
if (verbose) PrintAndLog("DEBUG: No data found");
|
if (verbose) PrintAndLog("DEBUG: No data found");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
684
common/lfdemod.c
684
common/lfdemod.c
File diff suppressed because it is too large
Load diff
|
@ -19,7 +19,6 @@ int DetectASKClock(uint8_t dest[], size_t size, int *clock, int maxErr);
|
||||||
uint8_t DetectCleanAskWave(uint8_t dest[], size_t size, int high, int low);
|
uint8_t DetectCleanAskWave(uint8_t dest[], size_t size, int high, int low);
|
||||||
int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr);
|
int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr);
|
||||||
uint8_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo);
|
uint8_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo);
|
||||||
//uint64_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx);
|
|
||||||
int ManchesterEncode(uint8_t *BitStream, size_t size);
|
int ManchesterEncode(uint8_t *BitStream, size_t size);
|
||||||
int manrawdecode(uint8_t *BitStream, size_t *size);
|
int manrawdecode(uint8_t *BitStream, size_t *size);
|
||||||
int BiphaseRawDecode(uint8_t * BitStream, size_t *size, int offset, int invert);
|
int BiphaseRawDecode(uint8_t * BitStream, size_t *size, int offset, int invert);
|
||||||
|
@ -34,20 +33,16 @@ void psk1TOpsk2(uint8_t *BitStream, size_t size);
|
||||||
void psk2TOpsk1(uint8_t *BitStream, size_t size);
|
void psk2TOpsk1(uint8_t *BitStream, size_t size);
|
||||||
int DetectNRZClock(uint8_t dest[], size_t size, int clock);
|
int DetectNRZClock(uint8_t dest[], size_t size, int clock);
|
||||||
int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert);
|
int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert);
|
||||||
void pskCleanWave(uint8_t *bitStream, size_t size);
|
|
||||||
int PyramiddemodFSK(uint8_t *dest, size_t *size);
|
int PyramiddemodFSK(uint8_t *dest, size_t *size);
|
||||||
int AWIDdemodFSK(uint8_t *dest, size_t *size);
|
int AWIDdemodFSK(uint8_t *dest, size_t *size);
|
||||||
size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen);
|
size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen);
|
||||||
uint16_t countFC(uint8_t *BitStream, size_t size, uint8_t *mostFC);
|
uint16_t countFC(uint8_t *BitStream, size_t size, uint8_t fskAdj);
|
||||||
uint8_t detectFSKClk(uint8_t *BitStream, size_t size, uint8_t fcHigh, uint8_t fcLow);
|
uint8_t detectFSKClk(uint8_t *BitStream, size_t size, uint8_t fcHigh, uint8_t fcLow);
|
||||||
int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo);
|
int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo);
|
||||||
int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo);
|
int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo);
|
||||||
uint8_t preambleSearch(uint8_t *BitStream, uint8_t *preamble, size_t pLen, size_t *size, size_t *startIdx);
|
uint8_t preambleSearch(uint8_t *BitStream, uint8_t *preamble, size_t pLen, size_t *size, size_t *startIdx);
|
||||||
uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType);
|
uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType);
|
||||||
uint8_t justNoise(uint8_t *BitStream, size_t size);
|
|
||||||
uint8_t countPSK_FC(uint8_t *BitStream, size_t size);
|
|
||||||
int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert);
|
int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert);
|
||||||
int DetectPSKClock(uint8_t dest[], size_t size, int clock);
|
int DetectPSKClock(uint8_t dest[], size_t size, int clock);
|
||||||
void askAmp(uint8_t *BitStream, size_t size);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue