Skip to content

Commit eb0dff8

Browse files
author
Vehicle Researcher
committed
Squashed 'panda/' changes from 0696730..869f123
869f123 Hyundai: counter check (#530) a439071 gitignore for route logs ac1b64e Fix CAN Ignition for Black Panda and Uno (#526) 273e388 When initializing all the CAN busses, make sure the are also cleared (#527) c2bea78 Fix python library on Windows (#523) 0a123b1 that too ba6355d unused lines c9102c0 Chrysler: use can packer in safety tests (#522) 9874e73 Abstract steering safety tests for Toyota and Chrysler (#520) 2299ecf Block 0xe5 (Honda Bosch) at the panda/uno. Only allow static values. (#515) 3517306 Subaru: fix steer torque scaling (#501) 0bc864b Make torque-based steering state global (#518) d9355c4 Make cruise_engaged_prev a global + test case for it (#519) 2115376 Abstract sample speed test (#516) 11dc905 remove unused function e5a586e Abstract gas interceptor tests (#517) 1dbed65 Safety Test Refactor: Honda (#495) 0632710 base class for different panda safety tests bd98fe6 safety tests: use shorter function name ba59ada No ESP in non-white (#514) c333618 Fix the CAN init fix (#513) 884afa0 Safety Test Refactor: Chrysler and Volkswagen PQ (#508) d77b72d Safety Test Refactor: Nissan (#510) 4c7755c Match Panda DFU entry fix in "make recover" process (#509) 0336f62 Pedal gas pressed safety limits (#507) 715b1a1 Hyundai-Kia-Genesis (HKG) (#503) 6f105e8 Safety Test Refactor: Subaru (#502) 57cc954 Safety Test Refactor: GM (#504) dd01c3b Safety Test Refactor: Hyundai (#505) 592c2c8 add support to can_unique.py for Cabana CSV format. (#506) ccf13b7 No more infinite while loops in CAN init (#499) 6c442b4 Safety Test Refactor: Volkswagen MQB (#493) f07a6ee panda recover should go through bootstub first (#498) 8cc3a35 remove cadillac (#496) 62e4d3c Chrysler: fix missing button signal on TX (#490) abce8f3 Safety Test Refactor: Toyota + support code (#491) 500370a Make sure relay faults make it to the health packet (#492) bc90b60 toyota: use universal gas pressed bit (#488) 74d10cc Fixed possible race condition (#487) a05361e cleanup safety_replay dockerfile (#486) fe73dcc Openpilot-tools is deprecated (#484) da8e00f TX message guaranteed delivery (#421) d8f6184 Add ISO number for longitudinal limits flag comment 6a60b78 touch ups 2ce6536 comments on unsafe flags d880134 remove from there as well 055ea07 remove that unsafe flag since it isn't implemented and it's unclear how to 4e98bbe Apply unsafe allow gas mode to all cars. (#480) 0c2c149 Fixing libusb busy error (#174) 753c42c Update Board Mac SDK Install script to work on clean mac (#146) b9a9ea3 Unsafe gas disengage mods, fix test compile warning (#481) 08ef92d Safety model for Volkswagen PQ35/PQ46/NMS (#474) 51e0a55 Support code for unsafe mode unit tests (#478) 5325b62 current_safety_mode 7908b72 update updating unsafe mode 98503e8 disable stock honda AEB in unsafe mode (#477) 01b2ccb one more 9a30265 weak steering while not engaged 577f10b added options for unsafe mode 83cf7bf update comment 4556e74 enable unsafe mode, toggle for use by forks that so choose de89fcd Nissan leaf (#473) git-subtree-dir: panda git-subtree-split: 869f123
1 parent a3690e4 commit eb0dff8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2504
-2566
lines changed

.circleci/config.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ jobs:
1111
- run:
1212
name: Run safety test
1313
command: |
14-
docker run panda_safety /bin/bash -c "cd /panda/tests/safety; PYTHONPATH=/ ./test.sh"
14+
docker run panda_safety /bin/bash -c "cd /openpilot/panda/tests/safety; PYTHONPATH=/openpilot ./test.sh"
1515
1616
misra-c2012:
1717
machine:

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v1.7.3
1+
v1.7.5

board/boards/black.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,13 @@ void black_enable_can_transciever(uint8_t transciever, bool enabled) {
2323
}
2424

2525
void black_enable_can_transcievers(bool enabled) {
26-
uint8_t t1 = enabled ? 1U : 2U; // leave transciever 1 enabled to detect CAN ignition
27-
for(uint8_t i=t1; i<=4U; i++) {
28-
black_enable_can_transciever(i, enabled);
26+
for(uint8_t i=1U; i<=4U; i++){
27+
// Leave main CAN always on for CAN-based ignition detection
28+
if((car_harness_status == HARNESS_STATUS_FLIPPED) ? (i == 3U) : (i == 1U)){
29+
black_enable_can_transciever(i, true);
30+
} else {
31+
black_enable_can_transciever(i, enabled);
32+
}
2933
}
3034
}
3135

board/boards/uno.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ void uno_enable_can_transciever(uint8_t transciever, bool enabled) {
2626

2727
void uno_enable_can_transcievers(bool enabled) {
2828
for(uint8_t i=1U; i<=4U; i++){
29-
uno_enable_can_transciever(i, enabled);
29+
// Leave main CAN always on for CAN-based ignition detection
30+
if((car_harness_status == HARNESS_STATUS_FLIPPED) ? (i == 3U) : (i == 1U)){
31+
uno_enable_can_transciever(i, true);
32+
} else {
33+
uno_enable_can_transciever(i, enabled);
34+
}
3035
}
3136
}
3237

board/build.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ bin: obj/$(PROJ_NAME).bin
4242

4343
# this flashes everything
4444
recover: obj/bootstub.$(PROJ_NAME).bin obj/$(PROJ_NAME).bin
45-
-PYTHONPATH=../ python3 -c "from python import Panda; Panda().reset(enter_bootloader=True)"
45+
-PYTHONPATH=../ python3 -c "from python import Panda; Panda().reset(enter_bootstub=True); Panda().reset(enter_bootloader=True)"
4646
sleep 1.0
4747
$(DFU_UTIL) -d 0483:df11 -a 0 -s 0x08004000 -D obj/$(PROJ_NAME).bin
4848
$(DFU_UTIL) -d 0483:df11 -a 0 -s 0x08000000:leave -D obj/bootstub.$(PROJ_NAME).bin

board/drivers/can.h

+46-21
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ extern uint32_t can_speed[4];
2626

2727
void can_set_forwarding(int from, int to);
2828

29-
void can_init(uint8_t can_number);
29+
bool can_init(uint8_t can_number);
3030
void can_init_all(void);
31+
bool can_tx_check_min_slots_free(uint32_t min);
3132
void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number, bool skip_tx_hook);
3233
bool can_pop(can_ring *q, CAN_FIFOMailBox_TypeDef *elem);
3334

@@ -107,6 +108,20 @@ bool can_push(can_ring *q, CAN_FIFOMailBox_TypeDef *elem) {
107108
return ret;
108109
}
109110

111+
uint32_t can_slots_empty(can_ring *q) {
112+
uint32_t ret = 0;
113+
114+
ENTER_CRITICAL();
115+
if (q->w_ptr >= q->r_ptr) {
116+
ret = q->fifo_size - 1U - q->w_ptr + q->r_ptr;
117+
} else {
118+
ret = q->r_ptr - q->w_ptr - 1U;
119+
}
120+
EXIT_CRITICAL();
121+
122+
return ret;
123+
}
124+
110125
void can_clear(can_ring *q) {
111126
ENTER_CRITICAL();
112127
q->w_ptr = 0;
@@ -133,27 +148,27 @@ uint32_t can_speed[] = {5000, 5000, 5000, 333};
133148

134149
#define CANIF_FROM_CAN_NUM(num) (cans[num])
135150
#define CAN_NUM_FROM_CANIF(CAN) ((CAN)==CAN1 ? 0 : ((CAN) == CAN2 ? 1 : 2))
136-
#define CAN_NAME_FROM_CANIF(CAN) ((CAN)==CAN1 ? "CAN1" : ((CAN) == CAN2 ? "CAN2" : "CAN3"))
137151
#define BUS_NUM_FROM_CAN_NUM(num) (bus_lookup[num])
138152
#define CAN_NUM_FROM_BUS_NUM(num) (can_num_lookup[num])
139153

140154
void process_can(uint8_t can_number);
141155

142-
void can_set_speed(uint8_t can_number) {
156+
bool can_set_speed(uint8_t can_number) {
157+
bool ret = true;
143158
CAN_TypeDef *CAN = CANIF_FROM_CAN_NUM(can_number);
144159
uint8_t bus_number = BUS_NUM_FROM_CAN_NUM(can_number);
145160

146-
if (!llcan_set_speed(CAN, can_speed[bus_number], can_loopback, (unsigned int)(can_silent) & (1U << can_number))) {
147-
puts("CAN init FAILED!!!!!\n");
148-
puth(can_number); puts(" ");
149-
puth(BUS_NUM_FROM_CAN_NUM(can_number)); puts("\n");
150-
}
161+
ret &= llcan_set_speed(CAN, can_speed[bus_number], can_loopback, (unsigned int)(can_silent) & (1U << can_number));
162+
return ret;
151163
}
152164

153165
void can_init_all(void) {
166+
bool ret = true;
154167
for (uint8_t i=0U; i < CAN_MAX; i++) {
155-
can_init(i);
168+
can_clear(can_queues[i]);
169+
ret &= can_init(i);
156170
}
171+
UNUSED(ret);
157172
}
158173

159174
void can_flip_buses(uint8_t bus1, uint8_t bus2){
@@ -179,7 +194,8 @@ void can_set_gmlan(uint8_t bus) {
179194
bus_lookup[prev_bus] = prev_bus;
180195
can_num_lookup[prev_bus] = prev_bus;
181196
can_num_lookup[3] = -1;
182-
can_init(prev_bus);
197+
bool ret = can_init(prev_bus);
198+
UNUSED(ret);
183199
break;
184200
default:
185201
// GMLAN was not set on either BUS 1 or 2
@@ -198,7 +214,8 @@ void can_set_gmlan(uint8_t bus) {
198214
bus_lookup[bus] = 3;
199215
can_num_lookup[bus] = -1;
200216
can_num_lookup[3] = bus;
201-
can_init(bus);
217+
bool ret = can_init(bus);
218+
UNUSED(ret);
202219
break;
203220
case 0xFF: //-1 unsigned
204221
break;
@@ -317,6 +334,10 @@ void process_can(uint8_t can_number) {
317334
CAN->sTxMailBox[0].TDHR = to_send.RDHR;
318335
CAN->sTxMailBox[0].TDTR = to_send.RDTR;
319336
CAN->sTxMailBox[0].TIR = to_send.RIR;
337+
338+
if (can_tx_check_min_slots_free(MAX_CAN_MSGS_PER_BULK_TRANSFER)) {
339+
usb_outep3_resume_if_paused();
340+
}
320341
}
321342
}
322343

@@ -342,11 +363,6 @@ void ignition_can_hook(CAN_FIFOMailBox_TypeDef *to_push) {
342363
// GTW_status
343364
ignition_can = (GET_BYTE(to_push, 0) & 0x1) != 0;
344365
}
345-
// Cadillac exception
346-
if ((addr == 0x160) && (len == 5)) {
347-
// this message isn't all zeros when ignition is on
348-
ignition_can = GET_BYTES_04(to_push) != 0;
349-
}
350366
}
351367
}
352368

@@ -405,6 +421,14 @@ void CAN3_TX_IRQ_Handler(void) { process_can(2); }
405421
void CAN3_RX0_IRQ_Handler(void) { can_rx(2); }
406422
void CAN3_SCE_IRQ_Handler(void) { can_sce(CAN3); }
407423

424+
bool can_tx_check_min_slots_free(uint32_t min) {
425+
return
426+
(can_slots_empty(&can_tx1_q) >= min) &&
427+
(can_slots_empty(&can_tx2_q) >= min) &&
428+
(can_slots_empty(&can_tx3_q) >= min) &&
429+
(can_slots_empty(&can_txgmlan_q) >= min);
430+
}
431+
408432
void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number, bool skip_tx_hook) {
409433
if (skip_tx_hook || safety_tx_hook(to_push) != 0) {
410434
if (bus_number < BUS_MAX) {
@@ -425,7 +449,9 @@ void can_set_forwarding(int from, int to) {
425449
can_forwarding[from] = to;
426450
}
427451

428-
void can_init(uint8_t can_number) {
452+
bool can_init(uint8_t can_number) {
453+
bool ret = false;
454+
429455
REGISTER_INTERRUPT(CAN1_TX_IRQn, CAN1_TX_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_1)
430456
REGISTER_INTERRUPT(CAN1_RX0_IRQn, CAN1_RX0_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_1)
431457
REGISTER_INTERRUPT(CAN1_SCE_IRQn, CAN1_SCE_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_1)
@@ -438,12 +464,11 @@ void can_init(uint8_t can_number) {
438464

439465
if (can_number != 0xffU) {
440466
CAN_TypeDef *CAN = CANIF_FROM_CAN_NUM(can_number);
441-
can_set_speed(can_number);
442-
443-
llcan_init(CAN);
444-
467+
ret &= can_set_speed(can_number);
468+
ret &= llcan_init(CAN);
445469
// in case there are queued up messages
446470
process_can(can_number);
447471
}
472+
return ret;
448473
}
449474

board/drivers/llcan.h

+95-56
Original file line numberDiff line numberDiff line change
@@ -11,82 +11,121 @@
1111
#define GET_BUS(msg) (((msg)->RDTR >> 4) & 0xFF)
1212
#define GET_LEN(msg) ((msg)->RDTR & 0xF)
1313
#define GET_ADDR(msg) ((((msg)->RIR & 4) != 0) ? ((msg)->RIR >> 3) : ((msg)->RIR >> 21))
14-
#define GET_BYTE(msg, b) (((int)(b) > 3) ? (((msg)->RDHR >> (8U * ((unsigned int)(b) % 4U))) & 0XFFU) : (((msg)->RDLR >> (8U * (unsigned int)(b))) & 0xFFU))
14+
#define GET_BYTE(msg, b) (((int)(b) > 3) ? (((msg)->RDHR >> (8U * ((unsigned int)(b) % 4U))) & 0xFFU) : (((msg)->RDLR >> (8U * (unsigned int)(b))) & 0xFFU))
1515
#define GET_BYTES_04(msg) ((msg)->RDLR)
1616
#define GET_BYTES_48(msg) ((msg)->RDHR)
1717

18+
#define CAN_INIT_TIMEOUT_MS 500U
19+
#define CAN_NAME_FROM_CANIF(CAN_DEV) (((CAN_DEV)==CAN1) ? "CAN1" : (((CAN_DEV) == CAN2) ? "CAN2" : "CAN3"))
20+
1821
void puts(const char *a);
1922

2023
bool llcan_set_speed(CAN_TypeDef *CAN_obj, uint32_t speed, bool loopback, bool silent) {
24+
bool ret = true;
25+
2126
// initialization mode
2227
register_set(&(CAN_obj->MCR), CAN_MCR_TTCM | CAN_MCR_INRQ, 0x180FFU);
23-
while((CAN_obj->MSR & CAN_MSR_INAK) != CAN_MSR_INAK);
24-
25-
// set time quanta from defines
26-
register_set(&(CAN_obj->BTR), ((CAN_BTR_TS1_0 * (CAN_SEQ1-1)) |
27-
(CAN_BTR_TS2_0 * (CAN_SEQ2-1)) |
28-
(can_speed_to_prescaler(speed) - 1U)), 0xC37F03FFU);
29-
30-
// silent loopback mode for debugging
31-
if (loopback) {
32-
register_set_bits(&(CAN_obj->BTR), CAN_BTR_SILM | CAN_BTR_LBKM);
33-
}
34-
if (silent) {
35-
register_set_bits(&(CAN_obj->BTR), CAN_BTR_SILM);
28+
uint32_t timeout_counter = 0U;
29+
while((CAN_obj->MSR & CAN_MSR_INAK) != CAN_MSR_INAK){
30+
// Delay for about 1ms
31+
delay(10000);
32+
timeout_counter++;
33+
34+
if(timeout_counter >= CAN_INIT_TIMEOUT_MS){
35+
puts(CAN_NAME_FROM_CANIF(CAN_obj)); puts(" set_speed timed out (1)!\n");
36+
ret = false;
37+
break;
38+
}
3639
}
3740

38-
// reset
39-
register_set(&(CAN_obj->MCR), CAN_MCR_TTCM | CAN_MCR_ABOM, 0x180FFU);
40-
41-
#define CAN_TIMEOUT 1000000
42-
int tmp = 0;
43-
bool ret = false;
44-
while(((CAN_obj->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) && (tmp < CAN_TIMEOUT)) tmp++;
45-
if (tmp < CAN_TIMEOUT) {
46-
ret = true;
41+
if(ret){
42+
// set time quanta from defines
43+
register_set(&(CAN_obj->BTR), ((CAN_BTR_TS1_0 * (CAN_SEQ1-1)) |
44+
(CAN_BTR_TS2_0 * (CAN_SEQ2-1)) |
45+
(can_speed_to_prescaler(speed) - 1U)), 0xC37F03FFU);
46+
47+
// silent loopback mode for debugging
48+
if (loopback) {
49+
register_set_bits(&(CAN_obj->BTR), CAN_BTR_SILM | CAN_BTR_LBKM);
50+
}
51+
if (silent) {
52+
register_set_bits(&(CAN_obj->BTR), CAN_BTR_SILM);
53+
}
54+
55+
// reset
56+
register_set(&(CAN_obj->MCR), CAN_MCR_TTCM | CAN_MCR_ABOM, 0x180FFU);
57+
58+
timeout_counter = 0U;
59+
while(((CAN_obj->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)) {
60+
// Delay for about 1ms
61+
delay(10000);
62+
timeout_counter++;
63+
64+
if(timeout_counter >= CAN_INIT_TIMEOUT_MS){
65+
puts(CAN_NAME_FROM_CANIF(CAN_obj)); puts(" set_speed timed out (2)!\n");
66+
ret = false;
67+
break;
68+
}
69+
}
4770
}
4871

4972
return ret;
5073
}
5174

52-
void llcan_init(CAN_TypeDef *CAN_obj) {
75+
bool llcan_init(CAN_TypeDef *CAN_obj) {
76+
bool ret = true;
77+
5378
// Enter init mode
5479
register_set_bits(&(CAN_obj->FMR), CAN_FMR_FINIT);
5580

5681
// Wait for INAK bit to be set
57-
while(((CAN_obj->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)) {}
58-
59-
// no mask
60-
// For some weird reason some of these registers do not want to set properly on CAN2 and CAN3. Probably something to do with the single/dual mode and their different filters.
61-
CAN_obj->sFilterRegister[0].FR1 = 0U;
62-
CAN_obj->sFilterRegister[0].FR2 = 0U;
63-
CAN_obj->sFilterRegister[14].FR1 = 0U;
64-
CAN_obj->sFilterRegister[14].FR2 = 0U;
65-
CAN_obj->FA1R |= 1U | (1U << 14);
66-
67-
// Exit init mode, do not wait
68-
register_clear_bits(&(CAN_obj->FMR), CAN_FMR_FINIT);
69-
70-
// enable certain CAN interrupts
71-
register_set_bits(&(CAN_obj->IER), CAN_IER_TMEIE | CAN_IER_FMPIE0 | CAN_IER_WKUIE);
72-
73-
if (CAN_obj == CAN1) {
74-
NVIC_EnableIRQ(CAN1_TX_IRQn);
75-
NVIC_EnableIRQ(CAN1_RX0_IRQn);
76-
NVIC_EnableIRQ(CAN1_SCE_IRQn);
77-
} else if (CAN_obj == CAN2) {
78-
NVIC_EnableIRQ(CAN2_TX_IRQn);
79-
NVIC_EnableIRQ(CAN2_RX0_IRQn);
80-
NVIC_EnableIRQ(CAN2_SCE_IRQn);
81-
#ifdef CAN3
82-
} else if (CAN_obj == CAN3) {
83-
NVIC_EnableIRQ(CAN3_TX_IRQn);
84-
NVIC_EnableIRQ(CAN3_RX0_IRQn);
85-
NVIC_EnableIRQ(CAN3_SCE_IRQn);
86-
#endif
87-
} else {
88-
puts("Invalid CAN: initialization failed\n");
82+
uint32_t timeout_counter = 0U;
83+
while(((CAN_obj->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)) {
84+
// Delay for about 1ms
85+
delay(10000);
86+
timeout_counter++;
87+
88+
if(timeout_counter >= CAN_INIT_TIMEOUT_MS){
89+
puts(CAN_NAME_FROM_CANIF(CAN_obj)); puts(" initialization timed out!\n");
90+
ret = false;
91+
break;
92+
}
8993
}
94+
95+
if(ret){
96+
// no mask
97+
// For some weird reason some of these registers do not want to set properly on CAN2 and CAN3. Probably something to do with the single/dual mode and their different filters.
98+
CAN_obj->sFilterRegister[0].FR1 = 0U;
99+
CAN_obj->sFilterRegister[0].FR2 = 0U;
100+
CAN_obj->sFilterRegister[14].FR1 = 0U;
101+
CAN_obj->sFilterRegister[14].FR2 = 0U;
102+
CAN_obj->FA1R |= 1U | (1U << 14);
103+
104+
// Exit init mode, do not wait
105+
register_clear_bits(&(CAN_obj->FMR), CAN_FMR_FINIT);
106+
107+
// enable certain CAN interrupts
108+
register_set_bits(&(CAN_obj->IER), CAN_IER_TMEIE | CAN_IER_FMPIE0 | CAN_IER_WKUIE);
109+
110+
if (CAN_obj == CAN1) {
111+
NVIC_EnableIRQ(CAN1_TX_IRQn);
112+
NVIC_EnableIRQ(CAN1_RX0_IRQn);
113+
NVIC_EnableIRQ(CAN1_SCE_IRQn);
114+
} else if (CAN_obj == CAN2) {
115+
NVIC_EnableIRQ(CAN2_TX_IRQn);
116+
NVIC_EnableIRQ(CAN2_RX0_IRQn);
117+
NVIC_EnableIRQ(CAN2_SCE_IRQn);
118+
#ifdef CAN3
119+
} else if (CAN_obj == CAN3) {
120+
NVIC_EnableIRQ(CAN3_TX_IRQn);
121+
NVIC_EnableIRQ(CAN3_RX0_IRQn);
122+
NVIC_EnableIRQ(CAN3_SCE_IRQn);
123+
#endif
124+
} else {
125+
puts("Invalid CAN: initialization failed\n");
126+
}
127+
}
128+
return ret;
90129
}
91130

92131
void llcan_clear_send(CAN_TypeDef *CAN_obj) {

0 commit comments

Comments
 (0)