bool IO_Serial_InitPnP (struct s_reader * reader) { uint32_t PnP_id_size = 0; unsigned char PnP_id[IO_SERIAL_PNPID_SIZE]; /* PnP Id of the serial device */ int32_t dtr = IO_SERIAL_HIGH; int32_t cts = IO_SERIAL_LOW; if (IO_Serial_SetParams (reader, 1200, 7, PARITY_NONE, 1, &dtr, &cts)) return ERROR; while ((PnP_id_size < IO_SERIAL_PNPID_SIZE) && !IO_Serial_Read (reader, 0, 200000, 1, &(PnP_id[PnP_id_size]))) PnP_id_size++; return OK; }
static int32_t mp35_init(struct s_reader *reader) { reader->handle = open(reader->device, O_RDWR | O_NOCTTY | O_NONBLOCK); if(reader->handle < 0) { rdr_log(reader, "ERROR: Opening device %s (errno=%d %s)", reader->device, errno, strerror(errno)); return ERROR; } if(IO_Serial_SetParams(reader, DEFAULT_BAUDRATE, 8, PARITY_EVEN, 2, NULL, NULL)) { return ERROR; } if(mp35_reader_init(reader)) { rdr_log(reader, "ERROR: mp35_reader_init returned error"); mp35_close(reader); return ERROR; } return OK; }
int32_t MP35_Init(struct s_reader * reader) { MP35_info reader_info; BYTE rec_buf[32]; BYTE parameter; int32_t original_mhz; rdr_debug_mask(reader, D_IFD, "Initializing MP35 reader"); current_product = 0; original_mhz = reader->mhz; // MP3.5 commands should be always be written using 9600 baud at 3.58MHz reader->mhz = 357; call(IO_Serial_SetParams(reader, 9600, 8, PARITY_NONE, 1, IO_SERIAL_HIGH, IO_SERIAL_HIGH)); IO_Serial_Sendbreak(reader, MP35_BREAK_LENGTH); IO_Serial_DTR_Clr(reader); IO_Serial_DTR_Set(reader); cs_sleepms(200); IO_Serial_Flush(reader); memset(rec_buf, 0x00, sizeof(rec_buf)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 2, fw_version)); call(IO_Serial_Read(reader, MP35_READ_DELAY, 4, rec_buf)); if(rec_buf[3] != ACK) { rdr_debug_mask(reader, D_IFD, "Failed MP35 command: fw_version"); return ERROR; } if (MP35_product_info(reader, rec_buf[1], rec_buf[0], rec_buf[2], &reader_info) != OK) { rdr_log(reader, "MP35_Init: unknown product code"); return ERROR; } if(reader_info.current_product == 0x10) // USB Phoenix { if(original_mhz == 357) { rdr_log(reader, "MP35_Init: Using oscillator 1 (3.57MHz)"); parameter = 0x01; } else if(original_mhz == 368) { rdr_log(reader, "MP35_Init: Using oscillator 2 (3.68MHz)"); parameter = 0x02; } else if(original_mhz == 600) { rdr_log(reader, "MP35_Init: Using oscillator 3 (6.00MHz)"); parameter = 0x03; } else { rdr_log(reader, "MP35_Init: MP35 support only mhz=357, mhz=368 or mhz=600"); rdr_log(reader, "MP35_Init: Forced oscillator 1 (3.57MHz)"); parameter = 0x01; original_mhz = 357; } memset(rec_buf, 0x00, sizeof(rec_buf)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 2, set_mode_osc)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1, ¶meter)); call(IO_Serial_Read(reader, MP35_READ_DELAY, 1, rec_buf)); // Read ACK from previous command if(rec_buf[0] != ACK) { rdr_debug_mask(reader, D_IFD, "Failed MP35 command: set_mode_osc"); return ERROR; } rdr_log(reader, "MP35_Init: Leaving programming mode"); memset(rec_buf, 0x00, sizeof(rec_buf)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 2, exit_program_mode)); call(IO_Serial_Read(reader, MP35_READ_DELAY, 1, rec_buf)); if(rec_buf[0] != ACK) { rdr_debug_mask(reader, D_IFD, "Failed MP35 command: exit_program_mode"); return ERROR; } } else //MP3.5 or MP3.6 { if(reader_info.product_fw_version >= 0x0500) { int32_t info_len; char info[sizeof(rec_buf) - 2]; memset(rec_buf, 0x00, sizeof(rec_buf)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 2, fw_info)); call(IO_Serial_Read(reader, MP35_READ_DELAY, 1, rec_buf)); info_len = rec_buf[0]; call(IO_Serial_Read(reader, MP35_READ_DELAY, info_len + 1, rec_buf)); if(rec_buf[info_len] != ACK) { rdr_debug_mask(reader, D_IFD, "Failed MP35 command: fw_info"); return ERROR; } memcpy(info, rec_buf, info_len); info[info_len] = '\0'; rdr_log(reader, "MP35_Init: FW Info - %s", info); } memset(rec_buf, 0x00, sizeof(rec_buf)); if(original_mhz == 357) { rdr_log(reader, "MP35_Init: Using oscillator 1 (3.57MHz)"); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 2, phoenix_mode)); } else if(original_mhz == 600) { rdr_log(reader, "MP35_Init: Using oscillator 2 (6.00MHz)"); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 2, phoenix_6mhz_mode)); } else { rdr_log(reader, "MP35_Init: MP35 support only mhz=357 or mhz=600"); rdr_log(reader, "MP35_Init: Forced oscillator 1 (3.57MHz)"); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 2, phoenix_mode)); original_mhz = 357; } } reader->mhz = original_mhz; // We might have switched oscillator here current_product = reader_info.current_product; IO_Serial_Flush(reader); return OK; }
static int32_t mp35_reader_init(struct s_reader *reader) { MP35_info reader_info; unsigned char rec_buf[32]; unsigned char parameter; int32_t original_mhz; int32_t original_cardmhz; rdr_log(reader, "%s: started", __func__); original_mhz = reader->mhz; original_cardmhz = reader->cardmhz; // MP3.5 commands should be always be written using 9600 baud at 3.57MHz reader->mhz = 357; reader->cardmhz = 357; int32_t dtr = IO_SERIAL_HIGH; int32_t cts = IO_SERIAL_HIGH; call(IO_Serial_SetParams(reader, 9600, 8, PARITY_NONE, 1, &dtr, &cts)); IO_Serial_Sendbreak(reader, MP35_BREAK_LENGTH); IO_Serial_DTR_Clr(reader); IO_Serial_DTR_Set(reader); cs_sleepms(200); IO_Serial_RTS_Set(reader); IO_Serial_Flush(reader); memset(rec_buf, 0x00, sizeof(rec_buf)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1000000, 2, fw_version)); call(IO_Serial_Read(reader, MP35_READ_DELAY, 1000000, 4, rec_buf)); if(rec_buf[3] != ACK) { rdr_debug_mask(reader, D_IFD, "Failed MP35 command: fw_version"); return ERROR; } if(mp35_product_info(reader, rec_buf[1], rec_buf[0], rec_buf[2], &reader_info) != OK) { rdr_log(reader, "%s: unknown product code", __func__); return ERROR; } if(reader_info.current_product == 0x10) // USB Phoenix { if(original_mhz == 357) { rdr_log(reader, "%s: Using oscillator 1 (3.57MHz)", __func__); parameter = 0x01; } else if(original_mhz == 368) { rdr_log(reader, "%s: Using oscillator 2 (3.68MHz)", __func__); parameter = 0x02; } else if(original_mhz == 600) { rdr_log(reader, "%s: Using oscillator 3 (6.00MHz)", __func__); parameter = 0x03; } else { rdr_log(reader, "%s: MP35 support only mhz=357, mhz=368 or mhz=600", __func__); rdr_log(reader, "%s: Forced oscillator 1 (3.57MHz)", __func__); parameter = 0x01; original_mhz = 357; } memset(rec_buf, 0x00, sizeof(rec_buf)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1000000, 2, set_mode_osc)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1000000, 1, ¶meter)); call(IO_Serial_Read(reader, MP35_READ_DELAY, 1000000, 1, rec_buf)); // Read ACK from previous command if(rec_buf[0] != ACK) { rdr_debug_mask(reader, D_IFD, "Failed MP35 command: set_mode_osc"); return ERROR; } rdr_debug_mask(reader, D_IFD, "%s: Leaving programming mode", __func__); memset(rec_buf, 0x00, sizeof(rec_buf)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1000000, 2, exit_program_mode)); call(IO_Serial_Read(reader, MP35_READ_DELAY, 1000000, 1, rec_buf)); if(rec_buf[0] != ACK) { rdr_debug_mask(reader, D_IFD, "Failed MP35 command: exit_program_mode"); return ERROR; } } else //MP3.5 or MP3.6 { if(reader_info.product_fw_version >= 0x0500) { int32_t info_len; char info[sizeof(rec_buf) - 2]; memset(rec_buf, 0x00, sizeof(rec_buf)); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1000000, 2, fw_info)); call(IO_Serial_Read(reader, MP35_READ_DELAY, 1000000, 1, rec_buf)); info_len = rec_buf[0]; call(IO_Serial_Read(reader, MP35_READ_DELAY, 1000000, info_len + 1, rec_buf)); if(rec_buf[info_len] != ACK) { rdr_debug_mask(reader, D_IFD, "Failed MP35 command: fw_info"); return ERROR; } memcpy(info, rec_buf, info_len); info[info_len] = '\0'; rdr_log(reader, "%s: FW Info - %s", __func__, info); } memset(rec_buf, 0x00, sizeof(rec_buf)); if(original_mhz == 357) { rdr_log(reader, "%s: Using oscillator 1 (3.57MHz)", __func__); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1000000, 2, phoenix_mode)); } else if(original_mhz == 600) { rdr_log(reader, "%s: Using oscillator 2 (6.00MHz)", __func__); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1000000, 2, phoenix_6mhz_mode)); } else { rdr_log(reader, "%s: MP35 support only mhz=357 or mhz=600", __func__); rdr_log(reader, "%s: Forced oscillator 1 (3.57MHz)", __func__); call(IO_Serial_Write(reader, MP35_WRITE_DELAY, 1000000, 2, phoenix_mode)); original_mhz = 357; } tcdrain(reader->handle); } // We might have switched oscillator here reader->mhz = original_mhz; reader->cardmhz = original_cardmhz; /* Default serial port settings */ if(reader->atr[0] == 0) { IO_Serial_Flush(reader); call(IO_Serial_SetParams(reader, DEFAULT_BAUDRATE, 8, PARITY_EVEN, 2, NULL, NULL)); } return OK; }