Пример #1
0
void make_bricklet_enumerate(EnumerateCallback *ec, const uint8_t bricklet) {
	com_make_default_header(ec, bs[bricklet].uid, sizeof(EnumerateCallback), FID_ENUMERATE_CALLBACK);

	memset(ec->uid, '\0', UID_STR_MAX_LENGTH);
	uid_to_serial_number(bs[bricklet].uid, ec->uid);

	memset(ec->connected_uid, '\0', UID_STR_MAX_LENGTH);
	uid_to_serial_number(com_info.uid, ec->connected_uid);
	ec->position = 'a' + bricklet;
	ec->version_fw[0] = bs[bricklet].firmware_version[0];
	ec->version_fw[1] = bs[bricklet].firmware_version[1];
	ec->version_fw[2] = bs[bricklet].firmware_version[2];
	ec->version_hw[0] = bs[bricklet].hardware_version[0];
	ec->version_hw[1] = bs[bricklet].hardware_version[1];
	ec->version_hw[2] = bs[bricklet].hardware_version[2];
	ec->device_identifier = bs[bricklet].device_identifier;
}
Пример #2
0
void get_identity(const ComType com, const GetIdentity *data) {
	logd("GetIdentitiy for %lu\n\r", data->header.uid);
	GetIdentityReturn gir = MESSAGE_EMPTY_INITIALIZER;
	gir.header        = data->header;
	gir.header.length = sizeof(GetIdentityReturn);

	if(data->header.uid == com_info.uid) {
		memset(gir.uid, '\0', UID_STR_MAX_LENGTH);
		uid_to_serial_number(com_info.uid, gir.uid);
		strncpy(gir.connected_uid, NO_CONNECTED_UID_STR, NO_CONNECTED_UID_STR_LENGTH);
		gir.position = '0';
		gir.version_fw[0] = BRICK_FIRMWARE_VERSION_MAJOR;
		gir.version_fw[1] = BRICK_FIRMWARE_VERSION_MINOR;
		gir.version_fw[2] = BRICK_FIRMWARE_VERSION_REVISION;
		gir.version_hw[0] = brick_hardware_version[0];
		gir.version_hw[1] = brick_hardware_version[1];
		gir.version_hw[2] = brick_hardware_version[2];
		gir.device_identifier = BRICK_DEVICE_IDENTIFIER;
	} else {
		for(uint8_t i = 0; i < BRICKLET_NUM; i++) {
			if(bs[i].uid == data->header.uid && bricklet_attached[i] != BRICKLET_INIT_CO_MCU) {
				memset(gir.uid, '\0', UID_STR_MAX_LENGTH);
				uid_to_serial_number(bs[i].uid, gir.uid);

				memset(gir.connected_uid, '\0', UID_STR_MAX_LENGTH);
				uid_to_serial_number(com_info.uid, gir.connected_uid);
				gir.position = 'a' + i;
				gir.version_fw[0] = bs[i].firmware_version[0];
				gir.version_fw[1] = bs[i].firmware_version[1];
				gir.version_fw[2] = bs[i].firmware_version[2];
				gir.version_hw[0] = bs[i].hardware_version[0];
				gir.version_hw[1] = bs[i].hardware_version[1];
				gir.version_hw[2] = bs[i].hardware_version[2];
				gir.device_identifier = bs[i].device_identifier;

				break;
			}
		}
	}

	if(gir.device_identifier != 0) {
		send_blocking_with_timeout(&gir, sizeof(GetIdentityReturn), com);
	}
}
Пример #3
0
// Insert stack address into enumerate message
void spi_stack_master_insert_position(void* data, const uint8_t position) {
	if(spi_stack_buffer_size_recv > sizeof(MessageHeader)) {
		EnumerateCallback *enum_cb =  (EnumerateCallback*)data;
		if(enum_cb->header.fid == FID_ENUMERATE_CALLBACK || enum_cb->header.fid == FID_GET_IDENTITY) {
			if(enum_cb->position == '0') {
				enum_cb->position = '0' + position;
				uid_to_serial_number(com_info.uid, enum_cb->connected_uid);
			}
		}
	}
}
Пример #4
0
void make_bricklet_enumerate(EnumerateCallback *ec, const uint8_t bricklet) {
	com_make_default_header(ec, bs[bricklet].uid, sizeof(EnumerateCallback), FID_ENUMERATE_CALLBACK);

	memset(ec->uid, '\0', UID_STR_MAX_LENGTH);
	uid_to_serial_number(bs[bricklet].uid, ec->uid);

	memset(ec->connected_uid, '\0', UID_STR_MAX_LENGTH);
	uid_to_serial_number(com_info.uid, ec->connected_uid);
	ec->position = 'a' + bricklet;
	ec->version_fw[0] = bs[bricklet].firmware_version[0];
	ec->version_fw[1] = bs[bricklet].firmware_version[1];
	ec->version_fw[2] = bs[bricklet].firmware_version[2];
	ec->version_hw[0] = bs[bricklet].hardware_version[0];
	ec->version_hw[1] = bs[bricklet].hardware_version[1];
	ec->version_hw[2] = bs[bricklet].hardware_version[2];
	ec->device_identifier = bs[bricklet].device_identifier;
	if(bricklet_attached[bricklet] == BRICKLET_INIT_CO_MCU) {
		// A co mcu Bricklet does the initial enumeration itself
		ec->device_identifier = 0;
	}
}
Пример #5
0
void make_brick_enumerate(EnumerateCallback *ec) {
	com_make_default_header(ec, com_info.uid, sizeof(EnumerateCallback), FID_ENUMERATE_CALLBACK);

	memset(ec->uid, '\0', UID_STR_MAX_LENGTH);
	uid_to_serial_number(com_info.uid, ec->uid);
	strncpy(ec->connected_uid, NO_CONNECTED_UID_STR, NO_CONNECTED_UID_STR_LENGTH);
	ec->position = '0';
	ec->version_fw[0] = BRICK_FIRMWARE_VERSION_MAJOR;
	ec->version_fw[1] = BRICK_FIRMWARE_VERSION_MINOR;
	ec->version_fw[2] = BRICK_FIRMWARE_VERSION_REVISION;
	ec->version_hw[0] = brick_hardware_version[0];
	ec->version_hw[1] = brick_hardware_version[1];
	ec->version_hw[2] = brick_hardware_version[2];
	ec->device_identifier = BRICK_DEVICE_IDENTIFIER;
}
Пример #6
0
void brick_init(void) {
	// Wait 5ms so everything can power up
	SLEEP_MS(5);
	logging_init();

	logsi("Booting %d\n\r", BRICK_DEVICE_IDENTIFIER);
	logsi("Compiled on %s %s\n\r", __DATE__, __TIME__);
	logsi("Processor family %s\n\r", IS_SAM3() ? "SAM3S" : "SAM4S");

    led_init();
	led_on(LED_STD_BLUE);
#ifdef LED_STD_RED
#if LOGGING_LEVEL == LOGGING_NONE
	led_off(LED_STD_RED);
#else
	led_on(LED_STD_RED);
#endif
#endif
	logsi("LEDs initialized\n\r");

	com_info.uid = uid_get_uid32();

	// Add 0 at end for printing
    char sn[MAX_BASE58_STR_SIZE] = {'\0'};
    uid_to_serial_number(com_info.uid, sn);
    set_serial_number_descriptor(sn, MAX_BASE58_STR_SIZE);
    logsi("Unique ID %s (%lu)\n\r\n\r", sn, com_info.uid);

    wdt_start();
    logsi("Watchdog disabled\n\r");

    mutex_init();
    logsi("Mutexes initialized\n\r");

	// Disable JTAG (Pins are needed for i2c)
#ifdef DISABLE_JTAG_ON_STARTUP
	MATRIX->CCFG_SYSIO |= (CCFG_SYSIO_SYSIO12 |
	                       CCFG_SYSIO_SYSIO4  |
	                       CCFG_SYSIO_SYSIO5  |
	                       CCFG_SYSIO_SYSIO6  |
	                       CCFG_SYSIO_SYSIO7);
	logsi("JTAG disabled\n\r");
#endif

	com_info.current = COM_NONE;
    PIO_InitializeInterrupts(15);

    bricklet_clear_eeproms();
    i2c_eeprom_master_init(TWI_BRICKLET);
    logsi("I2C for Bricklets initialized\n\r");

	usb_detect_configure();

	adc_init();
	adc_enable_temperature_sensor();
#ifndef NO_PERIODIC_ADC_CONVERISION
	adc_start_periodic_conversion();
#endif
    logsi("A/D converter initialized\n\r");

	bricklet_init();
}