serial basically working

This commit is contained in:
jaseg 2020-01-27 21:58:22 +01:00
parent 966f104597
commit f4a6ea896f
10 changed files with 3970 additions and 3306 deletions

View file

@ -22,16 +22,22 @@
#include <stdlib.h>
#include <assert.h>
volatile uint16_t adc_buf[100]; /* 100ms worth of data */
uint32_t usart_overruns = 0;
static struct __attribute__((__packed__)) hl_adc_pkt {
struct ll_pkt ll;
uint16_t seq;
volatile uint16_t data[32];
} adc_pkt[2];
static uint16_t current_seq = 0;
static int current_buf = 0;
static void adc_dma_init(int burstlen);
static void adc_dma_init(void);
static void adc_timer_init(int psc, int ivl);
static void adc_dma_launch(void);
/* Mode that can be used for debugging */
void adc_configure_scope_mode(int sampling_interval_ns) {
adc_dma_init(sizeof(adc_buf)/sizeof(adc_buf[0]));
adc_dma_init();
/* Clock from PCLK/4 instead of the internal exclusive high-speed RC oscillator. */
ADC1->CFGR2 = (2<<ADC_CFGR2_CKMODE_Pos); /* Use PCLK/4=12MHz */
@ -59,24 +65,28 @@ void adc_configure_scope_mode(int sampling_interval_ns) {
adc_timer_init(12/*250ns/tick*/, cycles);
}
static void adc_dma_init(int burstlen) {
static void adc_dma_init() {
/* Configure DMA 1 Channel 1 to get rid of all the data */
DMA1_Channel1->CPAR = (unsigned int)&ADC1->DR;
DMA1_Channel1->CMAR = (unsigned int)&adc_buf;
DMA1_Channel1->CNDTR = burstlen;
DMA1_Channel1->CCR = (0<<DMA_CCR_PL_Pos);
DMA1_Channel1->CCR |=
DMA_CCR_CIRC /* circular mode so we can leave it running indefinitely */
| (1<<DMA_CCR_MSIZE_Pos) /* 16 bit */
(1<<DMA_CCR_MSIZE_Pos) /* 16 bit */
| (1<<DMA_CCR_PSIZE_Pos) /* 16 bit */
| DMA_CCR_MINC
| DMA_CCR_HTIE /* Enable half-transfer interrupt. */
| DMA_CCR_TCIE; /* Enable transfer complete interrupt. */
/* triggered on half-transfer and on transfer completion. We use this to send out the ADC data and to trap into GDB. */
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
NVIC_SetPriority(DMA1_Channel1_IRQn, 3<<5);
NVIC_SetPriority(DMA1_Channel1_IRQn, 2<<5);
adc_dma_launch();
}
void adc_dma_launch() {
DMA1_Channel1->CCR &= ~DMA_CCR_EN; /* Disable channel */
current_buf = !current_buf;
DMA1_Channel1->CMAR = (unsigned int)&(adc_pkt[current_buf].data);
DMA1_Channel1->CNDTR = ARRAY_LEN(adc_pkt[current_buf].data);
DMA1_Channel1->CCR |= DMA_CCR_EN; /* Enable channel */
}
@ -103,18 +113,13 @@ void DMA1_Channel1_IRQHandler(void) {
uint32_t isr = DMA1->ISR;
/* Clear the interrupt flag */
DMA1->IFCR |= DMA_IFCR_CGIF1;
adc_dma_launch();
gdb_dump();
static_assert(ARRAY_LEN(adc_buf) % 2 == 0, "ADC_BUFSIZE must be even for half-transfer uart tx logic to work");
int rc;
if (isr & DMA_ISR_HTIF2) /* half-transfer */
rc = usart_send_packet_nonblocking((uint8_t *)adc_buf, sizeof(adc_buf)/2);
else /* end of transfer */
rc = usart_send_packet_nonblocking((uint8_t *)adc_buf + ARRAY_LEN(adc_buf)/2, sizeof(adc_buf)/2);
if (rc)
usart_overruns++;
adc_pkt[!current_buf].seq = current_seq++;
/* Ignore return value since we can't do anything here. Overruns are logged in serial.c. */
usart_send_packet_nonblocking(&adc_pkt[!current_buf].ll, sizeof(adc_pkt[!current_buf]));
/*
static int debug_buf_pos = 0;

79
gm_platform/fw/crctest.py Normal file
View file

@ -0,0 +1,79 @@
custom_crc_table = {}
def generate_crc32_table(_poly):
global custom_crc_table
for i in range(256):
c = i << 24
for j in range(8):
c = (c << 1) ^ _poly if (c & 0x80000000) else c << 1
custom_crc_table[i] = c & 0xffffffff
def crc32_stm(bytes_arr):
length = len(bytes_arr)
crc = 0xffffffff
k = 0
while length >= 4:
v = ((bytes_arr[k] << 24) & 0xFF000000) | ((bytes_arr[k+1] << 16) & 0xFF0000) | \
((bytes_arr[k+2] << 8) & 0xFF00) | (bytes_arr[k+3] & 0xFF)
crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ v)]
crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 8))]
crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 16))]
crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 24))]
k += 4
length -= 4
if length > 0:
v = 0
for i in range(length):
v |= (bytes_arr[k+i] << 24-i*8)
if length == 1:
v &= 0xFF000000
elif length == 2:
v &= 0xFFFF0000
elif length == 3:
v &= 0xFFFFFF00
crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v ) )];
crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 8) )];
crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 16) )];
crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 24) )];
return crc
poly = 0x04C11DB7
buf = bytes(reversed([1, 2, 3, 4]))
generate_crc32_table(poly)
print(hex(crc32_stm(bytearray(buf))))
from crccheck import crc
import struct
def rev_bits_in_word(w):
return sum( ((w>>i)&1) << (31-i) for i in range(32) )
import zlib
def crc32stm(inbytes):
crc32 = crc.Crc32.calc(inbytes)^0xffffffff
#crc32 = zlib.crc32(inbytes)^0xffffffff
crc32 = rev_bits_in_word(crc32)
return crc32
#data = [0x80,0x40,0xc0,0x20]
data = [0x00, 0, 0, 0x80, 0, 0, 0, 0x80]
print(hex(crc32stm(bytes(data))))
print(hex(zlib.crc32(bytes([0, 0, 0, 1]))^0xffffffff))

Binary file not shown.

View file

@ -30,7 +30,7 @@ volatile union {
struct {
unsigned int usb, ocxo, error, _nc1, _nc2, _nc3, pps, sd_card;
};
unsigned int arr[0];
unsigned int arr[8];
} leds;
int main(void) {
@ -47,7 +47,7 @@ int main(void) {
NVIC_SetPriority(SysTick_IRQn, 3<<5);
/* Turn on lots of neat things */
RCC->AHBENR |= RCC_AHBENR_DMAEN | RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_FLITFEN;
RCC->AHBENR |= RCC_AHBENR_DMAEN | RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_FLITFEN | RCC_AHBENR_CRCEN;
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_ADCEN | RCC_APB2ENR_SPI1EN | RCC_APB2ENR_DBGMCUEN |\
RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM16EN | RCC_APB2ENR_USART1EN;
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;

Binary file not shown.

View file

@ -1,15 +1,15 @@
:020000040800F2
:10000000001000205519000885040008910400081C
:1000000000100020FD1B0008850400089104000872
:1000100000000000000000000000000000000000E0
:10002000000000000000000000000000950400082F
:100030000000000000000000A1040008AD0400085A
:10004000A119000800000000A1190008A11900086A
:10005000A1190008A1190008A1190008A119000898
:100060000000000063070008A90A0008A1190008A1
:10007000A1190008A1190008A1190008000000003A
:10008000A11900080000000000000000A1190008EC
:1000900000000000C9030008A1190008A119000808
:1000A000000000009D03000800000000A1190008E6
:10004000491C000800000000491C0008491C000869
:10005000491C0008491C0008491C0008491C0008EC
:10006000000000009B070008D10C0008491C000894
:10007000491C0008491C0008491C00080000000039
:10008000491C00080000000000000000491C000896
:1000900000000000C9030008491C0008491C0008B2
:1000A000000000009D03000800000000290A00086D
:1000B0000000000000000000000000000000000040
:1000C00080B582B000AF0200FB1D1A70FB1D1B78CB
:1000D0001A001F231A40044B012191400A001A60A4
@ -38,8 +38,8 @@
:100240004B490A405A60494B5A68484B8821490338
:100250000A435A60454B1A68444B802149040A43BB
:100260001A60C046414B1A6880239B041340F9D0A2
:100270003E4B5A683D4B02210A435A6000F072FE21
:100280003C4B1B680A21180001F0EEF9030018002E
:100270003E4B5A683D4B02210A435A6000F0C6FFCC
:100280003C4B1B680A21180001F042FB03001800D8
:10029000FFF79AFF01235B421800FFF711FF0123CC
:1002A0005B4260211800FFF721FF304B5A692F4B4A
:1002B00031490A435A612D4B9A692C4B2F490A4305
@ -53,8 +53,8 @@
:10033000DDFE174B00225A60154B0122DA60144B88
:100340002F229A62124B134ADA62114B01221A6071
:100350001520FFF7B5FE40211520FFF7C7FE0E4B15
:10036000180000F045F900F0CDFAFEE70010024059
:100370000CF8C3FF0000002011000600015A4200E3
:10036000180000F045F900F0F5FAFEE70010024031
:100370000CF8C3FF0000002051000600015A4200A3
:1003800070A92800808A080000040048003001405D
:1003900000440140E703000040420F0080B500AF79
:1003A000084B9B680222134009D09023DB050822EA
@ -70,14 +70,14 @@
:1004400011600A2B10D10C4B00221A600B4AFB1DC5
:100450001B7813700A4B5A68094B80210A435A6073
:100460009023DB0508229A62C046BD4602B080BDDB
:1004700000440140B0000020980000200C300140F2
:100470000044014078010020980000200C30014029
:100480000030014080B500AF00BEC046BD4680BD13
:1004900000BEC04680B500AF00BEC046BD4680BDB0
:1004A00080B500AF00BEC046BD4680BD80B500AF80
:1004B0000A4B1B68591C094A11600A2B0AD1074BC9
:1004C00000221A60064B1B685A1C054B1A60054B2C
:1004D00064229A61C046BD4680BDC0469C00002093
:1004E00094000020B000002080B582B000AF020070
:1004E000940000207801002080B582B000AF0200A7
:1004F000FB1D1A70FB1D1B781A001F231A40044BAA
:10050000012191400A001A60C046BD4602B080BD7C
:1005100000E100E090B583B000AF02003960FB1D40
@ -94,332 +94,375 @@
:1005C000FB1D1B78180003230340DB009A400748FB
:1005D000FB1D1B785BB29B080A43C0339B001A507B
:1005E000C046BD4603B090BD00ED00E000E100E074
:1005F00080B584B000AF7860202000F04BF8214B2C
:10060000802212061A611F4B07225A611D4B1E4A97
:10061000DA601C4B04229A621A4B9A68194B8021AB
:1006200009060A439A60C046164B9B68002BFBDB09
:10063000144B9A68134B01210A439A60114B9A6834
:10064000104B04210A439A607B68104A934206DDEE
:100650007B68FA21180001F091F8030000E00623FE
:10066000FB60FA6880235B029A4201DB084BFB6067
:10067000FB6819000C2000F03DF8C046BD4604B0F0
:1006800080BDC0460024014043080000DC05000096
:10069000FFFF000080B582B000AF7860114B124AB6
:1006A0009A60104B114ADA600E4B7A685A600D4B13
:1006B00000221A600B4B1A680A4B0D490A431A6054
:1006C0000920FFF711FF60210920FFF723FF054BE9
:1006D0001A68044B01210A431A60C046BD4602B0A5
:1006E00080BDC0460800024040240140D0000020E8
:1006F000A605000080B582B000AF78603960154B68
:10070000802212025A64134BC022D201DA61114BCB
:10071000802252011A620F4B01221A647B685A1E12
:100720000C4B9A623B685A1E0A4BDA62094B5A69B3
:10073000084B01210A435A61064B80221A60054B7F
:100740001A68044B01210A431A60C046BD4602B034
:1007500080BDC046002C014080B500AFC046BD46FC
:1007600080BD80B582B000AF144B1B683B60134B5B
:100770005A68124B01210A435A60FFF7EDFF3B68AC
:100780004022134007D00E4B2021180000F0C6F97C
:1007900003007B6006E00B4B2021180000F0BEF93F
:1007A00003007B607B68002B04D0074B1B685A1C3E
:1007B000054B1A60C046BD4602B080BD0000024035
:1007C000D0000020E0000020A000002080B582B012
:1007D00000AF0200FB1D1A70FB1D1B781A001F23BF
:1007E0001A40044B012191400A001A60C046BD46E0
:1007F00002B080BD00E100E080B582B000AF020031
:10080000FB1D1A70FB1D1B781A001F23134005499E
:1008100001229A40130080228B50C046BD4602B090
:1008200080BDC04600E100E090B583B000AF02009B
:100830003960FB1D1A70FB1D1B787F2B32D92F4AA4
:10084000FB1D1B7819000F230B40083B9B08063348
:100850009B00D31804331B68FA1D12781100032281
:100860000A40D200FF2191400A00D2431A401100F1
:100870003B689B01FF221A40FB1D1B7818000323D5
:100880000340DB009A401D48FB1D1B781C000F2312
:100890002340083B9B080A4306339B00C3180433DC
:1008A0001A6027E0164AFB1D1B785BB29B08C03319
:1008B0009B009B58FA1D1278110003220A40D200B7
:1008C000FF2191400A00D2431A4011003B689B016E
:1008D000FF221A40FB1D1B78180003230340DB0096
:1008E0009A400748FB1D1B785BB29B080A43C03344
:1008F0009B001A50C046BD4603B090BD00ED00E01D
:1009000000E100E080B500AF194B012252421A60AD
:10091000174B00225A60164B00229A60154B164A5C
:100920009A60144B92221A600A20FFF74FFF202191
:100930000A20FFF779FF114B114A1A600F4B602212
:10094000DA600E4BC022DA600C4BC02292025A6071
:100950000A4B9A68094B80210A439A60074B1A6830
:10096000064B01210A431A60C046BD4680BDC04601
:10097000100100201C0002402838014000380140CE
:100980002C20000080B584B000AF194BBB60BB6861
:100990005B687B60BB689B687A689A4205D2BB68DB
:1009A0009A687B68D31AFB6004E07B688022D200DF
:1009B000D31AFB60BB687A681A607A68FB68D31840
:1009C0009B059A0DBB685A60BB680C331A007B68A4
:1009D000D218084BDA60074BFA685A60054B1A6860
:1009E000044B01210A431A60C046BD4604B080BDD5
:1009F000100100201C00024080B582B000AF78607A
:100A00000A00FB1C1A700A20FFF7F6FE7B689A6842
:100A10007B681B689A4205D10A20FFF7D7FE102396
:100A20005B4211E07B689B687A68D318FA1C1278E5
:100A30001A737B689B6801339B059A0D7B689A60EB
:100A40000A20FFF7C3FE00231800BD4602B080BD98
:100A500080B582B000AF0200FB1D1A70C046FB1DBE
:100A60001A78064B11001800FFF7C6FF0300103379
:100A7000F5D000231800BD4602B080BD1001002053
:100A800080B582B000AF0200FB1D1A70FB1D1A7802
:100A9000044B11001800FFF7AFFF03001800BD461C
:100AA00002B080BD1001002080B500AF0B4B5A682A
:100AB0000A4B20210A435A60094B1A68084B01214E
:100AC0008A431A60074B9A68064B5B689A4201D0CA
:100AD000FFF758FFC046BD4680BDC046000002403B
:100AE0001C0002401001002080B582B000AF786089
:100AF00039603A687968074B180000F09CF8064B9B
:100B00001B680122134001D1FFF73CFFC046BD46E0
:100B100002B080BD510A00081C00024080B584B0BC
:100B200000AF786039600023FB600BE00E4B1B7850
:100B30005A1CD1B20C4A11701800FFF7A1FFFB68D4
:100B40000133FB60FA68AF235B009A42EED9074B92
:100B50001B680122134001D1FFF714FF0023180086
:100B6000BD4604B080BDC046A40000201C00024069
:100B700080B588B000AFF860B9607A603B60BA6851
:100B800080235B029A4202D23B68FE2B02D90123EA
:100B90005B424CE03B680233BA689A4202D20123BE
:100BA0005B4244E00023FB6136E0FB69002B0FD081
:100BB000FB69013B7A68D3181B78002B08D0FB69CE
:100BC000013B7A68D2181B23FB1812781A7019E0BF
:100BD000FB697B6102E07B6901337B617A693B6879
:100BE0009A4205D27A687B69D3181B78002BF2D120
:100BF0007B69DAB2FB69DBB2D31ADAB21B23FB18CA
:100C000001321A70FA68FB69D3181B22BA181278DD
:100C10001A70FB690133FB61FA693B689A42C4D9D7
:100C2000FA68FB69D31800221A703B680233180077
:100C3000BD4608B080BD80B58AB000AFF860B9602D
:100C40007A607B68FE2B02D901235B424EE00023D1
:100C50007B623CE07B6A002B0FD07B6A013BBA6869
:100C6000D3181B78002B08D07B6A013BBA68D218D6
:100C70002323FB1812781A7019E07B6AFB6102E0EB
:100C8000FB690133FB61FA697B689A4205D2BA6855
:100C9000FB69D3181B78002BF2D1FB69DAB27B6AAF
:100CA000DBB2D31ADAB22323FB1801321A702323E2
:100CB000FB181A78FB681000984703007B617B697A
:100CC000002B01D07B6911E07B6A01337B627A6A79
:100CD0007B689A42BED9FB68002098470300BB613D
:100CE000BB69002B01D0BB6900E000231800BD46A2
:100CF0000AB080BD80B588B000AFF860B9607A6096
:100D00003B60BA6880235B029A4204D23A6880232F
:100D10005B029A4202D301235B4252E03B68002B04
:100D200002D101235B424CE0BA683B689A4202D28E
:100D300001235B4245E00123FB617B681B78BB61BB
:100D4000BB69002B24D102235B423AE0BB69013B23
:100D5000BB61BB69002B09D17A68FB69D3181B788A
:100D6000BB611723FB1800221A7006E07A68FB6942
:100D7000D2181723FB1812781A70FB69013BFA6826
:100D8000D3181722BA1812781A70FB690133FB6165
:100D9000FA693B689A4205D27A68FB69D3181B78D6
:100DA000002BD3D1FA693B689A4202D102235B42FD
:100DB00007E0BB69012B02D003235B4201E0FB6922
:100DC000013B1800BD4608B080BD80B582B000AFC1
:100DD00078607B6800221A607B6800225A60C046F7
:100DE000BD4602B080BD80B588B000AFF860B96084
:100DF0007A601A00FB1C1A70FB681B68002B0ED16E
:100E0000FB1C1B78002B54D0FB1C1A78FB685A6023
:100E1000FB681B685A1CFB681A60002350E0FB1C2F
:100E20001B78002B0DD1FB685B68012B39D1FB6867
:100E30001B68013B7B61FB681800FFF7C6FF7B69FD
:100E40003EE0FB685B685A1EFB685A60FB685B68A3
:100E5000002B08D1FB1C1A78FB685A601F23FB1873
:100E600000221A7004E01F23FB18FA1C12781A7073
:100E7000FB681B68013BBB61BA697B689A4202D37D
:100E800002235B421CE0BA68BB69D3181F22BA1860
:100E900012781A70FB681B685A1CFB681A600023E2
:100EA0000EE0C046FB681800FFF78FFF01235B428E
:100EB00006E0C046FB681800FFF787FF03235B428C
:100EC0001800BD4608B080BDBC1900080000002015
:100ED00094000020940000201C05002080B500AF85
:100EE0001A4B1A68194B01210A431A60174B5A68AA
:100EF000164B17490A405A60144B1A68134B154990
:100F00000A401A60114B1A68104B13490A401A60C4
:100F10000E4B5A680D4B11490A405A600B4BDA6A66
:100F20000A4B0F218A43DA62084B1A6B074B0C49B4
:100F30000A401A63054B5A6B044B01218A435A63DA
:100F4000024B00229A60C046BD4680BD00100240A0
:100F50000CB8FF08FFFFF6FEFFFFFBFFFFFFC0FF1F
:100F6000ECFEFFFF80B584B000AF0023FB600023E0
:100F7000BB6000237B6000233B60314B5B680C222D
:100F80001340FB60FB68082B11D0FB68082B41D88D
:100F9000FB68002B03D0FB68042B04D03AE0294BFC
:100FA000294A1A603AE0274B274A1A6036E0244B58
:100FB0005A68F0239B031340BB60214B5A6880237F
:100FC0005B0213407B60BB689B0C0233BB601C4B15
:100FD000DB6A0F22134001333B607A6880235B0297
:100FE0009A420AD13968184800F03EFB03001A0003
:100FF000BB685A43134B1A6010E0B9680A005201EB
:10100000521A93019B1ADB005B181B021A000D4B4E
:101010001A6003E00B4B0C4A1A60C046084B5B6831
:101020001B090F221340094AD35CFB60054B1A6869
:10103000FB68DA40034B1A60C046BD4604B080BD71
:10104000001002400000002000127A00A4190008DD
:1010500080B500AF044B1A68034B8021C9020A43D4
:101060001A60C046BD4680BD0010024080B500AF8A
:10107000044B1A68034B04490A401A60C046BD4637
:1010800080BDC04600100240FFFFFBFF80B500AFEF
:10109000044B1A68034B802149020A431A60C04678
:1010A000BD4680BD0010024080B500AF064B1A68F7
:1010B00080239B021340054A944663445A4253419D
:1010C000DBB21800BD4680BD001002400000FEFFEC
:1010D00080B500AF044B1A68034B01210A431A6024
:1010E000C046BD4680BDC0460010024080B500AF7E
:1010F000054B1B6802221340023B5A425341DBB2AC
:101100001800BD4680BDC0460010024080B582B0C8
:1011100000AF7860064B5B68032293431900044BD1
:101120007A680A435A60C046BD4602B080BDC046D8
:101130000010024080B500AF034B5B680C221340E7
:101140001800BD4680BDC0460010024080B582B088
:1011500000AF7860064B5B68F02293431900044BA4
:101160007A680A435A60C046BD4602B080BDC04698
:101170000010024080B582B000AF7860064B5B681B
:10118000064A13401900044B7A680A435A60C04665
:10119000BD4602B080BDC04600100240FFF8FFFF10
:1011A00080B500AF044B1A68034B802149040A4301
:1011B0001A60C046BD4680BD0010024080B500AF39
:1011C000074B1A6880239B041340FE2212069446A4
:1011D00063445A425341DBB21800BD4680BDC0464D
:1011E0000010024080B582B000AF786039600E4BCD
:1011F0005B680E4A134019007A6880235B021A402C
:101200003B681A43084B0A435A60074BDB6A0F22BC
:10121000934319007B680F221A40034B0A43DA629A
:10122000C046BD4602B080BD00100240FFFFC2FFB5
:1012300080B582B000AF786039603968786800F0B6
:1012400013FA03001A00064B013A5A60044B0022BD
:101250009A60034B05221A60C046BD4602B080BDAD
:1012600010E000E080B582B000AF7860064B1B68EC
:10127000012293431900044B7A680A431A60C0465E
:10128000BD4602B080BDC0460020024080B500AF20
:10129000034B1B68012213401800BD4680BDC046A9
:1012A0000020024080B582B000AF7860FA239A0037
:1012B0007B6811001800FFF7BBFFC046BD4602B0B7
:1012C00080BD80B584B000AF78600E4B1B68FB60BA
:1012D000FB687B6801330CD07B6801337B6008E0DE
:1012E000084B1A6880235B02134002D07B68013BE5
:1012F0007B607B68002BF3D1C046C046BD4604B07E
:1013000080BDC04610E000E080B582B000AF7860DC
:10131000034B7A681A60C046BD4602B080BDC04625
:101320000000002090B585B000AF786039600F23D1
:10133000FB1801221A700023BB6000F0D4F80300F0
:10134000012B28D17B6801225A607B68174A19005B
:10135000100000F0ABF80300BB60FFF7C7FE03000E
:10136000012B07D0FFF7B4FEC046FFF7BFFE030016
:10137000012BFAD17B681B6819000020FFF732FFB0
:101380000F23FC183A68BB681100180000F0BEF883
:101390000300237003E00F23FB1800221A700F23B1
:1013A000FB181B781800BD4605B090BD00127A00EE
:1013B00090B587B000AFF860B9607A603B601723E2
:1013C000FB1801221A7000233B6100F08CF8030027
:1013D000012B32D17A68FB681100180000F066F822
:1013E00003003B61FFF760FE0300012B0FD0BB68D9
:1013F000012B02D1FFF72CFE01E0FFF737FEFFF7CC
:1014000045FEC046FFF750FE0300012BFAD17B6872
:101410005B68802252021A437B681B681900100027
:10142000FFF7E0FE1723FC183A683B69110018002B
:1014300000F06CF80300237003E01723FB18002270
:101440001A701723FB181B781800BD4607B090BD13
:1014500080B584B000AF78600F217B1801221A702C
:101460000023BB607B68002B03D17B1800221A701D
:1014700013E07B680C4A934201D90123BB60BB682F
:101480001800FFF7EFFEFFF701FF0200BB68934271
:1014900003D00F23FB1800221A700F23FB181B78B0
:1014A0001800BD4604B080BD00366E0180B584B022
:1014B00000AF786039600023FB603B685B680133F4
:1014C0001900786800F0D0F8030019003B681B6829
:1014D0009B0C0F22134002334B43FB60FB68180048
:1014E000BD4604B080BD80B582B000AFFB1D0122B7
:1014F0001A70FFF763FE031E02D0FB1D00221A7054
:10150000FB1D1B781800BD4602B080BD90B585B0AC
:1015100000AF786039600F203B1801221A70002359
:10152000BB602E4B1A683B681B681B090F210B40E0
:101530002B49CB5C9A401300BB60BA687B689A4227
:1015400006D23C187B681800FFF782FF0300237067
:101550000F23FB181B78012B1AD1FFF721FEC04681
:10156000FFF72CFE0300012BFAD13B681B68180023
:10157000FFF7ECFD0220FFF7C9FDC046FFF7DAFDDB
:101580000300082BFAD13B685B681800FFF7F2FDF7
:10159000BA687B689A4207D90F23FC187B68180049
:1015A000FFF756FF030023700F23FB181B78012B56
:1015B0000CD13B681B681B090F221340084AD35CFF
:1015C0001A007B68D3401800FFF79EFE0F23FB181C
:1015D0001B781800BD4605B090BDC0460000002035
:1015E000A419000880B500AFC046BD4680BD80B5D7
:1015F00086B000AFF860B9607A60FA687B68D3188B
:101600003B61FB687B6106E0BB68DAB27B691A70FC
:101610007B6901337B617A693B699A42F4D3FB6849
:101620001800BD4606B080BD80B584B000AF7860BC
:101630007B68FB60C0467B685A1C7A601B78002B75
:10164000F9D17A68FB68D31A013B1800BD4604B093
:1016500080BD80B582B000AF0200FB1D1A70C0468D
:10166000BD4602B080BD0000002243088B4274D307
:1016700003098B425FD3030A8B4244D3030B8B4293
:1016800028D3030C8B420DD3FF22090212BA030C9C
:101690008B4202D31212090265D0030B8B4219D37D
:1016A00000E0090AC30B8B4201D3CB03C01A52419D
:1016B000830B8B4201D38B03C01A5241430B8B42E5
:1016C00001D34B03C01A5241030B8B4201D30B03CE
:1016D000C01A5241C30A8B4201D3CB02C01A5241F5
:1016E000830A8B4201D38B02C01A5241430A8B42B8
:1016F00001D34B02C01A5241030A8B4201D30B02A1
:10170000C01A5241CDD2C3098B4201D3CB01C01ABA
:10171000524183098B4201D38B01C01A52414309C4
:101720008B4201D34B01C01A524103098B4201D3B2
:101730000B01C01A5241C3088B4201D3CB00C01A1F
:10174000524183088B4201D38B00C01A5241430897
:101750008B4201D34B00C01A5241411A00D20146BC
:10176000524110467047FFE701B5002000F0F0F845
:1017700002BDC0460029F7D076E7704703460B4309
:101780007FD4002243088B4274D303098B425FD37A
:10179000030A8B4244D3030B8B4228D3030C8B42A6
:1017A0000DD3FF22090212BA030C8B4202D312128C
:1017B000090265D0030B8B4219D300E0090AC30B61
:1017C0008B4201D3CB03C01A5241830B8B4201D30E
:1017D0008B03C01A5241430B8B4201D34B03C01AF7
:1017E0005241030B8B4201D30B03C01A5241C30A6F
:1017F0008B4201D3CB02C01A5241830A8B4201D3E0
:101800008B02C01A5241430A8B4201D34B02C01AC9
:101810005241030A8B4201D30B02C01A5241CDD26E
:10182000C3098B4201D3CB01C01A524183098B42B9
:1018300001D38B01C01A524143098B4201D34B01A2
:10184000C01A524103098B4201D30B01C01A524105
:10185000C3088B4201D3CB00C01A524183088B428C
:1018600001D38B00C01A524143088B4201D34B0075
:10187000C01A5241411A00D20146524110467047E7
:101880005DE0CA0F00D04942031000D340425340EC
:1018900000229C4603098B422DD3030A8B4212D3AC
:1018A000FC22890112BA030A8B420CD389019211DE
:1018B0008B4208D3890192118B4204D389013AD01B
:1018C000921100E08909C3098B4201D3CB01C01AF0
:1018D000524183098B4201D38B01C01A5241430903
:1018E0008B4201D34B01C01A524103098B4201D3F1
:1018F0000B01C01A5241C3088B4201D3CB00C01A5E
:10190000524183088B4201D38B00C01A5241D9D275
:1019100043088B4201D34B00C01A5241411A00D2F6
:101920000146634652415B10104601D34042002BF2
:1019300000D54942704763465B1000D3404201B571
:10194000002000F005F802BD0029F8D016E7704726
:101950007047C0460C488546002103E00B4B5B589E
:10196000435004310A480B4B42189A42F6D30A4AB4
:1019700002E0002313600432084B9A42F9D3FFF7C8
:10198000ADFAFEF74AFCFEE700100020BC19000883
:101990000000002094000020940000201C0500207E
:1019A000FEE7000000000000000000000102030448
:0C19B00006070809000000000102030403
:1019BC0000127A0000040040002000400028004083
:1019CC00002C0040003000400054004000700040EB
:1019DC0000000140000401400024014008270140A0
:1019EC0008270140002C0140003001400038014024
:1019FC0000440140004801400058014000000240F2
:101A0C00080002401C00024030000240440002402A
:101A1C00580002400020024000F8FF1F0010024056
:101A2C000030024000000048000400480008004854
:101A3C00000C00480014004800ED00E010E000E04D
:041A4C0000E100E0D5
:040000050800195581
:1005F00080B584B000AF786000F04AF8204B8022CC
:1006000012061A611E4B07225A611D4B1D4ADA6001
:100610001B4B04229A621A4B9A68194B80210906D7
:100620000A439A60C046164B9B68002BFBDB144BB9
:100630009A68134B01210A439A60114B9A68104B38
:1006400004210A439A607B680F4A934206DD7B6867
:10065000FA21180001F0E6F9030000E00623FB6030
:10066000FA6880235B029A4201DB084BFB60FB685F
:1006700019000C2000F05AF8C046BD4604B080BDF9
:100680000024014043080000DC050000FFFF0000DB
:1006900080B500AF0B4B0C4A9A600A4B00221A60DF
:1006A000084B1A68074B09490A431A600920FFF7EB
:1006B0001BFF40210920FFF72DFF00F009F8C0467D
:1006C000BD4680BD08000240402401408205000074
:1006D00080B500AF124B1A68114B01218A431A6092
:1006E000104B1B685A425341DBB21A000D4B1A6083
:1006F0000C4B1A681300DB009B18DB0008331A0050
:10070000094BD218064BDA60054B20225A60044B85
:100710001A68034B01210A431A60C046BD4680BDDA
:100720000800024034010020A000002080B582B003
:1007300000AF78603960154B802212025A64134B67
:10074000C022D201DA61114B802252011A620F4B92
:1007500001221A647B685A1E0C4B9A623B685A1E2F
:100760000A4BDA62094B5A69084B01210A435A6164
:10077000064B80221A60054B1A68044B01210A437C
:100780001A60C046BD4602B080BDC046002C014084
:1007900080B500AFC046BD4680BD80B582B000AF19
:1007A0001A4B1B687B60194B5A68184B01210A438E
:1007B0005A60FFF78DFFFFF7EBFF154B1A88531CAC
:1007C00099B2134B1980134B1B6859424B41DBB252
:1007D000180011490300DB001B18DB00CB1806339F
:1007E0001A800C4B1B685A425341DBB21A001300AB
:1007F000DB009B18DB00084A9B184821180000F01A
:10080000DDFAC046BD4602B080BDC04600000240D1
:100810003001002034010020A000002080B582B00B
:1008200000AF0200FB1D1A70FB1D1B781A001F236E
:100830001A40044B012191400A001A60C046BD468F
:1008400002B080BD00E100E080B582B000AF0200E0
:10085000FB1D1A70FB1D1B781A001F23134005494E
:1008600001229A40130080228B50C046BD4602B040
:1008700080BDC04600E100E090B583B000AF02004B
:100880003960FB1D1A70FB1D1B787F2B32D92F4A54
:10089000FB1D1B7819000F230B40083B9B080633F8
:1008A0009B00D31804331B68FA1D12781100032231
:1008B0000A40D200FF2191400A00D2431A401100A1
:1008C0003B689B01FF221A40FB1D1B781800032385
:1008D0000340DB009A401D48FB1D1B781C000F23C2
:1008E0002340083B9B080A4306339B00C31804338C
:1008F0001A6027E0164AFB1D1B785BB29B08C033C9
:100900009B009B58FA1D1278110003220A40D20066
:10091000FF2191400A00D2431A4011003B689B011D
:10092000FF221A40FB1D1B78180003230340DB0045
:100930009A400748FB1D1B785BB29B080A43C033F3
:100940009B001A50C046BD4603B090BD00ED00E0CC
:1009500000E100E080B582B000AF2A4B0122524294
:100960001A60284B00225A60264B00229A6000230E
:100970007B600BE0234A7B6802339B00D31804336F
:10098000012252421A607B6801337B607B68042B32
:10099000F0D91D4B180000F06BFB1C4B1C4A9A60F1
:1009A0001A4B92221A601B4B1B4ADA60194B1B4AE6
:1009B0001A600A20FFF732FF20210A20FFF75CFFB0
:1009C000174B184A1A60164BC022DA60144BC0222B
:1009D00092025A60124B9A68114B80210A439A6026
:1009E0001B20FFF71BFF60211B20FFF745FF0C4B6F
:1009F0001A680B4B01210A431A60C046BD4602B07B
:100A000080BDC04698010020480100201C00024023
:100A100028380140300002400030024042100000FF
:100A2000003801402C20000080B586B000AF414B5B
:100A3000DB693B613B690822134008D03D4B08222B
:100A40001A623D4B1B685A1C3B4B1A606FE03B69B6
:100A50002022134000D16AE0364B9B8C9AB20F21C2
:100A60007B181A707B181B7834493548202200F017
:100A70000DFB0300BB60BB68002B57D0BB68002B8D
:100A800005DA304B1B685A1C2E4B1A604FE0BB68CE
:100A9000022B05D02C4B1B685A1C2B4B1A6046E0CE
:100AA000264B7B607B681B78DBB2032B26D033DCC4
:100AB000012B02D0022B13D02EE000237B610BE030
:100AC000224A7B6902339B00D3180433012252422D
:100AD0001A607B6901337B617B69042BF0D924E0C8
:100AE0007B685B78DBB2180000F06CF8031E19D04D
:100AF000154B1B685A1C144B1A6013E07B685B781B
:100B0000DBB2180000F004F9031E0DD00E4B1B6879
:100B10005A1C0D4B1A6007E00B4B1B685A1C0A4B02
:100B20001A6004E0C04602E0C04600E0C046BD4690
:100B300006B080BD003801403C010020500100207B
:100B400048010020400100204401002098010020BD
:100B500080B584B000AF194BBB60BB685B687B603D
:100B6000BB689B687A689A4205DABB689A687B68BA
:100B7000D31AFB6004E07B6880229200D31AFB60EA
:100B8000BB687A681A607A68FB68D318DB05DA0DEF
:100B9000BB685A60BB6820331A007B68D218084BC8
:100BA000DA60074BFA685A60054B1A68044B01215A
:100BB0000A431A60C046BD4604B080BD98010020BB
:100BC0001C00024080B582B000AF0200FB1D1A700D
:100BD000FB1D1B78052B02D916235B420AE0FB1D87
:100BE0001B78064A02339B00D31804330122524279
:100BF0001A6000231800BD4602B080BD9801002095
:100C000080B584B000AF78600A00FB1C1A700A201F
:100C1000FFF71AFE0023FB6013E07B689A6879688F
:100C2000FB6802339B00CB1804331B689A4205D142
:100C30000A20FFF7F3FD10235B4219E0FB68013344
:100C4000FB60FB68042BE8D97B689B687A682021ED
:100C5000D3185B18FA1C12781A707B689B680133F2
:100C6000DB05DA0D7B689A600A20FFF7D7FD0023C9
:100C70001800BD4604B080BD80B582B000AF020050
:100C8000FB1D1A70C046FB1D1A78064B1100180098
:100C9000FFF7B6FF03001033F5D000231800BD4660
:100CA00002B080BD9801002080B582B000AF020084
:100CB000FB1D1A70FB1D1A78044B11001800FFF77A
:100CC0009FFF03001800BD4602B080BD98010020C0
:100CD00080B500AF0B4B5A680A4B20210A435A607B
:100CE000094B1A68084B01218A431A60074B9A681E
:100CF000064B5B689A4201D0FFF72AFFC046BD460B
:100D000080BDC046000002401C0002409801002047
:100D100090B587B000AF0200FB1D1A700920FFF7E5
:100D200093FDFB1D1B78234A02339B00D318043329
:100D30001B687B617B693B610FE00F23FB181B780D
:100D40001800FFF7B1FF031E07D01B4B1B685A1C8E
:100D5000194B1A6010235B4228E07B695A1C7A61A8
:100D60000F243A1913492020CB181B181B78137035
:100D70003B191B78002BE0D10020FFF795FF031EE5
:100D800007D00D4B1B685A1C0B4B1A6010235B429B
:100D90000CE0FB1D1B78074A02339B00D318043379
:100DA0003A691A600920FFF739FD00231800BD4693
:100DB00007B090BD980100203801002090B587B0A1
:100DC00000AF78603960404B9B68FB6000237B611B
:100DD0003D4A7B6902339B00D31804331B680133FF
:100DE0000DD07B6901337B617B69042BF0D9374BD4
:100DF0001B685A1C354B1A6010235B4260E0C046EA
:100E00007B69DAB27B681A71314BA1229A600423A4
:100E10003B6108E07A683B69D3181A782C4B1A605A
:100E20003B6901333B613A693B689A42F2D3284BF4
:100E30001B68DA437B68FF2111400C001978002001
:100E40000140081C211C01431970110AFF200140B8
:100E50000C00597800200140081C211C01435970E6
:100E6000110CFF2001400C00997800200140081C63
:100E7000211C01439970100EDA7800210A40111CE0
:100E8000021C0A43DA703A687968124B180000F0C5
:100E900025F80300BB60BB68002B01D0BB680FE0E6
:100EA000094A7B6902339B00D3180433FA681A603D
:100EB000094B1B680122134001D1FFF749FE0023B3
:100EC0001800BD4607B090BD9801002038010020F1
:100ED00000300240A90C00081C00024080B58AB016
:100EE00000AFF860B9607A607B68FE2B02D90123FD
:100EF0005B424EE000237B623CE07B6A002B0FD01C
:100F00007B6A013BBA68D3181B78002B08D07B6A38
:100F1000013BBA68D2182323FB1812781A7019E023
:100F20007B6AFB6102E0FB690133FB61FA697B6864
:100F30009A4205D2BA68FB69D3181B78002BF2D10C
:100F4000FB69DAB27B6ADBB2D31ADAB22323FB186D
:100F500001321A702323FB181A78FB681000984797
:100F600003007B617B69002B01D07B6911E07B6A08
:100F700001337B627A6A7B689A42BED9FB680020A3
:100F800098470300BB61BB69002B01D0BB6900E03F
:100F900000231800BD460AB080BD80B588B000AF00
:100FA000F860B9607A603B60BA6880235B029A425D
:100FB00004D23A6880235B029A4202D301235B4247
:100FC00052E03B68002B02D101235B424CE0BA683F
:100FD0003B689A4202D201235B4245E00123FB6158
:100FE0007B681B78BB61BB69002B24D102235B4269
:100FF0003AE0BB69013BBB61BB69002B09D17A6850
:10100000FB69D3181B78BB611723FB1800221A70E9
:1010100006E07A68FB69D2181723FB1812781A7059
:10102000FB69013BFA68D3181722BA1812781A70B4
:10103000FB690133FB61FA693B689A4205D27A6821
:10104000FB69D3181B78002BD3D1FA693B689A420D
:1010500002D102235B4207E0BB69012B02D00323CC
:101060005B4201E0FB69013B1800BD4608B080BD52
:1010700080B582B000AF78607B6800221A607B6820
:1010800000225A60C046BD4602B080BD80B588B01F
:1010900000AFF860B9607A601A00FB1C1A70FB6838
:1010A0001B68002B0ED1FB1C1B78002B54D0FB1CA3
:1010B0001A78FB685A60FB681B685A1CFB681A6048
:1010C000002350E0FB1C1B78002B0DD1FB685B68F4
:1010D000012B39D1FB681B68013B7B61FB68180061
:1010E000FFF7C6FF7B693EE0FB685B685A1EFB6842
:1010F0005A60FB685B68002B08D1FB1C1A78FB6800
:101100005A601F23FB1800221A7004E01F23FB18EB
:10111000FA1C12781A70FB681B68013BBB61BA6944
:101120007B689A4202D302235B421CE0BA68BB6927
:10113000D3181F22BA1812781A70FB681B685A1C41
:10114000FB681A6000230EE0C046FB681800FFF73A
:101150008FFF01235B4206E0C046FB681800FFF7E3
:1011600087FF03235B421800BD4608B080BD641CA6
:101170000008000000209400002094000020B80324
:101180000020000080B500AF1A4B1A68194B0121EE
:101190000A431A60174B5A68164B17490A405A609F
:1011A000144B1A68134B15490A401A60114B1A6800
:1011B000104B13490A401A600E4B5A680D4B1149E7
:1011C0000A405A600B4BDA6A0A4B0F218A43DA62F3
:1011D000084B1A6B074B0C490A401A63054B5A6BB4
:1011E000044B01218A435A63024B00229A60C04695
:1011F000BD4680BD001002400CB8FF08FFFFF6FEA0
:10120000FFFFFBFFFFFFC0FFECFEFFFF80B584B0D8
:1012100000AF0023FB600023BB6000237B60002342
:101220003B60314B5B680C221340FB60FB68082B72
:1012300011D0FB68082B41D8FB68002B03D0FB685A
:10124000042B04D03AE0294B294A1A603AE0274B94
:10125000274A1A6036E0244B5A68F0239B03134058
:10126000BB60214B5A6880235B0213407B60BB68E4
:101270009B0C0233BB601C4BDB6A0F221340013313
:101280003B607A6880235B029A420AD13968184829
:1012900000F03EFB03001A00BB685A43134B1A6070
:1012A00010E0B9680A005201521A93019B1ADB0040
:1012B0005B181B021A000D4B1A6003E00B4B0C4A23
:1012C0001A60C046084B5B681B090F221340094A8D
:1012D000D35CFB60054B1A68FB68DA40034B1A606D
:1012E000C046BD4604B080BD001002400000002092
:1012F00000127A004C1C000880B500AF044B1A683D
:10130000034B8021C9020A431A60C046BD4680BD16
:101310000010024080B500AF044B1A68034B04492B
:101320000A401A60C046BD4680BDC046001002405B
:10133000FFFFFBFF80B500AF044B1A68034B802111
:1013400049020A431A60C046BD4680BD00100240F3
:1013500080B500AF064B1A6880239B021340054AF4
:10136000944663445A425341DBB21800BD4680BDE7
:10137000001002400000FEFF80B500AF044B1A6869
:10138000034B01210A431A60C046BD4680BDC046DA
:101390000010024080B500AF054B1B6802221340CD
:1013A000023B5A425341DBB21800BD4680BDC046E5
:1013B0000010024080B582B000AF7860064B5B68D9
:1013C000032293431900044B7A680A435A60C046CB
:1013D000BD4602B080BDC0460010024080B500AFDF
:1013E000034B5B680C2213401800BD4680BDC0460D
:1013F0000010024080B582B000AF7860064B5B6899
:10140000F02293431900044B7A680A435A60C0469D
:10141000BD4602B080BDC0460010024080B582B01B
:1014200000AF7860064B5B68064A13401900044B16
:101430007A680A435A60C046BD4602B080BDC046C5
:1014400000100240FFF8FFFF80B500AF044B1A68A0
:10145000034B802149040A431A60C046BD4680BD43
:101460000010024080B500AF074B1A6880239B0430
:101470001340FE221206944663445A425341DBB2A3
:101480001800BD4680BDC0460010024080B582B045
:1014900000AF786039600E4B5B680E4A134019004C
:1014A0007A6880235B021A403B681A43084B0A4360
:1014B0005A60074BDB6A0F22934319007B680F22A7
:1014C0001A40034B0A43DA62C046BD4602B080BDF3
:1014D00000100240FFFFC2FF80B582B000AF78600D
:1014E00039603968786800F013FA03001A00064B77
:1014F000013A5A60044B00229A60034B05221A609D
:10150000C046BD4602B080BD10E000E080B582B0AC
:1015100000AF7860064B1B68012293431900044B0F
:101520007A680A431A60C046BD4602B080BDC04614
:101530000020024080B500AF034B1B68012213401E
:101540001800BD4680BDC0460020024080B582B074
:1015500000AF7860FA239A007B6811001800FFF74B
:10156000BBFFC046BD4602B080BD80B584B000AFB1
:1015700078600E4B1B68FB60FB687B6801330CD006
:101580007B6801337B6008E0084B1A6880235B02AC
:10159000134002D07B68013B7B607B68002BF3D15A
:1015A000C046C046BD4604B080BDC04610E000E065
:1015B00080B582B000AF7860034B7A681A60C0468D
:1015C000BD4602B080BDC0460000002090B585B089
:1015D00000AF786039600F23FB1801221A700023D6
:1015E000BB6000F0D4F80300012B28D17B680122F6
:1015F0005A607B68174A1900100000F0ABF803002E
:10160000BB60FFF7C7FE0300012B07D0FFF7B4FE56
:10161000C046FFF7BFFE0300012BFAD17B681B68B1
:1016200019000020FFF732FF0F23FC183A68BB684F
:101630001100180000F0BEF80300237003E00F2330
:10164000FB1800221A700F23FB181B781800BD46E8
:1016500005B090BD00127A0090B587B000AFF86079
:10166000B9607A603B601723FB1801221A700023CF
:101670003B6100F08CF80300012B32D17A68FB68E3
:101680001100180000F066F803003B61FFF760FEF0
:101690000300012B0FD0BB68012B02D1FFF72CFEFA
:1016A00001E0FFF737FEFFF745FEC046FFF750FEAB
:1016B0000300012BFAD17B685B68802252021A4337
:1016C0007B681B6819001000FFF7E0FE1723FC1869
:1016D0003A683B691100180000F06CF803002370B1
:1016E00003E01723FB1800221A701723FB181B783E
:1016F0001800BD4607B090BD80B584B000AF7860DB
:101700000F217B1801221A700023BB607B68002B1D
:1017100003D17B1800221A7013E07B680C4A9342B5
:1017200001D90123BB60BB681800FFF7EFFEFFF78C
:1017300001FF0200BB68934203D00F23FB18002275
:101740001A700F23FB181B781800BD4604B080BD2B
:1017500000366E0180B584B000AF78603960002338
:10176000FB603B685B6801331900786800F0D0F8D3
:10177000030019003B681B689B0C0F2213400233C7
:101780004B43FB60FB681800BD4604B080BD80B5CC
:1017900082B000AFFB1D01221A70FFF763FE031E2B
:1017A00002D0FB1D00221A70FB1D1B781800BD46DD
:1017B00002B080BD90B585B000AF786039600F2071
:1017C0003B1801221A700023BB602E4B1A683B683D
:1017D0001B681B090F210B402B49CB5C9A4013005F
:1017E000BB60BA687B689A4206D23C187B681800D6
:1017F000FFF782FF030023700F23FB181B78012BD8
:101800001AD1FFF721FEC046FFF72CFE0300012B83
:10181000FAD13B681B681800FFF7ECFD0220FFF7C8
:10182000C9FDC046FFF7DAFD0300082BFAD13B687B
:101830005B681800FFF7F2FDBA687B689A4207D927
:101840000F23FC187B681800FFF756FF0300237076
:101850000F23FB181B78012B0CD13B681B681B095D
:101860000F221340084AD35C1A007B68D34018004B
:10187000FFF79EFE0F23FB181B781800BD4605B02E
:1018800090BDC046000000204C1C000880B500AF91
:10189000C046BD4680BD80B586B000AFF860B96077
:1018A0007A60FA687B68D3183B61FB687B6106E06D
:1018B000BB68DAB27B691A707B6901337B617A6934
:1018C0003B699A42F4D3FB681800BD4606B080BD60
:1018D00080B584B000AF78607B68FB60C0467B68F1
:1018E0005A1C7A601B78002BF9D17A68FB68D31AEE
:1018F000013B1800BD4604B080BD80B582B000AF8A
:101900000200FB1D1A70C046BD4602B080BD00003B
:10191000002243088B4274D303098B425FD3030A2E
:101920008B4244D3030B8B4228D3030C8B420DD341
:10193000FF22090212BA030C8B4202D312120902CF
:1019400065D0030B8B4219D300E0090AC30B8B420D
:1019500001D3CB03C01A5241830B8B4201D38B03BB
:10196000C01A5241430B8B4201D34B03C01A524160
:10197000030B8B4201D30B03C01A5241C30A8B42A3
:1019800001D3CB02C01A5241830A8B4201D38B028E
:10199000C01A5241430A8B4201D34B02C01A524132
:1019A000030A8B4201D30B02C01A5241CDD2C309A4
:1019B0008B4201D3CB01C01A524183098B4201D320
:1019C0008B01C01A524143098B4201D34B01C01A0B
:1019D000524103098B4201D30B01C01A5241C30883
:1019E0008B4201D3CB00C01A524183088B4201D3F2
:1019F0008B00C01A524143088B4201D34B00C01ADE
:101A00005241411A00D20146524110467047FFE749
:101A100001B5002000F0F0F802BDC0460029F7D063
:101A200076E7704703460B437FD4002243088B427E
:101A300074D303098B425FD3030A8B4244D3030B55
:101A40008B4228D3030C8B420DD3FF22090212BA1A
:101A5000030C8B4202D31212090265D0030B8B4296
:101A600019D300E0090AC30B8B4201D3CB03C01A80
:101A70005241830B8B4201D38B03C01A5241430B5B
:101A80008B4201D34B03C01A5241030B8B4201D34B
:101A90000B03C01A5241C30A8B4201D3CB02C01AB6
:101AA0005241830A8B4201D38B02C01A5241430A2E
:101AB0008B4201D34B02C01A5241030A8B4201D31D
:101AC0000B02C01A5241CDD2C3098B4201D3CB01C4
:101AD000C01A524183098B4201D38B01C01A524173
:101AE00043098B4201D34B01C01A524103098B4277
:101AF00001D30B01C01A5241C3088B4201D3CB0062
:101B0000C01A524183088B4201D38B00C01A524144
:101B100043088B4201D34B00C01A5241411A00D2F4
:101B200001465241104670475DE0CA0F00D049425D
:101B3000031000D34042534000229C4603098B42CD
:101B40002DD3030A8B4212D3FC22890112BA030A55
:101B50008B420CD3890192118B4208D389019211D7
:101B60008B4204D389013AD0921100E08909C3095C
:101B70008B4201D3CB01C01A524183098B4201D35E
:101B80008B01C01A524143098B4201D34B01C01A49
:101B9000524103098B4201D30B01C01A5241C308C1
:101BA0008B4201D3CB00C01A524183088B4201D330
:101BB0008B00C01A5241D9D243088B4201D34B004B
:101BC000C01A5241411A00D20146634652415B108D
:101BD000104601D34042002B00D54942704763466E
:101BE0005B1000D3404201B5002000F005F802BDB3
:101BF0000029F8D016E770477047C0460C48854664
:101C0000002103E00B4B5B58435004310A480B4B57
:101C100042189A42F6D30A4A02E0002313600432C3
:101C2000084B9A42F9D3FFF7ADFAFEF7F6FAFEE752
:101C300000100020641C0008000000209400002018
:101C400094000020B8030020FEE700000000000020
:101C5000000000000102030406070809000000005C
:041C60000102030476
:101C640000127A00000400400020004000280040D8
:101C7400002C004000300040005400400070004040
:101C840000000140000401400024014008270140F5
:101C940008270140002C0140003001400038014079
:101CA4000044014000480140005801400000024047
:101CB400080002401C000240300002404400024080
:101CC400580002400020024000F8FF1F00100240AC
:101CD40000300240000000480004004800080048AA
:101CE400000C00480014004800ED00E010E000E0A3
:041CF40000E100E02B
:0400000508001BFDD7
:00000001FF

File diff suppressed because it is too large Load diff

View file

@ -1,18 +1,17 @@
Archive member included to satisfy reference by file (symbol)
/usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
/tmp/ccxtvPlT.o (__aeabi_uidiv)
/tmp/ccy8OCeb.o (__aeabi_uidiv)
/usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
/tmp/ccrrpgrR.o (__aeabi_idiv)
/tmp/cc6Un0Q5.o (__aeabi_idiv)
/usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
/usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o) (__aeabi_idiv0)
Allocating common symbols
Common symbol size file
usart_tx_buf 0x40c /tmp/ccXNIrIP.o
leds 0x20 /tmp/ccxtvPlT.o
adc_buf 0x40 /tmp/ccrrpgrR.o
usart_tx_buf 0x220 /tmp/ccRRCPG0.o
leds 0x20 /tmp/ccy8OCeb.o
Memory Configuration
@ -25,29 +24,29 @@ RAM 0x0000000020000000 0x0000000000001000 xrw
Linker script and memory map
LOAD /home/user/resource/STM32CubeF0/Drivers/CMSIS/Lib/GCC/libarm_cortexM0l_math.a
LOAD /tmp/ccxtvPlT.o
LOAD /tmp/ccrrpgrR.o
LOAD /tmp/ccXNIrIP.o
LOAD /tmp/ccy0xC7N.o
LOAD /tmp/ccr2qryM.o
LOAD /tmp/ccJ50X5K.o
LOAD /tmp/ccFUXyQJ.o
LOAD /tmp/cc8rJnLI.o
LOAD /tmp/ccDd2fMH.o
LOAD /tmp/ccy8OCeb.o
LOAD /tmp/cc6Un0Q5.o
LOAD /tmp/ccRRCPG0.o
LOAD /tmp/ccWI4kHV.o
LOAD /tmp/ccjaIjJQ.o
LOAD /tmp/cceYjaVL.o
LOAD /tmp/ccsXJViH.o
LOAD /tmp/ccGz0VMC.o
LOAD /tmp/ccy5lZmy.o
LOAD /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a
0x0000000020001000 _estack = 0x20001000
.isr_vector 0x0000000008000000 0xc0
0x0000000008000000 . = ALIGN (0x4)
*(.isr_vector)
.isr_vector 0x0000000008000000 0xc0 /tmp/ccr2qryM.o
.isr_vector 0x0000000008000000 0xc0 /tmp/ccjaIjJQ.o
0x0000000008000000 g_pfnVectors
0x00000000080000c0 . = ALIGN (0x4)
.text 0x00000000080000c0 0x18fc
.text 0x00000000080000c0 0x1ba4
0x00000000080000c0 . = ALIGN (0x4)
*(.text)
.text 0x00000000080000c0 0x428 /tmp/ccxtvPlT.o
.text 0x00000000080000c0 0x428 /tmp/ccy8OCeb.o
0x0000000008000210 update_leds
0x000000000800021a main
0x000000000800039c SPI1_IRQHandler
@ -57,119 +56,118 @@ LOAD /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a
0x0000000008000494 SVC_Handler
0x00000000080004a0 PendSV_Handler
0x00000000080004ac SysTick_Handler
.text 0x00000000080004e8 0x2e4 /tmp/ccrrpgrR.o
.text 0x00000000080004e8 0x334 /tmp/cc6Un0Q5.o
0x00000000080005f0 adc_configure_scope_mode
0x0000000008000762 DMA1_Channel1_IRQHandler
.text 0x00000000080007cc 0x3a4 /tmp/ccXNIrIP.o
0x0000000008000904 usart_dma_init
0x00000000080009f8 usart_dma_fifo_push
0x0000000008000a50 usart_putc
0x0000000008000a80 usart_putc_nonblocking
0x0000000008000aa8 DMA1_Channel2_3_IRQHandler
0x0000000008000ae8 usart_send_packet
0x0000000008000b1c usart_send_packet_nonblocking
.text 0x0000000008000b70 0x358 /tmp/ccy0xC7N.o
0x0000000008000b70 cobs_encode
0x0000000008000c36 cobs_encode_usart
0x0000000008000cf4 cobs_decode
0x0000000008000dca cobs_decode_incremental_initialize
0x0000000008000de6 cobs_decode_incremental
.text 0x0000000008000ec8 0x14 /tmp/ccr2qryM.o
.text 0x0000000008000edc 0x174 /tmp/ccJ50X5K.o
0x0000000008000edc SystemInit
0x0000000008000f64 SystemCoreClockUpdate
.text 0x0000000008001050 0x594 /tmp/ccFUXyQJ.o
0x00000000080012a4 LL_Init1msTick
0x00000000080012c2 LL_mDelay
0x0000000008001308 LL_SetSystemCoreClock
0x0000000008001324 LL_PLL_ConfigSystemClock_HSI
0x00000000080013b0 LL_PLL_ConfigSystemClock_HSE
.text 0x00000000080015e4 0x82 /tmp/cc8rJnLI.o
0x00000000080015e4 __sinit
0x00000000080015ee memset
0x0000000008001628 strlen
0x0000000008001652 __assert_func
.text 0x0000000008001666 0x0 /tmp/ccDd2fMH.o
*fill* 0x0000000008001666 0x2
.text 0x0000000008001668 0x114 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
0x0000000008001668 __udivsi3
0x0000000008001668 __aeabi_uidiv
0x0000000008001774 __aeabi_uidivmod
.text 0x000000000800177c 0x1d4 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
0x000000000800177c __aeabi_idiv
0x000000000800177c __divsi3
0x0000000008001948 __aeabi_idivmod
.text 0x0000000008001950 0x4 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
0x0000000008001950 __aeabi_ldiv0
0x0000000008001950 __aeabi_idiv0
0x000000000800079a DMA1_Channel1_IRQHandler
.text 0x000000000800081c 0x6c0 /tmp/ccRRCPG0.o
0x0000000008000954 usart_dma_init
0x0000000008000a28 USART1_IRQHandler
0x0000000008000bc4 usart_ack_packet
0x0000000008000c00 usart_dma_fifo_push
0x0000000008000c78 usart_putc
0x0000000008000cd0 DMA1_Channel2_3_IRQHandler
0x0000000008000dbc usart_send_packet_nonblocking
.text 0x0000000008000edc 0x292 /tmp/ccWI4kHV.o
0x0000000008000edc cobs_encode_usart
0x0000000008000f9a cobs_decode
0x0000000008001070 cobs_decode_incremental_initialize
0x000000000800108c cobs_decode_incremental
.text 0x000000000800116e 0x14 /tmp/ccjaIjJQ.o
*fill* 0x0000000008001182 0x2
.text 0x0000000008001184 0x174 /tmp/cceYjaVL.o
0x0000000008001184 SystemInit
0x000000000800120c SystemCoreClockUpdate
.text 0x00000000080012f8 0x594 /tmp/ccsXJViH.o
0x000000000800154c LL_Init1msTick
0x000000000800156a LL_mDelay
0x00000000080015b0 LL_SetSystemCoreClock
0x00000000080015cc LL_PLL_ConfigSystemClock_HSI
0x0000000008001658 LL_PLL_ConfigSystemClock_HSE
.text 0x000000000800188c 0x82 /tmp/ccGz0VMC.o
0x000000000800188c __sinit
0x0000000008001896 memset
0x00000000080018d0 strlen
0x00000000080018fa __assert_func
.text 0x000000000800190e 0x0 /tmp/ccy5lZmy.o
*fill* 0x000000000800190e 0x2
.text 0x0000000008001910 0x114 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
0x0000000008001910 __udivsi3
0x0000000008001910 __aeabi_uidiv
0x0000000008001a1c __aeabi_uidivmod
.text 0x0000000008001a24 0x1d4 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
0x0000000008001a24 __aeabi_idiv
0x0000000008001a24 __divsi3
0x0000000008001bf0 __aeabi_idivmod
.text 0x0000000008001bf8 0x4 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
0x0000000008001bf8 __aeabi_ldiv0
0x0000000008001bf8 __aeabi_idiv0
*(.text.*)
.text.Reset_Handler
0x0000000008001954 0x4c /tmp/ccr2qryM.o
0x0000000008001954 Reset_Handler
0x0000000008001bfc 0x4c /tmp/ccjaIjJQ.o
0x0000000008001bfc Reset_Handler
.text.Default_Handler
0x00000000080019a0 0x2 /tmp/ccr2qryM.o
0x00000000080019a0 TIM1_CC_IRQHandler
0x00000000080019a0 I2C1_IRQHandler
0x00000000080019a0 EXTI2_3_IRQHandler
0x00000000080019a0 ADC1_IRQHandler
0x00000000080019a0 TIM17_IRQHandler
0x00000000080019a0 RTC_IRQHandler
0x00000000080019a0 TIM3_IRQHandler
0x00000000080019a0 EXTI4_15_IRQHandler
0x00000000080019a0 RCC_IRQHandler
0x00000000080019a0 Default_Handler
0x00000000080019a0 TIM14_IRQHandler
0x00000000080019a0 DMA1_Channel4_5_IRQHandler
0x00000000080019a0 EXTI0_1_IRQHandler
0x00000000080019a0 WWDG_IRQHandler
0x00000000080019a0 FLASH_IRQHandler
0x00000000080019a0 USART1_IRQHandler
0x00000000080019a0 TIM1_BRK_UP_TRG_COM_IRQHandler
0x0000000008001c48 0x2 /tmp/ccjaIjJQ.o
0x0000000008001c48 TIM1_CC_IRQHandler
0x0000000008001c48 I2C1_IRQHandler
0x0000000008001c48 EXTI2_3_IRQHandler
0x0000000008001c48 ADC1_IRQHandler
0x0000000008001c48 TIM17_IRQHandler
0x0000000008001c48 RTC_IRQHandler
0x0000000008001c48 TIM3_IRQHandler
0x0000000008001c48 EXTI4_15_IRQHandler
0x0000000008001c48 RCC_IRQHandler
0x0000000008001c48 Default_Handler
0x0000000008001c48 TIM14_IRQHandler
0x0000000008001c48 DMA1_Channel4_5_IRQHandler
0x0000000008001c48 EXTI0_1_IRQHandler
0x0000000008001c48 WWDG_IRQHandler
0x0000000008001c48 FLASH_IRQHandler
0x0000000008001c48 TIM1_BRK_UP_TRG_COM_IRQHandler
*(.rodata)
*fill* 0x00000000080019a2 0x2
.rodata 0x00000000080019a4 0x18 /tmp/ccJ50X5K.o
0x00000000080019a4 AHBPrescTable
0x00000000080019b4 APBPrescTable
*fill* 0x0000000008001c4a 0x2
.rodata 0x0000000008001c4c 0x18 /tmp/cceYjaVL.o
0x0000000008001c4c AHBPrescTable
0x0000000008001c5c APBPrescTable
*(.rodata*)
*(.glue_7)
.glue_7 0x00000000080019bc 0x0 linker stubs
.glue_7 0x0000000008001c64 0x0 linker stubs
*(.glue_7t)
.glue_7t 0x00000000080019bc 0x0 linker stubs
.glue_7t 0x0000000008001c64 0x0 linker stubs
*(.source_tarball)
*(.init)
*(.fini)
*(.source_tarball)
0x00000000080019bc . = ALIGN (0x4)
0x00000000080019bc _etext = .
0x00000000080019bc _sidata = _etext
0x0000000008001c64 . = ALIGN (0x4)
0x0000000008001c64 _etext = .
0x0000000008001c64 _sidata = _etext
.vfp11_veneer 0x00000000080019bc 0x0
.vfp11_veneer 0x00000000080019bc 0x0 linker stubs
.vfp11_veneer 0x0000000008001c64 0x0
.vfp11_veneer 0x0000000008001c64 0x0 linker stubs
.v4_bx 0x00000000080019bc 0x0
.v4_bx 0x00000000080019bc 0x0 linker stubs
.v4_bx 0x0000000008001c64 0x0
.v4_bx 0x0000000008001c64 0x0 linker stubs
.iplt 0x00000000080019bc 0x0
.iplt 0x00000000080019bc 0x0 /tmp/ccxtvPlT.o
.iplt 0x0000000008001c64 0x0
.iplt 0x0000000008001c64 0x0 /tmp/ccy8OCeb.o
.rel.dyn 0x00000000080019bc 0x0
.rel.iplt 0x00000000080019bc 0x0 /tmp/ccxtvPlT.o
.rel.dyn 0x0000000008001c64 0x0
.rel.iplt 0x0000000008001c64 0x0 /tmp/ccy8OCeb.o
.data 0x0000000020000000 0x94 load address 0x00000000080019bc
.data 0x0000000020000000 0x94 load address 0x0000000008001c64
0x0000000020000000 . = ALIGN (0x4)
0x0000000020000000 _sdata = .
0x0000000020000000 _data = .
*(.data)
.data 0x0000000020000000 0x0 /tmp/ccxtvPlT.o
.data 0x0000000020000000 0x0 /tmp/ccrrpgrR.o
.data 0x0000000020000000 0x0 /tmp/ccXNIrIP.o
.data 0x0000000020000000 0x0 /tmp/ccy0xC7N.o
.data 0x0000000020000000 0x0 /tmp/ccr2qryM.o
.data 0x0000000020000000 0x4 /tmp/ccJ50X5K.o
.data 0x0000000020000000 0x0 /tmp/ccy8OCeb.o
.data 0x0000000020000000 0x0 /tmp/cc6Un0Q5.o
.data 0x0000000020000000 0x0 /tmp/ccRRCPG0.o
.data 0x0000000020000000 0x0 /tmp/ccWI4kHV.o
.data 0x0000000020000000 0x0 /tmp/ccjaIjJQ.o
.data 0x0000000020000000 0x4 /tmp/cceYjaVL.o
0x0000000020000000 SystemCoreClock
.data 0x0000000020000004 0x0 /tmp/ccFUXyQJ.o
.data 0x0000000020000004 0x0 /tmp/cc8rJnLI.o
.data 0x0000000020000004 0x90 /tmp/ccDd2fMH.o
.data 0x0000000020000004 0x0 /tmp/ccsXJViH.o
.data 0x0000000020000004 0x0 /tmp/ccGz0VMC.o
.data 0x0000000020000004 0x90 /tmp/ccy5lZmy.o
0x0000000020000004 tim3
0x0000000020000008 tim14
0x000000002000000c rtc
@ -214,45 +212,41 @@ LOAD /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a
0x0000000020000094 . = ALIGN (0x4)
0x0000000020000094 _edata = .
.igot.plt 0x0000000020000094 0x0 load address 0x0000000008001a50
.igot.plt 0x0000000020000094 0x0 /tmp/ccxtvPlT.o
.igot.plt 0x0000000020000094 0x0 load address 0x0000000008001cf8
.igot.plt 0x0000000020000094 0x0 /tmp/ccy8OCeb.o
.bss 0x0000000020000094 0x488 load address 0x0000000008001a50
.bss 0x0000000020000094 0x324 load address 0x0000000008001cf8
0x0000000020000094 . = ALIGN (0x4)
0x0000000020000094 _sbss = .
0x0000000020000094 _bss = .
*(.bss)
.bss 0x0000000020000094 0xc /tmp/ccxtvPlT.o
.bss 0x0000000020000094 0xc /tmp/ccy8OCeb.o
0x0000000020000094 sys_time_seconds
.bss 0x00000000200000a0 0x4 /tmp/ccrrpgrR.o
0x00000000200000a0 usart_overruns
.bss 0x00000000200000a4 0x1 /tmp/ccXNIrIP.o
.bss 0x00000000200000a5 0x0 /tmp/ccy0xC7N.o
.bss 0x00000000200000a5 0x0 /tmp/ccr2qryM.o
.bss 0x00000000200000a5 0x0 /tmp/ccJ50X5K.o
.bss 0x00000000200000a5 0x0 /tmp/ccFUXyQJ.o
*fill* 0x00000000200000a5 0x3
.bss 0x00000000200000a8 0x8 /tmp/cc8rJnLI.o
0x00000000200000a8 __errno
0x00000000200000ac _impure_ptr
.bss 0x00000000200000b0 0x0 /tmp/ccDd2fMH.o
.bss 0x00000000200000b0 0x0 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.bss 0x00000000200000b0 0x0 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.bss 0x00000000200000b0 0x0 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.bss 0x00000000200000a0 0x98 /tmp/cc6Un0Q5.o
.bss 0x0000000020000138 0x38 /tmp/ccRRCPG0.o
.bss 0x0000000020000170 0x0 /tmp/ccWI4kHV.o
.bss 0x0000000020000170 0x0 /tmp/ccjaIjJQ.o
.bss 0x0000000020000170 0x0 /tmp/cceYjaVL.o
.bss 0x0000000020000170 0x0 /tmp/ccsXJViH.o
.bss 0x0000000020000170 0x8 /tmp/ccGz0VMC.o
0x0000000020000170 __errno
0x0000000020000174 _impure_ptr
.bss 0x0000000020000178 0x0 /tmp/ccy5lZmy.o
.bss 0x0000000020000178 0x0 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.bss 0x0000000020000178 0x0 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.bss 0x0000000020000178 0x0 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
*(.bss.*)
*(COMMON)
COMMON 0x00000000200000b0 0x20 /tmp/ccxtvPlT.o
0x00000000200000b0 leds
COMMON 0x00000000200000d0 0x40 /tmp/ccrrpgrR.o
0x00000000200000d0 adc_buf
COMMON 0x0000000020000110 0x40c /tmp/ccXNIrIP.o
0x0000000020000110 usart_tx_buf
0x000000002000051c . = ALIGN (0x4)
0x000000002000051c _ebss = .
COMMON 0x0000000020000178 0x20 /tmp/ccy8OCeb.o
0x0000000020000178 leds
COMMON 0x0000000020000198 0x220 /tmp/ccRRCPG0.o
0x0000000020000198 usart_tx_buf
0x00000000200003b8 . = ALIGN (0x4)
0x00000000200003b8 _ebss = .
[!provide] PROVIDE (end = _ebss)
[!provide] PROVIDE (_end = _ebss)
0x000000002000051c __exidx_start = .
0x000000002000051c __exidx_end = .
0x00000000200003b8 __exidx_start = .
0x00000000200003b8 __exidx_end = .
.stab
*(.stab)
@ -274,36 +268,36 @@ LOAD /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a
.comment 0x0000000000000000 0x21
*(.comment)
.comment 0x0000000000000000 0x21 /tmp/ccxtvPlT.o
.comment 0x0000000000000000 0x21 /tmp/ccy8OCeb.o
0x22 (size before relaxing)
.comment 0x0000000000000021 0x22 /tmp/ccrrpgrR.o
.comment 0x0000000000000021 0x22 /tmp/ccXNIrIP.o
.comment 0x0000000000000021 0x22 /tmp/ccy0xC7N.o
.comment 0x0000000000000021 0x22 /tmp/ccJ50X5K.o
.comment 0x0000000000000021 0x22 /tmp/ccFUXyQJ.o
.comment 0x0000000000000021 0x22 /tmp/cc8rJnLI.o
.comment 0x0000000000000021 0x22 /tmp/ccDd2fMH.o
.comment 0x0000000000000021 0x22 /tmp/cc6Un0Q5.o
.comment 0x0000000000000021 0x22 /tmp/ccRRCPG0.o
.comment 0x0000000000000021 0x22 /tmp/ccWI4kHV.o
.comment 0x0000000000000021 0x22 /tmp/cceYjaVL.o
.comment 0x0000000000000021 0x22 /tmp/ccsXJViH.o
.comment 0x0000000000000021 0x22 /tmp/ccGz0VMC.o
.comment 0x0000000000000021 0x22 /tmp/ccy5lZmy.o
.ARM.attributes
0x0000000000000000 0x2f
.ARM.attributes
0x0000000000000000 0x2b /tmp/ccxtvPlT.o
0x0000000000000000 0x2b /tmp/ccy8OCeb.o
.ARM.attributes
0x000000000000002b 0x2b /tmp/ccrrpgrR.o
0x000000000000002b 0x2b /tmp/cc6Un0Q5.o
.ARM.attributes
0x0000000000000056 0x2b /tmp/ccXNIrIP.o
0x0000000000000056 0x2b /tmp/ccRRCPG0.o
.ARM.attributes
0x0000000000000081 0x2b /tmp/ccy0xC7N.o
0x0000000000000081 0x2b /tmp/ccWI4kHV.o
.ARM.attributes
0x00000000000000ac 0x21 /tmp/ccr2qryM.o
0x00000000000000ac 0x21 /tmp/ccjaIjJQ.o
.ARM.attributes
0x00000000000000cd 0x2b /tmp/ccJ50X5K.o
0x00000000000000cd 0x2b /tmp/cceYjaVL.o
.ARM.attributes
0x00000000000000f8 0x2b /tmp/ccFUXyQJ.o
0x00000000000000f8 0x2b /tmp/ccsXJViH.o
.ARM.attributes
0x0000000000000123 0x2b /tmp/cc8rJnLI.o
0x0000000000000123 0x2b /tmp/ccGz0VMC.o
.ARM.attributes
0x000000000000014e 0x31 /tmp/ccDd2fMH.o
0x000000000000014e 0x31 /tmp/ccy5lZmy.o
.ARM.attributes
0x000000000000017f 0x1e /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.ARM.attributes
@ -326,23 +320,23 @@ LOAD /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a
.debug_aranges 0x0000000000000000 0x180
*(.debug_aranges)
.debug_aranges
0x0000000000000000 0x20 /tmp/ccxtvPlT.o
0x0000000000000000 0x20 /tmp/ccy8OCeb.o
.debug_aranges
0x0000000000000020 0x20 /tmp/ccrrpgrR.o
0x0000000000000020 0x20 /tmp/cc6Un0Q5.o
.debug_aranges
0x0000000000000040 0x20 /tmp/ccXNIrIP.o
0x0000000000000040 0x20 /tmp/ccRRCPG0.o
.debug_aranges
0x0000000000000060 0x20 /tmp/ccy0xC7N.o
0x0000000000000060 0x20 /tmp/ccWI4kHV.o
.debug_aranges
0x0000000000000080 0x28 /tmp/ccr2qryM.o
0x0000000000000080 0x28 /tmp/ccjaIjJQ.o
.debug_aranges
0x00000000000000a8 0x20 /tmp/ccJ50X5K.o
0x00000000000000a8 0x20 /tmp/cceYjaVL.o
.debug_aranges
0x00000000000000c8 0x20 /tmp/ccFUXyQJ.o
0x00000000000000c8 0x20 /tmp/ccsXJViH.o
.debug_aranges
0x00000000000000e8 0x20 /tmp/cc8rJnLI.o
0x00000000000000e8 0x20 /tmp/ccGz0VMC.o
.debug_aranges
0x0000000000000108 0x18 /tmp/ccDd2fMH.o
0x0000000000000108 0x18 /tmp/ccy5lZmy.o
.debug_aranges
0x0000000000000120 0x20 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_aranges
@ -353,87 +347,87 @@ LOAD /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a
.debug_pubnames
*(.debug_pubnames)
.debug_info 0x0000000000000000 0x5eaf
.debug_info 0x0000000000000000 0x62e5
*(.debug_info .gnu.linkonce.wi.*)
.debug_info 0x0000000000000000 0x12f8 /tmp/ccxtvPlT.o
.debug_info 0x00000000000012f8 0x1129 /tmp/ccrrpgrR.o
.debug_info 0x0000000000002421 0x10a6 /tmp/ccXNIrIP.o
.debug_info 0x00000000000034c7 0xcf2 /tmp/ccy0xC7N.o
.debug_info 0x00000000000041b9 0x22 /tmp/ccr2qryM.o
.debug_info 0x00000000000041db 0x263 /tmp/ccJ50X5K.o
.debug_info 0x000000000000443e 0x795 /tmp/ccFUXyQJ.o
.debug_info 0x0000000000004bd3 0x1e9 /tmp/cc8rJnLI.o
.debug_info 0x0000000000004dbc 0x1081 /tmp/ccDd2fMH.o
.debug_info 0x0000000000005e3d 0x26 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_info 0x0000000000005e63 0x26 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_info 0x0000000000005e89 0x26 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.debug_info 0x0000000000000000 0x132d /tmp/ccy8OCeb.o
.debug_info 0x000000000000132d 0x11f5 /tmp/cc6Un0Q5.o
.debug_info 0x0000000000002522 0x13c6 /tmp/ccRRCPG0.o
.debug_info 0x00000000000038e8 0xd07 /tmp/ccWI4kHV.o
.debug_info 0x00000000000045ef 0x22 /tmp/ccjaIjJQ.o
.debug_info 0x0000000000004611 0x263 /tmp/cceYjaVL.o
.debug_info 0x0000000000004874 0x795 /tmp/ccsXJViH.o
.debug_info 0x0000000000005009 0x1e9 /tmp/ccGz0VMC.o
.debug_info 0x00000000000051f2 0x1081 /tmp/ccy5lZmy.o
.debug_info 0x0000000000006273 0x26 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_info 0x0000000000006299 0x26 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_info 0x00000000000062bf 0x26 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.debug_abbrev 0x0000000000000000 0x1221
.debug_abbrev 0x0000000000000000 0x12ad
*(.debug_abbrev)
.debug_abbrev 0x0000000000000000 0x355 /tmp/ccxtvPlT.o
.debug_abbrev 0x0000000000000355 0x322 /tmp/ccrrpgrR.o
.debug_abbrev 0x0000000000000677 0x32d /tmp/ccXNIrIP.o
.debug_abbrev 0x00000000000009a4 0x290 /tmp/ccy0xC7N.o
.debug_abbrev 0x0000000000000c34 0x12 /tmp/ccr2qryM.o
.debug_abbrev 0x0000000000000c46 0x113 /tmp/ccJ50X5K.o
.debug_abbrev 0x0000000000000d59 0x23c /tmp/ccFUXyQJ.o
.debug_abbrev 0x0000000000000f95 0x117 /tmp/cc8rJnLI.o
.debug_abbrev 0x00000000000010ac 0x139 /tmp/ccDd2fMH.o
.debug_abbrev 0x00000000000011e5 0x14 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_abbrev 0x00000000000011f9 0x14 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_abbrev 0x000000000000120d 0x14 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.debug_abbrev 0x0000000000000000 0x34c /tmp/ccy8OCeb.o
.debug_abbrev 0x000000000000034c 0x314 /tmp/cc6Un0Q5.o
.debug_abbrev 0x0000000000000660 0x3ec /tmp/ccRRCPG0.o
.debug_abbrev 0x0000000000000a4c 0x274 /tmp/ccWI4kHV.o
.debug_abbrev 0x0000000000000cc0 0x12 /tmp/ccjaIjJQ.o
.debug_abbrev 0x0000000000000cd2 0x113 /tmp/cceYjaVL.o
.debug_abbrev 0x0000000000000de5 0x23c /tmp/ccsXJViH.o
.debug_abbrev 0x0000000000001021 0x117 /tmp/ccGz0VMC.o
.debug_abbrev 0x0000000000001138 0x139 /tmp/ccy5lZmy.o
.debug_abbrev 0x0000000000001271 0x14 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_abbrev 0x0000000000001285 0x14 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_abbrev 0x0000000000001299 0x14 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.debug_line 0x0000000000000000 0x1806
.debug_line 0x0000000000000000 0x198f
*(.debug_line)
.debug_line 0x0000000000000000 0x3cb /tmp/ccxtvPlT.o
.debug_line 0x00000000000003cb 0x363 /tmp/ccrrpgrR.o
.debug_line 0x000000000000072e 0x3b2 /tmp/ccXNIrIP.o
.debug_line 0x0000000000000ae0 0x305 /tmp/ccy0xC7N.o
.debug_line 0x0000000000000de5 0x77 /tmp/ccr2qryM.o
.debug_line 0x0000000000000e5c 0x1ab /tmp/ccJ50X5K.o
.debug_line 0x0000000000001007 0x466 /tmp/ccFUXyQJ.o
.debug_line 0x000000000000146d 0xf4 /tmp/cc8rJnLI.o
.debug_line 0x0000000000001561 0x148 /tmp/ccDd2fMH.o
.debug_line 0x00000000000016a9 0x76 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_line 0x000000000000171f 0x7d /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_line 0x000000000000179c 0x6a /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.debug_line 0x0000000000000000 0x3d6 /tmp/ccy8OCeb.o
.debug_line 0x00000000000003d6 0x37f /tmp/cc6Un0Q5.o
.debug_line 0x0000000000000755 0x51f /tmp/ccRRCPG0.o
.debug_line 0x0000000000000c74 0x2fa /tmp/ccWI4kHV.o
.debug_line 0x0000000000000f6e 0x77 /tmp/ccjaIjJQ.o
.debug_line 0x0000000000000fe5 0x1ab /tmp/cceYjaVL.o
.debug_line 0x0000000000001190 0x466 /tmp/ccsXJViH.o
.debug_line 0x00000000000015f6 0xf4 /tmp/ccGz0VMC.o
.debug_line 0x00000000000016ea 0x148 /tmp/ccy5lZmy.o
.debug_line 0x0000000000001832 0x76 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_line 0x00000000000018a8 0x7d /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_line 0x0000000000001925 0x6a /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.debug_frame 0x0000000000000000 0x888
.debug_frame 0x0000000000000000 0x8c4
*(.debug_frame)
.debug_frame 0x0000000000000000 0x164 /tmp/ccxtvPlT.o
.debug_frame 0x0000000000000164 0xec /tmp/ccrrpgrR.o
.debug_frame 0x0000000000000250 0x168 /tmp/ccXNIrIP.o
.debug_frame 0x00000000000003b8 0xb0 /tmp/ccy0xC7N.o
.debug_frame 0x0000000000000468 0x4c /tmp/ccJ50X5K.o
.debug_frame 0x00000000000004b4 0x308 /tmp/ccFUXyQJ.o
.debug_frame 0x00000000000007bc 0x8c /tmp/cc8rJnLI.o
.debug_frame 0x0000000000000848 0x20 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_frame 0x0000000000000868 0x20 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_frame 0x0000000000000000 0x164 /tmp/ccy8OCeb.o
.debug_frame 0x0000000000000164 0x104 /tmp/cc6Un0Q5.o
.debug_frame 0x0000000000000268 0x1ac /tmp/ccRRCPG0.o
.debug_frame 0x0000000000000414 0x90 /tmp/ccWI4kHV.o
.debug_frame 0x00000000000004a4 0x4c /tmp/cceYjaVL.o
.debug_frame 0x00000000000004f0 0x308 /tmp/ccsXJViH.o
.debug_frame 0x00000000000007f8 0x8c /tmp/ccGz0VMC.o
.debug_frame 0x0000000000000884 0x20 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_frame 0x00000000000008a4 0x20 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_str 0x0000000000000000 0x12fd
.debug_str 0x0000000000000000 0x1404
*(.debug_str)
.debug_str 0x0000000000000000 0x952 /tmp/ccxtvPlT.o
0x9f5 (size before relaxing)
.debug_str 0x0000000000000952 0x101 /tmp/ccrrpgrR.o
0x95f (size before relaxing)
.debug_str 0x0000000000000a53 0xdc /tmp/ccXNIrIP.o
0x939 (size before relaxing)
.debug_str 0x0000000000000b2f 0xa9 /tmp/ccy0xC7N.o
0x65f (size before relaxing)
.debug_str 0x0000000000000bd8 0x22 /tmp/ccr2qryM.o
.debug_str 0x0000000000000000 0x968 /tmp/ccy8OCeb.o
0xa13 (size before relaxing)
.debug_str 0x0000000000000968 0x125 /tmp/cc6Un0Q5.o
0x9a9 (size before relaxing)
.debug_str 0x0000000000000a8d 0x1e1 /tmp/ccRRCPG0.o
0xa79 (size before relaxing)
.debug_str 0x0000000000000c6e 0x82 /tmp/ccWI4kHV.o
0x6ba (size before relaxing)
.debug_str 0x0000000000000cf0 0x22 /tmp/ccjaIjJQ.o
0x57 (size before relaxing)
.debug_str 0x0000000000000bfa 0x53 /tmp/ccJ50X5K.o
.debug_str 0x0000000000000d12 0x53 /tmp/cceYjaVL.o
0x219 (size before relaxing)
.debug_str 0x0000000000000c4d 0x3ae /tmp/ccFUXyQJ.o
.debug_str 0x0000000000000d65 0x3ae /tmp/ccsXJViH.o
0x5bf (size before relaxing)
.debug_str 0x0000000000000ffb 0x39 /tmp/cc8rJnLI.o
.debug_str 0x0000000000001113 0x39 /tmp/ccGz0VMC.o
0x1b7 (size before relaxing)
.debug_str 0x0000000000001034 0x227 /tmp/ccDd2fMH.o
.debug_str 0x000000000000114c 0x216 /tmp/ccy5lZmy.o
0x5ca (size before relaxing)
.debug_str 0x000000000000125b 0xa2 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
.debug_str 0x0000000000001362 0xa2 /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_udivsi3.o)
0xae (size before relaxing)
.debug_str 0x00000000000012fd 0xae /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_str 0x00000000000012fd 0xae /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.debug_str 0x0000000000001404 0xae /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_divsi3.o)
.debug_str 0x0000000000001404 0xae /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o)
.debug_loc
*(.debug_loc)
@ -455,5 +449,5 @@ LOAD /usr/lib/gcc/arm-none-eabi/9.2.0/thumb/v6-m/nofp/libgcc.a
OUTPUT(main.elf elf32-littlearm)
.debug_ranges 0x0000000000000000 0x38
.debug_ranges 0x0000000000000000 0x18 /tmp/ccy0xC7N.o
.debug_ranges 0x0000000000000018 0x20 /tmp/ccr2qryM.o
.debug_ranges 0x0000000000000000 0x18 /tmp/ccWI4kHV.o
.debug_ranges 0x0000000000000018 0x20 /tmp/ccjaIjJQ.o

