mirror of https://github.com/commaai/panda.git
ELM327: Added ISO 14230-4 (KWP FAST) wakeup pulse.
This commit is contained in:
parent
04e37c2d5d
commit
63af60c1b0
|
@ -212,6 +212,7 @@ static int ICACHE_FLASH_ATTR panda_usbemu_ctrl_write(uint8_t request_type, uint8
|
||||||
#define panda_set_can0_cbaud(cbps) panda_usbemu_ctrl_write(0x40, 0xde, 0, cbps, 0)
|
#define panda_set_can0_cbaud(cbps) panda_usbemu_ctrl_write(0x40, 0xde, 0, cbps, 0)
|
||||||
#define panda_set_can0_kbaud(kbps) panda_usbemu_ctrl_write(0x40, 0xde, 0, kbps*10, 0)
|
#define panda_set_can0_kbaud(kbps) panda_usbemu_ctrl_write(0x40, 0xde, 0, kbps*10, 0)
|
||||||
#define panda_set_safety_mode(mode) panda_usbemu_ctrl_write(0x40, 0xdc, mode, 0, 0)
|
#define panda_set_safety_mode(mode) panda_usbemu_ctrl_write(0x40, 0xdc, mode, 0, 0)
|
||||||
|
#define panda_kline_wakeup_pulse() panda_usbemu_ctrl_write(0x40, 0xf0, 0, 0, 0)
|
||||||
|
|
||||||
static int ICACHE_FLASH_ATTR panda_usbemu_can_read(panda_can_msg_t** can_msgs) {
|
static int ICACHE_FLASH_ATTR panda_usbemu_can_read(panda_can_msg_t** can_msgs) {
|
||||||
int returned_count = spi_comm((uint8_t *)((const uint16 []){1,0}), 4, pandaRecvData, 0x40);
|
int returned_count = spi_comm((uint8_t *)((const uint16 []){1,0}), 4, pandaRecvData, 0x40);
|
||||||
|
@ -532,7 +533,7 @@ int ICACHE_FLASH_ATTR elm_LINFast_process_echo() {
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
#ifdef ELM_DEBUG
|
#ifdef ELM_DEBUG
|
||||||
os_printf("Somehow failed\n");
|
os_printf("Echo not correct.\n");
|
||||||
os_printf(" RB Data (%d %d %d): ", lin_ringbuff_start, lin_ringbuff_end, lin_ringbuff_len);
|
os_printf(" RB Data (%d %d %d): ", lin_ringbuff_start, lin_ringbuff_end, lin_ringbuff_len);
|
||||||
for(int i = 0; i < sizeof(lin_ringbuff); i++)
|
for(int i = 0; i < sizeof(lin_ringbuff); i++)
|
||||||
os_printf("%02x ", lin_ringbuff[i]);
|
os_printf("%02x ", lin_ringbuff[i]);
|
||||||
|
@ -543,8 +544,14 @@ int ICACHE_FLASH_ATTR elm_LINFast_process_echo() {
|
||||||
os_printf("\n");
|
os_printf("\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if(lin_bus_initialized) {
|
||||||
lin_ringbuff_clear();
|
lin_ringbuff_clear();
|
||||||
return -1;
|
return -1;
|
||||||
|
} else {
|
||||||
|
os_printf("Lin init echo misaligned? Consuming byte (%02x). Retry.\n", lin_ringbuff_get(0));
|
||||||
|
lin_ringbuff_consume(1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -658,6 +665,10 @@ void ICACHE_FLASH_ATTR elm_LINFast_businit_timer_cb(void *arg){
|
||||||
|
|
||||||
if(echo_result == -1 || (echo_result == 0 && loopcount == 0)) {
|
if(echo_result == -1 || (echo_result == 0 && loopcount == 0)) {
|
||||||
os_printf("Init failed with echo test\n");
|
os_printf("Init failed with echo test\n");
|
||||||
|
|
||||||
|
loopcount = 0;
|
||||||
|
lin_bus_initialized = 0;
|
||||||
|
|
||||||
if(!is_auto_detecting){
|
if(!is_auto_detecting){
|
||||||
if(echo_result == -1)
|
if(echo_result == -1)
|
||||||
elm_append_rsp_const("BUS ERROR\r\r>");
|
elm_append_rsp_const("BUS ERROR\r\r>");
|
||||||
|
@ -667,8 +678,6 @@ void ICACHE_FLASH_ATTR elm_LINFast_businit_timer_cb(void *arg){
|
||||||
} else {
|
} else {
|
||||||
elm_autodetect_cb(false);
|
elm_autodetect_cb(false);
|
||||||
}
|
}
|
||||||
loopcount = 0;
|
|
||||||
lin_bus_initialized = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -785,6 +794,8 @@ static void ICACHE_FLASH_ATTR elm_process_obd_cmd_LINFast(const elm_protocol_t*
|
||||||
bytelen = 1;
|
bytelen = 1;
|
||||||
msg.dat[0] = 0x81;
|
msg.dat[0] = 0x81;
|
||||||
msg.dat[1] = 0x81; // checksum
|
msg.dat[1] = 0x81; // checksum
|
||||||
|
|
||||||
|
panda_kline_wakeup_pulse();
|
||||||
} else {
|
} else {
|
||||||
bytelen = min(bytelen, 7);
|
bytelen = min(bytelen, 7);
|
||||||
for(int i = 0; i < bytelen; i++){
|
for(int i = 0; i < bytelen; i++){
|
||||||
|
|
|
@ -84,7 +84,7 @@ class ELMCarSimulator():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
lin_buff += lin_msg
|
lin_buff += lin_msg
|
||||||
if lin_buff.endswith(b'\xc1\x33\xf1\x81\x66'):
|
if lin_buff.endswith(b'\x00\xc1\x33\xf1\x81\x66'): # Leading 0 is wakeup
|
||||||
lin_buff = bytearray()
|
lin_buff = bytearray()
|
||||||
self.__lin_active = True
|
self.__lin_active = True
|
||||||
print("GOT LIN (KWP FAST) WAKEUP SIGNAL")
|
print("GOT LIN (KWP FAST) WAKEUP SIGNAL")
|
||||||
|
@ -111,7 +111,7 @@ class ELMCarSimulator():
|
||||||
RECV = 0xF1
|
RECV = 0xF1
|
||||||
SEND = 0x33 # Car OBD Functional Address
|
SEND = 0x33 # Car OBD Functional Address
|
||||||
headers = struct.pack("BBB", PHYS_ADDR | len(msg), RECV, to_addr)
|
headers = struct.pack("BBB", PHYS_ADDR | len(msg), RECV, to_addr)
|
||||||
print(" Sending LIN", binascii.hexlify(headers+msg))
|
print(" Sending LIN", binascii.hexlify(headers+msg), hex(sum(bytearray(headers+msg))%0x100))
|
||||||
self.panda.kline_send(headers + msg)
|
self.panda.kline_send(headers + msg)
|
||||||
|
|
||||||
def __reset_lin_timeout(self):
|
def __reset_lin_timeout(self):
|
||||||
|
@ -165,6 +165,7 @@ class ELMCarSimulator():
|
||||||
while not self.__stop:
|
while not self.__stop:
|
||||||
for address, ts, data, src in self.panda.can_recv():
|
for address, ts, data, src in self.panda.can_recv():
|
||||||
if self.__on and src is 0 and len(data) == 8 and data[0] >= 2:
|
if self.__on and src is 0 and len(data) == 8 and data[0] >= 2:
|
||||||
|
print("Processing CAN message", src, hex(address), binascii.hexlify(data))
|
||||||
self.__can_process_msg(data[1], data[2], address, ts, data, src)
|
self.__can_process_msg(data[1], data[2], address, ts, data, src)
|
||||||
else:
|
else:
|
||||||
print("Rejecting CAN message", src, hex(address), binascii.hexlify(data))
|
print("Rejecting CAN message", src, hex(address), binascii.hexlify(data))
|
||||||
|
|
Loading…
Reference in New Issue