コード例 #1
0
ファイル: main_mifare.c プロジェクト: 12019/openpcd
/* mifare classic helper */
static int
mifare_classic_read_sector(struct rfid_protocol_handle *ph, int sector)
{
	unsigned char buf[20];
	unsigned int len = sizeof(buf);
	int ret;
	int block;

	/* FIXME: make this work for sectors > 31 */
	DEBUGPCR("Reading sector %u", sector);

	for (block = sector*4; block < sector*4+4; block++) {
		DEBUGP("Reading block %u: ", block);
		ret = rfid_protocol_read(ph, block, buf, &len);
		if(ret == -ETIMEDOUT)
			DEBUGPCR("TIMEOUT");
		if (ret < 0) {
			DEBUGPCR("Error %d reading", ret);
			return ret;
		}

		DEBUGPCR("Page 0x%x: %s", block, hexdump(buf, len));
	}
	return 0;
}
int _main_dbgu(char key)
{
	unsigned char value;

	switch (key) {
	case '4':
		AT91F_DBGU_Printk("Testing RC632 : ");
		if (rc632_test(RAH) == 0)
			AT91F_DBGU_Printk("SUCCESS!\n\r");
		else
			AT91F_DBGU_Printk("ERROR!\n\r");
			
		break;
	case '5':
		opcd_rc632_reg_read(RAH, RC632_REG_RX_WAIT, &value);
		DEBUGPCR("Reading RC632 Reg RxWait: 0x%02xr", value);

		break;
	case '6':
		DEBUGPCR("Writing RC632 Reg RxWait: 0x55");
		opcd_rc632_reg_write(RAH, RC632_REG_RX_WAIT, 0x55);
		break;
	case '7':
		rc632_dump();
		break;
	}

	return -EINVAL;
}
コード例 #3
0
ファイル: req_ctx.c プロジェクト: 12019/simtrace-firmware
void req_ctx_init(void)
{
	int i;
	for (i = 0; i < NUM_RCTX_SMALL; i++) {
	        req_ctx[i].prev = req_ctx + i - 1;
	        req_ctx[i].next = req_ctx + i + 1;
		req_ctx[i].size = RCTX_SIZE_SMALL;
		req_ctx[i].tot_len = 0;
		req_ctx[i].data = rctx_data[i];
		req_ctx[i].state = RCTX_STATE_FREE;
		DEBUGPCR("SMALL req_ctx[%02i] initialized at %08X, Data: %08X => %08X", i, req_ctx + i, req_ctx[i].data, req_ctx[i].data + RCTX_SIZE_SMALL);
	}

	for (; i < NUM_REQ_CTX; i++) {
	        req_ctx[i].prev = req_ctx + i - 1;
  	        req_ctx[i].next = req_ctx + i + 1;
		req_ctx[i].size = RCTX_SIZE_LARGE;
		req_ctx[i].tot_len = 0;
		req_ctx[i].data = rctx_data_large[i];
		req_ctx[i].state = RCTX_STATE_FREE;
		DEBUGPCR("LARGE req_ctx[%02i] initialized at %08X, Data: %08X => %08X", i, req_ctx + i, req_ctx[i].data, req_ctx[i].data + RCTX_SIZE_LARGE);
	}
	req_ctx[0].prev = NULL;
	req_ctx[NUM_REQ_CTX - 1].next = NULL;

	req_ctx_queues[RCTX_STATE_FREE] = req_ctx;
	req_ctx_tails[RCTX_STATE_FREE] = req_ctx + NUM_REQ_CTX - 1;
	req_counts[RCTX_STATE_FREE] = NUM_REQ_CTX;

	for (i = RCTX_STATE_FREE + 1; i < RCTX_STATE_COUNT; i++) {
		req_ctx_queues[i] = req_ctx_tails[i] = NULL;
		req_counts[i] = 0;
	}
}
コード例 #4
0
ファイル: req_ctx.c プロジェクト: 12019/simtrace-firmware
void req_print(int state) {
	int count = 0;
	struct req_ctx *ctx, *last = NULL;
	DEBUGP("State [%02i] start <==> ", state);
	ctx = req_ctx_queues[state];
	while (ctx) {
		if (last != ctx->prev)
			DEBUGP("*INV_PREV* ");
		DEBUGP("%08X => ", ctx);
		last = ctx;
		ctx = ctx->next;
		count++;
		if (count > NUM_REQ_CTX) {
		  DEBUGP("*WILD POINTER* => ");
		  break;
		}
	}
	DEBUGPCR("NULL");
	if (!req_ctx_queues[state] && req_ctx_tails[state]) {
		DEBUGPCR("NULL head, NON-NULL tail");
	}
	if (last != req_ctx_tails[state]) {
		DEBUGPCR("Tail does not match last element");
	}
}
コード例 #5
0
void tc_cdiv_print(void)
{
	DEBUGP("TCB_BMR=0x%08x ", tcb->TCB_BMR);
	DEBUGP("TC0_CV=0x%08x ", tcb->TCB_TC0.TC_CV);
	DEBUGP("TC0_CMR=0x%08x ", tcb->TCB_TC0.TC_CMR);
	DEBUGPCR("TC0_SR=0x%08x", tcb->TCB_TC0.TC_SR);

	DEBUGPCR("TC0_RA=0x%04x, TC0_RB=0x%04x, TC0_RC=0x%04x",
		 tcb->TCB_TC0.TC_RA, tcb->TCB_TC0.TC_RB, tcb->TCB_TC0.TC_RC);
}
コード例 #6
0
static void help(void)
{
	DEBUGPCR("o: decrease duty     p: increase duty\r\n"
		 "k: stop pwm          l: start pwn\r\n"
		 "n: decrease freq     m: incresae freq\r\n"
		 "v: decrease mod_cond b: increase mod_cond\r\n"
		 "g: decrease cw_cond  h: increase cw_cond");
	DEBUGPCR("u: PA23 const 1      y: PA23 const 0\r\n"
		 "t: PA23 PWM0         f: toggle Force100ASK\r\n"
		 "{: decrease cdiv_idx }: increse cdiv idx");
}
コード例 #7
0
void _init_func(void)
{
	DEBUGPCR("\r\n===> main_pwm <===\r\n");
	help();

	rc632_init();
	DEBUGPCRF("turning on RF");
	rc632_turn_on_rf(RAH);

	/* switch PA17 (connected to MFIN on board) to input */
	AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91C_PIO_PA17);

	DEBUGPCRF("Initializing carrier divider");
	tc_cdiv_init();

	DEBUGPCRF("Initializing PWM");
	pwm_init();
	pwm_freq_set(0, 105937);
	pwm_start(0);
	pwm_duty_set_percent(0, 22);	/* 22% of 9.43uS = 2.07uS */
	rc632_modulate_mfin();