View file

@ -31,14 +31,27 @@
volatile struct dma_tx_buf usart_tx_buf;
static uint32_t tx_overruns=0, rx_overruns=0;
static uint32_t rx_framing_errors=0, rx_protocol_errors=0;
static struct cobs_decode_state cobs_state;
static volatile uint8_t rx_buf[32];
static void usart_schedule_dma(void);
int usart_putc_nonblocking(char c);
int usart_putc(char c);
static int usart_putc_nonblocking(uint8_t c);
static int usart_retransmit_packet(uint8_t idx);
void usart_dma_init() {
usart_tx_buf.xfr_start = -1,
usart_tx_buf.xfr_end = 0,
usart_tx_buf.wr_pos = 0,
usart_tx_buf.xfr_start = -1;
usart_tx_buf.xfr_end = 0;
usart_tx_buf.wr_pos = 0;
for (size_t i=0; i<ARRAY_LEN(usart_tx_buf.packet_start); i++)
usart_tx_buf.packet_start[i] = -1;
cobs_decode_incremental_initialize(&cobs_state);
/* Configure DMA 1 Channel 2 to handle uart transmission */
DMA1_Channel2->CPAR = (uint32_t)&(USART1->TDR);
@ -74,7 +87,7 @@ void usart_dma_init() {
//USART1->BRR = 417;
//USART1->BRR = 48; /* 1MBd */
USART1->BRR = 96; /* 500kBd */
//USART1->BRR = 96; /* 500kBd */
USART1->BRR = 192; /* 250kBd */
//USART1->BRR = 208; /* 230400 */
@ -83,19 +96,72 @@ void usart_dma_init() {
USART1->CR3 |= USART_CR3_DMAT; /* TX DMA enable */
/* Enable receive interrupt */
//NVIC_EnableIRQ(USART1_IRQn);
//NVIC_SetPriority(USART1_IRQn, 1);
NVIC_EnableIRQ(USART1_IRQn);
NVIC_SetPriority(USART1_IRQn, 3<<5);
/* And... go! */
USART1->CR1 |= USART_CR1_UE;
}
void USART1_IRQHandler() {
uint32_t isr = USART1->ISR;
if (isr & USART_ISR_ORE) {
USART1->ICR = USART_ICR_ORECF;
rx_overruns++;
return;
}
if (isr & USART_ISR_RXNE) {
uint8_t c = USART1->RDR;
int rc = cobs_decode_incremental(&cobs_state, (char *)rx_buf, sizeof(rx_buf), c);
if (rc == 0) /* packet still incomplete */
return;
if (rc < 0) {
rx_framing_errors++;
return;
}
/* A complete frame received */
if (rc != 2) {
rx_protocol_errors++;
return;
}
volatile struct ctrl_pkt *pkt = (volatile struct ctrl_pkt *)rx_buf;
switch (pkt->type) {
case CTRL_PKT_RESET:
for (size_t i=0; i<ARRAY_LEN(usart_tx_buf.packet_start); i++)
usart_tx_buf.packet_start[i] = -1;
break;
case CTRL_PKT_ACK:
if (usart_ack_packet(pkt->orig_id))
rx_protocol_errors++;
break;
case CTRL_PKT_RETRANSMIT:
if (usart_retransmit_packet(pkt->orig_id))
rx_protocol_errors++;
break;
default:
rx_protocol_errors++;
}
return;
}
}
void usart_schedule_dma() {
/* This function is only called when the DMA channel is disabled. This means we don't have to guard it in IRQ
* disables. */
volatile struct dma_tx_buf *buf = &usart_tx_buf;
size_t xfr_len, xfr_start = buf->xfr_end;
ssize_t xfr_len, xfr_start = buf->xfr_end;
if (buf->wr_pos > xfr_start) /* no wraparound */
xfr_len = buf->wr_pos - xfr_start;
else /* wraparound */
@ -110,15 +176,28 @@ void usart_schedule_dma() {
DMA1_Channel2->CCR |= DMA_CCR_EN;
}
int usart_dma_fifo_push(volatile struct dma_tx_buf *buf, char c) {
int usart_ack_packet(uint8_t idx) {
if (idx > ARRAY_LEN(usart_tx_buf.packet_start))
return -EINVAL;
usart_tx_buf.packet_start[idx] = -1;
return 0;
}
int usart_dma_fifo_push(volatile struct dma_tx_buf *buf, uint8_t c) {
/* This function must be guarded by IRQ disable since the IRQ may schedule a new transfer and charge pos/start. */
NVIC_DisableIRQ(DMA1_Channel2_3_IRQn);
if (buf->wr_pos == buf->xfr_start) {
NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
return -EBUSY;
/* If the write pointer hit any unacknowledged packet start position we can't advance it.
* Packet start positions are unordered and we have to scan here. */
for (size_t i=0; i<ARRAY_LEN(buf->packet_start); i++) {
if (buf->wr_pos == buf->packet_start[i]) {
NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
return -EBUSY;
}
}
/* write byte, then increment to avoid racing the DMA ISR reading wr_pos */
buf->data[buf->wr_pos] = c;
buf->wr_pos = (buf->wr_pos + 1) % sizeof(buf->data);
@ -126,7 +205,7 @@ int usart_dma_fifo_push(volatile struct dma_tx_buf *buf, char c) {
return 0;
}
int usart_putc(char c) {
int usart_putc(uint8_t c) {
/* push char to fifo, busy-loop if stalled to wait for USART to empty fifo via DMA */
while (usart_dma_fifo_push(&usart_tx_buf, c) == -EBUSY) {
/* idle */
@ -134,7 +213,7 @@ int usart_putc(char c) {
return 0;
}
int usart_putc_nonblocking(char c) {
int usart_putc_nonblocking(uint8_t c) {
return usart_dma_fifo_push(&usart_tx_buf, c);
}
@ -148,26 +227,70 @@ void DMA1_Channel2_3_IRQHandler(void) {
usart_schedule_dma();
}
void usart_send_packet(const uint8_t *data, size_t len) {
/* ignore return value as putf is blocking and always succeeds */
(void)cobs_encode_usart(usart_putc, (char *)data, len);
int usart_retransmit_packet(uint8_t idx) {
/* Disable ADC DMA IRQ to prevent write races */
NVIC_DisableIRQ(DMA1_Channel1_IRQn);
/* If the DMA stream is idle right now, schedule a transfer */
if (!(DMA1_Channel2->CCR & DMA_CCR_EN))
usart_schedule_dma();
ssize_t i = usart_tx_buf.packet_start[idx];
ssize_t start = i;
/* Copy packet */
uint8_t c;
while ((c = usart_tx_buf.data[i++])) {
if (usart_putc_nonblocking(c)) {
tx_overruns++;
return -EBUSY;
}
}
/* Terminating null byte */
if (usart_putc_nonblocking(0)) {
tx_overruns++;
return -EBUSY;
}
/* Update start index */
usart_tx_buf.packet_start[idx] = start;
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
return 0;
}
int usart_send_packet_nonblocking(const uint8_t *data, size_t len) {
/* ignore return value as putf is blocking and always succeeds */
/* FIXME DEBUG */
//int rc = cobs_encode_usart(usart_putc_nonblocking, (char *)data, len);
//if (rc)
// return rc;
/* END */
static uint8_t x = 0;
/* len is the packet length including headers */
int usart_send_packet_nonblocking(struct ll_pkt *pkt, size_t pkt_len) {
ssize_t start = usart_tx_buf.wr_pos;
/* Find a free slot for this packet */
size_t packet_idx = 0;
do {
if (usart_tx_buf.packet_start[packet_idx] == -1)
goto success;
} while (++packet_idx <ARRAY_LEN(usart_tx_buf.packet_start));
tx_overruns++;
return -EBUSY;
success:
pkt->pid = packet_idx;
pkt->_pad = 0;
/* make the value this wonky-ass CRC implementation produces match zlib etc. */
CRC->CR = CRC_CR_REV_OUT | (1<<CRC_CR_REV_IN_Pos) | CRC_CR_RESET;
for (size_t i=offsetof(struct ll_pkt, pid); i<pkt_len; i++)
CRC->DR = ((uint8_t *)pkt)[i];
pkt->crc32 = ~CRC->DR;
int rc = cobs_encode_usart((int (*)(char))usart_putc_nonblocking, (char *)pkt, pkt_len);
if (rc)
return rc;
/* Checkpoint packet start index to prevent overwriting before ack */
usart_tx_buf.packet_start[packet_idx] = start;
/* FIXME debug code
static uint8_t x = 0;
for (size_t i=0; i<351; i++)
usart_putc_nonblocking(x++);
*/
/* If the DMA stream is idle right now, schedule a transfer */
if (!(DMA1_Channel2->CCR & DMA_CCR_EN))

View file

@ -27,19 +27,46 @@
#include <stdarg.h>
#include <errno.h>
#include "global.h"
struct dma_tx_buf {
size_t xfr_start; /* Start index of running DMA transfer */
size_t xfr_end; /* End index of running DMA transfer plus one */
size_t wr_pos; /* Next index to be written */
/* The following fields are accessed only from DMA ISR */
ssize_t xfr_start; /* Start index of running DMA transfer */
ssize_t xfr_end; /* End index of running DMA transfer plus one */
uint8_t cur_packet;
/* The following fields are written only from non-interrupt code */
ssize_t wr_pos; /* Next index to be written */
ssize_t packet_start[8];
/* The following may be accessed by anything */
uint8_t data[512];
size_t packet_starts[5];
};
struct __attribute__((__packed__)) ll_pkt {
uint32_t crc32;
/* CRC computed over entire packet starting here */
uint8_t pid;
uint8_t _pad;
uint8_t data[];
};
enum ctrl_pkt_type {
CTRL_PKT_RESET = 1,
CTRL_PKT_ACK = 2,
CTRL_PKT_RETRANSMIT = 3,
};
struct __attribute__((__packed__)) ctrl_pkt {
uint8_t type;
uint8_t orig_id;
};
extern volatile struct dma_tx_buf usart_tx_buf;
void usart_dma_init(void);
int usart_dma_fifo_push(volatile struct dma_tx_buf *buf, char c);
void usart_send_packet(const uint8_t *data, size_t len);
int usart_send_packet_nonblocking(const uint8_t *data, size_t len);
int usart_dma_fifo_push(volatile struct dma_tx_buf *buf, uint8_t c);
int usart_send_packet_nonblocking(struct ll_pkt *pkt, size_t pkt_len);
int usart_ack_packet(uint8_t idx);
#endif // __SERIAL_H__