From 5dbebb3dc8d2ba3325c230f515bba17004eee1e1 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 6 Jul 2018 15:20:21 +0200 Subject: [PATCH] chg: sc reader - get atr --- common/i2c.c | 51 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/common/i2c.c b/common/i2c.c index ddf4aea5e..466c89b79 100644 --- a/common/i2c.c +++ b/common/i2c.c @@ -39,12 +39,12 @@ void __attribute__((optimize("O0"))) I2CSpinDelayClk(uint16_t delay) { #define I2C_DELAY_XCLK(x) I2CSpinDelayClk((x)) */ // 通讯延迟函数 ommunication delay function -#define I2C_DELAY_1CLK I2C_DELAY_1() -#define I2C_DELAY_2CLK I2C_DELAY_2() -#define I2C_DELAY_XCLK(x) I2C_DELAY_X((x)) -void I2C_DELAY_1(void) { I2CSpinDelayClk(1);} -void I2C_DELAY_2(void) { I2CSpinDelayClk(2);} -void I2C_DELAY_X(uint16_t delay) { I2CSpinDelayClk(delay);} +#define I2C_DELAY_1CLK I2CSpinDelayClk(1) +#define I2C_DELAY_2CLK I2CSpinDelayClk(2) +#define I2C_DELAY_XCLK(x) I2CSpinDelayClk((x)) +//void I2C_DELAY_1(void) { I2CSpinDelayClk(1);} +//void I2C_DELAY_2(void) { I2CSpinDelayClk(2);} +//void I2C_DELAY_X(uint16_t delay) { I2CSpinDelayClk(delay);} void I2C_init(void) { // 配置复位引脚,关闭上拉,推挽输出,默认高 @@ -113,9 +113,10 @@ void I2C_Reset_EnterBootloader(void) { // Wait for the clock to go High. bool WaitSCL_H(void) { - volatile uint16_t count = 50000; + volatile uint16_t delay = 5000; - while (count--) { + while (delay--) { + if (SCL_read) { return true; } @@ -124,6 +125,20 @@ bool WaitSCL_H(void) { 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) { I2C_DELAY_XCLK(4); @@ -499,35 +514,31 @@ void I2C_print_status(void) { DbpString(" FW version................FAILED"); } -#define WAIT_SCL_MAX_300 -#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); -} - +#define WAIT_UNTIL_SCL_GOES_HIGH { while (!SCL_read) { SpinDelay(1); } } bool GetATR(smart_card_atr_t *card_ptr) { if ( card_ptr ) { card_ptr->atr_len = 0; memset(card_ptr->atr, 0, sizeof(card_ptr->atr)); } + + if ( MF_DBGLEVEL > 3 ) DbpString("before sending GET_ATR"); // Send ATR // start [C0 01] stop I2C_WriteCmd(I2C_DEVICE_CMD_GENERATE_ATR, I2C_DEVICE_ADDRESS_MAIN); // variable delay here. - if (!WaitSCL_300()) + if (!WaitSCL_300ms()) { + if ( MF_DBGLEVEL > 3 ) DbpString(" 300ms SCL delay failed"); return false; + } // 8051 speaks with smart card. WAIT_UNTIL_SCL_GOES_HIGH; + if ( MF_DBGLEVEL > 3 ) DbpString("before reading"); + // 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);