【问题标题】:Linux using a driver from inside a driverLinux 使用驱动程序内部的驱动程序
【发布时间】:2011-05-09 06:05:50
【问题描述】:

我正在尝试通过 RS232 串行从我的 linux 机器连接到微控制器。

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

如何仅使用驱动程序中的现有设备驱动程序?还有什么我需要包括的吗?

如果没有,我怎样才能在驱动程序中轻松使用串行端口?

#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>

【问题讨论】:

    标签: linux serial-port device-driver uart


    【解决方案1】:

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

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

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

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

    【讨论】:

    • PPP 驱动程序使用所谓的“串行线路规程”来执行此操作,这是一些 ttyS... 特定的魔法。从技术上讲,可以从内核上下文打开 fd 并对其进行系统调用。但是你为什么要这么做呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2014-02-05
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2019-11-19
    相关资源
    最近更新 更多