add bitswap option for lf em 4x05write

default read mode of this chip outputs in reverse order...  so offer the
option to program in reverse order
This commit is contained in:
marshmellow42 2017-03-14 14:42:01 -04:00
parent 8b6abef506
commit 713045f819
3 changed files with 30 additions and 14 deletions

View file

@ -762,9 +762,10 @@ int CmdEM4x05dump(const char *Cmd) {
int usage_lf_em_write(void) {
PrintAndLog("Write EM4x05/EM4x69. Tag must be on antenna. ");
PrintAndLog("");
PrintAndLog("Usage: lf em 4x05writeword [h] <address> <data> <pwd>");
PrintAndLog("Usage: lf em 4x05writeword [h] [s] <address> <data> <pwd>");
PrintAndLog("Options:");
PrintAndLog(" h - this help");
PrintAndLog(" s - swap data bit order before write");
PrintAndLog(" address - memory address to write to. (0-15)");
PrintAndLog(" data - data to write (hex)");
PrintAndLog(" pwd - password (hex) (optional)");
@ -783,11 +784,16 @@ int CmdEM4x05WriteWord(const char *Cmd) {
uint8_t addr = 16; // default to invalid address
uint32_t data = 0xFFFFFFFF; // default to blank data
uint32_t pwd = 0xFFFFFFFF; // default to blank password
char swap = 0;
addr = param_get8ex(Cmd, 0, 16, 10);
data = param_get32ex(Cmd, 1, 0, 16);
pwd = param_get32ex(Cmd, 2, 1, 16);
int p = 0;
swap = param_getchar(Cmd, 0);
if (swap == 's' || swap=='S') p++;
addr = param_get8ex(Cmd, p++, 16, 10);
data = param_get32ex(Cmd, p++, 0, 16);
pwd = param_get32ex(Cmd, p++, 1, 16);
if (swap == 's' || swap=='S') data = SwapBits(data, 32);
if ( (addr > 15) ) {
PrintAndLog("Address must be between 0 and 15");

View file

@ -245,6 +245,15 @@ void num_to_bytebitsLSBF(uint64_t n, size_t len, uint8_t *dest) {
}
}
// Swap bit order on a uint32_t value. Can be limited by nrbits just use say 8bits reversal
// And clears the rest of the bits.
uint32_t SwapBits(uint32_t value, int nrbits) {
uint32_t newvalue = 0;
for(int i = 0; i < nrbits; i++) {
newvalue ^= ((value >> i) & 1) << (nrbits - 1 - i);
}
return newvalue;
}
// aa,bb,cc,dd,ee,ff,gg,hh, ii,jj,kk,ll,mm,nn,oo,pp
// to

View file

@ -48,6 +48,7 @@ uint64_t bytes_to_num(uint8_t* src, size_t len);
void num_to_bytebits(uint64_t n, size_t len, uint8_t *dest);
void num_to_bytebitsLSBF(uint64_t n, size_t len, uint8_t *dest);
char * printBits(size_t const size, void const * const ptr);
uint32_t SwapBits(uint32_t value, int nrbits);
uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize);
void SwapEndian64ex(const uint8_t *src, const size_t len, const uint8_t blockSize, uint8_t *dest);