MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / virtio_input_control

Function virtio_input_control

components/drivers/virtio/virtio_input.c:178–270  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

176}
177
178static rt_err_t virtio_input_control(rt_device_t dev, int cmd, void *args)
179{
180 rt_err_t status = RT_EOK;
181 struct virtio_input_device *virtio_input_dev = (struct virtio_input_device *)dev;
182 struct virtio_device *virtio_dev = &virtio_input_dev->virtio_dev;
183 struct virtio_input_config *config = virtio_input_dev->config;
184
185 if (args == RT_NULL)
186 {
187 return -RT_ERROR;
188 }
189
190 switch (cmd)
191 {
192 case VIRTIO_DEVICE_CTRL_INPUT_GET_TYPE:
193
194 *(enum virtio_input_type *)args = virtio_input_dev->type;
195
196 break;
197 case VIRTIO_DEVICE_CTRL_INPUT_BIND_BSCT_HANDLER:
198
199 virtio_input_dev->bsct_handler = args;
200
201 break;
202 case VIRTIO_DEVICE_CTRL_INPUT_GET_ABS_X_INFO:
203
204 virtio_input_cfg_select(virtio_input_dev, VIRTIO_INPUT_CFG_ABS_INFO, VIRTIO_INPUT_ABS_AXIS_X);
205 rt_memcpy(args, config, sizeof(struct virtio_input_config));
206
207 break;
208 case VIRTIO_DEVICE_CTRL_INPUT_GET_ABS_Y_INFO:
209
210 virtio_input_cfg_select(virtio_input_dev, VIRTIO_INPUT_CFG_ABS_INFO, VIRTIO_INPUT_ABS_AXIS_Y);
211 rt_memcpy(args, config, sizeof(struct virtio_input_config));
212
213 break;
214 case VIRTIO_DEVICE_CTRL_INPUT_SET_STATUS:
215 {
216 rt_uint16_t id;
217 void *addr;
218 struct virtq *queue_status = &virtio_dev->queues[VIRTIO_INPUT_QUEUE_STATUS];
219
220#ifdef RT_USING_SMP
221 rt_base_t level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
222#endif
223 id = queue_status->avail->idx % queue_status->num;
224 addr = &virtio_input_dev->xmit_events[id];
225
226 rt_memcpy(addr, args, sizeof(struct virtio_input_event));
227
228 virtio_free_desc(virtio_dev, VIRTIO_INPUT_QUEUE_STATUS, id);
229
230 virtio_fill_desc(virtio_dev, VIRTIO_INPUT_QUEUE_STATUS, id,
231 VIRTIO_VA2PA(addr), sizeof(struct virtio_input_event), 0, 0);
232
233 virtio_submit_chain(virtio_dev, VIRTIO_INPUT_QUEUE_STATUS, id);
234
235 virtio_queue_notify(virtio_dev, VIRTIO_INPUT_QUEUE_STATUS);

Callers

nothing calls this directly

Calls 9

virtio_input_cfg_selectFunction · 0.85
rt_memcpyFunction · 0.85
virtio_free_descFunction · 0.85
virtio_fill_descFunction · 0.85
virtio_submit_chainFunction · 0.85
virtio_queue_notifyFunction · 0.85
virtio_alloc_descFunction · 0.85
rt_spin_lock_irqsaveFunction · 0.50

Tested by

no test coverage detected