Linux 使用驱动程序内部的驱动程序

标签 linux serial-port device-driver uart

我正在尝试通过 RS232 串口从我的 linux 机器连接到微 Controller 。

我已经编写了驱动程序并实现了一个协议(protocol) b/n pc 和微 Controller ,它使用内核中已经作为模块存在的 tty(/dev/ttyS0) 设备(例如通过调用打开、关闭等) .但是,当我尝试编译时,它说找不到打开、写入、读取等的引用...

如何在驱动程序中使用现有的设备驱动程序?我还需要添加其他内容吗?

如果没有,我如何在驱动程序中轻松使用串口?

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/cdev.h>
#include <linux/spinlock.h>
#include <linux/termios.h>
#include <linux/fcntl.h>
#include <linux/unistd.h>

最佳答案

通常你应该在用户空间做这样的事情——在一个普通的用户空间程序中实现你的设备的协议(protocol)。

这是可能的,但绝对不建议在内核中做这些事情。例如,ppp 驱动程序在串行驱动程序之上实现网络驱动程序。我不知道在那种情况下它是如何工作的,但我希望用户空间帮助程序打开设备,初始化其参数等,然后使用一些系统调用将文件描述符传递到内核。

您不能从内核中调用任意库函数 - 或者实际上,根本不能调用任何库函数(除了实际上作为内核的一部分提供的库)。这包括内核系统调用。有可能调用的等效函数 - 例如,filp_open。

在大多数情况下,您不能只从内核调用正常的系统调用,因为它们期望指针指向用户空间数据,但在内核中您的(通过 kalloc 等分配)通常会指向内核空间数据。两者不能随意混合。

关于Linux 使用驱动程序内部的驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933143/

相关文章:

android-studio - adb.exe start-server failed——必要时手动运行

linux - 将一个文件的内容移动到另一个文件

linux - 编译包含非内核头文件的 linux 内核 (2.6) 模块

linux -/dev/input/by-path/pci-xxx-kbd输出的格式是什么?

c++ - 打开/dev/ttyUSB0 返回 "Bad file descriptor"

C# .Net Serial DataReceived 事件响应对于高速数据来说太慢

winapi - 获取 Windows 驱动程序目录

linux - 通用操作系统和软实时操作系统之间的区别?

c - 串行协议(protocol)的状态机

c - 如何在设备驱动程序和它控制的 FPGA 之间共享寄存器和位域定义