static rtems_status_code lm3s69xx_ssi_send_addr(rtems_libi2c_bus_t *bus, uint32_t addr, int rw) { lm3s69xx_ssi_bus_entry *e = (lm3s69xx_ssi_bus_entry *)bus; e->cs_pin = addr; lm3s69xx_gpio_set_pin(e->cs_pin, false); return RTEMS_SUCCESSFUL; }
static rtems_status_code lm3s69xx_ssi_send_stop(rtems_libi2c_bus_t *bus) { lm3s69xx_ssi_bus_entry *e = (lm3s69xx_ssi_bus_entry *)bus; volatile lm3s69xx_ssi* regs = e->regs; while ((regs->sr & SSISR_BSY) != 0) /* wait */; lm3s69xx_gpio_set_pin(e->cs_pin, true); return RTEMS_SUCCESSFUL; }
void gyroscope_init(int spi_bus_num) { printf("Initializing gyroscope...\n"); lm3s69xx_gpio_set_pin(SSI_SS_PIN, true); lm3s69xx_gpio_digital_enable(SSI_SS_PIN, true); rtems_device_minor_number minor = RTEMS_LIBI2C_MAKE_MINOR(spi_bus_num, SSI_SS_PIN); check_whoami(minor); init_l3g4200d(minor); measure_offset(minor, &gyro_data.offset); printf("Gyroscope offset: %"PRId16", %"PRId16", %"PRId16"\n", gyro_data.offset.x, gyro_data.offset.y, gyro_data.offset.z); rtems_id task_id; rtems_task_create(rtems_build_name('G', 'Y', 'R', 'O'), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id); rtems_task_start(task_id, gyroscope_task, 0); }