mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
commit
905df58cc3
8 changed files with 539 additions and 1682 deletions
|
@ -74,6 +74,7 @@ extern void switch_off(void);
|
|||
// Options for the HF reader, correlating against rx from tag
|
||||
#define FPGA_HF_READER_RX_XCORR_848_KHZ (1<<0)
|
||||
#define FPGA_HF_READER_RX_XCORR_SNOOP (1<<1)
|
||||
#define FPGA_HF_READER_RX_XCORR_QUARTER (1<<2)
|
||||
// Options for the HF simulated tag, how to modulate
|
||||
#define FPGA_HF_SIMULATOR_NO_MODULATION (0<<0) // 0000
|
||||
#define FPGA_HF_SIMULATOR_MODULATE_BPSK (1<<0) // 0001
|
||||
|
|
1861
armsrc/legicrf.c
1861
armsrc/legicrf.c
File diff suppressed because it is too large
Load diff
|
@ -11,38 +11,11 @@
|
|||
#ifndef __LEGICRF_H
|
||||
#define __LEGICRF_H
|
||||
|
||||
#include "proxmark3.h" //
|
||||
#include "apps.h"
|
||||
#include "util.h" //
|
||||
#include "string.h"
|
||||
#include "legic_prng.h" // legic PRNG impl
|
||||
#include "crc.h" // legic crc-4
|
||||
#include "ticks.h" // timers
|
||||
#include "legic.h" // legic_card_select_t struct
|
||||
#include "proxmark3.h"
|
||||
|
||||
extern void LegicRfSimulate(int phase, int frame, int reqresp);
|
||||
extern int LegicRfReader(uint16_t offset, uint16_t len, uint8_t iv);
|
||||
extern void LegicRfWriter(uint16_t offset, uint16_t byte, uint8_t iv, uint8_t *data);
|
||||
extern void LegicRfInfo(void);
|
||||
|
||||
uint32_t get_key_stream(int skip, int count);
|
||||
void frame_send_tag(uint16_t response, uint8_t bits);
|
||||
void frame_sendAsReader(uint32_t data, uint8_t bits);
|
||||
|
||||
int legic_read_byte( uint16_t index, uint8_t cmd_sz);
|
||||
bool legic_write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz);
|
||||
|
||||
int legic_select_card(legic_card_select_t *p_card);
|
||||
int legic_select_card_iv(legic_card_select_t *p_card, uint8_t iv);
|
||||
|
||||
void LegicCommonInit(bool clear_mem);
|
||||
|
||||
// emulator mem
|
||||
void LegicEMemSet(uint32_t arg0, uint32_t arg1, uint8_t *data);
|
||||
void LegicEMemGet(uint32_t arg0, uint32_t arg1);
|
||||
void legic_emlset_mem(uint8_t *data, int offset, int numofbytes);
|
||||
void legic_emlget_mem(uint8_t *data, int offset, int numofbytes);
|
||||
|
||||
void ice_legic_setup();
|
||||
extern void LegicRfReader(uint16_t offset, uint16_t len, uint8_t iv);
|
||||
extern void LegicRfWriter(uint16_t offset, uint16_t byte, uint8_t iv, uint8_t *data);
|
||||
extern void LegicRfSimulate(int phase, int frame, int reqresp);
|
||||
|
||||
#endif /* __LEGICRF_H */
|
||||
|
|
|
@ -174,54 +174,65 @@ uint32_t RAMFUNC GetCountSspClk(void) {
|
|||
// -------------------------------------------------------------------------
|
||||
void StartTicks(void){
|
||||
// initialization of the timer
|
||||
// tc1 is higher 0xFFFF0000
|
||||
// tc0 is lower 0x0000FFFF
|
||||
AT91C_BASE_PMC->PMC_PCER |= (1 << AT91C_ID_TC0) | (1 << AT91C_ID_TC1);
|
||||
AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC0XC0S_NONE | AT91C_TCB_TC1XC1S_TIOA0 | AT91C_TCB_TC2XC2S_NONE;
|
||||
|
||||
// disable TC0 and TC1 for re-configuration
|
||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
|
||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
|
||||
|
||||
// first configure TC1 (higher, 0xFFFF0000) 16 bit counter
|
||||
AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_XC1; // just connect to TIOA0 from TC0
|
||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // re-enable timer and wait for TC0
|
||||
|
||||
// second configure TC0 (lower, 0x0000FFFF) 16 bit counter
|
||||
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV3_CLOCK | // MCK(48MHz) / 32
|
||||
AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_ACPA_CLEAR |
|
||||
AT91C_TC_ACPC_SET | AT91C_TC_ASWTRG_SET;
|
||||
AT91C_BASE_TC0->TC_RA = 1;
|
||||
AT91C_BASE_TC0->TC_RC = 0;
|
||||
AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO |
|
||||
AT91C_TC_ACPA_CLEAR | // RA comperator clears TIOA (carry bit)
|
||||
AT91C_TC_ACPC_SET | // RC comperator sets TIOA (carry bit)
|
||||
AT91C_TC_ASWTRG_SET; // SWTriger sets TIOA (carry bit)
|
||||
AT91C_BASE_TC0->TC_RC = 0; // set TIOA (carry bit) on overflow, return to zero
|
||||
AT91C_BASE_TC0->TC_RA = 1; // clear carry bit on next clock cycle
|
||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // reset and re-enable timer
|
||||
|
||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; // timer disable
|
||||
AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_XC1; // from TC0
|
||||
// synchronized startup procedure
|
||||
while (AT91C_BASE_TC0->TC_CV > 0); // wait until TC0 returned to zero
|
||||
while (AT91C_BASE_TC0->TC_CV < 2); // and has started (TC_CV > TC_RA, now TC1 is cleared)
|
||||
|
||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||
AT91C_BASE_TCB->TCB_BCR = 1;
|
||||
|
||||
// wait until timer becomes zero.
|
||||
while (AT91C_BASE_TC1->TC_CV > 0);
|
||||
// return to zero
|
||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
|
||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG;
|
||||
while (AT91C_BASE_TC0->TC_CV > 0);
|
||||
}
|
||||
|
||||
uint32_t GetTicks(void) {
|
||||
uint32_t hi, lo;
|
||||
|
||||
do {
|
||||
hi = AT91C_BASE_TC1->TC_CV;
|
||||
lo = AT91C_BASE_TC0->TC_CV;
|
||||
} while(hi != AT91C_BASE_TC1->TC_CV);
|
||||
|
||||
return (hi << 16) | lo;
|
||||
}
|
||||
|
||||
// Wait - Spindelay in ticks.
|
||||
// if called with a high number, this will trigger the WDT...
|
||||
void WaitTicks(uint32_t ticks){
|
||||
if ( ticks == 0 ) return;
|
||||
ticks += GET_TICKS;
|
||||
while (GET_TICKS < ticks);
|
||||
ticks += GetTicks();
|
||||
while (GetTicks() < ticks);
|
||||
}
|
||||
|
||||
// Wait / Spindelay in us (microseconds)
|
||||
// 1us = 1.5ticks.
|
||||
void WaitUS(uint16_t us){
|
||||
if ( us == 0 ) return;
|
||||
WaitTicks( (uint32_t)us * 3/2 );
|
||||
}
|
||||
void WaitMS(uint16_t ms){
|
||||
if (ms == 0) return;
|
||||
WaitTicks( (uint32_t)ms * 1500 );
|
||||
}
|
||||
// Starts Clock and waits until its reset
|
||||
void ResetTicks(void){
|
||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||
while (AT91C_BASE_TC1->TC_CV > 0);
|
||||
}
|
||||
void ResetTimer(AT91PS_TC timer){
|
||||
timer->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||
while(timer->TC_CV > 0) ;
|
||||
}
|
||||
|
||||
// stop clock
|
||||
void StopTicks(void){
|
||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#include "proxmark3.h"
|
||||
|
||||
#ifndef GET_TICKS
|
||||
# define GET_TICKS (uint32_t)((AT91C_BASE_TC1->TC_CV << 16) | AT91C_BASE_TC0->TC_CV)
|
||||
#define GET_TICKS GetTicks()
|
||||
#endif
|
||||
|
||||
void SpinDelay(int ms);
|
||||
|
@ -32,17 +32,15 @@ void StartCountUS(void);
|
|||
uint32_t RAMFUNC GetCountUS(void);
|
||||
void ResetUSClock(void);
|
||||
void SpinDelayCountUs(uint32_t us);
|
||||
//uint32_t RAMFUNC GetDeltaCountUS(void);
|
||||
|
||||
void StartCountSspClk();
|
||||
void ResetSspClk(void);
|
||||
uint32_t RAMFUNC GetCountSspClk();
|
||||
|
||||
extern void StartTicks(void);
|
||||
extern void WaitTicks(uint32_t ticks);
|
||||
extern void WaitUS(uint16_t us);
|
||||
extern void WaitMS(uint16_t ms);
|
||||
extern void ResetTicks();
|
||||
extern void ResetTimer(AT91PS_TC timer);
|
||||
extern void StopTicks(void);
|
||||
void StartTicks(void);
|
||||
uint32_t GetTicks(void);
|
||||
void WaitTicks(uint32_t ticks);
|
||||
void WaitUS(uint16_t us);
|
||||
void WaitMS(uint16_t ms);
|
||||
void StopTicks(void);
|
||||
#endif
|
BIN
fpga/fpga_hf.bit
BIN
fpga/fpga_hf.bit
Binary file not shown.
|
@ -71,19 +71,8 @@ always @(negedge ssp_clk)
|
|||
|
||||
assign ssp_frame = (hi_byte_div == 3'b000);
|
||||
|
||||
// Implement a hysteresis to give out the received signal on
|
||||
// ssp_din. Sample at fc.
|
||||
assign adc_clk = ck_1356meg;
|
||||
assign ssp_din = 1'b0;
|
||||
|
||||
// ADC data appears on the rising edge, so sample it on the falling edge
|
||||
reg after_hysteresis;
|
||||
always @(negedge adc_clk)
|
||||
begin
|
||||
if(& adc_d[6:4]) after_hysteresis <= 1'b1;
|
||||
else if(~(| adc_d[6:4])) after_hysteresis <= 1'b0;
|
||||
end
|
||||
|
||||
assign ssp_din = after_hysteresis;
|
||||
assign dbg = after_hysteresis;
|
||||
assign dbg = ssp_frame;
|
||||
|
||||
endmodule
|
Loading…
Add table
Add a link
Reference in a new issue