ソースを参照

!304 console 添加ioctl实现
Merge pull request !304 from lin123/rt-smart

bernard 4 年 前
コミット
a6e98c57a4
2 ファイル変更49 行追加12 行削除
  1. 19 9
      components/drivers/serial/serial.c
  2. 30 3
      components/lwp/lwp_console.c

+ 19 - 9
components/drivers/serial/serial.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -469,7 +469,7 @@ static void rt_dma_recv_update_put_index(struct rt_serial_device *serial, rt_siz
             rx_fifo->is_full = RT_TRUE;
         }
     }
-    
+
     if(rx_fifo->is_full == RT_TRUE)
     {
         _serial_check_buffer_size();
@@ -626,7 +626,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
 
     /* initialize the Rx/Tx structure according to open flag */
     if (serial->serial_rx == RT_NULL)
-    { 
+    {
         if (oflag & RT_DEVICE_FLAG_INT_RX)
         {
             struct rt_serial_rx_fifo* rx_fifo;
@@ -645,7 +645,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
             /* configure low level device */
             serial->ops->control(serial, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_RX);
         }
-#ifdef RT_SERIAL_USING_DMA        
+#ifdef RT_SERIAL_USING_DMA
         else if (oflag & RT_DEVICE_FLAG_DMA_RX)
         {
             if (serial->config.bufsz == 0) {
@@ -682,10 +682,14 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
     else
     {
         if (oflag & RT_DEVICE_FLAG_INT_RX)
+        {
             dev->open_flag |= RT_DEVICE_FLAG_INT_RX;
+        }
 #ifdef RT_SERIAL_USING_DMA
         else if (oflag & RT_DEVICE_FLAG_DMA_RX)
+        {
             dev->open_flag |= RT_DEVICE_FLAG_DMA_RX;
+        }
 #endif /* RT_SERIAL_USING_DMA */  
     }
 
@@ -730,11 +734,15 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
     else
     {
         if (oflag & RT_DEVICE_FLAG_INT_TX)
+        {
             dev->open_flag |= RT_DEVICE_FLAG_INT_TX;
+        }
 #ifdef RT_SERIAL_USING_DMA
         else if (oflag & RT_DEVICE_FLAG_DMA_TX)
+        {
             dev->open_flag |= RT_DEVICE_FLAG_DMA_TX;
-#endif /* RT_SERIAL_USING_DMA */    
+        }            
+#endif /* RT_SERIAL_USING_DMA */
     }
 
     /* set stream flag */
@@ -792,7 +800,7 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
         serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_RX);
     }
 #endif /* RT_SERIAL_USING_DMA */
-    
+
     if (dev->open_flag & RT_DEVICE_FLAG_INT_TX)
     {
         struct rt_serial_tx_fifo* tx_fifo;
@@ -853,7 +861,7 @@ static rt_size_t rt_serial_read(struct rt_device *dev,
     {
         return _serial_dma_rx(serial, (rt_uint8_t *)buffer, size);
     }
-#endif /* RT_SERIAL_USING_DMA */    
+#endif /* RT_SERIAL_USING_DMA */
 
     return _serial_poll_rx(serial, (rt_uint8_t *)buffer, size);
 }
@@ -874,7 +882,7 @@ static rt_size_t rt_serial_write(struct rt_device *dev,
     {
         return _serial_int_tx(serial, (const rt_uint8_t *)buffer, size);
     }
-#ifdef RT_SERIAL_USING_DMA    
+#ifdef RT_SERIAL_USING_DMA
     else if (dev->open_flag & RT_DEVICE_FLAG_DMA_TX)
     {
         return _serial_dma_tx(serial, (const rt_uint8_t *)buffer, size);
@@ -1130,6 +1138,8 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
             break;
         case TCXONC:
             break;
+        case TIOCGWINSZ:
+            break;
 #endif
 #ifdef RT_USING_POSIX
         case FIONREAD:
@@ -1155,7 +1165,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
 }
 
 #ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops serial_ops = 
+const static struct rt_device_ops serial_ops =
 {
     rt_serial_init,
     rt_serial_open,

+ 30 - 3
components/lwp/lwp_console.c

@@ -293,6 +293,16 @@ static int console_fops_write(struct dfs_fd *fd, const void *buf, size_t count)
     return size;
 }
 
+static int console_fops_ioctl(struct dfs_fd *fd, int cmd, void *args)
+{
+    int size = 0;
+    struct rt_device *device = RT_NULL;
+
+    device = (struct rt_device *)fd->fnode->data;
+    RT_ASSERT(device != RT_NULL);
+    size = rt_device_control(device, cmd, args);
+    return size;	
+}
 static int console_fops_poll(struct dfs_fd *fd, struct rt_pollreq *req)
 {
     rt_base_t level = 0;
@@ -332,7 +342,7 @@ const static struct dfs_file_ops _console_fops =
 {
     console_fops_open,
     console_fops_close,
-    RT_NULL,
+    console_fops_ioctl,
     console_fops_read,
     console_fops_write,
     RT_NULL, /* flush */
@@ -451,6 +461,23 @@ static rt_size_t rt_console_write(struct rt_device *dev,
 
     return len;
 }
+		
+static rt_err_t  rt_console_control(rt_device_t dev, int cmd, void *args)
+{
+	rt_base_t level = 0;
+    rt_size_t len = 0;
+    struct rt_console_device *console = RT_NULL;
+
+    console = (struct rt_console_device *)dev;
+    RT_ASSERT(console != RT_NULL);
+    RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_INITED);
+
+    level = rt_hw_interrupt_disable();
+    len = rt_device_control((struct rt_device *)console->iodev, cmd, args);
+    rt_hw_interrupt_enable(level);
+
+    return len;
+}
 
 #ifdef RT_USING_DEVICE_OPS
 const static struct rt_device_ops console_ops =
@@ -460,7 +487,7 @@ const static struct rt_device_ops console_ops =
     rt_console_close,
     rt_console_read,
     rt_console_write,
-    RT_NULL,
+    rt_console_control,
 };
 #endif
 
@@ -490,7 +517,7 @@ rt_err_t rt_console_register(const char *name, struct rt_device *iodev)
     device->close       = rt_console_close;
     device->read        = rt_console_read;
     device->write       = rt_console_write;
-    device->control     = RT_NULL;
+    device->control     = rt_console_control;
 #endif
 
     /* register a character device */