#ifdef SSC
	DEBUGPCRF("Initializing SSC RX");
	ssc_rx_init();
#endif
}
コード例 #8
0
ファイル: req_ctx.c プロジェクト: 12019/simtrace-firmware
void req_ctx_set_state(struct req_ctx *ctx, unsigned long new_state)
{
	unsigned long flags;
	unsigned old_state;

	if (new_state >= RCTX_STATE_COUNT) {
		DEBUGPCR("Invalid new_state for req_ctx_set_state");
		return;
	}
	local_irq_save(flags);
	old_state = ctx->state;
	if (ctx->prev)
		ctx->prev->next = ctx->next;
	else 
		req_ctx_queues[old_state] = ctx->next;
	if (ctx->next)
		ctx->next->prev = ctx->prev;
	else
		req_ctx_tails[old_state] = ctx->prev;
	req_counts[old_state]--;
	if ((ctx->prev = req_ctx_tails[new_state]))
		ctx->prev->next = ctx;
	else
		req_ctx_queues[new_state] = ctx;
	req_ctx_tails[new_state] = ctx;
	ctx->state = new_state;
	ctx->next = NULL;
	req_counts[new_state]++;
	local_irq_restore(flags);
}
コード例 #9
0
ファイル: req_ctx.c プロジェクト: 12019/simtrace-firmware
struct req_ctx __ramfunc *req_ctx_find_get(int large,
				 unsigned long old_state, 
				 unsigned long new_state)
{
        struct req_ctx *toReturn;
	unsigned long flags;

	if (old_state >= RCTX_STATE_COUNT || new_state >= RCTX_STATE_COUNT) {
		DEBUGPCR("Invalid parameters for req_ctx_find_get");
		return NULL;
	}
	local_irq_save(flags);
	toReturn = req_ctx_queues[old_state];
	if (toReturn) {
		if ((req_ctx_queues[old_state] = toReturn->next))
			toReturn->next->prev = NULL;
		else
			req_ctx_tails[old_state] = NULL;
		req_counts[old_state]--;
		if ((toReturn->prev = req_ctx_tails[new_state]))
	  		toReturn->prev->next = toReturn;
		else
			req_ctx_queues[new_state] = toReturn;
		req_ctx_tails[new_state] = toReturn;
		toReturn->state = new_state;
		toReturn->next = NULL;
		req_counts[new_state]++;
	}
	local_irq_restore(flags);
	return toReturn;
}
コード例 #10
0
void _main_func(void)
{
	u_int32_t uid;
	int status;
	
	status = rfid_layer2_open(l2h);
        if (status >= 0  && l2h->uid_len==4)
	{
	    uid=((u_int32_t)l2h->uid[0])    |
		((u_int32_t)l2h->uid[1])<< 8|
		((u_int32_t)l2h->uid[2])<<16|
		((u_int32_t)l2h->uid[3])<<24;
			
	    delay_scan=100;
		
	    if(uid!=last_uid)
	    {
		last_uid=last_polled_uid=uid;
		delay_blink=10;
		    
		DEBUGPCR("UID:0x%08X", uid);
	    }
	}
	else
	    if(delay_scan)
		delay_scan--;
	    else
		last_uid=0;
	    
        led_switch(1,(delay_blink==0)?1:0);
	if(delay_blink)
	    delay_blink--;
	
	/* first we try to get rid of pending to-be-sent stuff */
	usb_out_process();
	/* next we deal with incoming reqyests from USB EP1 (OUT) */
	usb_in_process();
	rc632_unthrottle();
}
コード例 #11
0
ファイル: tc_fdt.c プロジェクト: 12019/openpcd
static void __ramfunc tc_fdt_irq(void)
{
	portSAVE_CONTEXT();
	//vLedSetGreen(1);
	u_int32_t sr = tcfdt->TC_SR;
	DEBUGP("tc_fdt_irq: TC2_SR=0x%08x TC2_CV=0x%08x ", 
		sr, tcfdt->TC_CV);
	
	if (sr & AT91C_TC_ETRGS) {
		DEBUGP("Ext_trigger ");
	}
	if (sr & AT91C_TC_CPAS) {
		DEBUGP("FDT_expired ");
	}
	if (sr & AT91C_TC_CPCS) {
		DEBUGP("Compare_C ");
	}
	DEBUGPCR("");
	AT91F_AIC_ClearIt(AT91C_ID_TC2);
	AT91F_AIC_AcknowledgeIt();
	//vLedSetGreen(0);
	portRESTORE_CONTEXT();
}
コード例 #12
0
int _main_dbgu(char key)
{
	switch (key) {
	case 'o':
		if (duty_percent >= 1)
			duty_percent--;
		pwm_duty_set_percent(0, duty_percent);
		break;
	case 'p':
		if (duty_percent <= 99)
			duty_percent++;
		pwm_duty_set_percent(0, duty_percent);
		break;
	case 'k':
		pwm_stop(0);
		break;
	case 'l':
		pwm_start(0);
		break;
	case 'n':
		if (pwm_freq_idx > 0) {
			pwm_freq_idx--;
			pwm_stop(0);
			pwm_freq_set(0, pwm_freq[pwm_freq_idx]);
			pwm_start(0);
			pwm_duty_set_percent(0, 22);	/* 22% of 9.43uS = 2.07uS */
		}
		break;
	case 'm':
		if (pwm_freq_idx < ARRAY_SIZE(pwm_freq)-1) {
			pwm_freq_idx++;
			pwm_stop(0);
			pwm_freq_set(0, pwm_freq[pwm_freq_idx]);
			pwm_start(0);
			pwm_duty_set_percent(0, 22);	/* 22% of 9.43uS = 2.07uS */
		}
		break;
	case 'u':
		DEBUGPCRF("PA23 output high");
		AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA23);
		AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA23);
		break;
	case 'y':
		DEBUGPCRF("PA23 output low");
		AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA23);
		AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA23);
		return 0;
		break;
	case 't':
		DEBUGPCRF("PA23 PeriphA (PWM)");
		AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, 0, AT91C_PA23_PWM0);
		return 0;
		break;
	case 'f':
		DEBUGPCRF("%sabling Force100ASK", force_100ask ? "Dis":"En");
		if (force_100ask) {
			force_100ask = 0;
			opcd_rc632_clear_bits(RAH, RC632_REG_TX_CONTROL,
					      RC632_TXCTRL_FORCE_100_ASK);
		} else {
			force_100ask = 1;
			opcd_rc632_set_bits(RAH, RC632_REG_TX_CONTROL,
					    RC632_TXCTRL_FORCE_100_ASK);
		}
		return 0;
		break;
	case 'v':
		if (mod_conductance > 0) {
			mod_conductance--;
			opcd_rc632_reg_write(RAH, RC632_REG_MOD_CONDUCTANCE,
					     rsrel_table[mod_conductance]);
		}
		break;
	case 'b':
		if (mod_conductance < 0x3f) {
			mod_conductance++;
			opcd_rc632_reg_write(RAH, RC632_REG_MOD_CONDUCTANCE,
					     rsrel_table[mod_conductance]);
		}
		break;
	case 'g':
		if (cw_conductance > 0) {
			cw_conductance--;
			opcd_rc632_reg_write(RAH, RC632_REG_CW_CONDUCTANCE, 
					     rsrel_table[cw_conductance]);
		}
		break;
	case 'h':
		if (cw_conductance < 0x3f) {
			cw_conductance++;
			opcd_rc632_reg_write(RAH, RC632_REG_CW_CONDUCTANCE, 
					     rsrel_table[cw_conductance]);
		}
		break;
	case '?':
		help();
		return 0;
		break;
	case '<':
		tc_cdiv_phase_inc();
		break;
	case '>':
		tc_cdiv_phase_dec();
		break;
	case '{':
		if (cdiv_idx > 0)
			cdiv_idx--;
		tc_cdiv_set_divider(cdivs[cdiv_idx]);
		break;
	case '}':
		if (cdiv_idx < ARRAY_SIZE(cdivs)-1)
			cdiv_idx++;
		tc_cdiv_set_divider(cdivs[cdiv_idx]);
		break;
