我正在尝试通过 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/