From a5775835302d7f0d78dae03b9c8ee257dd03e269 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 16:23:54 -0700 Subject: [PATCH 01/11] working on gmbitbang --- board/drivers/can.h | 81 ++++++++++++++++++++++++++++++++++++++--- tests/gmbitbang/test.py | 32 ++++++++++++++++ 2 files changed, 107 insertions(+), 6 deletions(-) create mode 100755 tests/gmbitbang/test.py diff --git a/board/drivers/can.h b/board/drivers/can.h index d5daa054d516d7..a1ef6c2ab68045 100644 --- a/board/drivers/can.h +++ b/board/drivers/can.h @@ -461,14 +461,83 @@ void CAN3_SCE_IRQHandler() { can_sce(CAN3); } #endif +void set_bitbanged_gmlan(int val) { + if (val) { + GPIOB->ODR |= (1 << 13); + } else { + GPIOB->ODR &= ~(1 << 13); + } +} + +void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { + puts("called bitbang_gmlan\n"); + puth(can_num_lookup[3]); + puts("\n"); + char test_pkt[] = \ + {0, // SOF + 0,0,0,0, // ID10-ID7 + 1, // bitstuff + 0,0,1,0,1,0,0, // ID6-ID0 + 0, // RTR + 0, // IDE + 0, // reserved + 1, // bitstuff + 0,0,0,1, // len + 0,0,0,0,0, // 1st byte 7-3 + 1, // bitstuff + 0,0,1, // 1st byte 2-0 + + // start CRC + 0,1,0,0,0,0,1,1,0,0,0,0,0, + 1, // bitstuff + 0,0, // CRC field + 1, // CRC delimiter + + 1, // ACK + 1, // ACK delimiter + 1,1,1,1,1,1,1, // EOF + 1,1,1, // IFS + }; + /*char test_pkt[] = { + 0,1,0,1, 0,1,0,1, 0,1,0,1, + 1,1,1,1, + 0,1,0,1, 0,1,0,1, 0,1,0,1, + 0,0,0,0,0,0,0,0, + 0,1,0,1, 0,1,0,1, 0,1,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,1, 0,1,0,1, 0,1,0,1,};*/ + + #define SPEEED 30 + + // bitbang loop + set_bitbanged_gmlan(1); // recessive + set_gpio_mode(GPIOB, 13, MODE_OUTPUT); + enter_critical_section(); + int init = TIM2->CNT; + for (int i = 0; i < sizeof(test_pkt); i++) { + while ((TIM2->CNT - init) < (SPEEED*i)); + set_bitbanged_gmlan(test_pkt[i]); + } + exit_critical_section(); + set_gpio_mode(GPIOB, 13, MODE_INPUT); + + puts("bitbang done\n"); +} + void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number) { if (safety_tx_hook(to_push) && !can_autobaud_enabled[bus_number]) { - if (bus_number < BUS_MAX) { - // add CAN packet to send queue - // bus number isn't passed through - to_push->RDTR &= 0xF; - can_push(can_queues[bus_number], to_push); - process_can(CAN_NUM_FROM_BUS_NUM(bus_number)); + //if (bus_number == 3) { //&& can_num_lookup[3] == -1) { + // TODO: why uint8 bro? only int8? + if (bus_number == 3 && can_num_lookup[3] == 0xFF) { + bitbang_gmlan(to_push); + } else { + if (bus_number < BUS_MAX) { + // add CAN packet to send queue + // bus number isn't passed through + to_push->RDTR &= 0xF; + can_push(can_queues[bus_number], to_push); + process_can(CAN_NUM_FROM_BUS_NUM(bus_number)); + } } } } diff --git a/tests/gmbitbang/test.py b/tests/gmbitbang/test.py new file mode 100755 index 00000000000000..76ef3712b766c2 --- /dev/null +++ b/tests/gmbitbang/test.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +import time +from panda import Panda + +p1 = Panda('430026000951363338383037') +p2 = Panda('380016000551363338383037') + +# this is a test, no safety +p1.set_safety_mode(Panda.SAFETY_ALLOUTPUT) +p2.set_safety_mode(Panda.SAFETY_ALLOUTPUT) + +# get versions +print(p1.get_version()) +print(p2.get_version()) + +# this sets bus 2 to actually be GMLAN +p2.set_gmlan(bus=2) + +# send w bitbang then without +p1.set_gmlan(bus=None) +p1.can_send(20, "\x01", bus=3) +p1.set_gmlan(bus=2) +p1.can_send(20, "\x01", bus=3) +#time.sleep(0.1) +#p1.set_gmlan(bus=None) +#p1.can_send(20, "\x01", bus=3) + +# test echo +# (to send on GMLAN, set bus=3) +time.sleep(0.1) +print p2.can_recv() + From 55da0b654f1768d48911db4b79242765bc975a47 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 16:33:34 -0700 Subject: [PATCH 02/11] rigol yea, dj pauly d yea --- tests/gmbitbang/rigol.py | 26 ++++++++++++++++++++++++++ tests/gmbitbang/test.py | 19 +++++++------------ 2 files changed, 33 insertions(+), 12 deletions(-) create mode 100755 tests/gmbitbang/rigol.py diff --git a/tests/gmbitbang/rigol.py b/tests/gmbitbang/rigol.py new file mode 100755 index 00000000000000..f3080c310524d4 --- /dev/null +++ b/tests/gmbitbang/rigol.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +import numpy as np +import visa +import matplotlib.pyplot as plt + +resources = visa.ResourceManager() +print resources.list_resources() + +scope = resources.open_resource('USB0::0x1AB1::0x04CE::DS1ZA184652242::INSTR', timeout=2000, chunk_size=1024000) +print(scope.query('*IDN?').strip()) + +#voltscale = scope.ask_for_values(':CHAN1:SCAL?')[0] +#voltoffset = scope.ask_for_values(":CHAN1:OFFS?")[0] + +#scope.write(":STOP") +scope.write(":WAV:POIN:MODE RAW") +scope.write(":WAV:DATA? CHAN1")[10:] +rawdata = scope.read_raw() +data = np.frombuffer(rawdata, 'B') +print data.shape +plt.plot(data) +plt.show() +#data = (data - 130.0 - voltoffset/voltscale*25) / 25 * voltscale + +print data + diff --git a/tests/gmbitbang/test.py b/tests/gmbitbang/test.py index 76ef3712b766c2..60c35ad2ba70c6 100755 --- a/tests/gmbitbang/test.py +++ b/tests/gmbitbang/test.py @@ -17,16 +17,11 @@ p2.set_gmlan(bus=2) # send w bitbang then without -p1.set_gmlan(bus=None) -p1.can_send(20, "\x01", bus=3) -p1.set_gmlan(bus=2) -p1.can_send(20, "\x01", bus=3) -#time.sleep(0.1) -#p1.set_gmlan(bus=None) -#p1.can_send(20, "\x01", bus=3) - -# test echo -# (to send on GMLAN, set bus=3) -time.sleep(0.1) -print p2.can_recv() +while 1: + p1.set_gmlan(bus=None) + p1.can_send(20, "\x01", bus=3) + p1.set_gmlan(bus=2) + p1.can_send(20, "\x01", bus=3) + time.sleep(0.01) + print p2.can_recv() From be22522714a52b610ec7fc5e3a6115b8c27897aa Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 16:48:53 -0700 Subject: [PATCH 03/11] bros ok match bros --- board/drivers/can.h | 8 ++++++-- tests/gmbitbang/rigol.py | 11 ++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/board/drivers/can.h b/board/drivers/can.h index a1ef6c2ab68045..a91b656ede5910 100644 --- a/board/drivers/can.h +++ b/board/drivers/can.h @@ -488,9 +488,13 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { 0,0,1, // 1st byte 2-0 // start CRC - 0,1,0,0,0,0,1,1,0,0,0,0,0, + /*0,1,0,0,0,0,1,1,0,0,0,0,0, 1, // bitstuff - 0,0, // CRC field + 0,0, // CRC field*/ + + // CRC from real message + 1,1,1,0,1,1,1,0,1,0,1,0,0,1,1,1, + 1, // CRC delimiter 1, // ACK diff --git a/tests/gmbitbang/rigol.py b/tests/gmbitbang/rigol.py index f3080c310524d4..8ae6e7ea34296c 100755 --- a/tests/gmbitbang/rigol.py +++ b/tests/gmbitbang/rigol.py @@ -18,7 +18,16 @@ rawdata = scope.read_raw() data = np.frombuffer(rawdata, 'B') print data.shape -plt.plot(data) + +s1 = data[0:600] +s2 = data[600:] +s1i = np.argmax(s1 > 100) +s2i = np.argmax(s2 > 100) +s1 = s1[s1i:] +s2 = s2[s2i:] + +plt.plot(s1) +plt.plot(s2) plt.show() #data = (data - 130.0 - voltoffset/voltscale*25) / 25 * voltscale From 932d72786779deb42f87d5dd9bd4b21ab0bfb233 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 22:52:53 -0700 Subject: [PATCH 04/11] bit stuffing support --- board/drivers/can.h | 84 +++----------------------- board/drivers/canbitbang.h | 109 ++++++++++++++++++++++++++++++++++ tests/gmbitbang/rigol.py | 4 +- tests/gmbitbang/test_packer.c | 15 +++++ 4 files changed, 135 insertions(+), 77 deletions(-) create mode 100644 board/drivers/canbitbang.h create mode 100644 tests/gmbitbang/test_packer.c diff --git a/board/drivers/can.h b/board/drivers/can.h index a91b656ede5910..cd809704b9a407 100644 --- a/board/drivers/can.h +++ b/board/drivers/can.h @@ -461,84 +461,18 @@ void CAN3_SCE_IRQHandler() { can_sce(CAN3); } #endif -void set_bitbanged_gmlan(int val) { - if (val) { - GPIOB->ODR |= (1 << 13); - } else { - GPIOB->ODR &= ~(1 << 13); - } -} - -void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { - puts("called bitbang_gmlan\n"); - puth(can_num_lookup[3]); - puts("\n"); - char test_pkt[] = \ - {0, // SOF - 0,0,0,0, // ID10-ID7 - 1, // bitstuff - 0,0,1,0,1,0,0, // ID6-ID0 - 0, // RTR - 0, // IDE - 0, // reserved - 1, // bitstuff - 0,0,0,1, // len - 0,0,0,0,0, // 1st byte 7-3 - 1, // bitstuff - 0,0,1, // 1st byte 2-0 - - // start CRC - /*0,1,0,0,0,0,1,1,0,0,0,0,0, - 1, // bitstuff - 0,0, // CRC field*/ - - // CRC from real message - 1,1,1,0,1,1,1,0,1,0,1,0,0,1,1,1, - - 1, // CRC delimiter - - 1, // ACK - 1, // ACK delimiter - 1,1,1,1,1,1,1, // EOF - 1,1,1, // IFS - }; - /*char test_pkt[] = { - 0,1,0,1, 0,1,0,1, 0,1,0,1, - 1,1,1,1, - 0,1,0,1, 0,1,0,1, 0,1,0,1, - 0,0,0,0,0,0,0,0, - 0,1,0,1, 0,1,0,1, 0,1,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,1, 0,1,0,1, 0,1,0,1,};*/ - - #define SPEEED 30 - - // bitbang loop - set_bitbanged_gmlan(1); // recessive - set_gpio_mode(GPIOB, 13, MODE_OUTPUT); - enter_critical_section(); - int init = TIM2->CNT; - for (int i = 0; i < sizeof(test_pkt); i++) { - while ((TIM2->CNT - init) < (SPEEED*i)); - set_bitbanged_gmlan(test_pkt[i]); - } - exit_critical_section(); - set_gpio_mode(GPIOB, 13, MODE_INPUT); - - puts("bitbang done\n"); -} +#include "canbitbang.h" void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number) { if (safety_tx_hook(to_push) && !can_autobaud_enabled[bus_number]) { - //if (bus_number == 3) { //&& can_num_lookup[3] == -1) { - // TODO: why uint8 bro? only int8? - if (bus_number == 3 && can_num_lookup[3] == 0xFF) { - bitbang_gmlan(to_push); - } else { - if (bus_number < BUS_MAX) { - // add CAN packet to send queue - // bus number isn't passed through - to_push->RDTR &= 0xF; + if (bus_number < BUS_MAX) { + // add CAN packet to send queue + // bus number isn't passed through + to_push->RDTR &= 0xF; + if (bus_number == 3 && can_num_lookup[3] == 0xFF) { + // TODO: why uint8 bro? only int8? + bitbang_gmlan(to_push); + } else { can_push(can_queues[bus_number], to_push); process_can(CAN_NUM_FROM_BUS_NUM(bus_number)); } diff --git a/board/drivers/canbitbang.h b/board/drivers/canbitbang.h new file mode 100644 index 00000000000000..9732adf597b195 --- /dev/null +++ b/board/drivers/canbitbang.h @@ -0,0 +1,109 @@ + +// returns out_len +int do_bitstuff(char *out, char *in, int in_len) { + int last_bit = -1; + int bit_cnt = 0; + int j = 0; + for (int i = 0; i < in_len; i++) { + char bit = in[i]; + out[j++] = bit; + + // do the stuffing + if (bit == last_bit) { + bit_cnt++; + if (bit_cnt == 5) { + // 5 in a row the same, do stuff + last_bit = !bit; + out[j++] = last_bit; + bit_cnt = 1; + } + } else { + // this is a new bit + last_bit = bit; + bit_cnt = 1; + } + } + return j; +} + +int get_bit_message(char *out) { + char test_pkt[] = { + 0, // SOF + 0,0,0,0, // ID10-ID7 + //1, // bitstuff + 0,0,1,0,1,0,0, // ID6-ID0 + 0, // RTR + 0, // IDE + 0, // reserved + //1, // bitstuff + 0,0,0,1, // len + 0,0,0,0,0, // 1st byte 7-3 + //1, // bitstuff + 0,0,1, // 1st byte 2-0 + + // CRC from real message + 1,1,1,0,1,1,1,0,1,0,1,0,0,1,1, + }; + char footer[] = { + 1, // CRC delimiter + + 1, // ACK + 1, // ACK delimiter + 1,1,1,1,1,1,1, // EOF + 1,1,1, // IFS + }; + #define SPEEED 30 + + // testing + //char *test_pkt_stuffed = test_pkt; + //int len = sizeof(test_pkt); + + // do bitstuffing + int len = do_bitstuff(out, test_pkt, sizeof(test_pkt)); + + // append footer + for (int i = 0; i < sizeof(footer); i++) { + out[len++] = footer[i]; + } + return len; +} + +// hardware stuff below this line + +#ifdef PANDA + +void set_bitbanged_gmlan(int val) { + if (val) { + GPIOB->ODR |= (1 << 13); + } else { + GPIOB->ODR &= ~(1 << 13); + } +} + +void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { + puts("called bitbang_gmlan\n"); + puth(can_num_lookup[3]); + puts("\n"); + + char pkt_stuffed[64+44+25]; + int len = get_bit_message(pkt_stuffed); + + // actual bitbang loop + set_bitbanged_gmlan(1); // recessive + set_gpio_mode(GPIOB, 13, MODE_OUTPUT); + enter_critical_section(); + int init = TIM2->CNT; + + for (int i = 0; i < len; i++) { + while ((TIM2->CNT - init) < (SPEEED*i)); + set_bitbanged_gmlan(pkt_stuffed[i]); + } + + exit_critical_section(); + set_gpio_mode(GPIOB, 13, MODE_INPUT); + + puts("bitbang done\n"); +} + +#endif + diff --git a/tests/gmbitbang/rigol.py b/tests/gmbitbang/rigol.py index 8ae6e7ea34296c..3d690fdd84c725 100755 --- a/tests/gmbitbang/rigol.py +++ b/tests/gmbitbang/rigol.py @@ -19,8 +19,8 @@ data = np.frombuffer(rawdata, 'B') print data.shape -s1 = data[0:600] -s2 = data[600:] +s1 = data[0:650] +s2 = data[650:] s1i = np.argmax(s1 > 100) s2i = np.argmax(s2 > 100) s1 = s1[s1i:] diff --git a/tests/gmbitbang/test_packer.c b/tests/gmbitbang/test_packer.c new file mode 100644 index 00000000000000..0f4386fab278ca --- /dev/null +++ b/tests/gmbitbang/test_packer.c @@ -0,0 +1,15 @@ +#include +#include "../../board/drivers/canbitbang.h" + +int main() { + char out[100]; + int len = get_bit_message(out); + for (int i = 0; i < len; i++) { + printf("%d", out[i]); + } + printf("\n"); + return 0; +} + + + From 74af4417db6d331085568b37804afc7af56a17dc Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 23:11:29 -0700 Subject: [PATCH 05/11] can crc --- board/drivers/canbitbang.h | 38 ++++++++++++++++++++++++----------- tests/gmbitbang/test_packer.c | 3 +++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/board/drivers/canbitbang.h b/board/drivers/canbitbang.h index 9732adf597b195..e152412151da9b 100644 --- a/board/drivers/canbitbang.h +++ b/board/drivers/canbitbang.h @@ -1,3 +1,4 @@ +#define MAX_BITS_CAN_PACKET (64+44+25) // returns out_len int do_bitstuff(char *out, char *in, int in_len) { @@ -26,24 +27,35 @@ int do_bitstuff(char *out, char *in, int in_len) { return j; } +int append_crc(char *in, int in_len) { + int crc = 0; + for (int i = 0; i < in_len; i++) { + crc <<= 1; + if (in[i] ^ ((crc>>15)&1)) { + crc = crc ^ 0x4599; + } + crc &= 0x7fff; + } + for (int i = 14; i >= 0; i--) { + in[in_len++] = (crc>>i)&1; + } + return in_len; +} + int get_bit_message(char *out) { - char test_pkt[] = { + char test_pkt[MAX_BITS_CAN_PACKET]; + char test_pkt_src[] = { 0, // SOF 0,0,0,0, // ID10-ID7 - //1, // bitstuff 0,0,1,0,1,0,0, // ID6-ID0 0, // RTR 0, // IDE 0, // reserved - //1, // bitstuff 0,0,0,1, // len 0,0,0,0,0, // 1st byte 7-3 - //1, // bitstuff 0,0,1, // 1st byte 2-0 - - // CRC from real message - 1,1,1,0,1,1,1,0,1,0,1,0,0,1,1, }; + char footer[] = { 1, // CRC delimiter @@ -54,12 +66,14 @@ int get_bit_message(char *out) { }; #define SPEEED 30 - // testing - //char *test_pkt_stuffed = test_pkt; - //int len = sizeof(test_pkt); + // copy packet + for (int i = 0; i < sizeof(test_pkt_src); i++) test_pkt[i] = test_pkt_src[i]; + + // append crc + int len = append_crc(test_pkt, sizeof(test_pkt_src)); // do bitstuffing - int len = do_bitstuff(out, test_pkt, sizeof(test_pkt)); + len = do_bitstuff(out, test_pkt, len); // append footer for (int i = 0; i < sizeof(footer); i++) { @@ -85,7 +99,7 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { puth(can_num_lookup[3]); puts("\n"); - char pkt_stuffed[64+44+25]; + char pkt_stuffed[MAX_BITS_CAN_PACKET]; int len = get_bit_message(pkt_stuffed); // actual bitbang loop diff --git a/tests/gmbitbang/test_packer.c b/tests/gmbitbang/test_packer.c index 0f4386fab278ca..4387c839914140 100644 --- a/tests/gmbitbang/test_packer.c +++ b/tests/gmbitbang/test_packer.c @@ -4,10 +4,13 @@ int main() { char out[100]; int len = get_bit_message(out); + printf("T:"); for (int i = 0; i < len; i++) { printf("%d", out[i]); } printf("\n"); + printf("R:0000010010100000100010000010011110111010100111111111111111"); + printf("\n"); return 0; } From d917386bf8caeeb025c1af1fe01703aa8f9b6948 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 23:29:20 -0700 Subject: [PATCH 06/11] bitbanging works --- board/drivers/canbitbang.h | 55 +++++++++++++++++++++-------------- tests/gmbitbang/test.py | 4 +-- tests/gmbitbang/test_packer.c | 18 ++++++++++-- 3 files changed, 51 insertions(+), 26 deletions(-) diff --git a/board/drivers/canbitbang.h b/board/drivers/canbitbang.h index e152412151da9b..ee408095e58deb 100644 --- a/board/drivers/canbitbang.h +++ b/board/drivers/canbitbang.h @@ -42,23 +42,24 @@ int append_crc(char *in, int in_len) { return in_len; } -int get_bit_message(char *out) { - char test_pkt[MAX_BITS_CAN_PACKET]; - char test_pkt_src[] = { - 0, // SOF - 0,0,0,0, // ID10-ID7 - 0,0,1,0,1,0,0, // ID6-ID0 - 0, // RTR - 0, // IDE - 0, // reserved - 0,0,0,1, // len - 0,0,0,0,0, // 1st byte 7-3 - 0,0,1, // 1st byte 2-0 - }; +int append_bits(char *in, int in_len, char *app, int app_len) { + for (int i = 0; i < app_len; i++) { + in[in_len++] = app[i]; + } + return in_len; +} +int append_int(char *in, int in_len, int val, int val_len) { + for (int i = val_len-1; i >= 0; i--) { + in[in_len++] = (val&(1<RDTR & 0xF; + len = append_int(pkt, len, 0, 1); // Start-of-frame + len = append_int(pkt, len, to_bang->RIR >> 21, 11); // Identifier + len = append_int(pkt, len, 0, 3); // RTR+IDE+reserved + len = append_int(pkt, len, dlc_len, 4); // Data length code + + // append data + for (int i = 0; i < dlc_len; i++) { + unsigned char dat = ((unsigned char *)(&(to_bang->RDLR)))[i]; + len = append_int(pkt, len, dat, 8); + } // append crc - int len = append_crc(test_pkt, sizeof(test_pkt_src)); + len = append_crc(pkt, len); // do bitstuffing - len = do_bitstuff(out, test_pkt, len); + len = do_bitstuff(out, pkt, len); // append footer - for (int i = 0; i < sizeof(footer); i++) { - out[len++] = footer[i]; - } + len = append_bits(out, len, footer, sizeof(footer)); return len; } @@ -100,7 +111,7 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { puts("\n"); char pkt_stuffed[MAX_BITS_CAN_PACKET]; - int len = get_bit_message(pkt_stuffed); + int len = get_bit_message(pkt_stuffed, to_bang); // actual bitbang loop set_bitbanged_gmlan(1); // recessive diff --git a/tests/gmbitbang/test.py b/tests/gmbitbang/test.py index 60c35ad2ba70c6..0636d42501704a 100755 --- a/tests/gmbitbang/test.py +++ b/tests/gmbitbang/test.py @@ -19,9 +19,9 @@ # send w bitbang then without while 1: p1.set_gmlan(bus=None) - p1.can_send(20, "\x01", bus=3) + p1.can_send(123, "\x01\x02\x03\x04\x05\x06\x07\x08", bus=3) p1.set_gmlan(bus=2) - p1.can_send(20, "\x01", bus=3) + p1.can_send(123, "\x01\x02\x03\x04\x05\x06\x07\x08", bus=3) time.sleep(0.01) print p2.can_recv() diff --git a/tests/gmbitbang/test_packer.c b/tests/gmbitbang/test_packer.c index 4387c839914140..4435e80fdd0518 100644 --- a/tests/gmbitbang/test_packer.c +++ b/tests/gmbitbang/test_packer.c @@ -1,9 +1,23 @@ #include +#include + +typedef struct { + uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + #include "../../board/drivers/canbitbang.h" int main() { - char out[100]; - int len = get_bit_message(out); + char out[300]; + CAN_FIFOMailBox_TypeDef to_bang = {0}; + to_bang.RIR = 20 << 21; + to_bang.RDTR = 1; + to_bang.RDLR = 1; + + int len = get_bit_message(out, &to_bang); printf("T:"); for (int i = 0; i < len; i++) { printf("%d", out[i]); From 1ba79077bd5d433cb774d4a63ab1dd1938883fde Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 23:30:52 -0700 Subject: [PATCH 07/11] that space tho --- tests/gmbitbang/test_packer.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/gmbitbang/test_packer.c b/tests/gmbitbang/test_packer.c index 4435e80fdd0518..f056dd48125d34 100644 --- a/tests/gmbitbang/test_packer.c +++ b/tests/gmbitbang/test_packer.c @@ -1,12 +1,12 @@ #include #include -typedef struct { - uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; +typedef struct { + uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; #include "../../board/drivers/canbitbang.h" From 223a1fb68fdec2ee4d046e2a9612e60b7a3fe70a Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 23:40:58 -0700 Subject: [PATCH 08/11] cleanin it up --- board/drivers/canbitbang.h | 28 +++++++++++++++++++++++++--- tests/gmbitbang/test.py | 1 + 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/board/drivers/canbitbang.h b/board/drivers/canbitbang.h index ee408095e58deb..21be86c437e3b2 100644 --- a/board/drivers/canbitbang.h +++ b/board/drivers/canbitbang.h @@ -107,8 +107,6 @@ void set_bitbanged_gmlan(int val) { void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { puts("called bitbang_gmlan\n"); - puth(can_num_lookup[3]); - puts("\n"); char pkt_stuffed[MAX_BITS_CAN_PACKET]; int len = get_bit_message(pkt_stuffed, to_bang); @@ -117,13 +115,37 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { set_bitbanged_gmlan(1); // recessive set_gpio_mode(GPIOB, 13, MODE_OUTPUT); enter_critical_section(); - int init = TIM2->CNT; + // wait for bus silent for 7 frames + int silent_count = 0; + while (silent_count < 7) { + int read = get_gpio_input(GPIOB, 12); + silent_count++; + if (read == 0) { + silent_count = 0; + } + int lwait = TIM2->CNT; + while ((TIM2->CNT - lwait) < SPEEED); + } + + // send my message with optional failure + int last = 1; + int init = TIM2->CNT; for (int i = 0; i < len; i++) { while ((TIM2->CNT - init) < (SPEEED*i)); + int read = get_gpio_input(GPIOB, 12); + if ((read == 0 && last == 1) && i != (len-11)) { + puts("ERR: bus driven at "); + puth(i); + puts("\n"); + goto fail; + } set_bitbanged_gmlan(pkt_stuffed[i]); + last = pkt_stuffed[i]; } +fail: + set_bitbanged_gmlan(1); // recessive exit_critical_section(); set_gpio_mode(GPIOB, 13, MODE_INPUT); diff --git a/tests/gmbitbang/test.py b/tests/gmbitbang/test.py index 0636d42501704a..987bb682053dc9 100755 --- a/tests/gmbitbang/test.py +++ b/tests/gmbitbang/test.py @@ -24,4 +24,5 @@ p1.can_send(123, "\x01\x02\x03\x04\x05\x06\x07\x08", bus=3) time.sleep(0.01) print p2.can_recv() + exit(0) From 2ce3a26ab9a27af82dee2dc5b87bbf6fd78a8904 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 23:47:44 -0700 Subject: [PATCH 09/11] handle rollover --- board/drivers/canbitbang.h | 4 ++-- board/libc.h | 16 ++++++++++++++++ board/safety.h | 15 --------------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/board/drivers/canbitbang.h b/board/drivers/canbitbang.h index 21be86c437e3b2..608f286cc44459 100644 --- a/board/drivers/canbitbang.h +++ b/board/drivers/canbitbang.h @@ -125,14 +125,14 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { silent_count = 0; } int lwait = TIM2->CNT; - while ((TIM2->CNT - lwait) < SPEEED); + while (get_ts_elapsed(TIM2->CNT, lwait) < SPEEED); } // send my message with optional failure int last = 1; int init = TIM2->CNT; for (int i = 0; i < len; i++) { - while ((TIM2->CNT - init) < (SPEEED*i)); + while (get_ts_elapsed(TIM2->CNT, init) < (SPEEED*i)); int read = get_gpio_input(GPIOB, 12); if ((read == 0 && last == 1) && i != (len-11)) { puts("ERR: bus driven at "); diff --git a/board/libc.h b/board/libc.h index 8d80a3aad855a9..9947fd7f19c974 100644 --- a/board/libc.h +++ b/board/libc.h @@ -49,3 +49,19 @@ void exit_critical_section() { } } +// ***** generic helpers ****** + +// compute the time elapsed (in microseconds) from 2 counter samples +uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last) { + return ts > ts_last ? ts - ts_last : (0xFFFFFFFF - ts_last) + 1 + ts; +} + +// convert a trimmed integer to signed 32 bit int +int to_signed(int d, int bits) { + if (d >= (1 << (bits - 1))) { + d -= (1 << bits); + } + return d; +} + + diff --git a/board/safety.h b/board/safety.h index 14ca2c34df4dc5..a7d6054beac6d9 100644 --- a/board/safety.h +++ b/board/safety.h @@ -9,8 +9,6 @@ void safety_rx_hook(CAN_FIFOMailBox_TypeDef *to_push); int safety_tx_hook(CAN_FIFOMailBox_TypeDef *to_send); int safety_tx_lin_hook(int lin_num, uint8_t *data, int len); int safety_ignition_hook(); -uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last); -int to_signed(int d, int bits); void update_sample(struct sample_t *sample, int sample_new); typedef void (*safety_hook_init)(int16_t param); @@ -114,19 +112,6 @@ int safety_set_mode(uint16_t mode, int16_t param) { return -1; } -// compute the time elapsed (in microseconds) from 2 counter samples -uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last) { - return ts > ts_last ? ts - ts_last : (0xFFFFFFFF - ts_last) + 1 + ts; -} - -// convert a trimmed integer to signed 32 bit int -int to_signed(int d, int bits) { - if (d >= (1 << (bits - 1))) { - d -= (1 << bits); - } - return d; -} - // given a new sample, update the smaple_t struct void update_sample(struct sample_t *sample, int sample_new) { for (int i = sizeof(sample->values)/sizeof(sample->values[0]) - 1; i > 0; i--) { From fa66e4b785354258d7854f381b5c4224ef76bccb Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 23:50:32 -0700 Subject: [PATCH 10/11] Revert "handle rollover" This reverts commit 2ce3a26ab9a27af82dee2dc5b87bbf6fd78a8904. --- board/drivers/canbitbang.h | 4 ++-- board/libc.h | 16 ---------------- board/safety.h | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/board/drivers/canbitbang.h b/board/drivers/canbitbang.h index 608f286cc44459..21be86c437e3b2 100644 --- a/board/drivers/canbitbang.h +++ b/board/drivers/canbitbang.h @@ -125,14 +125,14 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { silent_count = 0; } int lwait = TIM2->CNT; - while (get_ts_elapsed(TIM2->CNT, lwait) < SPEEED); + while ((TIM2->CNT - lwait) < SPEEED); } // send my message with optional failure int last = 1; int init = TIM2->CNT; for (int i = 0; i < len; i++) { - while (get_ts_elapsed(TIM2->CNT, init) < (SPEEED*i)); + while ((TIM2->CNT - init) < (SPEEED*i)); int read = get_gpio_input(GPIOB, 12); if ((read == 0 && last == 1) && i != (len-11)) { puts("ERR: bus driven at "); diff --git a/board/libc.h b/board/libc.h index 9947fd7f19c974..8d80a3aad855a9 100644 --- a/board/libc.h +++ b/board/libc.h @@ -49,19 +49,3 @@ void exit_critical_section() { } } -// ***** generic helpers ****** - -// compute the time elapsed (in microseconds) from 2 counter samples -uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last) { - return ts > ts_last ? ts - ts_last : (0xFFFFFFFF - ts_last) + 1 + ts; -} - -// convert a trimmed integer to signed 32 bit int -int to_signed(int d, int bits) { - if (d >= (1 << (bits - 1))) { - d -= (1 << bits); - } - return d; -} - - diff --git a/board/safety.h b/board/safety.h index a7d6054beac6d9..14ca2c34df4dc5 100644 --- a/board/safety.h +++ b/board/safety.h @@ -9,6 +9,8 @@ void safety_rx_hook(CAN_FIFOMailBox_TypeDef *to_push); int safety_tx_hook(CAN_FIFOMailBox_TypeDef *to_send); int safety_tx_lin_hook(int lin_num, uint8_t *data, int len); int safety_ignition_hook(); +uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last); +int to_signed(int d, int bits); void update_sample(struct sample_t *sample, int sample_new); typedef void (*safety_hook_init)(int16_t param); @@ -112,6 +114,19 @@ int safety_set_mode(uint16_t mode, int16_t param) { return -1; } +// compute the time elapsed (in microseconds) from 2 counter samples +uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last) { + return ts > ts_last ? ts - ts_last : (0xFFFFFFFF - ts_last) + 1 + ts; +} + +// convert a trimmed integer to signed 32 bit int +int to_signed(int d, int bits) { + if (d >= (1 << (bits - 1))) { + d -= (1 << bits); + } + return d; +} + // given a new sample, update the smaple_t struct void update_sample(struct sample_t *sample, int sample_new) { for (int i = sizeof(sample->values)/sizeof(sample->values[0]) - 1; i > 0; i--) { From 7edc88e54ba1f19dac2d1cf15415b287d460e065 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sun, 10 Jun 2018 23:50:50 -0700 Subject: [PATCH 11/11] put that back --- board/drivers/canbitbang.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/board/drivers/canbitbang.h b/board/drivers/canbitbang.h index 21be86c437e3b2..608f286cc44459 100644 --- a/board/drivers/canbitbang.h +++ b/board/drivers/canbitbang.h @@ -125,14 +125,14 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { silent_count = 0; } int lwait = TIM2->CNT; - while ((TIM2->CNT - lwait) < SPEEED); + while (get_ts_elapsed(TIM2->CNT, lwait) < SPEEED); } // send my message with optional failure int last = 1; int init = TIM2->CNT; for (int i = 0; i < len; i++) { - while ((TIM2->CNT - init) < (SPEEED*i)); + while (get_ts_elapsed(TIM2->CNT, init) < (SPEEED*i)); int read = get_gpio_input(GPIOB, 12); if ((read == 0 && last == 1) && i != (len-11)) { puts("ERR: bus driven at ");