Aktuelles
Digital Eliteboard - Das Digitale Technik Forum

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

How to Hack paired keys

    Nobody is reading this thread right now.
AW: How to Hack paired keys

das kannst du vergessen..das geht nicht..alles schon ausprobiert..
was ich weis..geht nur mit einem opentel dga box..mit einer software von 2011
modul und das ganze kannst vergessen..da ist nix drinn..
man kann die daten nicht entschlüsseln..
 
AW: How to Hack paired keys

murat das stimmt nicht! Ich weis von erste hand das mit kaon und ci modul geht und zwar haben zwei leute eine hat von ci modul ausgelesen lassen und der andre von kaon resiver ! schönnen abend noch hija
 
AW: How to Hack paired keys

@hija...
erst beweissen dann reden..
glaub mir..ich bin jetzt sicher seit 4 jahren dahinter..man kann die ganze Hardware vergessen..die lösung steckt ganz wo anders..
und aus erster Hand nehme ich an..die Tanter Ursula hats sich verplapapt :)
belieben wir mal Realistisch..nix gegen dich..aber man muss das ernst nehmen..
Dga ist nicht gleich Conax wie wir es kennen..da steckt mehr dahinter..
 
AW: How to Hack paired keys

Ich weiss es nicht das du 4 jahre gebraucht hast ? und die leute brauchen 2 tage ! es is so es gibt eine oscam conax cas7 patched version basiert an 8915 oscam und glauben sie mir das geht 100% so ist schönnen tag noch! mfg hija
 
Zuletzt bearbeitet von einem Moderator:
AW: How to Hack paired keys

per testim !

Kush ka dekoder digitalb hd dhe do te
shikoj kanalet free me kta dekodera
duhet te ndjeki kto hapa
1 te shikoj te gjendja e abonimit nje
abonim qe ka bere
pershembull do kesh bere abonim me
date 17:12:2012 mbaje shenim daten
hapi i dyte esht hap memun shko te
instalimi pastaj shko te preferencat
pastaj regullimi i ores.
ktu tani ju do rregulloni daten.
do futni nje date me shume se dita qe
keni bere abonimin
tek shembulli tham qe abonimi ishte
bere me datd 17:12:2012 ndersa te
data e dekoderit do fusim 18:12:2012
shtypni ok pastaj dilni nga menuja
dhe provoni kanalet free a do hapen
kujdes ju duhet ti fusni nje date
dekoderit ne menyre qe karta juaj
smart te kete pasur abonim
nk ka rendesi lloji i abonimit apo
koha e tij. Ora duhet nga auto ne
manuale.
 
AW: How to Hack paired keys

reset pairing rotation conax oscam 9125
Ich kann es nicht testen bitte repport

