@@ -37,8 +37,8 @@ enum mouse_report_idx {
37
37
MOUSE_REPORT_COUNT = 4 ,
38
38
};
39
39
40
- static uint8_t __aligned ( sizeof ( void * )) report [ MOUSE_REPORT_COUNT ] ;
41
- static K_SEM_DEFINE (report_sem , 0 , 1 ) ;
40
+ K_MSGQ_DEFINE ( mouse_msgq , MOUSE_REPORT_COUNT , 2 , 1 ) ;
41
+ static K_SEM_DEFINE (ep_write_sem , 0 , 1 ) ;
42
42
43
43
static inline void status_cb (enum usb_dc_status_code status , const uint8_t * param )
44
44
{
@@ -57,9 +57,7 @@ static ALWAYS_INLINE void rwup_if_suspended(void)
57
57
58
58
static void input_cb (struct input_event * evt )
59
59
{
60
- uint8_t tmp [MOUSE_REPORT_COUNT ];
61
-
62
- (void )memcpy (tmp , report , sizeof (tmp ));
60
+ static uint8_t tmp [MOUSE_REPORT_COUNT ];
63
61
64
62
switch (evt -> code ) {
65
63
case INPUT_KEY_0 :
@@ -88,10 +86,13 @@ static void input_cb(struct input_event *evt)
88
86
return ;
89
87
}
90
88
91
- if (memcmp (tmp , report , sizeof (tmp ))) {
92
- memcpy (report , tmp , sizeof (report ));
93
- k_sem_give (& report_sem );
89
+ if (k_msgq_put (& mouse_msgq , tmp , K_NO_WAIT ) != 0 ) {
90
+ LOG_ERR ("Failed to put new input event" );
94
91
}
92
+
93
+ tmp [MOUSE_X_REPORT_IDX ] = 0U ;
94
+ tmp [MOUSE_Y_REPORT_IDX ] = 0U ;
95
+
95
96
}
96
97
97
98
INPUT_CALLBACK_DEFINE (NULL , input_cb );
@@ -120,6 +121,16 @@ static int enable_usb_device_next(void)
120
121
}
121
122
#endif /* defined(CONFIG_USB_DEVICE_STACK_NEXT) */
122
123
124
+ static void int_in_ready_cb (const struct device * dev )
125
+ {
126
+ ARG_UNUSED (dev );
127
+ k_sem_give (& ep_write_sem );
128
+ }
129
+
130
+ static const struct hid_ops ops = {
131
+ .int_in_ready = int_in_ready_cb ,
132
+ };
133
+
123
134
int main (void )
124
135
{
125
136
const struct device * hid_dev ;
@@ -148,7 +159,7 @@ int main(void)
148
159
149
160
usb_hid_register_device (hid_dev ,
150
161
hid_report_desc , sizeof (hid_report_desc ),
151
- NULL );
162
+ & ops );
152
163
153
164
usb_hid_init (hid_dev );
154
165
@@ -163,19 +174,17 @@ int main(void)
163
174
}
164
175
165
176
while (true) {
166
- k_sem_take (& report_sem , K_FOREVER );
177
+ uint8_t __aligned (sizeof (void * )) report [MOUSE_REPORT_COUNT ];
178
+
179
+ k_msgq_get (& mouse_msgq , & report , K_FOREVER );
167
180
168
181
ret = hid_int_ep_write (hid_dev , report , sizeof (report ), NULL );
169
- report [MOUSE_X_REPORT_IDX ] = 0U ;
170
- report [MOUSE_Y_REPORT_IDX ] = 0U ;
171
182
if (ret ) {
172
183
LOG_ERR ("HID write error, %d" , ret );
173
- }
174
-
175
- /* Toggle LED on sent report */
176
- ret = gpio_pin_toggle (led0 .port , led0 .pin );
177
- if (ret < 0 ) {
178
- LOG_ERR ("Failed to toggle the LED pin, error: %d" , ret );
184
+ } else {
185
+ k_sem_take (& ep_write_sem , K_FOREVER );
186
+ /* Toggle LED on sent report */
187
+ (void )gpio_pin_toggle (led0 .port , led0 .pin );
179
188
}
180
189
}
181
190
return 0 ;
0 commit comments