blob: 0f49bd488e88aa209a56c9973101544f164a4678 [file] [log] [blame]
Brian Silverman2df84412013-12-10 14:00:40 -08001#include "cape/fill_packet.h"
2
3#include <string.h>
4
5#include <STM32F2XX.h>
6
7#include "cape/uart_dma.h"
Brian Silvermandf49fe32013-12-11 14:21:37 -08008#include "cape/uart_common.h"
Brian Silverman2df84412013-12-10 14:00:40 -08009#include "cape/cows.h"
Brian Silverman1b6fbd02013-12-12 18:08:47 -080010#include "cape/encoder.h"
11#include "cape/crc.h"
12#include "cape/bootloader_handoff.h"
Brian Silverman18b01642013-12-13 21:12:25 -080013#include "cape/gyro.h"
14#include "cape/led.h"
Brian Silverman95244d82013-12-14 12:15:46 -080015#include "cape/analog.h"
Brian Silverman1b6fbd02013-12-12 18:08:47 -080016
17#define TIMESTAMP_TIM TIM6
18#define RCC_APB1ENR_TIMESTAMP_TIMEN RCC_APB1ENR_TIM6EN
Brian Silverman2df84412013-12-10 14:00:40 -080019
20static uint8_t buffer1[DATA_STRUCT_SEND_SIZE] __attribute__((aligned(4)));
21static uint8_t buffer2[DATA_STRUCT_SEND_SIZE] __attribute__((aligned(4)));
22
Brian Silverman1b6fbd02013-12-12 18:08:47 -080023static uint32_t flash_checksum;
24// These aren't really integers; they're (4-byte) variables whose addresses mark
25// various locations.
26extern uint8_t __etext, __data_start__, __data_end__;
27
28static inline void do_fill_packet(struct DataStruct *packet) {
29 static uint64_t timestamp = 0;
30 counter_update_u64_u16(&timestamp, TIMESTAMP_TIM->CNT);
31 packet->timestamp = timestamp;
32
33 packet->flash_checksum = flash_checksum;
34
Brian Silverman18b01642013-12-13 21:12:25 -080035 struct GyroOutput gyro_output;
36 gyro_get_output(&gyro_output);
37 packet->gyro_angle = gyro_output.angle;
38 packet->old_gyro_reading = gyro_output.last_reading_bad;
39 packet->uninitialized_gyro = !gyro_output.initialized;
40 packet->zeroing_gyro = !gyro_output.zeroed;
41 packet->bad_gyro = gyro_output.gyro_bad;
42
Brian Silverman1b6fbd02013-12-12 18:08:47 -080043 packet->main.encoders[0] = encoder_read(0);
44 packet->main.encoders[1] = encoder_read(1);
45 packet->main.encoders[2] = encoder_read(2);
46 packet->main.encoders[3] = encoder_read(3);
47 packet->main.encoders[4] = encoder_read(4);
48 packet->main.encoders[5] = encoder_read(5);
49 packet->main.encoders[6] = encoder_read(6);
50 packet->main.encoders[7] = encoder_read(7);
Brian Silverman95244d82013-12-14 12:15:46 -080051
52 for (int i = 0; i < 8; ++i) {
53 packet->main.analogs[i] = analog_get(i);
54 }
Brian Silverman1b6fbd02013-12-12 18:08:47 -080055}
56
Brian Silverman2df84412013-12-10 14:00:40 -080057// Fills the new packet with data.
58void uart_dma_callback(uint8_t *buffer) {
59 struct {
60 struct DataStruct packet;
61 uint8_t padding[DATA_STRUCT_SEND_SIZE - sizeof(struct DataStruct) - 12];
62 uint32_t checksum;
63 } data __attribute__((aligned(4)));
64 STATIC_ASSERT(sizeof(data) == DATA_STRUCT_SEND_SIZE - 8,
65 The_size_of_the_data_is_wrong);
66 struct DataStruct *packet = &data.packet;
67
Brian Silverman1b6fbd02013-12-12 18:08:47 -080068 do_fill_packet(packet);
69
70 uint32_t *p;
71 memcpy(&p, &packet, sizeof(void *));
72 data.checksum = crc_calculate(p, sizeof(*packet) / 4);
Brian Silverman2df84412013-12-10 14:00:40 -080073
74 memset(buffer, 0, 4);
75 cows_stuff(&data, sizeof(data), buffer + 4);
76}
77
78void fill_packet_start(void) {
Brian Silverman1b6fbd02013-12-12 18:08:47 -080079 RCC->APB1ENR |= RCC_APB1ENR_TIMESTAMP_TIMEN;
80 TIMESTAMP_TIM->CR1 = TIM_CR1_UDIS;
81 TIMESTAMP_TIM->EGR = TIM_EGR_UG;
82 TIMESTAMP_TIM->CR1 |= TIM_CR1_CEN;
83
84 crc_init();
Brian Silverman18b01642013-12-13 21:12:25 -080085 led_init();
Brian Silverman95244d82013-12-14 12:15:46 -080086 analog_init();
Brian Silverman1b6fbd02013-12-12 18:08:47 -080087 encoder_init();
Brian Silverman18b01642013-12-13 21:12:25 -080088 gyro_init();
Brian Silverman1b6fbd02013-12-12 18:08:47 -080089
90 uint8_t *flash_end = &__etext + (&__data_start__ - &__data_end__) + 8;
91 flash_checksum = crc_calculate((void *)MAIN_FLASH_START,
92 (size_t)(flash_end - MAIN_FLASH_START) / 4);
Brian Silverman2df84412013-12-10 14:00:40 -080093
Brian Silvermandf49fe32013-12-11 14:21:37 -080094 uart_common_configure(3000000);
95 uart_dma_configure(DATA_STRUCT_SEND_SIZE, buffer1, buffer2);
Brian Silverman2df84412013-12-10 14:00:40 -080096}