Exemplo n.º 1
0
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, &parameter));
    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;
}
Exemplo n.º 2
0
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, &parameter));
		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;
}