| 340 | } |
| 341 | |
| 342 | rt_err_t rt_virtio_input_init(rt_ubase_t *mmio_base, rt_uint32_t irq) |
| 343 | { |
| 344 | rt_uint32_t flag; |
| 345 | static int dev_no = 0; |
| 346 | char dev_name[RT_NAME_MAX]; |
| 347 | struct virtio_device *virtio_dev; |
| 348 | struct virtio_input_device *virtio_input_dev; |
| 349 | |
| 350 | virtio_input_dev = rt_malloc(sizeof(struct virtio_input_device)); |
| 351 | |
| 352 | if (virtio_input_dev == RT_NULL) |
| 353 | { |
| 354 | goto _alloc_fail; |
| 355 | } |
| 356 | |
| 357 | virtio_dev = &virtio_input_dev->virtio_dev; |
| 358 | virtio_dev->irq = irq; |
| 359 | virtio_dev->mmio_base = mmio_base; |
| 360 | |
| 361 | virtio_input_dev->config = (struct virtio_input_config *)virtio_dev->mmio_config->config; |
| 362 | virtio_input_dev->bsct_handler = RT_NULL; |
| 363 | |
| 364 | #ifdef RT_USING_SMP |
| 365 | rt_spin_lock_init(&virtio_dev->spinlock); |
| 366 | #endif |
| 367 | |
| 368 | virtio_reset_device(virtio_dev); |
| 369 | virtio_status_acknowledge_driver(virtio_dev); |
| 370 | |
| 371 | virtio_dev->mmio_config->driver_features = virtio_dev->mmio_config->device_features & ~( |
| 372 | (1 << VIRTIO_F_RING_EVENT_IDX) | |
| 373 | (1 << VIRTIO_F_RING_INDIRECT_DESC)); |
| 374 | |
| 375 | virtio_status_driver_ok(virtio_dev); |
| 376 | |
| 377 | if (virtio_queues_alloc(virtio_dev, 2) != RT_EOK) |
| 378 | { |
| 379 | goto _alloc_fail; |
| 380 | } |
| 381 | |
| 382 | if (virtio_queue_init(virtio_dev, VIRTIO_INPUT_QUEUE_EVENT, VIRTIO_INPUT_EVENT_QUEUE_SIZE) != RT_EOK) |
| 383 | { |
| 384 | goto _alloc_fail; |
| 385 | } |
| 386 | |
| 387 | if (virtio_queue_init(virtio_dev, VIRTIO_INPUT_QUEUE_STATUS, VIRTIO_INPUT_STATUS_QUEUE_SIZE) != RT_EOK) |
| 388 | { |
| 389 | virtio_queue_destroy(virtio_dev, VIRTIO_INPUT_QUEUE_EVENT); |
| 390 | |
| 391 | goto _alloc_fail; |
| 392 | } |
| 393 | |
| 394 | virtio_input_cfg_select(virtio_input_dev, VIRTIO_INPUT_CFG_ID_DEVIDS, 0); |
| 395 | |
| 396 | if (virtio_input_dev->config->ids.product == EV_ABS) |
| 397 | { |
| 398 | virtio_input_dev->type = VIRTIO_INPUT_TYPE_TABLET; |
| 399 |
nothing calls this directly
no test coverage detected