带有 GPIO 的串行 Linux 嵌入式驱动程序

1 kernel serial-port driver gpio

我正在尝试开发一个驱动程序来与设备进行通信。我的驱动程序使用 sysfs 与用户空间通信,并使用 rs232 从外部设备发送/接收信息。我的 Boad 和其他设备通过 rs232 进行通信,但我不知道如何在驱动程序中使用我的 rx、tx、cts/rts 初始化此通信。我看到很多关于 tty 的信息。但没有直接使用 GPIO 进行 rs232 通信。

结构

用户 -> 板

|-----rx------|
|-----tx------|
|-----cts-----|

设备

如果有人有想法:)

谢谢

小智 5

我最近在职业生涯中遇到了类似的问题。我们用完了硬件 UART,需要在 GPIO 上使用单线实现 UART 协议。

现在,如果我对您的理解正确(或者我是否错过了您所询问的特定架构?),您正在尝试在某种可以(或正在)运行 linux 的微处理器上实现它。根据您的硬件和可用的调试工具/编程器类型,您几乎有两种选择来获得基本的裸机(读取:无操作系统)UART 通信,可以通过串行端口配置进行扩展(并且通常简化)在操作系统级别的 linux 内核中。在OS层面配置串口的细节我就不赘述了,但是如果你能在裸机上做到,你就可以在OS上做到;我将重点介绍两个基本的解决方案。

编辑:我现在意识到你确实在一个完整的操作系统中。下面的所有内容都适用于您必须开发并与 Gautham Kantharaju 描述的调用相关联的固件。因此,软件 UART 可能并不完全有用。

这些是:

  1. 微控制器/微处理器上的硬件 UART 端口已经具有用于 UART 配置和 FIFO 的专用寄存器。
  2. 您只能访问 GPIO 模块,并且只能访问纯 GPIO 功能 - 输出逻辑高/低、中断配置(上升沿中断、下降沿中断;向向量或 DMA 请求发送中断等)。和一个输入数据寄存器。

无论哪种情况,您都需要查看微处理器的数据表和参考手册,以首先了解其 UART 寄存器的工作原理。您几乎肯定还会找到在您的芯片上实现和启用 UART 的应用笔记。它在硬件上是非常标准的,它们之间只有细微的差别。几乎总是有代码示例可以为您完成这些任务,但根据您的需要,您可能必须至少修改一些配置设置。

您应该看到某种形式的寄存器:

  1. 某种形式的使能寄存器有效地为模块供电。这可能涉及取消时钟寄存器(模块在没有时钟的情况下无法运行)和其他一些可能更特定于硬件的步骤。
  2. 用于设置流控制的寄存器。这里可以有很多。一起开启流量控制,CTS线是否高/低有效,是否开启中断,中断标志在哪里等。
  3. 通用 UART 配置(可能这将是初始化阶段的一部分,因为某些 UART [例如飞思卡尔的 ARM] 可以通过写入配置寄存器来初始化。在这些地方您将看到停止位的数量、数据位的数量、奇偶校验位等等。有很多可以使用UARTs进行配置……这是一个非常成熟的标准。
  4. 您的 FIFO 寄存器以及如何访问它们。

同样,您的库/应用程序堆栈可能包含提供宏和函数来完成所有这些配置选项的示例,并且在许多情况下默认配置将起作用。您可能需要进入您的串行驱动程序(通常是 serial.c)并更改代码以满足您的需要,但是如果您知道寄存器和配置发生了什么,那么理解哪些设置会变得更加容易


现在,如果是后者,则需要实现软件UART。那里有很多示例,但除非您了解 GPIO 引脚的端口控制的来龙去脉以及 UART 硬件完成的实质内容,否则它不会对您有任何好处。这听起来比实际困难得多。您希望有两条线路:一条用于 RX,另一条用于 TX。如果您不需要流量控制,那么这就是您所需要的。否则,您将需要 RTS 和 CTS 线路。这些只是简单的 GPIO,它们通过在 RTS 引脚上驱动的“活动”逻辑电平(可以是高或低,取决于硬件 - 阅读您的数据表)来控制方向,以指示发送请求和来自 CTS 线的确认,指示现在可以开始传输了。

假设暂时没有流量控制,让我们从一个简单的接收开始。基本上,您需要在起始位上执行某种形式的中断。在中断处理程序中,启动某种硬件定时器(您必须配置另一个寄存器/模块),并以周期性间隔对 RX 线进行采样,直到数据帧结束(start_bit + data_bits + stop_bit(s) + parity_bit) 或使用计时器来计时一条线保持高/低的时间并在另一个函数中执行一些数学运算(不在中断处理程序中!)。在大多数情况下,您将需要前一种计时器,但如果有一个有趣的设备涉及特定的握手,您可能需要更灵活的计时并选择第二种形式的采样传入数据。此外,缓冲区在调试时非常有用且不可或缺,

要传输,您需要禁用中断(或屏蔽它们),以便您的传输不会被中断(对于单线实现尤其重要)。然后,您必须解析数据以确定每个位是 1 还是 0(高电平有效或低电平有效),并为一个“位时间”(波特率的倒数)设置硬件定时器。

如果需要流量控制,您只需要在进入主动接收之前添加另一个简单的轮询方法,以便设备知道它“允许”进行通信。

如果启用奇偶校验位,则还需要在传输期间处理这些位以与数据一起发送出去,或者在接收之后确定数据是否成功传输。

在 Google 上搜索“软件 uart”会从 ATMEL 获得许多示例,用于他们的 AVR 芯片和其他详细说明如何实现一个芯片的示例。本应用笔记对基础知识和基础理论很有帮助,本页 ZIP 中链接的代码确实有助于解释如何对其进行编码


希望这给了你一些很好的起点。