panda is the nicest universal car interface ever.
It supports 3x CAN, 2x LIN, and 1x GMLAN. It also charges a phone. On the computer side, it has both USB and Wi-Fi.
It uses an STM32F413 for low level stuff and an ESP8266 for Wi-Fi. They are connected over high speed SPI, so the panda is actually capable of dumping the full contents of the busses over Wi-Fi, unlike every other dongle on amazon. ELM327 is weak, panda is strong.
It is 2nd gen hardware, reusing code and parts from the NEO interface board.
To install the library:
# pip install pandacan
See this class for how to interact with the panda.
For example, to receive CAN messages:
>>> from panda import Panda
>>> panda = Panda()
>>> panda.can_recv()
And to send one on bus 0:
>>> panda.can_send(0x1aa, "message", 0)
Find user made scripts on the wiki
See PandaJS
As a universal car interface, it should support every reasonable software interface.
- board -- Code that runs on the STM32
- boardesp -- Code that runs on the ESP8266
- drivers -- Drivers (not needed for use with python)
- python -- Python userspace library for interfacing with the panda
- tests -- Tests and helper programs for panda
To print out the serial console from the STM32, run tests/debug_console.py
To print out the serial console from the ESP8266, run PORT=1 tests/debug_console.py
When a panda powers up, by default it's in "SAFETY_NOOUTPUT" mode. While in no output mode, the buses are also forced to be silent. In order to send messages, you have to select a safety mode. Currently, setting safety modes is only supported over USB.
Safety modes can also optionally support "controls_allowed", which allows or blocks a subset of messages based on a piece of state in the board.
Check out the hardware guide
panda software is released under the MIT license unless otherwise specified.
uint32_t firmware_len uint8_t code[firmware_len-4] uint8_t signature[RSANUMBYTES-SHA_DIGEST_SIZE] //RSANUMBYTES=128 uint8_t sha_hash_digest[SHA_DIGEST_SIZE] //SHA_DIGEST_SIZE=20
RSA_verify():
digest = sha(code,firmware_len-4)
signature_out = modpow(public_key, signature_in)
for(i= RSANUMBYTES-SHA_DIGEST_SIZE; i<RSANUMBYTES; i++){
signature_out[i] ^= sha_hash_digest[i]
}
signature_out[] must be is following:
static const uint8_t sha_padding_1024[RSANUMBYTES] = {
0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
...
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00,
// 20 bytes of hash go here.
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
因此,firmware生成如下
- get code[]
- get code_len
- get sha(code, code_len) //20byte
- fill sha_padding_1024 后20个字节
- modpow(private_key, sha_padding_1024)
- code[code_len]+sha_padding_1024[] is total firmware
UART1 ESP8266 UART2 Debug Serial UART5 L-Line