mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-02-13 02:34:48 +08:00
chg: sc reader - get atr
This commit is contained in:
parent
bcffde1198
commit
5dbebb3dc8
1 changed files with 31 additions and 20 deletions
51
common/i2c.c
51
common/i2c.c
|
@ -39,12 +39,12 @@ void __attribute__((optimize("O0"))) I2CSpinDelayClk(uint16_t delay) {
|
||||||
#define I2C_DELAY_XCLK(x) I2CSpinDelayClk((x))
|
#define I2C_DELAY_XCLK(x) I2CSpinDelayClk((x))
|
||||||
*/
|
*/
|
||||||
// 通讯延迟函数 ommunication delay function
|
// 通讯延迟函数 ommunication delay function
|
||||||
#define I2C_DELAY_1CLK I2C_DELAY_1()
|
#define I2C_DELAY_1CLK I2CSpinDelayClk(1)
|
||||||
#define I2C_DELAY_2CLK I2C_DELAY_2()
|
#define I2C_DELAY_2CLK I2CSpinDelayClk(2)
|
||||||
#define I2C_DELAY_XCLK(x) I2C_DELAY_X((x))
|
#define I2C_DELAY_XCLK(x) I2CSpinDelayClk((x))
|
||||||
void I2C_DELAY_1(void) { I2CSpinDelayClk(1);}
|
//void I2C_DELAY_1(void) { I2CSpinDelayClk(1);}
|
||||||
void I2C_DELAY_2(void) { I2CSpinDelayClk(2);}
|
//void I2C_DELAY_2(void) { I2CSpinDelayClk(2);}
|
||||||
void I2C_DELAY_X(uint16_t delay) { I2CSpinDelayClk(delay);}
|
//void I2C_DELAY_X(uint16_t delay) { I2CSpinDelayClk(delay);}
|
||||||
|
|
||||||
void I2C_init(void) {
|
void I2C_init(void) {
|
||||||
// 配置复位引脚,关闭上拉,推挽输出,默认高
|
// 配置复位引脚,关闭上拉,推挽输出,默认高
|
||||||
|
@ -113,9 +113,10 @@ void I2C_Reset_EnterBootloader(void) {
|
||||||
// Wait for the clock to go High.
|
// Wait for the clock to go High.
|
||||||
bool WaitSCL_H(void) {
|
bool WaitSCL_H(void) {
|
||||||
|
|
||||||
volatile uint16_t count = 50000;
|
volatile uint16_t delay = 5000;
|
||||||
|
|
||||||
while (count--) {
|
while (delay--) {
|
||||||
|
|
||||||
if (SCL_read) {
|
if (SCL_read) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -124,6 +125,20 @@ bool WaitSCL_H(void) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wait max 300ms or until SCL goes LOW.
|
||||||
|
// Which ever comes first
|
||||||
|
bool WaitSCL_300ms(void){
|
||||||
|
volatile uint16_t delay = 300;
|
||||||
|
while ( delay-- ) {
|
||||||
|
|
||||||
|
if (!SCL_read)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
SpinDelay(1);
|
||||||
|
}
|
||||||
|
return (delay == 0);
|
||||||
|
}
|
||||||
|
|
||||||
bool I2C_Start(void) {
|
bool I2C_Start(void) {
|
||||||
|
|
||||||
I2C_DELAY_XCLK(4);
|
I2C_DELAY_XCLK(4);
|
||||||
|
@ -499,35 +514,31 @@ void I2C_print_status(void) {
|
||||||
DbpString(" FW version................FAILED");
|
DbpString(" FW version................FAILED");
|
||||||
}
|
}
|
||||||
|
|
||||||
#define WAIT_SCL_MAX_300
|
#define WAIT_UNTIL_SCL_GOES_HIGH { while (!SCL_read) { SpinDelay(1); } }
|
||||||
#define WAIT_UNTIL_SCL_GOES_HIGH while (!SCL_read) { I2C_DELAY_1CLK; }
|
|
||||||
bool WaitSCL_300(void){
|
|
||||||
volatile uint16_t delay = 300;
|
|
||||||
while ( SCL_read || delay ) {
|
|
||||||
SpinDelay(1);
|
|
||||||
delay--;
|
|
||||||
}
|
|
||||||
return (delay == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GetATR(smart_card_atr_t *card_ptr) {
|
bool GetATR(smart_card_atr_t *card_ptr) {
|
||||||
|
|
||||||
if ( card_ptr ) {
|
if ( card_ptr ) {
|
||||||
card_ptr->atr_len = 0;
|
card_ptr->atr_len = 0;
|
||||||
memset(card_ptr->atr, 0, sizeof(card_ptr->atr));
|
memset(card_ptr->atr, 0, sizeof(card_ptr->atr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( MF_DBGLEVEL > 3 ) DbpString("before sending GET_ATR");
|
||||||
|
|
||||||
// Send ATR
|
// Send ATR
|
||||||
// start [C0 01] stop
|
// start [C0 01] stop
|
||||||
I2C_WriteCmd(I2C_DEVICE_CMD_GENERATE_ATR, I2C_DEVICE_ADDRESS_MAIN);
|
I2C_WriteCmd(I2C_DEVICE_CMD_GENERATE_ATR, I2C_DEVICE_ADDRESS_MAIN);
|
||||||
|
|
||||||
// variable delay here.
|
// variable delay here.
|
||||||
if (!WaitSCL_300())
|
if (!WaitSCL_300ms()) {
|
||||||
|
if ( MF_DBGLEVEL > 3 ) DbpString(" 300ms SCL delay failed");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// 8051 speaks with smart card.
|
// 8051 speaks with smart card.
|
||||||
WAIT_UNTIL_SCL_GOES_HIGH;
|
WAIT_UNTIL_SCL_GOES_HIGH;
|
||||||
|
|
||||||
|
if ( MF_DBGLEVEL > 3 ) DbpString("before reading");
|
||||||
|
|
||||||
// start [C0 03 start C1 len aa bb cc stop]
|
// start [C0 03 start C1 len aa bb cc stop]
|
||||||
uint8_t len = I2C_BufferRead(card_ptr->atr, sizeof(card_ptr->atr), I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN);
|
uint8_t len = I2C_BufferRead(card_ptr->atr, sizeof(card_ptr->atr), I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue