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; }
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); } }
// 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); } } } }
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; } }
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; }
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(); }