예제 #1
0
static int
rs5c313_todr_gettime_ymdhms(todr_chip_handle_t todr, struct clock_ymdhms *dt)
{
	struct rs5c313_softc *sc = todr->cookie;
	int retry;
	int s;

	/*
	 * If chip had invalid data on init, don't bother reading
	 * bogus values, let todr(9) cope.
	 */
	if (sc->sc_valid == 0)
		return EIO;

	s = splhigh();

	rtc_begin(sc);
	for (retry = 10; retry > 0; --retry) {
		rtc_ce(sc, 1);

		rs5c313_write_reg(sc, RS5C313_CTRL, sc->sc_ctrl[0]);
		if ((rs5c313_read_reg(sc, RS5C313_CTRL) & CTRL_BSY) == 0)
			break;

		rtc_ce(sc, 0);
		delay(1);
	}
	if (retry == 0) {
		splx(s);
		return EIO;
	}

#define RTCGET(x, y)							\
	do {								\
		int ones = rs5c313_read_reg(sc, RS5C313_ ## y ## 1);	\
		int tens = rs5c313_read_reg(sc, RS5C313_ ## y ## 10);	\
		dt->dt_ ## x = tens * 10 + ones;			\
	} while (/* CONSTCOND */0)

	RTCGET(sec, SEC);
	RTCGET(min, MIN);
	RTCGET(hour, HOUR);
	RTCGET(day, DAY);
	RTCGET(mon, MON);
	RTCGET(year, YEAR);
#undef	RTCGET
	dt->dt_wday = rs5c313_read_reg(sc, RS5C313_WDAY);

	rtc_ce(sc, 0);
	splx(s);

	dt->dt_year = (dt->dt_year % 100) + 1900;
	if (dt->dt_year < POSIX_BASE_YEAR) {
		dt->dt_year += 100;
	}

	return 0;
}
예제 #2
0
static int
rs5c313_todr_settime_ymdhms(todr_chip_handle_t todr, struct clock_ymdhms *dt)
{
	struct rs5c313_softc *sc = todr->cookie;
	int retry;
	int t;
	int s;

	s = splhigh();

	rtc_begin(sc);
	for (retry = 10; retry > 0; --retry) {
		rtc_ce(sc, 1);

		rs5c313_write_reg(sc, RS5C313_CTRL, sc->sc_ctrl[0]);
		if ((rs5c313_read_reg(sc, RS5C313_CTRL) & CTRL_BSY) == 0)
			break;

		rtc_ce(sc, 0);
		delay(1);
	}

	if (retry == 0) {
		splx(s);
		return EIO;
	}

#define	RTCSET(x, y)							     \
	do {								     \
		t = TOBCD(dt->dt_ ## y) & 0xff;				     \
		rs5c313_write_reg(sc, RS5C313_ ## x ## 1, t & 0x0f);	     \
		rs5c313_write_reg(sc, RS5C313_ ## x ## 10, (t >> 4) & 0x0f); \
	} while (/* CONSTCOND */0)

	RTCSET(SEC, sec);
	RTCSET(MIN, min);
	RTCSET(HOUR, hour);
	RTCSET(DAY, day);
	RTCSET(MON, mon);

#undef	RTCSET

	t = dt->dt_year % 100;
	t = TOBCD(t);
	rs5c313_write_reg(sc, RS5C313_YEAR1, t & 0x0f);
	rs5c313_write_reg(sc, RS5C313_YEAR10, (t >> 4) & 0x0f);

	rs5c313_write_reg(sc, RS5C313_WDAY, dt->dt_wday);

	rtc_ce(sc, 0);
	splx(s);

	sc->sc_valid = 1;
	return 0;
}
예제 #3
0
static int
rs5c313_init(struct rs5c313_softc *sc)
{
	device_t self = sc->sc_dev;
	int status = 0;
	int retry;

	rtc_ce(sc, 0);

	rtc_begin(sc);
	rtc_ce(sc, 1);

	if ((rs5c313_read_reg(sc, RS5C313_CTRL) & CTRL_XSTP) == 0) {
		sc->sc_valid = 1;
		goto done;
	}

	sc->sc_valid = 0;
	aprint_error_dev(self, "time not valid\n");

	rs5c313_write_reg(sc, RS5C313_TINT, 0);
	rs5c313_write_reg(sc, RS5C313_CTRL, (sc->sc_ctrl[0] | CTRL_ADJ));

	for (retry = 1000; retry > 0; --retry) {
		if (rs5c313_read_reg(sc, RS5C313_CTRL) & CTRL_BSY)
			delay(1);
		else
			break;
	}
	if (retry == 0) {
		status = EIO;
		goto done;
	}

	rs5c313_write_reg(sc, RS5C313_CTRL, sc->sc_ctrl[0]);
	rs5c313_write_reg(sc, RS5C313_CTRL2, sc->sc_ctrl[1]);

  done:
	rtc_ce(sc, 0);
	return status;
}
void setup(void)
{
  //
  // Announce
  //

  Serial.begin(57600);
  printf_begin();
  printf_P(PSTR("\n\rTheCameraMachine - [email protected]\n\r"));
  printf_P(PSTR("VER. %s\n\r"),program_version);
  printf_P(PSTR("FREE %u\n\r"),freeMemory());
  
  //
  // Pin Symbols
  //

#if NATIVE
  pinSymbol(test_switch_pin,"test_switch");
  pinSymbol(other_led_pin,"other_led");
  pinSymbol(power_led_pin,"power_led");
  pinSymbol(record_led_pin,"record_led");
  
#ifdef HAVE_RELAYS
  pinSymbol(power_relay_pin,"power_relay");
  pinSymbol(alt_relay_pin,"alt_relay");
#endif
  
#ifdef HAVE_LANC
  pinSymbol(lanc_rx_pin,"lanc_rx");
  pinSymbol(lanc_tx_pin,"lanc_tx");
#endif
  
#ifdef HAVE_FOCUS_SHUTTER
  pinSymbol(focus_pin,"focus");
  pinSymbol(shutter_pin,"shutter");
#endif
  
#ifdef HAVE_PIEZO
  pinSymbol(piezo_pin,"piezo");
#endif

#ifdef HAVE_RECORD_BUTTON
  pinSymbol(record_button_pin,"record_button");
#endif

#endif // if NATIVE

  //
  // Begin objects
  //

  rtc_begin();
  test_switch.begin(up);
  power_led.begin(NULL);
  record_led.begin(NULL);
  other_led.begin(NULL);
  tty.begin(up);
  
#ifdef HAVE_FOCUS_SHUTTER
  focus.begin(NULL);
  shutter_tap.begin(up,NULL);
#endif

#ifdef HAVE_RELAYS
  power_relay.begin(NULL);
  alt_relay.begin(NULL);
#endif

#ifdef HAVE_RECORD_BUTTON
  record_button.begin(up);
#endif

#ifdef HAVE_LANC
  camera.begin(NULL);

  // Un-comment this to try multiple record pulses if needed for a certain
  // camera
  //camera.setRecordPulses(2);

#endif

#ifdef HAVE_FIRE_CAMERA 
  fire_camera.begin(up,NULL);
#endif

#ifdef HAVE_START_STOP_RECORD_SEQ
  start_record.begin(up,NULL);
  stop_record.begin(up,NULL);
#endif

  //
  // Logger symbols
  //

  logger.setSymbol(signal_power_on, PSTR("power_on"));
  logger.setSymbol(signal_power_off, PSTR("power_off"));
  logger.setSymbol(signal_start_record, PSTR("start_record"));
  logger.setSymbol(signal_stop_record, PSTR("stop_record"));
  logger.setSymbol(signal_alt_relay_on, PSTR("alt_relay_on"));
  logger.setSymbol(signal_alt_relay_off, PSTR("alt_relay_off"));
  logger.setSymbol(signal_other_led_on, PSTR("other_led_on"));
  logger.setSymbol(signal_other_led_off, PSTR("other_led_off"));
  logger.setSymbol(signal_toggle_record, PSTR("toggle_record"));
  logger.setSymbol(signal_fire_camera, PSTR("fire_camera"));
  logger.setSymbol(signal_focus_on, PSTR("focus_on"));
  logger.setSymbol(signal_focus_off, PSTR("focus_off"));
  logger.setSymbol(signal_shutter_tap, PSTR("shutter_tap"));
  logger.setSymbol(signal_power_relay_on, PSTR("power_relay_on"));
  logger.setSymbol(signal_power_relay_off, PSTR("power_relay_off"));

  logger.setSymbol(&test_switch, PSTR("test_switch"));
  logger.setSymbol(&power_led, PSTR("power_led"));
  logger.setSymbol(&record_led, PSTR("record_led"));
  logger.setSymbol(&other_led, PSTR("other_led"));
  logger.setSymbol(events.channel(0), PSTR("events ch#0"));
  
#ifdef HAVE_FOCUS_SHUTTER
  logger.setSymbol(&focus, PSTR("focus"));
  logger.setSymbol(&shutter_tap, PSTR("shutter_tap"));
#endif

#ifdef HAVE_RELAYS
  logger.setSymbol(&power_relay, PSTR("power_relay"));
  logger.setSymbol(&alt_relay, PSTR("alt_relay"));
#endif

#ifdef HAVE_RECORD_BUTTON
  logger.setSymbol(&record_button, PSTR("record_button"));
#endif
  
#ifdef HAVE_LANC
  logger.setSymbol(&camera, PSTR("camera"));
#endif
  
#ifdef HAVE_FIRE_CAMERA 
  logger.setSymbol(&fire_camera, PSTR("fire_camera"));
  logger.setSymbol(fire_camera.channel(0), PSTR("fire_camera ch#0"));
#endif

#ifdef HAVE_START_STOP_RECORD_SEQ
  logger.setSymbol(&start_record, PSTR("start_record"));
  logger.setSymbol(start_record.channel(0), PSTR("start_record ch#0"));
  logger.setSymbol(&stop_record, PSTR("stop_record"));
  logger.setSymbol(stop_record.channel(0), PSTR("stop_record ch#0"));
#endif
  
  // Begin the logger after all the symbols are set.
  logger.begin();
  events.begin();

  conn.setLogger(&logger);
  
  // Begin the main events after the logger is set up
  events.begin(up);
}