Skip to content

Commit a577583

Browse files
committed
working on gmbitbang
1 parent 875c2bd commit a577583

File tree

2 files changed

+107
-6
lines changed

2 files changed

+107
-6
lines changed

board/drivers/can.h

+75-6
Original file line numberDiff line numberDiff line change
@@ -461,14 +461,83 @@ void CAN3_SCE_IRQHandler() { can_sce(CAN3); }
461461

462462
#endif
463463

464+
void set_bitbanged_gmlan(int val) {
465+
if (val) {
466+
GPIOB->ODR |= (1 << 13);
467+
} else {
468+
GPIOB->ODR &= ~(1 << 13);
469+
}
470+
}
471+
472+
void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
473+
puts("called bitbang_gmlan\n");
474+
puth(can_num_lookup[3]);
475+
puts("\n");
476+
char test_pkt[] = \
477+
{0, // SOF
478+
0,0,0,0, // ID10-ID7
479+
1, // bitstuff
480+
0,0,1,0,1,0,0, // ID6-ID0
481+
0, // RTR
482+
0, // IDE
483+
0, // reserved
484+
1, // bitstuff
485+
0,0,0,1, // len
486+
0,0,0,0,0, // 1st byte 7-3
487+
1, // bitstuff
488+
0,0,1, // 1st byte 2-0
489+
490+
// start CRC
491+
0,1,0,0,0,0,1,1,0,0,0,0,0,
492+
1, // bitstuff
493+
0,0, // CRC field
494+
1, // CRC delimiter
495+
496+
1, // ACK
497+
1, // ACK delimiter
498+
1,1,1,1,1,1,1, // EOF
499+
1,1,1, // IFS
500+
};
501+
/*char test_pkt[] = {
502+
0,1,0,1, 0,1,0,1, 0,1,0,1,
503+
1,1,1,1,
504+
0,1,0,1, 0,1,0,1, 0,1,0,1,
505+
0,0,0,0,0,0,0,0,
506+
0,1,0,1, 0,1,0,1, 0,1,0,1,
507+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
508+
0,1,0,1, 0,1,0,1, 0,1,0,1,};*/
509+
510+
#define SPEEED 30
511+
512+
// bitbang loop
513+
set_bitbanged_gmlan(1); // recessive
514+
set_gpio_mode(GPIOB, 13, MODE_OUTPUT);
515+
enter_critical_section();
516+
int init = TIM2->CNT;
517+
for (int i = 0; i < sizeof(test_pkt); i++) {
518+
while ((TIM2->CNT - init) < (SPEEED*i));
519+
set_bitbanged_gmlan(test_pkt[i]);
520+
}
521+
exit_critical_section();
522+
set_gpio_mode(GPIOB, 13, MODE_INPUT);
523+
524+
puts("bitbang done\n");
525+
}
526+
464527
void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number) {
465528
if (safety_tx_hook(to_push) && !can_autobaud_enabled[bus_number]) {
466-
if (bus_number < BUS_MAX) {
467-
// add CAN packet to send queue
468-
// bus number isn't passed through
469-
to_push->RDTR &= 0xF;
470-
can_push(can_queues[bus_number], to_push);
471-
process_can(CAN_NUM_FROM_BUS_NUM(bus_number));
529+
//if (bus_number == 3) { //&& can_num_lookup[3] == -1) {
530+
// TODO: why uint8 bro? only int8?
531+
if (bus_number == 3 && can_num_lookup[3] == 0xFF) {
532+
bitbang_gmlan(to_push);
533+
} else {
534+
if (bus_number < BUS_MAX) {
535+
// add CAN packet to send queue
536+
// bus number isn't passed through
537+
to_push->RDTR &= 0xF;
538+
can_push(can_queues[bus_number], to_push);
539+
process_can(CAN_NUM_FROM_BUS_NUM(bus_number));
540+
}
472541
}
473542
}
474543
}

tests/gmbitbang/test.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env python
2+
import time
3+
from panda import Panda
4+
5+
p1 = Panda('430026000951363338383037')
6+
p2 = Panda('380016000551363338383037')
7+
8+
# this is a test, no safety
9+
p1.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
10+
p2.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
11+
12+
# get versions
13+
print(p1.get_version())
14+
print(p2.get_version())
15+
16+
# this sets bus 2 to actually be GMLAN
17+
p2.set_gmlan(bus=2)
18+
19+
# send w bitbang then without
20+
p1.set_gmlan(bus=None)
21+
p1.can_send(20, "\x01", bus=3)
22+
p1.set_gmlan(bus=2)
23+
p1.can_send(20, "\x01", bus=3)
24+
#time.sleep(0.1)
25+
#p1.set_gmlan(bus=None)
26+
#p1.can_send(20, "\x01", bus=3)
27+
28+
# test echo
29+
# (to send on GMLAN, set bus=3)
30+
time.sleep(0.1)
31+
print p2.can_recv()
32+

0 commit comments

Comments
 (0)