UART子系统(十五)编写虚拟UART驱动程序\_实现数据传输

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: UART子系统(十五)编写虚拟UART驱动程序\_实现数据传输

编写虚拟UART驱动程序_实现数据传输


参考代码

硬件相关:
drivers/tty/serial/imx.c
drivers/tty/serial/stm32-usart.c
串口核心层:
drivers/tty/serial/serial_core.c
TTY层:
drivers/tty/tty_io.c


本节课程源码在GIT仓库里

doc_and_source_for_drivers\IMX6ULL\source\09_UART
  06_virtual_uart_driver_txrx
doc_and_source_for_drivers\STM32MP157\source\A7\09_UART
  06_virtual_uart_driver_txrx


1. 虚拟UART的驱动组成


1670941115554.jpg

2. 虚拟UART的数据流程


1670941122067.jpg

为了做实验,我们还要创建一个虚拟文件:/proc/virt_uart_buf


要发数据给虚拟串口时,执行:echo "xxx" > /proc/virt_uart_buf

要读取虚拟串口的数据时,执行:cat /proc/virt_uart_buf


3. 实现/proc文件


参考/proc/cmdline,怎么找到它对应的驱动?在Linux内核源码下执行以下命令搜索:

grep "cmdline" * -nr | grep proc

得到:

fs/proc/cmdline.c:26:   proc_create("cmdline", 0, NULL, &cmdline_proc_fops);


4. 触发中断


使用如下函数:

int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
     bool val);


怎么找到它的?在中断子系统中,我们知道往GIC寄存器GICD_ISPENDRn写入某一位就可以触发中断。内核代码中怎么访问这些寄存器?

在drivers\irqchip\irq-gic.c中可以看到irq_chip中的"irq_set_irqchip_state"被用来设置中断状态:

static struct irq_chip gic_chip = {
  .irq_mask  = gic_mask_irq,
  .irq_unmask  = gic_unmask_irq,
  .irq_eoi  = gic_eoi_irq,
  .irq_set_type  = gic_set_type,
  .irq_get_irqchip_state  = gic_irq_get_irqchip_state,
  .irq_set_irqchip_state  = gic_irq_set_irqchip_state, /* 2. 继续搜"irq_set_irqchip_state" */
  .flags    = IRQCHIP_SET_TYPE_MASKED |
      IRQCHIP_SKIP_SET_WAKE |
      IRQCHIP_MASK_ON_SUSPEND,
};
static int gic_irq_set_irqchip_state(struct irq_data *d,
         enum irqchip_irq_state which, bool val)
{
  u32 reg;
  switch (which) {
  case IRQCHIP_STATE_PENDING:
  reg = val ? GIC_DIST_PENDING_SET : GIC_DIST_PENDING_CLEAR; /* 1. 找到寄存器 */
  break;
  case IRQCHIP_STATE_ACTIVE:
  reg = val ? GIC_DIST_ACTIVE_SET : GIC_DIST_ACTIVE_CLEAR;
  break;
  case IRQCHIP_STATE_MASKED:
  reg = val ? GIC_DIST_ENABLE_CLEAR : GIC_DIST_ENABLE_SET;
  break;
  default:
  return -EINVAL;
  }
  gic_poke_irq(d, reg);
  return 0;
}


继续搜"irq_set_irqchip_state",在drivers\irqchip\irq-gic.c中可以看到:

int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
     bool val)
{
    ......
}
EXPORT_SYMBOL_GPL(irq_set_irqchip_state);


以后就可与使用如下代码触发某个中断:

irq_set_irqchip_state(irq, IRQCHIP_STATE_PENDING, 1);
相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
9月前
|
传感器
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)(下)
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)(下)
221 0
|
9月前
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)(上)
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)
121 0
|
芯片 iOS开发
STM32 | GPIO口的普通与复用如何配置与用法,本文降从最底层教你如何查看手册运用寄存器来实现GPIO口的配置
STM32 | GPIO口的普通与复用如何配置与用法,本文降从最底层教你如何查看手册运用寄存器来实现GPIO口的配置
599 0
STM32的HAL库开发系列 - CAN通信筛选器
STM32的HAL库开发系列 - CAN通信筛选器
331 0
|
数据安全/隐私保护
STM32的HAL库开发系列 - CAN通信实例
STM32的HAL库开发系列 - CAN通信实例
775 0
|
Ubuntu 开发工具 虚拟化
UART子系统(十六)编写虚拟UART驱动程序_调试
UART子系统(十六)编写虚拟UART驱动程序_调试
230 0
UART子系统(十六)编写虚拟UART驱动程序_调试
|
开发工具 git
UART子系统(十三)编写虚拟UART驱动程序_框架
UART子系统(十三)编写虚拟UART驱动程序_框架
111 0
UART子系统(十三)编写虚拟UART驱动程序_框架
|
开发工具 git
UART子系统(十四)编写虚拟UART驱动程序\_实现uart_ops
UART子系统(十四)编写虚拟UART驱动程序\_实现uart_ops
104 0
UART子系统(十四)编写虚拟UART驱动程序\_实现uart_ops
UART子系统(十二)UART驱动调试方法
UART子系统(十二)UART驱动调试方法
142 0
UART子系统(十二)UART驱动调试方法
UART子系统(十一)UART驱动情景分析_write
UART子系统(十一)UART驱动情景分析_write
142 0
UART子系统(十一)UART驱动情景分析_write