mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-16 02:03:00 -07:00
lf sim fixes/creations correct now
fixed lf simpsk fixed lf em em410xsim fixed lf sim (can go right from lf search to lf sim if you have a strong antenna - if not use a demod first)
This commit is contained in:
parent
e09f21fa7b
commit
78f5b1a77c
7 changed files with 54 additions and 109 deletions
106
armsrc/lfops.c
106
armsrc/lfops.c
|
@ -438,86 +438,6 @@ void SimulateTagLowFrequency(int period, int gap, int ledcontrol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Testing to fix timing issues by marshmellow (MM)
|
|
||||||
void SimulateTagLowFrequencyMM(int period, int gap, int ledcontrol)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
uint8_t *tab = BigBuf_get_addr();
|
|
||||||
|
|
||||||
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
|
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT);
|
|
||||||
|
|
||||||
AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT | GPIO_SSC_CLK;
|
|
||||||
|
|
||||||
AT91C_BASE_PIOA->PIO_OER = GPIO_SSC_DOUT;
|
|
||||||
AT91C_BASE_PIOA->PIO_ODR = GPIO_SSC_CLK;
|
|
||||||
|
|
||||||
#define SHORT_COIL() LOW(GPIO_SSC_DOUT)
|
|
||||||
#define OPEN_COIL() HIGH(GPIO_SSC_DOUT)
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
while(!BUTTON_PRESS()) {
|
|
||||||
|
|
||||||
WDT_HIT();
|
|
||||||
//wait until reader carrier is HIGH
|
|
||||||
while(!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)) {
|
|
||||||
WDT_HIT();
|
|
||||||
}
|
|
||||||
if (i>0){
|
|
||||||
if (tab[i]!=tab[i-1]){
|
|
||||||
// transition
|
|
||||||
if (ledcontrol)
|
|
||||||
LED_D_ON();
|
|
||||||
|
|
||||||
// modulate coil
|
|
||||||
if(tab[i])
|
|
||||||
OPEN_COIL();
|
|
||||||
else
|
|
||||||
SHORT_COIL();
|
|
||||||
|
|
||||||
if (ledcontrol)
|
|
||||||
LED_D_OFF();
|
|
||||||
|
|
||||||
} else { //no transition
|
|
||||||
//NOTE: it appears the COIL transition messes with the detection of the carrier, so if a transition happened
|
|
||||||
// skip test for readers Carrier = LOW, otherwise we get a bit behind
|
|
||||||
|
|
||||||
//wait until reader carrier is LOW
|
|
||||||
while(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK) {
|
|
||||||
WDT_HIT();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// transition
|
|
||||||
if (ledcontrol)
|
|
||||||
LED_D_ON();
|
|
||||||
|
|
||||||
// modulate coil
|
|
||||||
if(tab[i])
|
|
||||||
OPEN_COIL();
|
|
||||||
else
|
|
||||||
SHORT_COIL();
|
|
||||||
|
|
||||||
if (ledcontrol)
|
|
||||||
LED_D_OFF();
|
|
||||||
}
|
|
||||||
WDT_HIT();
|
|
||||||
|
|
||||||
|
|
||||||
i++;
|
|
||||||
if(i == period) {
|
|
||||||
// end of data stream, gap then repeat
|
|
||||||
i = 0;
|
|
||||||
if (gap) {
|
|
||||||
SHORT_COIL();
|
|
||||||
SpinDelayUs(gap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DbpString("Stopped");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEBUG_FRAME_CONTENTS 1
|
#define DEBUG_FRAME_CONTENTS 1
|
||||||
void SimulateTagLowFrequencyBidir(int divisor, int t0)
|
void SimulateTagLowFrequencyBidir(int divisor, int t0)
|
||||||
{
|
{
|
||||||
|
@ -586,7 +506,7 @@ static void fcAll(uint8_t c, int *n, uint8_t clock, uint16_t *modCnt)
|
||||||
for (idx=0; idx < (uint8_t) clock/c; idx++){
|
for (idx=0; idx < (uint8_t) clock/c; idx++){
|
||||||
// loop through field clock length - put 1/2 FC length 1's and 1/2 0's per field clock wave (to create the wave)
|
// loop through field clock length - put 1/2 FC length 1's and 1/2 0's per field clock wave (to create the wave)
|
||||||
for (fcCnt=0; fcCnt < c; fcCnt++){ //fudge slow transition from low to high - shorten wave by 1
|
for (fcCnt=0; fcCnt < c; fcCnt++){ //fudge slow transition from low to high - shorten wave by 1
|
||||||
if (fcCnt < c/2+1){
|
if (fcCnt < c/2){
|
||||||
dest[((*n)++)]=0;
|
dest[((*n)++)]=0;
|
||||||
} else {
|
} else {
|
||||||
//fudge low to high transition
|
//fudge low to high transition
|
||||||
|
@ -600,7 +520,7 @@ static void fcAll(uint8_t c, int *n, uint8_t clock, uint16_t *modCnt)
|
||||||
if ((mod>0) && modAdjOk){ //fsk2
|
if ((mod>0) && modAdjOk){ //fsk2
|
||||||
if ((*modCnt % modAdj) == 0){ //if 4th 8 length wave in a rf/50 add extra 8 length wave
|
if ((*modCnt % modAdj) == 0){ //if 4th 8 length wave in a rf/50 add extra 8 length wave
|
||||||
for (fcCnt=0; fcCnt < c; fcCnt++){ //fudge slow transition from low to high - shorten wave by 1
|
for (fcCnt=0; fcCnt < c; fcCnt++){ //fudge slow transition from low to high - shorten wave by 1
|
||||||
if (fcCnt < c/2+1){
|
if (fcCnt < c/2){
|
||||||
dest[((*n)++)]=0;
|
dest[((*n)++)]=0;
|
||||||
} else {
|
} else {
|
||||||
//if (c==8 && fcCnt==5) continue;
|
//if (c==8 && fcCnt==5) continue;
|
||||||
|
@ -637,7 +557,7 @@ void CmdHIDsimTAG(int hi, int lo, int ledcontrol)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (hi>0xFFF) {
|
if (hi>0xFFF) {
|
||||||
DbpString("Tags can only have 44 bits.");
|
DbpString("Tags can only have 44 bits. - USE lf simfsk for larger tags");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fc(0,&n);
|
fc(0,&n);
|
||||||
|
@ -701,7 +621,8 @@ void CmdFSKsimTAG(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Dbprintf("Simulating with fcHigh: %d, fcLow: %d, clk: %d, invert: %d, n: %d",fcHigh, fcLow, clk, invert, n);
|
Dbprintf("Simulating with fcHigh: %d, fcLow: %d, clk: %d, invert: %d, n: %d",fcHigh, fcLow, clk, invert, n);
|
||||||
Dbprintf("First 64:");
|
WDT_HIT();
|
||||||
|
/*Dbprintf("First 64:");
|
||||||
uint8_t *dest = BigBuf_get_addr();
|
uint8_t *dest = BigBuf_get_addr();
|
||||||
i=0;
|
i=0;
|
||||||
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
|
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
|
||||||
|
@ -733,10 +654,10 @@ void CmdFSKsimTAG(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
|
||||||
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
|
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
|
||||||
i+=16;
|
i+=16;
|
||||||
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
|
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
|
||||||
|
*/
|
||||||
if (ledcontrol)
|
if (ledcontrol)
|
||||||
LED_A_ON();
|
LED_A_ON();
|
||||||
SimulateTagLowFrequencyMM(n, 0, ledcontrol);
|
SimulateTagLowFrequency(n, 0, ledcontrol);
|
||||||
|
|
||||||
if (ledcontrol)
|
if (ledcontrol)
|
||||||
LED_A_OFF();
|
LED_A_OFF();
|
||||||
|
@ -779,7 +700,6 @@ void CmdASKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
|
||||||
uint8_t manchester = arg1 & 1;
|
uint8_t manchester = arg1 & 1;
|
||||||
uint8_t separator = arg2 & 1;
|
uint8_t separator = arg2 & 1;
|
||||||
uint8_t invert = (arg2 >> 8) & 1;
|
uint8_t invert = (arg2 >> 8) & 1;
|
||||||
WDT_HIT();
|
|
||||||
for (i=0; i<size; i++){
|
for (i=0; i<size; i++){
|
||||||
askSimBit(BitStream[i]^invert, &n, clk, manchester);
|
askSimBit(BitStream[i]^invert, &n, clk, manchester);
|
||||||
}
|
}
|
||||||
|
@ -801,7 +721,7 @@ void CmdASKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
|
||||||
|
|
||||||
if (ledcontrol)
|
if (ledcontrol)
|
||||||
LED_A_ON();
|
LED_A_ON();
|
||||||
SimulateTagLowFrequencyMM(n, 0, ledcontrol);
|
SimulateTagLowFrequency(n, 0, ledcontrol);
|
||||||
|
|
||||||
if (ledcontrol)
|
if (ledcontrol)
|
||||||
LED_A_OFF();
|
LED_A_OFF();
|
||||||
|
@ -815,13 +735,14 @@ static void pskSimBit(uint8_t waveLen, int *n, uint8_t clk, uint8_t *curPhase, b
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if (phaseChg){
|
if (phaseChg){
|
||||||
// write phase change
|
// write phase change
|
||||||
for (i=0; i < waveLen/2; i++){
|
for (idx=0; idx < waveLen/2; idx++){
|
||||||
dest[((*n)++)] = *curPhase^1;
|
dest[((*n)++)] = *curPhase^1;
|
||||||
}
|
}
|
||||||
for (i=0; i < waveLen/2; i++){
|
for (idx=0; idx < waveLen/2; idx++){
|
||||||
dest[((*n)++)] = *curPhase;
|
dest[((*n)++)] = *curPhase;
|
||||||
}
|
}
|
||||||
*curPhase ^= 1;
|
*curPhase ^= 1;
|
||||||
|
i+=waveLen;
|
||||||
}
|
}
|
||||||
//write each normal clock wave for the clock duration
|
//write each normal clock wave for the clock duration
|
||||||
for (; i < clk; i+=waveLen){
|
for (; i < clk; i+=waveLen){
|
||||||
|
@ -844,8 +765,8 @@ void CmdPSKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
|
||||||
uint8_t invert = arg2 & 0xFF;
|
uint8_t invert = arg2 & 0xFF;
|
||||||
//uint8_t phase = carrier/2; //extra phase changing bits = 1/2 a carrier wave to change the phase
|
//uint8_t phase = carrier/2; //extra phase changing bits = 1/2 a carrier wave to change the phase
|
||||||
//uint8_t invert = (arg2 >> 8) & 1;
|
//uint8_t invert = (arg2 >> 8) & 1;
|
||||||
uint8_t curPhase = 0;
|
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
uint8_t curPhase = 0;
|
||||||
for (i=0; i<size; i++){
|
for (i=0; i<size; i++){
|
||||||
if (BitStream[i] == curPhase){
|
if (BitStream[i] == curPhase){
|
||||||
pskSimBit(carrier, &n, clk, &curPhase, FALSE);
|
pskSimBit(carrier, &n, clk, &curPhase, FALSE);
|
||||||
|
@ -854,6 +775,7 @@ void CmdPSKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Dbprintf("Simulating with Carrier: %d, clk: %d, invert: %d, n: %d",carrier, clk, invert, n);
|
Dbprintf("Simulating with Carrier: %d, clk: %d, invert: %d, n: %d",carrier, clk, invert, n);
|
||||||
|
WDT_HIT();
|
||||||
Dbprintf("First 128:");
|
Dbprintf("First 128:");
|
||||||
uint8_t *dest = BigBuf_get_addr();
|
uint8_t *dest = BigBuf_get_addr();
|
||||||
i=0;
|
i=0;
|
||||||
|
@ -875,7 +797,7 @@ void CmdPSKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
|
||||||
|
|
||||||
if (ledcontrol)
|
if (ledcontrol)
|
||||||
LED_A_ON();
|
LED_A_ON();
|
||||||
SimulateTagLowFrequencyMM(n, 0, ledcontrol);
|
SimulateTagLowFrequency(n, 0, ledcontrol);
|
||||||
|
|
||||||
if (ledcontrol)
|
if (ledcontrol)
|
||||||
LED_A_OFF();
|
LED_A_OFF();
|
||||||
|
|
|
@ -133,20 +133,19 @@ int CmdAmp(const char *Cmd)
|
||||||
* Updates the Graph trace with 0/1 values
|
* Updates the Graph trace with 0/1 values
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* c : 0 or 1
|
* c : 0 or 1 (or invert)
|
||||||
*/
|
*/
|
||||||
//this method is dependant on all highs and lows to be the same(or clipped) this creates issues[marshmellow] it also ignores the clock
|
//this method ignores the clock
|
||||||
|
|
||||||
|
//this function strictly converts highs and lows to 1s and 0s for each sample in the graphbuffer
|
||||||
int Cmdaskdemod(const char *Cmd)
|
int Cmdaskdemod(const char *Cmd)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int c, high = 0, low = 0;
|
int c, high = 0, low = 0;
|
||||||
|
|
||||||
// TODO: complain if we do not give 2 arguments here !
|
|
||||||
// (AL - this doesn't make sense! we're only using one argument!!!)
|
|
||||||
sscanf(Cmd, "%i", &c);
|
sscanf(Cmd, "%i", &c);
|
||||||
|
|
||||||
/* Detect high and lows and clock */
|
/* Detect high and lows */
|
||||||
// (AL - clock???)
|
|
||||||
for (i = 0; i < GraphTraceLen; ++i)
|
for (i = 0; i < GraphTraceLen; ++i)
|
||||||
{
|
{
|
||||||
if (GraphBuffer[i] > high)
|
if (GraphBuffer[i] > high)
|
||||||
|
@ -176,9 +175,9 @@ int Cmdaskdemod(const char *Cmd)
|
||||||
* down)
|
* down)
|
||||||
*/
|
*/
|
||||||
//[marhsmellow] change == to >= for high and <= for low for fuzz
|
//[marhsmellow] change == to >= for high and <= for low for fuzz
|
||||||
if ((GraphBuffer[i] == high) && (GraphBuffer[i - 1] == c)) {
|
if ((GraphBuffer[i] >= high) && (GraphBuffer[i - 1] == c)) {
|
||||||
GraphBuffer[i] = 1 - c;
|
GraphBuffer[i] = 1 - c;
|
||||||
} else if ((GraphBuffer[i] == low) && (GraphBuffer[i - 1] == (1 - c))){
|
} else if ((GraphBuffer[i] <= low) && (GraphBuffer[i - 1] == (1 - c))){
|
||||||
GraphBuffer[i] = c;
|
GraphBuffer[i] = c;
|
||||||
} else {
|
} else {
|
||||||
/* No transition */
|
/* No transition */
|
||||||
|
@ -189,6 +188,23 @@ int Cmdaskdemod(const char *Cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//this function strictly converts >1 to 1 and <1 to 0 for each sample in the graphbuffer
|
||||||
|
int CmdGetBitStream(const char *Cmd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
CmdHpf(Cmd);
|
||||||
|
for (i = 0; i < GraphTraceLen; i++) {
|
||||||
|
if (GraphBuffer[i] >= 1) {
|
||||||
|
GraphBuffer[i] = 1;
|
||||||
|
} else {
|
||||||
|
GraphBuffer[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RepaintGraphWindow();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//by marshmellow
|
//by marshmellow
|
||||||
void printBitStream(uint8_t BitStream[], uint32_t bitLen)
|
void printBitStream(uint8_t BitStream[], uint32_t bitLen)
|
||||||
{
|
{
|
||||||
|
@ -1954,6 +1970,7 @@ int CmdHide(const char *Cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//zero mean GraphBuffer
|
||||||
int CmdHpf(const char *Cmd)
|
int CmdHpf(const char *Cmd)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -2561,6 +2578,7 @@ static command_t CommandTable[] =
|
||||||
{"fskpyramiddemod",CmdFSKdemodPyramid,1, "Demodulate a Pyramid FSK tag from GraphBuffer"},
|
{"fskpyramiddemod",CmdFSKdemodPyramid,1, "Demodulate a Pyramid FSK tag from GraphBuffer"},
|
||||||
{"fskparadoxdemod",CmdFSKdemodParadox,1, "Demodulate a Paradox FSK tag from GraphBuffer"},
|
{"fskparadoxdemod",CmdFSKdemodParadox,1, "Demodulate a Paradox FSK tag from GraphBuffer"},
|
||||||
//{"fskrawdemod", CmdFSKrawdemod, 1, "[clock rate] [invert] [rchigh] [rclow] Demodulate graph window from FSK to bin (clock = 50)(invert = 1|0)(rchigh = 10)(rclow=8)"},
|
//{"fskrawdemod", CmdFSKrawdemod, 1, "[clock rate] [invert] [rchigh] [rclow] Demodulate graph window from FSK to bin (clock = 50)(invert = 1|0)(rchigh = 10)(rclow=8)"},
|
||||||
|
{"getbitstream", CmdGetBitStream, 1, "Convert GraphBuffer's >=1 values to 1 and <1 to 0"},
|
||||||
{"grid", CmdGrid, 1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},
|
{"grid", CmdGrid, 1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},
|
||||||
{"hexsamples", CmdHexsamples, 0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},
|
{"hexsamples", CmdHexsamples, 0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},
|
||||||
{"hide", CmdHide, 1, "Hide graph window"},
|
{"hide", CmdHide, 1, "Hide graph window"},
|
||||||
|
|
|
@ -39,6 +39,7 @@ int CmdFSKrawdemod(const char *Cmd);
|
||||||
int CmdPSK1rawDemod(const char *Cmd);
|
int CmdPSK1rawDemod(const char *Cmd);
|
||||||
int CmdPSK2rawDemod(const char *Cmd);
|
int CmdPSK2rawDemod(const char *Cmd);
|
||||||
int CmdGrid(const char *Cmd);
|
int CmdGrid(const char *Cmd);
|
||||||
|
int CmdGetBitStream(const char *Cmd);
|
||||||
int CmdHexsamples(const char *Cmd);
|
int CmdHexsamples(const char *Cmd);
|
||||||
int CmdHide(const char *Cmd);
|
int CmdHide(const char *Cmd);
|
||||||
int CmdHpf(const char *Cmd);
|
int CmdHpf(const char *Cmd);
|
||||||
|
|
|
@ -510,11 +510,11 @@ int CmdLFSnoop(const char *Cmd)
|
||||||
static void ChkBitstream(const char *str)
|
static void ChkBitstream(const char *str)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* convert to bitstream if necessary */
|
/* convert to bitstream if necessary */
|
||||||
for (i = 0; i < (int)(GraphTraceLen / 2); i++){
|
for (i = 0; i < (int)(GraphTraceLen / 2); i++){
|
||||||
if (GraphBuffer[i] > 1 || GraphBuffer[i] < 0) {
|
if (GraphBuffer[i] > 1 || GraphBuffer[i] < 0) {
|
||||||
CmdBitstream(str);
|
CmdGetBitStream("");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -528,6 +528,7 @@ int CmdLFSim(const char *Cmd)
|
||||||
sscanf(Cmd, "%i", &gap);
|
sscanf(Cmd, "%i", &gap);
|
||||||
|
|
||||||
/* convert to bitstream if necessary */
|
/* convert to bitstream if necessary */
|
||||||
|
|
||||||
ChkBitstream(Cmd);
|
ChkBitstream(Cmd);
|
||||||
|
|
||||||
//can send 512 bits at a time (1 byte sent per bit...)
|
//can send 512 bits at a time (1 byte sent per bit...)
|
||||||
|
@ -878,6 +879,7 @@ int CmdLFpskSim(const char *Cmd)
|
||||||
uint16_t arg1, arg2;
|
uint16_t arg1, arg2;
|
||||||
arg1 = clk << 8 | carrier;
|
arg1 = clk << 8 | carrier;
|
||||||
arg2 = invert;
|
arg2 = invert;
|
||||||
|
|
||||||
UsbCommand c = {CMD_PSK_SIM_TAG, {arg1, arg2, DemodBufferLen}};
|
UsbCommand c = {CMD_PSK_SIM_TAG, {arg1, arg2, DemodBufferLen}};
|
||||||
if (DemodBufferLen > USB_CMD_DATA_SIZE) {
|
if (DemodBufferLen > USB_CMD_DATA_SIZE) {
|
||||||
PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", DemodBufferLen, USB_CMD_DATA_SIZE);
|
PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", DemodBufferLen, USB_CMD_DATA_SIZE);
|
||||||
|
@ -885,6 +887,7 @@ int CmdLFpskSim(const char *Cmd)
|
||||||
PrintAndLog("DEBUG: Sending DemodBuffer Length: %d", DemodBufferLen);
|
PrintAndLog("DEBUG: Sending DemodBuffer Length: %d", DemodBufferLen);
|
||||||
memcpy(c.d.asBytes, DemodBuffer, DemodBufferLen);
|
memcpy(c.d.asBytes, DemodBuffer, DemodBufferLen);
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -899,6 +902,7 @@ int CmdLFSimBidir(const char *Cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */
|
/* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */
|
||||||
|
/*
|
||||||
int CmdLFSimManchester(const char *Cmd)
|
int CmdLFSimManchester(const char *Cmd)
|
||||||
{
|
{
|
||||||
static int clock, gap;
|
static int clock, gap;
|
||||||
|
@ -919,7 +923,7 @@ int CmdLFSimManchester(const char *Cmd)
|
||||||
CmdLFSim(gapstring);
|
CmdLFSim(gapstring);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
int CmdVchDemod(const char *Cmd)
|
int CmdVchDemod(const char *Cmd)
|
||||||
{
|
{
|
||||||
|
@ -1111,11 +1115,11 @@ static command_t CommandTable[] =
|
||||||
{"read", CmdLFRead, 0, "Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"},
|
{"read", CmdLFRead, 0, "Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"},
|
||||||
{"search", CmdLFfind, 1, "[offline] ['u'] Read and Search for valid known tag (in offline mode it you can load first then search) - 'u' to search for unknown tags"},
|
{"search", CmdLFfind, 1, "[offline] ['u'] Read and Search for valid known tag (in offline mode it you can load first then search) - 'u' to search for unknown tags"},
|
||||||
{"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},
|
{"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},
|
||||||
{"simask", CmdLFaskSim, 0, "[clock] [invert <1|0>] [manchester/raw <'m'|'r'>] [trs separator 's'] [d <hexdata>] -- Simulate LF ASK tag from demodbuffer or input"},
|
{"simask", CmdLFaskSim, 0, "[clock] [invert <1|0>] [manchester/raw <'m'|'r'>] [msg separator 's'] [d <hexdata>] -- Simulate LF ASK tag from demodbuffer or input"},
|
||||||
{"simfsk", CmdLFfskSim, 0, "[c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>] -- Simulate LF FSK tag from demodbuffer or input"},
|
{"simfsk", CmdLFfskSim, 0, "[c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>] -- Simulate LF FSK tag from demodbuffer or input"},
|
||||||
{"simpsk", CmdLFpskSim, 0, "[1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>] -- Simulate LF PSK tag from demodbuffer or input"},
|
{"simpsk", CmdLFpskSim, 0, "[1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>] -- Simulate LF PSK tag from demodbuffer or input"},
|
||||||
{"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
|
{"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
|
||||||
{"simman", CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},
|
//{"simman", CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},
|
||||||
{"snoop", CmdLFSnoop, 0, "['l'|'h'|<divisor>] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"},
|
{"snoop", CmdLFSnoop, 0, "['l'|'h'|<divisor>] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"},
|
||||||
{"ti", CmdLFTI, 1, "{ TI RFIDs... }"},
|
{"ti", CmdLFTI, 1, "{ TI RFIDs... }"},
|
||||||
{"hitag", CmdLFHitag, 1, "{ Hitag tags and transponders... }"},
|
{"hitag", CmdLFHitag, 1, "{ Hitag tags and transponders... }"},
|
||||||
|
|
|
@ -23,7 +23,7 @@ int CmdLFaskSim(const char *Cmd);
|
||||||
int CmdLFfskSim(const char *Cmd);
|
int CmdLFfskSim(const char *Cmd);
|
||||||
int CmdLFpskSim(const char *Cmd);
|
int CmdLFpskSim(const char *Cmd);
|
||||||
int CmdLFSimBidir(const char *Cmd);
|
int CmdLFSimBidir(const char *Cmd);
|
||||||
int CmdLFSimManchester(const char *Cmd);
|
//int CmdLFSimManchester(const char *Cmd);
|
||||||
int CmdLFSnoop(const char *Cmd);
|
int CmdLFSnoop(const char *Cmd);
|
||||||
int CmdVchDemod(const char *Cmd);
|
int CmdVchDemod(const char *Cmd);
|
||||||
int CmdLFfind(const char *Cmd);
|
int CmdLFfind(const char *Cmd);
|
||||||
|
|
|
@ -266,7 +266,7 @@ int CmdEM410xSim(const char *Cmd)
|
||||||
/* stop bit */
|
/* stop bit */
|
||||||
AppendGraph(1, clock, 0);
|
AppendGraph(1, clock, 0);
|
||||||
|
|
||||||
CmdLFSim("240"); //240 start_gap.
|
CmdLFSim("0"); //240 start_gap.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,10 +24,10 @@ void AppendGraph(int redraw, int clock, int bit)
|
||||||
int i;
|
int i;
|
||||||
//set first half the clock bit (all 1's or 0's for a 0 or 1 bit)
|
//set first half the clock bit (all 1's or 0's for a 0 or 1 bit)
|
||||||
for (i = 0; i < (int)(clock / 2); ++i)
|
for (i = 0; i < (int)(clock / 2); ++i)
|
||||||
GraphBuffer[GraphTraceLen++] = bit ^ 1;
|
GraphBuffer[GraphTraceLen++] = bit ;
|
||||||
//set second half of the clock bit (all 0's or 1's for a 0 or 1 bit)
|
//set second half of the clock bit (all 0's or 1's for a 0 or 1 bit)
|
||||||
for (i = (int)(clock / 2); i < clock; ++i)
|
for (i = (int)(clock / 2); i < clock; ++i)
|
||||||
GraphBuffer[GraphTraceLen++] = bit;
|
GraphBuffer[GraphTraceLen++] = bit ^ 1;
|
||||||
|
|
||||||
if (redraw)
|
if (redraw)
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue