1
1
#include "i2csniffer.h"
2
2
3
- void clearSnifferBuffers (i2csniffer * sniffer ) {
3
+ void clear_sniffer_buffers (i2cSniffer * i2c_sniffer ) {
4
+ furi_assert (i2c_sniffer );
4
5
for (uint8_t i = 0 ; i < MAX_RECORDS ; i ++ ) {
5
6
for (uint8_t j = 0 ; j < MAX_MESSAGE_SIZE ; j ++ ) {
6
- sniffer -> frames [i ].ack [j ] = false;
7
- sniffer -> frames [i ].data [j ] = 0 ;
7
+ i2c_sniffer -> frames [i ].ack [j ] = false;
8
+ i2c_sniffer -> frames [i ].data [j ] = 0 ;
8
9
}
9
- sniffer -> frames [i ].bit_index = 0 ;
10
- sniffer -> frames [i ].data_index = 0 ;
10
+ i2c_sniffer -> frames [i ].bit_index = 0 ;
11
+ i2c_sniffer -> frames [i ].data_index = 0 ;
11
12
}
12
- sniffer -> frame_index = 0 ;
13
- sniffer -> state = I2C_BUS_FREE ;
14
- sniffer -> first = true;
13
+ i2c_sniffer -> frame_index = 0 ;
14
+ i2c_sniffer -> state = I2C_BUS_FREE ;
15
+ i2c_sniffer -> first = true;
15
16
}
16
17
17
- void start_interrupts (i2csniffer * sniffer ) {
18
+ void start_interrupts (i2cSniffer * i2c_sniffer ) {
19
+ furi_assert (i2c_sniffer );
18
20
furi_hal_gpio_init (pinSCL , GpioModeInterruptRise , GpioPullNo , GpioSpeedHigh );
19
- furi_hal_gpio_add_int_callback (pinSCL , SCLcallback , sniffer );
21
+ furi_hal_gpio_add_int_callback (pinSCL , SCLcallback , i2c_sniffer );
20
22
21
23
// Add Rise and Fall Interrupt on SDA pin
22
24
furi_hal_gpio_init (pinSDA , GpioModeInterruptRiseFall , GpioPullNo , GpioSpeedHigh );
23
- furi_hal_gpio_add_int_callback (pinSDA , SDAcallback , sniffer );
25
+ furi_hal_gpio_add_int_callback (pinSDA , SDAcallback , i2c_sniffer );
24
26
}
25
27
26
28
void stop_interrupts () {
@@ -30,50 +32,63 @@ void stop_interrupts() {
30
32
31
33
// Called on Fallin/Rising SDA
32
34
// Used to monitor i2c bus state
33
- void SDAcallback (void * _sniffer ) {
34
- i2csniffer * sniffer = _sniffer ;
35
+ void SDAcallback (void * _i2c_sniffer ) {
36
+ i2cSniffer * i2c_sniffer = _i2c_sniffer ;
35
37
// SCL is low maybe cclock strecching
36
38
if (furi_hal_gpio_read (pinSCL ) == false) {
37
39
return ;
38
40
}
39
41
// Check for stop condition: SDA rising while SCL is High
40
- if (sniffer -> state == I2C_BUS_STARTED ) {
42
+ if (i2c_sniffer -> state == I2C_BUS_STARTED ) {
41
43
if (furi_hal_gpio_read (pinSDA ) == true) {
42
- sniffer -> state = I2C_BUS_FREE ;
44
+ i2c_sniffer -> state = I2C_BUS_FREE ;
43
45
}
44
46
}
45
47
// Check for start condition: SDA falling while SCL is high
46
48
else if (furi_hal_gpio_read (pinSDA ) == false) {
47
- sniffer -> state = I2C_BUS_STARTED ;
48
- if (sniffer -> first ) {
49
- sniffer -> first = false;
49
+ i2c_sniffer -> state = I2C_BUS_STARTED ;
50
+ if (i2c_sniffer -> first ) {
51
+ i2c_sniffer -> first = false;
50
52
return ;
51
53
}
52
- sniffer -> frame_index ++ ;
53
- if (sniffer -> frame_index >= MAX_RECORDS ) {
54
- clearSnifferBuffers ( sniffer );
54
+ i2c_sniffer -> frame_index ++ ;
55
+ if (i2c_sniffer -> frame_index >= MAX_RECORDS ) {
56
+ clear_sniffer_buffers ( i2c_sniffer );
55
57
}
56
58
}
57
59
return ;
58
60
}
59
61
60
62
// Called on Rising SCL
61
63
// Used to read bus datas
62
- void SCLcallback (void * _sniffer ) {
63
- i2csniffer * sniffer = _sniffer ;
64
- if (sniffer -> state == I2C_BUS_FREE ) {
64
+ void SCLcallback (void * _i2c_sniffer ) {
65
+ i2cSniffer * i2c_sniffer = _i2c_sniffer ;
66
+ if (i2c_sniffer -> state == I2C_BUS_FREE ) {
65
67
return ;
66
68
}
67
- uint8_t frame = sniffer -> frame_index ;
68
- uint8_t bit = sniffer -> frames [frame ].bit_index ;
69
- uint8_t data_idx = sniffer -> frames [frame ].data_index ;
69
+ uint8_t frame = i2c_sniffer -> frame_index ;
70
+ uint8_t bit = i2c_sniffer -> frames [frame ].bit_index ;
71
+ uint8_t data_idx = i2c_sniffer -> frames [frame ].data_index ;
70
72
if (bit < 8 ) {
71
- sniffer -> frames [frame ].data [data_idx ] <<= 1 ;
72
- sniffer -> frames [frame ].data [data_idx ] |= (int )furi_hal_gpio_read (pinSDA );
73
- sniffer -> frames [frame ].bit_index ++ ;
73
+ i2c_sniffer -> frames [frame ].data [data_idx ] <<= 1 ;
74
+ i2c_sniffer -> frames [frame ].data [data_idx ] |= (int )furi_hal_gpio_read (pinSDA );
75
+ i2c_sniffer -> frames [frame ].bit_index ++ ;
74
76
} else {
75
- sniffer -> frames [frame ].ack [data_idx ] = !furi_hal_gpio_read (pinSDA );
76
- sniffer -> frames [frame ].data_index ++ ;
77
- sniffer -> frames [frame ].bit_index = 0 ;
77
+ i2c_sniffer -> frames [frame ].ack [data_idx ] = !furi_hal_gpio_read (pinSDA );
78
+ i2c_sniffer -> frames [frame ].data_index ++ ;
79
+ i2c_sniffer -> frames [frame ].bit_index = 0 ;
78
80
}
79
81
}
82
+
83
+ i2cSniffer * i2c_sniffer_alloc () {
84
+ i2cSniffer * i2c_sniffer = malloc (sizeof (i2cSniffer ));
85
+ i2c_sniffer -> started = false;
86
+ clear_sniffer_buffers (i2c_sniffer );
87
+ return i2c_sniffer ;
88
+ }
89
+
90
+ void i2c_sniffer_free (i2cSniffer * i2c_sniffer ) {
91
+ furi_assert (i2c_sniffer );
92
+ furi_check (i2c_sniffer -> started == false);
93
+ free (i2c_sniffer );
94
+ }
0 commit comments