Hi Ludovic,
On Mon, Feb 01, 2010 at 02:06:58PM +0100, Ludovic Rousseau wrote:
> 2010/2/1 Max Vozeler <[email protected]>:
> > This patch adds a workaround for unusual behaviour of Broadcom
> > BCM5880/5881 readers. They misreport an absent card as "Hardware
> > Error" in GetSlotStatus.
> >
> > To work around it, we turn the HW_ERROR answer to GetSlotStatus
> > into "No error, no card inserted".
> >
> > Since we need some way to look up the required quirk based on
> > USB vendor/product ID, this patch adds some simple quirk lookup
> > functions which can also be used for future quirks.
>
> I don't like the quirks lookup functions idea.
Fair enough. Like I said, I can see how you wouldn't want to
have two quirk mechanisms in upstream libccid.
> In the code I detect bogus readers using:
> if (SPR532 == ccid_descriptor->readerID)
See adapted patch below.
Max
--- ccid-1.3.11/src/ccid.h
+++ ccid-1.3.11/src/ccid.h
@@ -172,6 +172,8 @@ typedef struct
#define OZ776 0x0B977762
#define OZ776_7772 0x0B977772
#define SPR532 0x04E6E003
+#define BCM5880 0x0a5c5800
+#define BCM5881 0x0a5c5801
#define MYSMARTPAD 0x09BE0002
#define CHERRYXX44 0x046a0010
#define CL1356D 0x0B810200
--- ccid-1.3.11/src/commands.c
+++ ccid-1.3.11/src/commands.c
@@ -1009,8 +1009,35 @@ again_status:
#endif
ccid_error(buffer[ERROR_OFFSET], __FILE__, __LINE__,
__FUNCTION__); /* bError */
+ /*
+ * Special case for BCM5880/5881 readers since they
+ * answer with HW_ERROR if no card is inserted. We still
+ * log the error but turn it into "no card inserted".
+ */
+
+ if (BCM5880 == ccid_descriptor->readerID
+ || BCM5881 == ccid_descriptor->readerID)
+ {
+ log_msg(PCSC_LOG_ERROR, "%s:%d:%s %s",
+ __FILE__, __LINE__, __FUNCTION__,
+ "GetSlotStatus workaround for BCM5880/1");
+
+ /*
+ * bmICCStatus: 2 ("No ICC present")
+ * bmCommandStatus: 0 ("Processed without error")
+ */
+
+ buffer[STATUS_OFFSET] = 0x02;
+
+ /*
+ * Clear error register.
+ */
+
+ buffer[ERROR_OFFSET] = 0x00;
+ }
+
/* card absent or mute is not an communication error */
- if (buffer[ERROR_OFFSET] != 0xFE)
+ else if (buffer[ERROR_OFFSET] != 0xFE)
return_value = IFD_COMMUNICATION_ERROR;
}
_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle