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

Serial port 带GPIO的串行Linux嵌入式驱动程序,serial-port,driver,kernel,gpio,Serial Port,Driver,Kernel,Gpio,我正在尝试开发一个与设备通信的驱动程序。 我的驱动程序使用sysfs与用户空间通信,并使用rs232从外部设备发送/接收信息。我的Boad和其他设备通过rs232通信,但我不知道如何在驱动程序中使用我的rx、tx、cts/rts初始化此通信。 我看到了很多关于tty的信息。但是没有关于直接使用GPIO进行rs232通信的内容 结构 用户->板 |-----rx------| |-----tx------| |-----cts----- 装置 如果有人有想法:) 感谢您@Makit,1)首先阅

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

结构 用户->板

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

装置

如果有人有想法:)


感谢您

@Makit,1)首先阅读处理器的《技术参考手册》(TRM)。了解如何配置外部设备连接到的UART端口。需要编写/开发固件(独立于操作系统的代码),您将在其中配置一些uart寄存器,例如:线路控制寄存器(LCR),其中in将配置启动、奇偶校验、停止位(8N1)并且需要根据TRM中的公式配置波特率,并将适当的值分配给DLL和DLH寄存器。在此之后,-->2)开始开发具有常见文件操作(打开、关闭、读取和写入)的字符设备驱动程序。之后,需要使用“ioremap\u nocache”内核api映射已识别的uart端口寄存器,并使用返回值(指针值)使用ioread[8 | 16 | 32]/iowrite[8 | 16 | 32]读取/写入外部设备。Uart设备驱动程序将使用开发的固件代码来配置Uart寄存器,读取和写入外部设备。请随时反馈:-)。

@Makit,1)首先阅读处理器的技术参考手册(TRM)。了解如何配置外部设备连接到的UART端口。需要编写/开发固件(独立于操作系统的代码),您将在其中配置一些uart寄存器,例如:线路控制寄存器(LCR),其中in将配置启动、奇偶校验、停止位(8N1)并且需要根据TRM中的公式配置波特率,并将适当的值分配给DLL和DLH寄存器。在此之后,-->2)开始开发具有常见文件操作(打开、关闭、读取和写入)的字符设备驱动程序。之后,需要使用“ioremap\u nocache”内核api映射已识别的uart端口寄存器,并使用返回值(指针值)使用ioread[8 | 16 | 32]/iowrite[8 | 16 | 32]读取/写入外部设备。Uart设备驱动程序将使用开发的固件代码来配置Uart寄存器,读取和写入外部设备。请随时反馈:-)。

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

现在,如果我正确地理解了您(或者我是否错过了您正在询问的特定体系结构?),那么您正在尝试在某种可以(或正在)运行linux的微处理器上实现这一点。根据您的硬件和可用的调试工具/程序员类型,您几乎有两种选择来运行基本的裸机(读取:无操作系统)UART通信,这些通信可以在操作系统级别通过linux内核中的串行端口配置进行扩展(通常简化)。我不会详细介绍如何在操作系统级别配置串行端口,但如果您可以在裸机上进行配置,则可以在操作系统中进行配置;我将重点介绍两个基本解决方案

编辑:我现在意识到,您的操作系统确实已经成熟。下面的所有内容都是关于固件的,您必须开发这些固件,并与所描述的Gautham Kantharaju调用相关联。因此,UART软件可能并非完全有用

这些是:

  • 您的微控制器/微处理器上有硬件UART端口,这些端口已经有用于UART配置和FIFO的专用寄存器
  • 您只能访问GPIO模块,也只能访问纯GPIO功能-输出逻辑高/低、中断配置(上升沿中断、下降沿中断;向矢量发送中断或DMA请求等)。以及输入数据寄存器
  • 在任何一种情况下,您都需要查看微处理器的数据表和参考手册,以首先了解其UART寄存器的工作原理。您还几乎肯定会找到在芯片上实现和启用UART的应用说明。这在硬件上是相当标准的,只是它们之间的细微差别。几乎总是有代码示例为您完成这些任务,但根据您的需要,您可能需要修改至少一些配置设置

    您应该看到一些形式的寄存器,包括:

  • 某种形式的使能寄存器,有效地为模块供电。这可能涉及解除时钟寄存器的锁定(没有时钟,模块无法工作)和其他一些可能更硬件特定的步骤
  • 注册以设置流量控制。这里可能有很多。用于同时启用流量控制、CTS线路是否处于高/低激活状态、是否启用中断以及中断标志的位置等
  • 通用UART配置(这可能是一些UART初始化阶段的一部分[例如飞思卡尔的ARM]可以通过写入配置寄存器来初始化。在这些寄存器中,您将看到停止位的数量、数据位的数量、奇偶校验位等。有很多可以使用UART进行配置……这是一个非常成熟的标准
  • 您的FIFO寄存器以及如何访问它们
  • 同样,您的库/应用程序堆栈可能会包含一些示例,这些示例提供宏和函数来完成所有这些配置选项,并且在许多情况下,默认配置将起作用