]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/legicrf.c
CHG: reordered the "hf search" internal checks. The iclass check takes 4.5sec to...
[proxmark3-svn] / armsrc / legicrf.c
index 6a1c3baec0d64b467c82c69412bb2e7c22e08c83..f9092103ea1f0b1a70037731ba64fd81b2b0f3d3 100644 (file)
@@ -217,7 +217,7 @@ void frame_sendAsReader(uint32_t data, uint8_t bits){
        COIL_PULSE(0);
        
        // log
-       uint8_t cmdbytes[] = {cmd_sz, BYTEx(cmd, 0), BYTEx(cmd, 1), BYTEx(cmd, 2), BYTEx(send, 0), BYTEx(send, 1) };
+       uint8_t cmdbytes[] = {bits, BYTEx(data,0), BYTEx(data,1), BYTEx(data,2), BYTEx(send,0), BYTEx(send,1), BYTEx(send,2)};
        LogTrace(cmdbytes, sizeof(cmdbytes), starttime, GET_TICKS, NULL, TRUE);
 }
 
@@ -405,31 +405,20 @@ 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) {
 
        bool isOK = false;
-       uint8_t i = 80, edges = 0;
+       int8_t i = 40;
+       uint8_t edges = 0;
        uint8_t cmd_sz = addr_sz+1+8+4; //crc+data+cmd;
        uint32_t steps = 0, next_bit_at, start, crc, old_level = 0;
 
-       /*
-       crc_clear(&legic_crc);
-       crc_update(&legic_crc, 0, 1); // CMD_WRITE 
-       crc_update(&legic_crc, index, addr_sz);
-       crc_update(&legic_crc, byte, 8);
-       uint32_t crc = crc_finish(&legic_crc);
-       */
        crc = legic4Crc(LEGIC_WRITE, index, byte, addr_sz+1);
 
        // send write command
-       uint32_t cmd;
-       cmd     = ((crc & 0xF ) << (addr_sz+1+8));  // CRC
-       cmd |= byte  << (addr_sz+1); // Data
-       cmd |= ((index & 0xFF) << 1);           // index
-    cmd |= LEGIC_WRITE;          // CMD
-
-       /* Bitbang the response */
-       SHORT_COIL;
-       AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT;
+       uint32_t cmd = LEGIC_WRITE;
+       cmd |= index << 1;                        // index
+       cmd |= byte  << (addr_sz+1);  // Data   
+       cmd     |= (crc & 0xF ) << (addr_sz+1+8);       // CRC
        
-       WaitTicks(330);
+       WaitTicks(240);
        
        frame_sendAsReader(cmd, cmd_sz);
        
@@ -439,8 +428,7 @@ bool legic_write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) {
 
        // ACK,  - one single "1" bit after 3.6ms
        // 3.6ms = 3600us * 1.5 = 5400ticks.
-       WaitTicks(5000);
-       //WaitTicks(330);
+       WaitTicks(5400);
        
        next_bit_at = GET_TICKS + TAG_BIT_PERIOD;
        
@@ -467,10 +455,11 @@ bool legic_write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) {
                        goto OUT;
         }
     }
-
+               
 OUT: ;
-       // log
-       uint8_t cmdbytes[] = {cmd_sz, isOK, BYTEx(steps, 0), BYTEx(steps, 1) };
+       legic_prng_forward(1);
+       
+       uint8_t cmdbytes[] = {1, isOK, BYTEx(steps, 0), BYTEx(steps, 1) };
        LogTrace(cmdbytes, sizeof(cmdbytes), start, GET_TICKS, NULL, FALSE);
        return isOK;
 }
@@ -538,13 +527,12 @@ void LegicRfWriter(uint16_t offset, uint16_t len, uint8_t iv, uint8_t *data) {
 
     LED_B_ON();        
        while( len > 0 ) {
-               
-               if ( !legic_write_byte( len + offset + LOWERLIMIT, data[len-1], card.addrsize) ) {
-                       Dbprintf("operation failed @ 0x%03.3x", len-1);
+               --len;          
+               if ( !legic_write_byte( len + offset, data[len], card.addrsize) ) {
+                       Dbprintf("operation failed | %02X | %02X | %02X", len + offset, len, data[len] );
                        isOK = 0;
                        goto OUT;
                }
-               --len;
                WDT_HIT();
        }
 OUT:
Impressum, Datenschutz