#ifdef SSC
	case 's':
		ssc_rx_start();
		break;
	case 'S':
		ssc_rx_stop();
		break;
#endif
	default:
		return -EINVAL;
	}

	DEBUGPCR("pwm_freq=%u, duty_percent=%u, mod_cond=%u, cw_cond=%u tc_cdiv=%u", 
		 pwm_freq[pwm_freq_idx], duty_percent, mod_conductance, cw_conductance,
		 cdivs[cdiv_idx]);
	
	return 0;
}
コード例 #13
0
static void sys_irq(void)
{
	u_int32_t sr;
	DEBUGP("sys_irq ");

	/* Somehow Atmel decided to do really stupid interrupt sharing
	 * for commonly-used interrupts such as the timer irq */

	/* dbgu */
	if (*AT91C_DBGU_IMR) {
		sr = *AT91C_DBGU_CSR;
		if (sr & *AT91C_DBGU_IMR) {
			DEBUGP("DBGU(");
			if (sysirq_hdlrs[AT91SAM7_SYSIRQ_DBGU]) {
				DEBUGP("handler ");
				//by Shan. We'll never call the long DBGU process rountine, no interrupt handling for DBGU, time saving.
				//sysirq_hdlrs[AT91SAM7_SYSIRQ_DBGU](sr);
			} else {
				*AT91C_DBGU_IDR = *AT91C_DBGU_IMR;
				DEBUGP("no handler ");
			}
			DEBUGP(") ");
		}
	}
	
	/* pit_irq */
	if (*AT91C_PITC_PIMR & AT91C_PITC_PITIEN) {
		sr = *AT91C_PITC_PISR;
		if (sr & AT91C_PITC_PITS) {
			if (sysirq_hdlrs[AT91SAM7_SYSIRQ_PIT]) {
				sysirq_hdlrs[AT91SAM7_SYSIRQ_PIT](sr);
			} else {
				DEBUGP("no handler DISABLE_PIT ");
				*AT91C_PITC_PIMR &= ~AT91C_PITC_PITIEN;
			}
		}
	}

	/* rtt_irq */
	if (*AT91C_RTTC_RTMR & (AT91C_RTTC_ALMIEN|AT91C_RTTC_RTTINCIEN)) {
		sr = *AT91C_RTTC_RTSR;
		if (sr) {
			DEBUGP("RTT(");
			if (sysirq_hdlrs[AT91SAM7_SYSIRQ_RTT]) {
				DEBUGP("handler ");
				sysirq_hdlrs[AT91SAM7_SYSIRQ_RTT](sr);
			} else {
				*AT91C_RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN|
						      AT91C_RTTC_RTTINCIEN);
				DEBUGP("no handler ");
			}
			DEBUGP(") ");
		}
	}

	/* pmc_irq */
	if (*AT91C_PMC_IMR) {
		sr = *AT91C_PMC_SR;
		if (sr & *AT91C_PMC_IMR) {
			DEBUGP("PMC(");
			if (sysirq_hdlrs[AT91SAM7_SYSIRQ_PMC]) {
				DEBUGP("handler ");
				sysirq_hdlrs[AT91SAM7_SYSIRQ_PMC](sr);
			} else {
				*AT91C_PMC_IDR = *AT91C_PMC_IMR;
				DEBUGP("no handler ");
			}
			DEBUGP(") ");
		}
	}

	/* rstc_irq */
	if (*AT91C_RSTC_RMR & (AT91C_RSTC_URSTIEN|AT91C_RSTC_BODIEN)) {
		sr = *AT91C_RSTC_RSR;
		if (sr & (AT91C_RSTC_URSTS|AT91C_RSTC_BODSTS)) {
			DEBUGP("RSTC(");
			if (sysirq_hdlrs[AT91SAM7_SYSIRQ_RSTC]) {
				DEBUGP("handler ");
				sysirq_hdlrs[AT91SAM7_SYSIRQ_RSTC](sr);
			} else {
				*AT91C_RSTC_RMR &= ~(AT91C_RSTC_URSTIEN|
						     AT91C_RSTC_BODIEN);
				DEBUGP("no handler ");
			}
			DEBUGP(") ");
		}
	}

	/* mc_irq */
	if (*AT91C_MC_FMR & (AT91C_MC_LOCKE | AT91C_MC_PROGE)) {
		sr = *AT91C_MC_FSR;
		if ((*AT91C_MC_FMR & AT91C_MC_LOCKE && (sr & AT91C_MC_LOCKE))||
		    (*AT91C_MC_FMR & AT91C_MC_PROGE && (sr & AT91C_MC_PROGE))){
			DEBUGP("EFC(");
			if (sysirq_hdlrs[AT91SAM7_SYSIRQ_EFC]) {
				DEBUGP("handler ");
		    		sysirq_hdlrs[AT91SAM7_SYSIRQ_EFC](sr);
			} else {
				*AT91C_MC_FMR &= ~(AT91C_MC_LOCKE |
						   AT91C_MC_PROGE);
				DEBUGP("no handler ");
			}
			DEBUGP(") ");
		}
	}
	    
	/* wdt_irq */
	if (*AT91C_WDTC_WDMR & AT91C_WDTC_WDFIEN) {
		sr = *AT91C_WDTC_WDSR;
		if (sr) {
			DEBUGP("WDT(");
			if (sysirq_hdlrs[AT91SAM7_SYSIRQ_WDT]) {
				DEBUGP("handler ");
				sysirq_hdlrs[AT91SAM7_SYSIRQ_WDT](sr);
			} else {
				/* we can't disable it... */
				DEBUGP("no handler ");
			}
			DEBUGP(") ");
		}
	}
	AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_SYS);
	DEBUGPCR("END");
}
コード例 #14
0
ファイル: main_mifare.c プロジェクト: 12019/openpcd
static int init_proto(void)
{
	struct req_ctx *detect_rctx;
	struct openpcd_hdr *opcdh;
	struct openpcd_l2_connectinfo *l2c;
	struct openpcd_proto_connectinfo *pc;
	unsigned int size;

	l2h = rfid_layer2_scan(rh);
	if (!l2h)
		return 0;

	DEBUGP("l2='%s' ", rfid_layer2_name(l2h));

	detect_rctx = req_ctx_find_get(0, RCTX_STATE_FREE,
					RCTX_STATE_LIBRFID_BUSY);
	if (detect_rctx) {
		unsigned int uid_len;
		opcdh = (struct openpcd_hdr *) detect_rctx->data;
		l2c = (struct openpcd_l2_connectinfo *) 
				(char *) opcdh + sizeof(opcdh);
		l2c->uid_len = sizeof(l2c->uid);
		opcdh->cmd = OPENPCD_CMD_LRFID_DETECT_IRQ;
		opcdh->flags = 0x00;
		opcdh->reg = 0x03;
		opcdh->val = l2h->l2->id;

		detect_rctx->tot_len = sizeof(*opcdh) + sizeof(*l2c);
#if 0
		/* copy UID / PUPI into data section */
		rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, (void *)l2c->uid, 
					&uid_len);
		l2c->uid_len = uid_len & 0xff;
		
		size = sizeof(l2c->proto_supported);
		rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_PROTO_SUPP,
					&l2c->proto_supported, &size);

		switch (l2h->l2->id) {
		case RFID_LAYER2_ISO14443A:
			break;
		case RFID_LAYER2_ISO14443B:
			break;
		case RFID_LAYER2_ISO15693:
			break;
		}
