| 176 | } |
| 177 | |
| 178 | static 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); |
nothing calls this directly
no test coverage detected