| 102 | } |
| 103 | |
| 104 | static rt_err_t virtio_input_init(rt_device_t dev) |
| 105 | { |
| 106 | int i; |
| 107 | rt_uint16_t idx[VIRTIO_INPUT_QUEUE_MAX_SIZE]; |
| 108 | struct virtio_input_device *virtio_input_dev = (struct virtio_input_device *)dev; |
| 109 | struct virtio_device *virtio_dev = &virtio_input_dev->virtio_dev; |
| 110 | struct virtq *queue_event, *queue_status; |
| 111 | |
| 112 | virtio_input_cfg_bits(virtio_input_dev, VIRTIO_INPUT_CFG_EV_BITS, EV_KEY, virtio_input_dev->key_bit, KEY_CNT); |
| 113 | virtio_input_cfg_bits(virtio_input_dev, VIRTIO_INPUT_CFG_EV_BITS, EV_REL, virtio_input_dev->rel_bit, REL_CNT); |
| 114 | virtio_input_cfg_bits(virtio_input_dev, VIRTIO_INPUT_CFG_EV_BITS, EV_ABS, virtio_input_dev->abs_bit, ABS_CNT); |
| 115 | |
| 116 | queue_event = &virtio_dev->queues[VIRTIO_INPUT_QUEUE_EVENT]; |
| 117 | queue_status = &virtio_dev->queues[VIRTIO_INPUT_QUEUE_STATUS]; |
| 118 | |
| 119 | virtio_alloc_desc_chain(virtio_dev, VIRTIO_INPUT_QUEUE_EVENT, queue_event->num, idx); |
| 120 | virtio_alloc_desc_chain(virtio_dev, VIRTIO_INPUT_QUEUE_STATUS, queue_status->num, idx); |
| 121 | |
| 122 | for (i = 0; i < queue_event->num; ++i) |
| 123 | { |
| 124 | rt_uint16_t id = i; |
| 125 | void *addr = &virtio_input_dev->recv_events[i]; |
| 126 | |
| 127 | virtio_fill_desc(virtio_dev, VIRTIO_INPUT_QUEUE_EVENT, id, |
| 128 | VIRTIO_VA2PA(addr), sizeof(struct virtio_input_event), VIRTQ_DESC_F_WRITE, 0); |
| 129 | |
| 130 | virtio_submit_chain(virtio_dev, VIRTIO_INPUT_QUEUE_EVENT, id); |
| 131 | } |
| 132 | rt_hw_dsb(); |
| 133 | |
| 134 | queue_event->avail->flags = 0; |
| 135 | queue_status->avail->flags = VIRTQ_AVAIL_F_NO_INTERRUPT; |
| 136 | |
| 137 | virtio_queue_notify(virtio_dev, VIRTIO_INPUT_QUEUE_EVENT); |
| 138 | |
| 139 | return RT_EOK; |
| 140 | } |
| 141 | |
| 142 | static rt_ssize_t virtio_input_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) |
| 143 | { |
nothing calls this directly
no test coverage detected