@@ -70,28 +70,33 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, int hardwired) {
70
70
71
71
#endif
72
72
73
- // ***************************** honda can checksum *****************************
74
-
75
- int can_cksum (uint8_t * dat , int len , int addr , int idx ) {
76
- int i ;
77
- int s = 0 ;
78
- for (i = 0 ; i < len ; i ++ ) {
79
- s += (dat [i ] >> 4 );
80
- s += dat [i ] & 0xF ;
73
+ // ***************************** pedal can checksum *****************************
74
+
75
+ uint8_t pedal_checksum (uint8_t * dat , int len ) {
76
+ uint8_t crc = 0xFF ;
77
+ uint8_t poly = 0xD5 ; // standard crc8
78
+ int i , j ;
79
+ for (i = len - 1 ; i >= 0 ; i -- ) {
80
+ crc ^= dat [i ];
81
+ for (j = 0 ; j < 8 ; j ++ ) {
82
+ if ((crc & 0x80 ) != 0 ) {
83
+ crc = (uint8_t )((crc << 1 ) ^ poly );
84
+ }
85
+ else {
86
+ crc <<= 1 ;
87
+ }
88
+ }
81
89
}
82
- s += (addr >>0 )& 0xF ;
83
- s += (addr >>4 )& 0xF ;
84
- s += (addr >>8 )& 0xF ;
85
- s += idx ;
86
- s = 8 - s ;
87
- return s & 0xF ;
90
+ return crc ;
88
91
}
89
92
90
93
// ***************************** can port *****************************
91
94
92
95
// addresses to be used on CAN
93
96
#define CAN_GAS_INPUT 0x200
94
97
#define CAN_GAS_OUTPUT 0x201
98
+ #define CAN_GAS_SIZE 6
99
+ #define COUNTER_CYCLE 0xF
95
100
96
101
void CAN1_TX_IRQHandler () {
97
102
// clear interrupt
@@ -134,14 +139,19 @@ void CAN1_RX0_IRQHandler() {
134
139
}
135
140
136
141
// normal packet
137
- uint8_t * dat = (uint8_t * )& CAN -> sFIFOMailBox [0 ].RDLR ;
138
- uint8_t * dat2 = (uint8_t * )& CAN -> sFIFOMailBox [0 ].RDHR ;
142
+ uint8_t dat [8 ];
143
+ uint8_t * rdlr = (uint8_t * )& CAN -> sFIFOMailBox [0 ].RDLR ;
144
+ uint8_t * rdhr = (uint8_t * )& CAN -> sFIFOMailBox [0 ].RDHR ;
145
+ for (int i = 0 ; i < 4 ; i ++ ) {
146
+ dat [i ] = rdlr [i ];
147
+ dat [i + 4 ] = rdhr [i ];
148
+ }
139
149
uint16_t value_0 = (dat [0 ] << 8 ) | dat [1 ];
140
150
uint16_t value_1 = (dat [2 ] << 8 ) | dat [3 ];
141
- uint8_t enable = (dat2 [ 0 ] >> 7 ) & 1 ;
142
- uint8_t index = ( dat2 [ 1 ] >> 4 ) & 3 ;
143
- if (can_cksum (dat , 5 , CAN_GAS_INPUT , index ) == ( dat2 [ 1 ] & 0xF ) ) {
144
- if (((current_index + 1 ) & 3 ) == index ) {
151
+ uint8_t enable = (dat [ 4 ] >> 7 ) & 1 ;
152
+ uint8_t index = dat [ 4 ] & COUNTER_CYCLE ;
153
+ if (pedal_checksum (dat , CAN_GAS_SIZE - 1 ) == dat [ 5 ] ) {
154
+ if (((current_index + 1 ) & COUNTER_CYCLE ) == index ) {
145
155
#ifdef DEBUG
146
156
puts ("setting gas " );
147
157
puth (value );
@@ -196,18 +206,18 @@ void TIM3_IRQHandler() {
196
206
// check timer for sending the user pedal and clearing the CAN
197
207
if ((CAN -> TSR & CAN_TSR_TME0 ) == CAN_TSR_TME0 ) {
198
208
uint8_t dat [8 ];
199
- dat [0 ] = (pdl0 >>8 )& 0xFF ;
200
- dat [1 ] = (pdl0 >>0 )& 0xFF ;
201
- dat [2 ] = (pdl1 >>8 )& 0xFF ;
202
- dat [3 ] = (pdl1 >>0 )& 0xFF ;
203
- dat [4 ] = state ;
204
- dat [5 ] = can_cksum (dat , 5 , CAN_GAS_OUTPUT , pkt_idx ) | ( pkt_idx << 4 );
209
+ dat [0 ] = (pdl0 >>8 ) & 0xFF ;
210
+ dat [1 ] = (pdl0 >>0 ) & 0xFF ;
211
+ dat [2 ] = (pdl1 >>8 ) & 0xFF ;
212
+ dat [3 ] = (pdl1 >>0 ) & 0xFF ;
213
+ dat [4 ] = ( state & 0xF ) << 4 | pkt_idx ;
214
+ dat [5 ] = pedal_checksum (dat , CAN_GAS_SIZE - 1 );
205
215
CAN -> sTxMailBox [0 ].TDLR = dat [0 ] | (dat [1 ]<<8 ) | (dat [2 ]<<16 ) | (dat [3 ]<<24 );
206
216
CAN -> sTxMailBox [0 ].TDHR = dat [4 ] | (dat [5 ]<<8 );
207
217
CAN -> sTxMailBox [0 ].TDTR = 6 ; // len of packet is 5
208
218
CAN -> sTxMailBox [0 ].TIR = (CAN_GAS_OUTPUT << 21 ) | 1 ;
209
219
++ pkt_idx ;
210
- pkt_idx &= 3 ;
220
+ pkt_idx &= COUNTER_CYCLE ;
211
221
} else {
212
222
// old can packet hasn't sent!
213
223
state = FAULT_SEND ;
0 commit comments