[TABLE="class: code, width: 0"]
[TR]
[TD]/*[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] icc_async.c[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] Asynchronous ICC's handling functions[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] This file is part of the Unix driver for Towitoko smartcard readers[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] Copyright (C) 2000 2001 Carlos Prados <cprados@yahoo.com>[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] This version is modified by doz21 to work in a special manner ;)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] This library is free software; you can redistribute it and/or[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] modify it under the terms of the GNU Lesser General Public[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] License as published by the Free Software Foundation; either[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] version 2 of the License, or (at your option) any later version.[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] This library is distributed in the hope that it will be useful,[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] but WITHOUT ANY WARRANTY; without even the implied warranty of[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] Lesser General Public License for more details.[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] You should have received a copy of the GNU Lesser General Public[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] License along with this library; if not, write to the Free Software[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]*/[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#include "../globals.h"[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#ifdef WITH_CARDREADER[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#include "../oscam-lock.h"[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#include "../oscam-string.h"[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#include "icc_async.h"[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#include "protocol_t0.h"[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#include "io_serial.h"[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#include "ifd_phoenix.h"[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#include "../oscam-time.h"[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define OK 0[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define ERROR 1[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]// Default T0/T14 settings[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define DEFAULT_WI 10[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]// Default T1 settings[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define DEFAULT_IFSC 32[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define MAX_IFSC 251 /* Cannot send > 255 buffer */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define DEFAULT_CWI 13[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define DEFAULT_BWI 4[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define EDC_LRC 0[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define PPS_MAX_LENGTH 6[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define PPS_HAS_PPS1(block) ((block[1] & 0x10) == 0x10)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define PPS_HAS_PPS2(block) ((block[1] & 0x20) == 0x20)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#define PPS_HAS_PPS3(block) ((block[1] & 0x40) == 0x40)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]/*[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] * Not exported functions declaration[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static uint16_t tempfi; // used to capture FI and use it for rounding or not[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static void ICC_Async_InvertBuffer(uint32_t size, unsigned char *buffer);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t Parse_ATR(struct s_reader *reader, ATR *atr, uint16_t deprecated);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t PPS_Exchange(struct s_reader *reader, unsigned char *params, uint32_t *length);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static uint32_t PPS_GetLength(unsigned char *block);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t InitCard(struct s_reader *reader, ATR *atr, unsigned char FI, uint32_t D, unsigned char N, uint16_t deprecated);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static uint32_t ETU_to_us(struct s_reader *reader, uint32_t ETU);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static unsigned char PPS_GetPCK(unsigned char *block, uint32_t length);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t SetRightParity(struct s_reader *reader);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]/*[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] * Exported functions definition[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_Device_Init(struct s_reader *reader)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->fdmc = -1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Opening device %s", reader->device);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->written = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t ret = reader->crdr.reader_init(reader);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ret == OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { rdr_debug_mask(reader, D_IFD, "Device %s succesfully opened", reader->device); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->typ != R_SC8in1) { NULLFREE(reader->crdr_data); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "ERROR: Can't open %s device", reader->device);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return ret;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_Init_Locks(void)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Init device specific locks here, called from init thread[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // before reader threads are running[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] struct s_reader *rdr;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] LL_ITER itr = ll_iter_create(configured_readers);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] while((rdr = ll_iter_next(&itr)))[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(rdr->crdr.lock_init)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { rdr->crdr.lock_init(rdr); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_GetStatus(struct s_reader *reader, int32_t *card)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if (reader->typ == R_SMART && reader->smartdev_found >= 4) {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->statuscnt = reader->statuscnt + 1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if (reader->statuscnt == 6) {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t in = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.get_status(reader, &in));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(in)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {reader->modemstat = 1; *card = 1; reader->statuscnt = 0;}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {reader->modemstat = 0; *card = 0; reader->statuscnt = 0;}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] } else {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] *card = reader->modemstat;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t in = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.get_status(reader, &in));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(in)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { *card = 1;}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { *card = 0;}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_Activate(struct s_reader *reader, ATR *atr, uint16_t deprecated)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Activating card");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->current_baudrate = DEFAULT_BAUDRATE;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->atr[0] != 0 && !reader->ins7e11_fast_reset)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Using ATR from reader config");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ATR_InitFromArray(atr, reader->atr, ATR_MAX_SIZE);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.activate(reader, atr));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.skip_extra_atr_parsing)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { return OK; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char atrarr[ATR_MAX_SIZE];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t atr_size;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ATR_GetRaw(atr, atrarr, &atr_size);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] char tmp[atr_size * 3 + 1];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "ATR: %s", cs_hexdump(1, atrarr, atr_size, tmp, sizeof(tmp)));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] memcpy(reader->card_atr, atrarr, atr_size);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->card_atr_length = atr_size;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] /* Get ICC reader->convention */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetConvention(atr, &(reader->convention)) != ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "ERROR: Could not read reader->convention");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->convention = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->protocol_type = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return ERROR;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->protocol_type = ATR_PROTOCOL_TYPE_T0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Parse_ATR and InitCard need to be included in lock because they change parity of serial port[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.lock)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->crdr.lock(reader); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t ret = Parse_ATR(reader, atr, deprecated);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.unlock)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->crdr.unlock(reader); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ret)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { rdr_log(reader, "ERROR: Parse_ATR returned error"); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ret)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { return ERROR; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Card succesfully activated");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_CardWrite(struct s_reader *reader, unsigned char *command, uint16_t command_len, unsigned char *rsp, uint16_t *lr)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t ret;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] *lr = 0; //will be returned in case of error[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.card_write)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.card_write(reader, command, rsp, lr, command_len));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.lock)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->crdr.lock(reader); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t try = 1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint16_t type = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] do[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] switch(reader->protocol_type)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(try > 1)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Warning: needed try nr %i, next ECM has some delay", try);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case ATR_PROTOCOL_TYPE_T0:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = Protocol_T0_Command(reader, command, command_len, rsp, lr);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] type = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] break;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case ATR_PROTOCOL_TYPE_T1:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = Protocol_T1_Command(reader, command, command_len, rsp, lr);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] type = 1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ret != OK && !reader->crdr.skip_t1_command_retries)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //try to resync[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Resync error: readtimeouts %d/%d (max/min) us, writetimeouts %d/%d (max/min) us", reader->maxreadtimeout, reader->minreadtimeout, reader->maxwritetimeout, reader->minwritetimeout);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char resync[] = { 0x21, 0xC0, 0x00, 0xE1 };[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = Protocol_T1_Command(reader, resync, sizeof(resync), rsp, lr);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ret == OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //reader->ifsc = DEFAULT_IFSC; //tryfix cardtimeouts: ifsc is setup at card init, on resync it should not return to default_ifsc[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "T1 Resync command succesfull ifsc = %i", reader->ifsc);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = ERROR;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "T1 Resync command error, trying to reactivate!");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ATR atr;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ICC_Async_Activate(reader, &atr, reader->deprecated);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.unlock)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->crdr.unlock(reader); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return ERROR;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] break;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case ATR_PROTOCOL_TYPE_T14:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = Protocol_T14_ExchangeTPDU(reader, command, command_len, rsp, lr);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] type = 14;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] break;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] default:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "ERROR: Unknown protocol type %i", reader->protocol_type);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] type = 99; // use 99 for unknown.[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = ERROR;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] try++;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] while((try < 3) && (ret != OK)); //always do one retry when failing[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.unlock)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->crdr.unlock(reader); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ret)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_TRACE, "ERROR: Protocol_T%d_Command returns error", type);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return ERROR;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_ddump_mask(reader, D_READER, rsp, *lr, "Answer from cardreader:");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_GetTimings(struct s_reader *reader, uint32_t wait_etu)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t timeout = ETU_to_us(reader, wait_etu);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Setting timeout to %i ETU (%d us)", wait_etu, timeout);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return timeout;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_Transmit(struct s_reader *reader, uint32_t size, uint32_t expectedlen, unsigned char *data, uint32_t delay, uint32_t timeout)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(expectedlen) //expectedlen = 0 means expected len is unknown[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { rdr_debug_mask(reader, D_IFD, "Transmit size %d bytes, expected len %d bytes, delay %d us, timeout=%d us", size, expectedlen, delay, timeout); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { rdr_debug_mask(reader, D_IFD, "Transmit size %d bytes, delay %d us, timeout=%d us", size, delay, timeout); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_ddump_mask(reader, D_IFD, data, size, "Transmit:");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char *sent = data;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->convention == ATR_CONVENTION_INVERSE && reader->crdr.need_inverse)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ICC_Async_InvertBuffer(size, sent);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.transmit(reader, sent, size, expectedlen, delay, timeout));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Transmit succesful");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->convention == ATR_CONVENTION_INVERSE && reader->crdr.need_inverse)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // revert inversion cause the code in protocol_t0 is accessing buffer after transmit[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ICC_Async_InvertBuffer(size, sent);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_Receive(struct s_reader *reader, uint32_t size, unsigned char *data, uint32_t delay, uint32_t timeout)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Receive size %d bytes, delay %d us, timeout=%d us", size, delay, timeout);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.receive(reader, data, size, delay, timeout));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Receive succesful");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->convention == ATR_CONVENTION_INVERSE && reader->crdr.need_inverse == 1)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { ICC_Async_InvertBuffer(size, data); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_Close(struct s_reader *reader)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Closing device %s", reader->device);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.close(reader));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->typ != R_SC8in1) { NULLFREE(reader->crdr_data); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Device %s succesfully closed", reader->device);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]void ICC_Async_DisplayMsg(struct s_reader *reader, char *msg)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.display_msg)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->crdr.display_msg(reader, msg); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]int32_t ICC_Async_Reset(struct s_reader *reader, struct s_ATR *atr,[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t (*rdr_activate_card)(struct s_reader *, struct s_ATR *, uint16_t deprecated),[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t (*rdr_get_cardsystem)(struct s_reader *, struct s_ATR *))[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(!reader->crdr.do_reset)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { return 0; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return reader->crdr.do_reset(reader, atr, rdr_activate_card, rdr_get_cardsystem);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]/*static uint32_t ICC_Async_GetClockRate_NewSmart(int32_t cardmhz)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return (cardmhz * 10000L);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}*/[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static uint32_t ICC_Async_GetClockRate(int32_t cardmhz)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] switch(cardmhz)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case 357:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case 358:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return (372L * 9600L);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case 368:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return (384L * 9600L);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] default:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return (cardmhz * 10000L);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t ICC_Async_GetPLL_Divider(struct s_reader *reader)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->divider != 0) { return reader->divider; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->cardmhz != 8300) /* Check dreambox is not DM7025 */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] float divider;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader," TEST tempo mhz check = %u mhz", reader->mhz);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] divider = ((float) reader->cardmhz) / ((float) reader->mhz);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if (tempfi == 9) reader->divider = (int32_t) divider; // some card's runs only when slightly oveclocked like HD02[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->divider = (int32_t) divider;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(divider > reader->divider) { reader->divider++; } /* to prevent over clocking, ceil (round up) the divider */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_DEVICE, "PLL maxmhz = %.2f, wanted mhz = %.2f, divider used = %d, actualcardclock=%.2f", (float) reader->cardmhz / 100, (float) reader->mhz / 100,[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->divider, (float) reader->cardmhz / reader->divider / 100);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->mhz = reader->cardmhz / reader->divider;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else /* STB is DM7025 */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t i, dm7025_clock_freq[] = {518, 461, 395, 360, 319, 296, 267, 244, 230, 212, 197},[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] dm7025_PLL_setting[] = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, t_cardmhz = reader->mhz;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] for(i = 0; i < 11; i++)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(t_cardmhz >= dm7025_clock_freq) { break; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(i > 10) { i = 10; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->mhz = dm7025_clock_freq;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->divider = dm7025_PLL_setting; /*Nicer way of codeing is: reader->divider = i + 6;*/[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_DEVICE, "DM7025 PLL maxmhz = %.2f, wanted mhz = %.2f, PLL setting used = %d, actualcardclock=%.2f", (float) reader->cardmhz / 100, (float) t_cardmhz / 100,[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->divider, (float) reader->mhz / 100);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return reader->divider;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static void ICC_Async_InvertBuffer(uint32_t size, unsigned char *buffer)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t i;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] cs_debug_mask(D_IFD, "%s: size=%u buf[0]=%02x", __func__, size, buffer[0]);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] for(i = 0; i < size; i++)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { buffer = ~(INVERT_BYTE(buffer)); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t Parse_ATR(struct s_reader *reader, ATR *atr, uint16_t deprecated)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char FI = ATR_DEFAULT_FI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t D = ATR_DEFAULT_D;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t N = ATR_DEFAULT_N;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t ret;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] char tmp[256];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t numprot = atr->pn;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //if there is a trailing TD, this number is one too high[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char tx;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, numprot - 1, ATR_INTERFACE_BYTE_TD, &tx) == ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if((tx & 0xF0) == 0)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { numprot--; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t i, point;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] char txt[50];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] bool OffersT[3]; //T14 stored as T2[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] for(i = 0; i <= 2; i++)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { OffersT = 0; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] for(i = 1; i <= numprot; i++)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] point = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, i, ATR_INTERFACE_BYTE_TA, &tx) == ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] snprintf((char *)txt + point, sizeof(txt) - point, "TA%i=%02X ", i, tx);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] point += 7;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, i, ATR_INTERFACE_BYTE_TB, &tx) == ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] snprintf((char *)txt + point, sizeof(txt) - point, "TB%i=%02X ", i, tx);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] point += 7;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, i, ATR_INTERFACE_BYTE_TC, &tx) == ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] snprintf((char *)txt + point, sizeof(txt) - point, "TC%i=%02X ", i, tx);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] point += 7;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, i, ATR_INTERFACE_BYTE_TD, &tx) == ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] snprintf((char *)txt + point, sizeof(txt) - point, "TD%i=%02X ", i, tx);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] point += 7;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tx &= 0X0F;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] snprintf((char *)txt + point, sizeof(txt) - point, "(T%i)", tx);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(tx == 14)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { OffersT[2] = 1; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { OffersT[tx] = 1; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] snprintf((char *)txt + point, sizeof(txt) - point, "no TD%i means T0", i);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] OffersT[0] = 1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "%s", txt);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t numprottype = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] for(i = 0; i <= 2; i++)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(OffersT)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { numprottype ++; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "%i protocol types detected. Historical bytes: %s",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] numprottype, cs_hexdump(1, atr->hb, atr->hbn, tmp, sizeof(tmp)));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ATR_GetParameter(atr, ATR_PARAMETER_N, &(N));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ATR_GetProtocolType(atr, 1, &(reader->protocol_type)); //get protocol from TD1[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char TA2;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] bool SpecificMode = (ATR_GetInterfaceByte(atr, 2, ATR_INTERFACE_BYTE_TA, &TA2) == ATR_OK); //if TA2 present, specific mode, else negotiable mode[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(SpecificMode)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->protocol_type = TA2 & 0x0F;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if((TA2 & 0x10) != 0x10) //bit 5 set to 0 means F and D explicitly defined in interface characters[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char TA1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, 1 , ATR_INTERFACE_BYTE_TA, &TA1) == ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] FI = TA1 >> 4;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ATR_GetParameter(atr, ATR_PARAMETER_D, &(D));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] FI = ATR_DEFAULT_FI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] D = ATR_DEFAULT_D;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Specific mode: speed 'implicitly defined', not sure how to proceed, assuming default values");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] FI = ATR_DEFAULT_FI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] D = ATR_DEFAULT_D;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t F = atr_f_table[FI];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "Specific mode: T%i, F=%d, D=%d, N=%d",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->protocol_type, F, D, N);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else //negotiable mode[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->read_timeout = 1000000; // in us[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] bool PPS_success = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] bool NeedsPTS = ((reader->protocol_type != ATR_PROTOCOL_TYPE_T14) && (numprottype > 1 || (atr->ib[0][ATR_INTERFACE_BYTE_TA].present == 1 && atr->ib[0][ATR_INTERFACE_BYTE_TA].value != 0x11) || N == 255)); //needs PTS according to old ISO 7816[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(NeedsPTS && deprecated == 0)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // PTSS PTS0 PTS1 PCK[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char req[6] = { 0xFF, 0x10, 0x00, 0x00 }; //we currently do not support PTS2, standard guardtimes or PTS3,[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //but spare 2 bytes in arrayif card responds with it[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] req[1] = 0x10 | reader->protocol_type; //PTS0 always flags PTS1 to be sent always[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, 1, ATR_INTERFACE_BYTE_TA, &req[2]) != ATR_OK) //PTS1[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { req[2] = 0x11; } //defaults FI and DI to 1[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t len = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(SetRightParity(reader));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = PPS_Exchange(reader, req, &len);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ret == OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] FI = req[2] >> 4;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char DI = req[2] & 0x0F;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] D = atr_d_table[DI];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t F = atr_f_table[FI];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] PPS_success = 1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "PTS Succesfull, selected protocol: T%i, F=%d, D=%d, N=%d",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->protocol_type, F, D, N);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { rdr_ddump_mask(reader, D_ATR, req, len, "PTS Failure, response:"); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //When for SCI, T14 protocol, TA1 is obeyed, this goes OK for mosts devices, but somehow on DM7025 Sky S02 card goes wrong when setting ETU (ok on DM800/DM8000)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(!PPS_success) //last PPS not succesfull[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char TA1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, 1 , ATR_INTERFACE_BYTE_TA, &TA1) == ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] FI = TA1 >> 4;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ATR_GetParameter(atr, ATR_PARAMETER_D, &(D));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else //do not obey TA1[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] FI = ATR_DEFAULT_FI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] D = ATR_DEFAULT_D;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(NeedsPTS)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if((D == 32) || (D == 12) || (D == 20)) //those values were RFU in old table[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { D = 0; } // viaccess cards that fail PTS need this[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t F = atr_f_table[FI];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "No PTS %s, selected protocol T%i, F=%d, D=%d, N=%d",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] NeedsPTS ? "happened" : "needed", reader->protocol_type, F, D, N);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }//end negotiable mode[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //make sure no zero values[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t F = atr_f_table[FI];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(!F)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] FI = ATR_DEFAULT_FI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Warning: F=0 is invalid, forcing FI=%d", FI);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(!D)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] D = ATR_DEFAULT_D;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Warning: D=0 is invalid, forcing D=%d", D);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Init card protocol T%i, FI=%d, F=%d, D=%d, N=%d", reader->protocol_type, FI, F, D, N);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(deprecated == 0)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { return InitCard(reader, atr, FI, D, N, deprecated); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { return InitCard(reader, atr, ATR_DEFAULT_FI, ATR_DEFAULT_D, N, deprecated); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t PPS_Exchange(struct s_reader *reader, unsigned char *params, uint32_t *length)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char confirm[PPS_MAX_LENGTH];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t len_request, len_confirm;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] char tmp[128];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t ret;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] len_request = PPS_GetLength(params);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] params[len_request - 1] = PPS_GetPCK(params, len_request - 1);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "PTS: Sending request: %s",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] cs_hexdump(1, params, len_request, tmp, sizeof(tmp)));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.set_protocol)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = reader->crdr.set_protocol(reader, params, length, len_request);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return ret;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] /* Send PPS request */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(ICC_Async_Transmit(reader, len_request, len_request, params, 0, 1000000));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] /* Get PPS confirm */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(ICC_Async_Receive(reader, 2, confirm, 0, 1000000));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] len_confirm = PPS_GetLength(confirm);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(ICC_Async_Receive(reader, len_confirm - 2, confirm + 2, 0, 1000000));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "PTS: Receiving confirm: %s",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] cs_hexdump(1, confirm, len_confirm, tmp, sizeof(tmp)));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if((len_request != len_confirm) || (memcmp(params, confirm, len_request)))[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { ret = ERROR; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { ret = OK; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] /* Copy PPS handshake */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] memcpy(params, confirm, len_confirm);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] (*length) = len_confirm;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return ret;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static uint32_t PPS_GetLength(unsigned char *block)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t length = 3;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(PPS_HAS_PPS1(block))[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { length++; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(PPS_HAS_PPS2(block))[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { length++; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(PPS_HAS_PPS3(block))[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { length++; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return length;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static uint32_t ETU_to_us(struct s_reader *reader, uint32_t ETU)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return (uint32_t)((double) ETU * reader->worketu); // in us[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t ICC_Async_SetParity(struct s_reader *reader, uint16_t parity)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.set_parity)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_IFD, "Setting right parity");[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.set_parity(reader, parity));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t SetRightParity(struct s_reader *reader)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //set right parity[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint16_t parity = PARITY_EVEN;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->convention == ATR_CONVENTION_INVERSE)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { parity = PARITY_ODD; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->protocol_type == ATR_PROTOCOL_TYPE_T14)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { parity = PARITY_NONE; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(ICC_Async_SetParity(reader, parity));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.flush)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { IO_Serial_Flush(reader); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static int32_t InitCard(struct s_reader *reader, ATR *atr, unsigned char FI, uint32_t D, unsigned char N, uint16_t deprecated)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t I, F, Fi, BGT = 0, edc, GT = 0, WWT = 0, EGT = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char wi = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //set the amps and the volts according to ATR[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetParameter(atr, ATR_PARAMETER_I, &I) != ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { I = 0; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tempfi = FI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //set clock speed to max if internal reader[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.max_clock_speed == 1)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->mhz == 357 || reader->mhz == 358) //no overclocking[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->mhz = atr_fs_table[FI] / 10000; } //we are going to clock the card to this nominal frequency[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->cardmhz > 2000 && reader->autospeed == 1) // -1 replaced by autospeed parameter is magic number pll internal reader set cardmhz according to optimal atr speed[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->mhz = atr_fs_table[FI] / 10000 ; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->cardmhz > 2000)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->divider = 0; //reset pll divider so divider will be set calculated again.[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ICC_Async_GetPLL_Divider(reader); // calculate pll divider for target cardmhz.[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] Fi = atr_f_table[FI]; //get the frequency divider also called clock rate conversion factor[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.set_baudrate)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->current_baudrate = DEFAULT_BAUDRATE;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(deprecated == 0)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->protocol_type != ATR_PROTOCOL_TYPE_T14) //dont switch for T14[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t baud_temp = (double)D * ICC_Async_GetClockRate(reader->cardmhz) / (double)Fi; // just a test[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Setting baudrate to %d bps", baud_temp);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.set_baudrate(reader, baud_temp));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->current_baudrate = baud_temp;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->cardmhz > 2000 && reader->typ == R_INTERNAL) { F = reader->mhz; } // for PLL based internal readers[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if ((reader->typ == R_SMART) || (!strcasecmp(reader->crdr.desc, "smargo"))) {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if (reader->autospeed == 1) {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t Fsmart = atr_fs_table[FI];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->mhz = Fsmart/10000;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->mhz >= 1600) { reader->mhz = 1600; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 1200) { reader->mhz = 1200; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 961) { reader->mhz = 961; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 800) { reader->mhz = 800; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 686) { reader->mhz = 686; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 600) { reader->mhz = 600; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 534) { reader->mhz = 534; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 480) { reader->mhz = 534; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 436) { reader->mhz = 436; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 400) { reader->mhz = 400; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 369) { reader->mhz = 369; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 357) { reader->mhz = 369; } // 357 not suported by smartreader[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->mhz >= 343) { reader->mhz = 343; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->mhz = 320; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] F = reader->mhz; } // all other readers[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->worketu = (double)((double)(1 / (double)D) * ((double)Fi / (double)((double)F / 100))); // expressed in us[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "Calculated work ETU is %.2f us reader mhz = %u", reader->worketu, reader->mhz);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //set timings according to ATR[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->read_timeout = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->block_delay = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->char_delay = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] switch(reader->protocol_type)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case ATR_PROTOCOL_TYPE_T0:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case ATR_PROTOCOL_TYPE_T14:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] /* Integer value WI = TC2, by default 10 */[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#ifndef PROTOCOL_T0_USE_DEFAULT_TIMINGS[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, 2, ATR_INTERFACE_BYTE_TC, &(wi)) != ATR_OK)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#endif[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] wi = DEFAULT_WI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] WWT = (uint32_t) 960 * D * wi; //in work ETU[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char tmpatr[7]; // this is card atr of conax with pairingecmrotation, they need some additional WWT time but this isnt in those ATRs[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmpatr[0] = 0x3B;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmpatr[1] = 0x24;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmpatr[2] = 0x00;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmpatr[3] = 0x30;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmpatr[4] = 0x42;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmpatr[5] = 0x30;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmpatr[6] = 0x30;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // WWT = (uint32_t) 960 * D * wi; //in work ETU[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if (!memcmp(reader->card_atr, tmpatr, sizeof(tmpatr))){ // check for conax pairingecmrotation card atr.[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] WWT = WWT * 600; // if found add some additional WWT time[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] GT = 2; // standard guardtime[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] GT += 1; // start bit[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] GT += 8; // databits[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] GT += 1; // parity bit[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(N != 255) //add extra Guard Time by ATR[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { EGT += N; } // T0 protocol, if TC1 = 255 then dont add extra guardtime[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->CWT = 0; // T0 protocol doesnt have char waiting time (used to detect errors within 1 single block of data)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->BWT = 0; // T0 protocol doesnt have block waiting time (used to detect unresponsive card, this is max time for starting a block answer)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "Protocol: T=%i, WWT=%u, Clockrate=%u", reader->protocol_type, WWT, F * 10000);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->read_timeout = WWT; // Work waiting time used in T0 (max time to signal unresponsive card!)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->char_delay = GT + EGT; // Character delay is used on T0[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "Setting timings: timeout=%u ETU, block_delay=%u ETU, char_delay=%u ETU",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->read_timeout, reader->block_delay, reader->char_delay);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] break;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] case ATR_PROTOCOL_TYPE_T1:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char ta, tb, tc, cwi, bwi;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Set IFSC[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, 3, ATR_INTERFACE_BYTE_TA, &ta) == ATR_NOT_FOUND)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->ifsc = DEFAULT_IFSC; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if((ta != 0x00) && (ta != 0xFF))[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->ifsc = ta; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->ifsc = DEFAULT_IFSC; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //FIXME workaround for Smargo until native mode works[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->smargopatch == 1)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->ifsc = MIN(reader->ifsc, 28); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Towitoko and smartreaders dont allow IFSC > 251[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { reader->ifsc = MIN(reader->ifsc, MAX_IFSC); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#ifndef PROTOCOL_T1_USE_DEFAULT_TIMINGS[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Calculate CWI and BWI[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, 3, ATR_INTERFACE_BYTE_TB, &tb) == ATR_NOT_FOUND)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#endif[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] cwi = DEFAULT_CWI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] bwi = DEFAULT_BWI;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#ifndef PROTOCOL_T1_USE_DEFAULT_TIMINGS[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] cwi = tb & 0x0F;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] bwi = tb >> 4;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#endif[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Set CWT = 11+(2^CWI) work etu[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->CWT = (uint16_t) 11 + (1 << cwi); // in work ETU[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Set BWT = (2^BWI * 960 * 372 / clockspeed in mhz) us + 11*work etu[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Set BWT = (2^BWI * 960 * 372 / clockspeed in mhz) / worketu + 11[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->BWT = (uint32_t) ((1<<bwi) * 960 * 372 / (double)((double)F / 100) / (double) reader->worketu) + 11; // BWT in work ETU[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Set BGT = 22 * work etu[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] BGT = 22L; // Block Guard Time in ETU used to interspace between block responses[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] GT = 2; // standard guardtime[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] GT += 1; // start bit[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] GT += 8; // databits[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] GT += 1; // parity bit[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(N == 255)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { GT -= 1; } // special case, ATR says standard 2 etu guardtime is decreased by 1 (in ETU) EGT remains zero![/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { EGT += N; } // ATR says add extra guardtime (in ETU)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Set the error detection code type[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ATR_GetInterfaceByte(atr, 3, ATR_INTERFACE_BYTE_TC, &tc) == ATR_NOT_FOUND)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { edc = EDC_LRC; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { edc = tc & 0x01; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] // Set initial send sequence (NS)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->ns = 1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "Protocol: T=%i: IFSC=%d, CWT=%d etu, BWT=%d etu, BGT=%d etu, EDC=%s, N=%d",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->protocol_type, reader->ifsc,[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->CWT, reader->BWT,[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] BGT, (edc == EDC_LRC) ? "LRC" : "CRC", N);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->read_timeout = reader->BWT;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->block_delay = BGT;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->char_delay = GT + EGT;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_debug_mask(reader, D_ATR, "Setting timings: reader timeout=%u ETU, block_delay=%u ETU, char_delay=%u ETU",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->read_timeout, reader->block_delay, reader->char_delay);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] break;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] default:[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return ERROR;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] break;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }//switch[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] SetRightParity(reader); // some reader devices need to get set the right parity[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t ETU = Fi / D;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(atr->hbn >= 6 && !memcmp(atr->hb, "IRDETO", 6) && reader->protocol_type == ATR_PROTOCOL_TYPE_T14)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ETU = 0; // for Irdeto T14 cards, do not set ETU[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] reader->worketu *= 2; // overclocked T14 needs this otherwise high ecm reponses[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->crdr.write_settings)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.write_settings(reader, ETU, EGT, 5, I, (uint16_t) Fi, (unsigned char)D, N));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->crdr.write_settings2)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.write_settings2(reader, (uint16_t) Fi, (uint8_t) D, WWT, EGT, BGT));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else if(reader->crdr.write_settings3)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#if defined(__SH4__) || defined(STB04SCI)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] Fi = F/100; // workaround: SH4 internal reader needs base frequency like 1,2,3,4,5,6 Mhz not clock rate conversion factor (Fi)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#endif[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] call(reader->crdr.write_settings3(reader, ETU, Fi, WWT, reader->CWT, reader->BWT, EGT, (unsigned char)I));[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->typ == R_INTERNAL)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->cardmhz > 2000)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "PLL Reader: ATR Fsmax is %i MHz, clocking card to %.2f Mhz (nearest possible mhz specified reader->cardmhz)",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] atr_fs_table[FI] / 1000000, (float) reader->mhz / 100);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "ATR Fsmax is %i MHz, clocking card to %.2f (specified in reader->mhz)",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] atr_fs_table[FI] / 1000000, (float) reader->mhz / 100);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if ((reader->typ == R_SMART) && (reader->autospeed == 1))[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "ATR Fsmax is %i MHz, clocking card to atr Fsmax for smartreader cardspeed off %.2f MHz (specified in reader->mhz)",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] atr_fs_table[FI] / 1000000, (float) reader->mhz / 100);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] rdr_log(reader, "ATR Fsmax is %i MHz, clocking card to wanted user cardspeed off %.2f MHz (specified in reader->mhz)",[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] atr_fs_table[FI] / 1000000, (float) reader->mhz / 100);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] //Communicate to T1 card IFSD -> we use same as IFSC[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(reader->protocol_type == ATR_PROTOCOL_TYPE_T1 && reader->ifsc != DEFAULT_IFSC && !reader->crdr.skip_setting_ifsc)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] {[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char rsp[CTA_RES_LEN];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint16_t lr = 0;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] int32_t ret;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char tmp[] = { 0x21, 0xC1, 0x01, 0x00, 0x00 };[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmp[3] = reader->ifsc; // Information Field size[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] tmp[4] = reader->ifsc ^ 0xE1;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] ret = Protocol_T1_Command(reader, tmp, sizeof(tmp), rsp, &lr);[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] if(ret != OK) { rdr_log(reader, "Warning: Card returned error on setting ifsd value to %d", reader->ifsc); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] else { rdr_log(reader, "Card responded ok for ifsd request of %d", reader->ifsc); }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return OK;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]static unsigned char PPS_GetPCK(unsigned char *block, uint32_t length)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]{[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] unsigned char pck;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] uint32_t i;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] pck = block[0];[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] for(i = 1; i < length; i++)[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] { pck ^= block; }[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD][/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD] return pck;[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]}[/TD]
[/TR]
[TR]
[TH="bgcolor: #EEEEDD, align: right"] [/TH]
[TD]#endif[/TD]
[/TR]
[/TABLE]
 
Zuletzt bearbeitet von einem Moderator:
AW: How to Hack paired keys

o Haveri jem kjo eshte Source coda e oscamit njeher duhet mu kompilu edhe tani me punu me te edhe nuk eshte komplet nje pjes e saj mungon te pershendes hija
 
E paskeni bo kete Teme lamsh....deutsch englisch.

Tema qenka krijuar per LISA e shumica e antareve tu fol per FSHISA.

Me hy ne internet me gjet file e me bo copy nga google e paste ketu nuk eshte asgje.

Postoni dicka cka eshte e vertet dhe cka funksionon e leni tutorialet e gjuhes angleze tu i marr e tu i postu se ska sen prej tyne.

Po ashtu nuk mund te krahasohet nje sistem operativ linux apo nje eprom qe perdoret ne nje dreambox me linux njejt sikurse nje eprom i nje kompjuteri windows.

Per te nxerr te dhena nga eprom duhet me kan eprom programer e ata qe e kane kete titull as qe mundesh me i njoftu ndonjeher ndokush e leje mo ata me u marr me recervera se skan tjeter pune mat meqme :D.

Mos thuani po po funksion me ata po me kete, une kam nje cccam nganjeher hapen disa kanale qe jane te digitalb p.sh ktv por bllokohet keshtu qe nuk mun me than po bajn.

kam ndegjuar prap po e ceki qe kete gje e bejn me nje emulator por se si nuk e di.

iu lutem mos u lodhni me debatu tu qit databse te epromav po une i paguj kanalet me kartel e kam proovu me kete prove mu kan qel programet tjera ato jan vec genjeshtra.

te behemi real nese ndonjeri eshte i sakt le ta poston ate tutorial dhe te kuptohet qe eshte e vertet se na u lodh koka me keto poste provo ate provo kete.

Mire u ndegjofshim.
 
AW: Re: How to Hack paired keys

E paskeni bo kete Teme lamsh....deutsch englisch.

Tema qenka krijuar per LISA e shumica e antareve tu fol per FSHISA.
Ti Koke ma i Zoti si keta pse spo i Meson Pak ?
Po ashtu nuk mund te krahasohet nje sistem operativ linux apo nje eprom qe perdoret ne nje dreambox me linux njejt sikurse nje eprom i nje kompjuteri windows.
Sdi sa Vjet Shkoll iki ti me fal qe po te Pyes? sa per informata Eprom kan edhe windows aty eshte i shkrum Bios!
Per te nxerr te dhena nga eprom duhet me kan eprom programer e ata qe e kane kete titull as qe mundesh me i njoftu ndonjeher ndokush e leje mo ata me u marr me recervera se skan tjeter pune mat meqme :D.
Hiq Valla sduhet mu kan Programer po vetem duhet me dit me punu me Programa (hardware)
te behemi real nese ndonjeri eshte i sakt le ta poston ate tutorial dhe te kuptohet qe eshte e vertet se na u lodh koka me keto poste provo ate provo kete.
Valla Haver njerzi tuj Porvu po mesohet edhe njeri prej proves meson po nashta ti ke lind i ditur?
Po te shkruan nje Qoban i Dhenve (150 copa) edhe keshtu shoku mos ofendo edhe mos nenqmo se secili eka mendimin e vet edhe secili prej tyre ka kapacitetin e vet me mundsi shkon kjo punet te pershendes ardiani
 
Hija lexoe pak ma kadal ate cka kam shkruajt, ketu jan bere 6 faqe postime dhe asnje post nuk kishte diicka te sakt nese bazohemi ne titullin e temes.

Nese nencmova dikend kerkoi falje sepse nuk jam ketu per te nencmuar mirpo te them te drejten me mire mos me postu hiq sesa me postu dicka qe nuk funksionon apo ndoshta jam gabim .

Ndersa per RAM, ROM, EPROM, EEPROM, EAPROM nuk po ia nisim me debatu sepse dalim krejt prej teme mirpo tuj provu ne Eprom per me u mesu vec cka demton, megjithate kush te donn mundet me provu me e ri-shkruajt nje eprom por sa do ket sukses ?
 
AW: Re: How to Hack paired keys

Djema per mos me qu ma Gat 5000 euro kur ti bani edhe at.here lamrojuni te une e merrni prej meje nje kart me tani shka ju duhet plus abonimin per nje Vjet me te gjitha ju Pershendes Hija
 
AW: Re: How to Hack paired keys

5000-- euro jo shokit abonim per 1 vit ke nga 160 euro sa te don !
Djema per mos me qu ma Gat 5000 euro kur ti bani edhe at.here lamrojuni te une e merrni prej meje nje kart me tani shka ju duhet plus abonimin per nje Vjet me te gjitha ju Pershendes Hija
 
AW: How to Hack paired keys

Pazari eshte me Qef kush don kush nuk don te rrin !
 
AW: How to Hack paired keys

une per veti e kom falas linin kurse ju boni hajgare .
mundni me lyp edhe me shum kur nuk ka asgje pi kesaj pune.
 
AW: How to Hack paired keys

Shoki lexoje pak ma mire se ai paska shkru kush don me ja qel Karten e jo Linija me shiku, mos i keqkuptoni Njerzit.
 
Zurück
Oben