#endif
		req_ctx_set_state(detect_rctx, RCTX_STATE_UDP_EP3_PENDING);
	} else
		DEBUGPCRF("=>>>>>>>>>>>>>>no req_ctx for L2!");
	ph = rfid_protocol_scan(l2h);
	if (!ph)
		return 3;

	DEBUGP("p='%s' ", rfid_protocol_name(ph));
	detect_rctx = req_ctx_find_get(0, RCTX_STATE_FREE,
					RCTX_STATE_LIBRFID_BUSY);
	if (detect_rctx) {
		opcdh = (struct openpcd_hdr *) detect_rctx->data;
		pc = (struct openpcd_proto_connectinfo *)
				((char *) opcdh + sizeof(*opcdh));
		detect_rctx->tot_len = sizeof(*opcdh) + sizeof(*pc);
		opcdh->cmd = OPENPCD_CMD_LRFID_DETECT_IRQ;
		opcdh->flags = 0x00;
		opcdh->reg = 0x04;
		opcdh->val = ph->proto->id;
		/* copy L4 info into data section */

#if 0
		switch (ph->proto->id) {
		case RFID_PROTOCOL_TCL: {
			struct openpcd_proto_tcl_connectinfo *ptc
				= (struct openpcd_proto_tcl_connectinfo *)
						((char *) ph + sizeof(*ph));
			unsigned int space;
			detect_rctx->tot_len += sizeof(*ptc);
			space = detect_rctx->size - sizeof(*opcdh)-sizeof(*pc);
			size = space;
			rfid_protocol_getopt(ph, RFID_OPT_P_TCL_ATS,
					     &ptc->ats_snippet, &size);
			if (size == space) {
				/* we've only copied part of the ATS */
				size = sizeof(ptc->ats_tot_len);
				rfid_protocol_getopt(ph, 
						     RFID_OPT_P_TCL_ATS_LEN,
						     &ptc->ats_tot_len, &size);
			} else {
				ptc->ats_tot_len = size;
			}

			} break;
		}
#endif
		req_ctx_set_state(detect_rctx, RCTX_STATE_UDP_EP3_PENDING);
	} else
		DEBUGPCRF("=>>>>>>>>>>>>>>no req_ctx for L2!");
	led_switch(1, 1);

	if (ph->proto->id == RFID_PROTOCOL_MIFARE_CLASSIC) {
		int rc;

		DEBUGPCR("Authenticating sector %u: ", sector);
		rc = mfcl_set_key(ph, MIFARE_CL_KEYA_DEFAULT_INFINEON);
		if (rc < 0) {
			DEBUGPCR("key format error");
			return 4;
		}
		rc = mfcl_auth(ph, RFID_CMD_MIFARE_AUTH1A, sector*4);
		if (rc < 0) {
			DEBUGPCR("mifare auth error");
			return 4;
		} else
			DEBUGPCR("mifare auth succeeded!\n");

		mifare_classic_read_sector(ph, sector);

		return 5;
	}

	return 4;
}