Ejemplo n.º 1
0
static u8
read_byte(void){
  /* Read a single byte from EEPROM
     Read LSb first */
  int i;
  int Value;
  u8 Result=0;
#ifndef CONFIG_SYS_IMMR
  u32 Flags;
#endif

  E_DEBUG("Reading byte\n");

  for(i=0;i<8;i++){
    /* Small delay between pulses */
    udelay(1);

#ifndef CONFIG_SYS_IMMR
    /* Disable irq */
    save_flags(Flags);
    cli();
#endif

    /* Pull down pin short time to start read
       See page 26 in data sheet */

    WRITE_PORT(0);
    udelay(READ_LOW);
    WRITE_PORT(1);

    /* Wait for chip to drive pin */
    udelay(READ_TIMEOUT);

    Value = READ_PORT;
    if(Value)
      Value=1;

#ifndef CONFIG_SYS_IMMR
    /* Enable irq */
    restore_flags(Flags);
#endif

    /* Wait for chip to release pin */
    udelay(TOTAL_READ_LOW-READ_TIMEOUT);

    /* LSb first */
    Result|=Value<<i;
  }

  E_DEBUG("Read byte 0x%x\n",Result);

  return(Result);
}
Ejemplo n.º 2
0
static void
write_byte(u8 Byte){
  /* Write a single byte to EEPROM
     Write LSb first */
  int i;
  int Value;
#ifndef CONFIG_SYS_IMMR
  u32 Flags;
#endif

  E_DEBUG("Writing byte 0x%x\n",Byte);

  for(i=0;i<8;i++){
    /* Small delay between pulses */
    udelay(1);
    Value = Byte&1;

#ifndef CONFIG_SYS_IMMR
    /* Disable irq */
    save_flags(Flags);
    cli();
#endif

    /* Pull down pin short time for a 1, long time for a 0
       See page 26 in data sheet */

    WRITE_PORT(0);
    if(Value){
      /* Write a 1 */
      udelay(WRITE_1_LOW);
    }
    else{
      /* Write a 0 */
      udelay(WRITE_0_LOW);
    }

    WRITE_PORT(1);

#ifndef CONFIG_SYS_IMMR
    /* Enable irq */
    restore_flags(Flags);
#endif

    if(Value)
      /* Wait for chip to read the 1 */
      udelay(TOTAL_WRITE_LOW-WRITE_1_LOW);
    Byte>>=1;
  }
}
Ejemplo n.º 3
0
static int
do_reset(void){
  /* Release reset and verify that chip responds with presence pulse */
  int Retries = 0;
  while(Retries<5){
    udelay(RESET_LOW_TIME);

    /* Send reset */
    WRITE_PORT(0);
    udelay(RESET_LOW_TIME);

    /* Release reset */
    WRITE_PORT(1);

    /* Wait for EEPROM to drive output */
    udelay(PRESENCE_TIMEOUT);
    if(!READ_PORT){
      /* Ok, EEPROM is driving a 0 */
      E_DEBUG("Presence detected\n");
      if(Retries){
	E_DEBUG("Retries %d\n",Retries);
      }
      /* Make sure chip releases pin */
      udelay(PRESENCE_LOW_TIME);
      return 0;
    }
    Retries++;
  }

  printk(KERN_ERR"EEPROM did not respond when releasing reset\n");

    /* Make sure chip releases pin */
  udelay(PRESENCE_LOW_TIME);

  /* Set to idle again */
  set_idle();

  return(-EIO);
}
Ejemplo n.º 4
0
UINT8 namcoio_51XX_read(int chip)
{
#if VERBOSE
	logerror("%04x: custom 51XX read\n",activecpu_get_pc());
#endif

	if (io[chip].mode == 0)	/* switch mode */
	{
		switch ((io[chip].in_count++) % 3)
		{
			default:
			case 0: return READ_PORT(0) | (READ_PORT(1) << 4);
			case 1: return READ_PORT(2) | (READ_PORT(3) << 4);
			case 2: return 0;	// nothing?
		}
	}
	else	/* credits mode */
	{
		switch ((io[chip].in_count++) % 3)
		{
			default:
			case 0:	// number of credits in BCD format
				{
					int in,toggle;

					in = ~(READ_PORT(0) | (READ_PORT(1) << 4));
					toggle = in ^ io[chip].lastcoins;
					io[chip].lastcoins = in;

					if (io[chip].coins_per_cred[0] > 0)
					{
						if (io[chip].credits >= 99)
						{
							WRITE_PORT(1,1);	// coin lockout
						}
						else
						{
							WRITE_PORT(1,0);	// coin lockout
							/* check if the user inserted a coin */
							if (toggle & in & 0x10)
							{
								io[chip].coins[0]++;
								WRITE_PORT(0,0x04);	// coin counter
								WRITE_PORT(0,0x0c);
								if (io[chip].coins[0] >= io[chip].coins_per_cred[0])
								{
									io[chip].credits += io[chip].creds_per_coin[0];
									io[chip].coins[0] -= io[chip].coins_per_cred[0];
								}
							}
							if (toggle & in & 0x20)
							{
								io[chip].coins[1]++;
								WRITE_PORT(0,0x08);	// coin counter
								WRITE_PORT(0,0x0c);
								if (io[chip].coins[1] >= io[chip].coins_per_cred[1])
								{
									io[chip].credits += io[chip].creds_per_coin[1];
									io[chip].coins[1] -= io[chip].coins_per_cred[1];
								}
							}
							if (toggle & in & 0x40)
							{
								io[chip].credits++;
							}
						}
					}
					else io[chip].credits = 100;	// free play

					if (io[chip].mode == 1)
					{
						int on = (cpu_getcurrentframe() & 0x10) >> 4;

						if (io[chip].credits >= 2)
							WRITE_PORT(0,0x0c | 3*on);	// lamps
						else if (io[chip].credits >= 1)
							WRITE_PORT(0,0x0c | 2*on);	// lamps
						else
							WRITE_PORT(0,0x0c);	// lamps off

						/* check for 1 player start button */
						if (toggle & in & 0x04)
						{
							if (io[chip].credits >= 1)
							{
								io[chip].credits--;
								io[chip].mode = 2;
								WRITE_PORT(0,0x0c);	// lamps off
							}
						}
						/* check for 2 players start button */
						else if (toggle & in & 0x08)
						{
							if (io[chip].credits >= 2)
							{
								io[chip].credits -= 2;
								io[chip].mode = 2;
								WRITE_PORT(0,0x0c);	// lamps off
							}
						}
					}
				}

				if (~readinputport(0) & 0x80)	/* check test mode switch */
					return 0xbb;

				return (io[chip].credits / 10) * 16 + io[chip].credits % 10;

			case 1:
				{
					int joy = READ_PORT(2) & 0x0f;
					int in,toggle;

					in = ~READ_PORT(0);
					toggle = in ^ io[chip].lastbuttons;
					io[chip].lastbuttons = (io[chip].lastbuttons & 2) | (in & 1);

					/* remap joystick */
					if (io[chip].remap_joy) joy = joy_map[joy];

					/* fire */
					joy |= ((toggle & in & 0x01)^1) << 4;
					joy |= ((in & 0x01)^1) << 5;

					return joy;
				}

			case 2:
				{
					int joy = READ_PORT(3) & 0x0f;
					int in,toggle;

					in = ~READ_PORT(0);
					toggle = in ^ io[chip].lastbuttons;
					io[chip].lastbuttons = (io[chip].lastbuttons & 1) | (in & 2);

					/* remap joystick */
					if (io[chip].remap_joy) joy = joy_map[joy];

					/* fire */
					joy |= ((toggle & in & 0x02)^2) << 3;
					joy |= ((in & 0x02)^2) << 4;

					return joy;
				}
		}
	}
Ejemplo n.º 5
0
static void
set_idle(void){
  /* Send idle and keep start time
     Continous 1 is idle */
  WRITE_PORT(1);
}