| 224 | } |
| 225 | |
| 226 | static int serial_fops_poll(struct dfs_file *fd, struct rt_pollreq *req) |
| 227 | { |
| 228 | int mask = 0; |
| 229 | int flags = 0; |
| 230 | rt_device_t device; |
| 231 | struct rt_serial_device *serial; |
| 232 | |
| 233 | device = (rt_device_t)fd->vnode->data; |
| 234 | RT_ASSERT(device != RT_NULL); |
| 235 | |
| 236 | serial = (struct rt_serial_device *)device; |
| 237 | |
| 238 | /* only support POLLIN */ |
| 239 | flags = fd->flags & O_ACCMODE; |
| 240 | if (flags == O_RDONLY || flags == O_RDWR) |
| 241 | { |
| 242 | rt_base_t level; |
| 243 | struct rt_serial_rx_fifo *rx_fifo; |
| 244 | |
| 245 | rt_poll_add(&device->wait_queue, req); |
| 246 | |
| 247 | rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; |
| 248 | |
| 249 | level = RT_SERIAL_FIFO_LOCK(&serial->spinlock); |
| 250 | if (rt_ringbuffer_data_len(&rx_fifo->rb)) |
| 251 | mask |= POLLIN; |
| 252 | RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level); |
| 253 | } |
| 254 | /* mask|=POLLOUT; */ |
| 255 | return mask; |
| 256 | } |
| 257 | |
| 258 | const static struct dfs_file_ops _serial_fops = |
| 259 | { |
nothing calls this directly
no test coverage detected