mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-01-28 02:50:21 +08:00
chg: i2c fixes
This commit is contained in:
parent
d4e471092f
commit
df4c0014f6
2 changed files with 22 additions and 17 deletions
|
@ -89,6 +89,8 @@ int CmdSmartRaw(const char *Cmd) {
|
|||
//Validations
|
||||
if (errors || cmdp == 0 ) return usage_sm_raw();
|
||||
|
||||
// arg0 = RFU flags
|
||||
// arg1 = length
|
||||
UsbCommand c = {CMD_SMART_RAW, {0, hexlen, 0}};
|
||||
memcpy(c.d.asBytes, data, hexlen );
|
||||
clearCommandBuffer();
|
||||
|
|
37
common/i2c.c
37
common/i2c.c
|
@ -356,6 +356,9 @@ bool I2C_BufferWrite(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t dev
|
|||
// len = uint8 (max buffer to read 256bytes)
|
||||
uint8_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t device_address) {
|
||||
|
||||
if ( !data || len == 0 )
|
||||
return 0;
|
||||
|
||||
// extra wait 500us (514us measured)
|
||||
// 200us (xx measured)
|
||||
SpinDelayUs(200);
|
||||
|
@ -406,7 +409,7 @@ uint8_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t d
|
|||
data++;
|
||||
}
|
||||
readcount++;
|
||||
|
||||
|
||||
// acknowledgements. After last byte send NACK.
|
||||
if (len == 0)
|
||||
I2C_NoAck();
|
||||
|
@ -415,7 +418,8 @@ uint8_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t d
|
|||
}
|
||||
|
||||
I2C_Stop();
|
||||
return readcount;
|
||||
// return bytecount - first byte (which is length byte)
|
||||
return (readcount) ? readcount-- : 0;
|
||||
}
|
||||
|
||||
uint8_t I2C_ReadFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address) {
|
||||
|
@ -522,12 +526,12 @@ bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t d
|
|||
}
|
||||
|
||||
void I2C_print_status(void) {
|
||||
|
||||
DbpString("Smart card module (ISO 7816)");
|
||||
uint8_t resp[] = {0,0,0};
|
||||
I2C_init();
|
||||
I2C_Reset_EnterMainProgram();
|
||||
uint8_t resp[4] = {0};
|
||||
uint8_t len = I2C_BufferRead(resp, 4, I2C_DEVICE_CMD_GETVERSION, I2C_DEVICE_ADDRESS_MAIN);
|
||||
DbpString("Smart card module (ISO 7816)");
|
||||
if ( len )
|
||||
if ( I2C_BufferRead(resp, sizeof(resp), I2C_DEVICE_CMD_GETVERSION, I2C_DEVICE_ADDRESS_MAIN) )
|
||||
Dbprintf(" FW version................v%x.%02x", resp[0], resp[1]);
|
||||
else
|
||||
DbpString(" FW version................FAILED");
|
||||
|
@ -535,6 +539,7 @@ void I2C_print_status(void) {
|
|||
|
||||
bool GetATR(smart_card_atr_t *card_ptr) {
|
||||
|
||||
// clear
|
||||
if ( card_ptr ) {
|
||||
card_ptr->atr_len = 0;
|
||||
memset(card_ptr->atr, 0, sizeof(card_ptr->atr));
|
||||
|
@ -551,14 +556,13 @@ bool GetATR(smart_card_atr_t *card_ptr) {
|
|||
// read answer
|
||||
uint8_t len = I2C_BufferRead(card_ptr->atr, sizeof(card_ptr->atr), I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN);
|
||||
|
||||
if ( len == 0)
|
||||
if ( len == 0 )
|
||||
return false;
|
||||
|
||||
// remove length byte from the read bytes.
|
||||
if ( card_ptr )
|
||||
card_ptr->atr_len = (len == 0) ? 0 : len--;
|
||||
|
||||
LogTrace(card_ptr->atr, card_ptr->atr_len, 0, 0, NULL, false);
|
||||
|
||||
if ( card_ptr ) {
|
||||
card_ptr->atr_len = len;
|
||||
LogTrace(card_ptr->atr, card_ptr->atr_len, 0, 0, NULL, false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -607,12 +611,11 @@ void SmartCardRaw( uint64_t arg0, uint64_t arg1, uint8_t *data ) {
|
|||
// read response
|
||||
// start [C0 03 start C1 len aa bb cc stop]
|
||||
len = I2C_BufferRead(resp, ISO7618_MAX_FRAME, I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN);
|
||||
|
||||
// remove length byte from the read bytes.
|
||||
if ( len > 0 ) len--;
|
||||
|
||||
// log answer
|
||||
LogTrace(resp, len, 0, 0, NULL, false);
|
||||
if ( len )
|
||||
LogTrace(resp, len, 0, 0, NULL, false);
|
||||
|
||||
out:
|
||||
cmd_send(CMD_ACK, isOK, len, 0, resp, len);
|
||||
LED_D_OFF();
|
||||
|
|
Loading…
Reference in a new issue