Linux驱动主要函数

上次调试串口的时候,控制串口的app涉及到调用4412板子底层的驱动,对于Linux驱动一无所知,而Linux在嵌入式中又是一个相当基本且重要的环节,特此了解一下。

内核kernel中囊括了板子上外设的所有驱动,而驱动的构成又是什么呢?其实并不是很复杂,驱动所包含的函数主要有open(),write(),ioct(),下面逐一说明。

open()函数:

#include <fcntl.h>

int open(const char *pathname, int oflag, ... );

返回值:成功则返回文件描述符,否则返回 -1

对于 open 函数来说,第三个参数(...)仅当创建新文件时才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp);oflag 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。

O_RDONLY      只读模式

O_WRONLY      只写模式

O_RDWR        读写模式

打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:

O_APPEND       每次写操作都写入文件的末尾

O_CREAT        如果指定文件不存在,则创建这个文件

O_EXCL         如果要创建的文件已存在,则返回 -1,并且修改 errno 的值

O_TRUNC        如果文件存在,并且以只写/读写方式打开,则清空文件全部内容

O_NOCTTY       如果路径名指向终端设备,不要把这个设备用作控制终端。

O_NONBLOCK     如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)

以下三个常量同样是选用的,它们用于同步输入输出

O_DSYNC        等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。

O_RSYNC        read 等待所有写入同一区域的写操作完成后再进行

O_SYNC         等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

open 返回的文件描述符一定是最小的未被使用的描述符。

如果 NAME_MAX(文件名最大长度,不包括‘\0‘)是 14,而我们想在当前目录下创建文件名长度超过 14 字节的文件,早期的 System V 系统(如 SVR2)会截断超出部分,只保留前 14 个字节;而由 BSD 衍生的(BSD-derived)系统会返回错误信息,并且把 errno 置为 ENAMETOOLONG。

POSIX.1 引入常量 _POSIX_NO_TRUNC 用于决定是否截断长文件名/长路径名。如果_POSIX_NO_TRUNC 设定为禁止截断,并且路径名长度超过 PATH_MAX(包括 ‘\0‘),或者组成路径名的任意文件名长度超过 NAME_MAX,则返回错误信息,并且把 errno 置为 ENAMETOOLONG。

Write():

write函数所在的头文件为 <unistd.h>

write有两种用法。一种是:

int write(int handle, void *buf, int nbyte);

handle 是文件描述符;

buf是指定的缓冲区,即指针,指向一段内存单元;

nbyte是要写入文件指定的字节数;返回值:写入文档的字节数(成功);-1(出错)

write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.

另一种是:write(const char* str,int n)

str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。

write("string",strlen("string");表示输出字符串常量

Read():

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

参数:

fd: 将要读取数据的文件描述词。

buf:  所读取到的数据将存放的内存缓冲位置。

count: 需要读取的数据量。

返回说明:

成功执行时,返回所读取的数据量。失败返回-1,errno被设为以下的某个值

EAGAIN:打开文件时设定了O_NONBLOCK标志,并且当前没有数据可读取

EBADF:文件描述词无效,或者文件不可读

EFAULT:参数buf指向的空间不可访问

EINTR:数据读取前,操作被信号中断

EINVAL:一个或者多个参数无效

EIO:读写出错

EISDIR:参数fd索引的时目录

ioctl():

int ioctl(int handle, int cmd,unsigned long arg);

返回值:成功为0,出错为-1

handle:文件描述符

cmd:命令,cmd这个数对应的命令,由四部分组成(设备类型亦称作幻数8bit,序列号8bit,方向2bit,数据尺寸8-14bit),需要时内核会对cmd这个数进行拆分和组合。

arg:用户层传入的参数,个数只能为1,一般为整数或者指针

几个相关概念的说明:

文件描述符:每个文件对应一个文件描述符,文件描述符为一个整数,可以理解为文件在内核中的索引

时间: 2024-10-29 19:08:37

Linux驱动主要函数的相关文章

linux驱动probe函数的实现框架思考

linux驱动probe函数的实现框架思考 .probe函数实现无非就是1)创建一个私有的driver_data用于区分不同的device,因为一个driver可以管理多个device,2)parse device tree,并根据配置申请资源.io resource.memory:3)初始化设备4)注册对应的子系统暴露对应的接口,子系统相关的底层函数需要你实现,实现/dev/设备的file_operation.sysfs.proc接口.:5)dev_set_drvdata 绑定私有结构和设备的

Linux驱动 - select函数介绍

一.select 函数介绍 select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h> #include <unistd.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1:rdset,

Linux代码的重用与强行卸载Linux驱动

(一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动(静态重用) 对于复杂的Linux驱动,需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理,那么就不得不编译多个源代码文件,最终生成.ko文件或编译进Linux内核 下面,就介绍将3个.c文件分别编译为3个.o文件,并将这3个.o文件链接(link)成一个.ko文件——静态重用 假

对于linux下system()函数的深度理解(整理)

对于linux下system()函数的深度理解(整理) (2013-02-07 08:58:54) 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不稳定?

第六章——使用实例来理解Linux驱动开发及心得

在这一章中主要介绍了一个Linux驱动程序,以实战的方式向我们介绍了一个Linux驱动程序的例子. Linux驱动的工作和访问方式是Linux的亮点之一,同时受到了业界的广泛好评. Linux系统 将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这种 设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问LinuxAPI 更容易. 由于大多数Linux驱动都有与其对应的设备文件, 因此与Linux驱动交换数据就变成了与 设备文件交

Linux驱动开发盲点笔记1

1. vim中在找到搜索目标后,使用n与N进行定位查找 2. vim中使用gg到最好第一行,使用xxxG到某一行,否则G直接到最后一行: 3. ln -s 产生的链接文件最终指向的目标文件src 新产生的当前软链接文件dst. ln -s project(磁盘上实际存在的文件或者目录) a.lnk ln -s src dst(新产生的文件dst,dst链接到src) symlink功能类似 4 tar -czvf 最终生产的tar打包好的文件 待打包的文件或者文件夹 tar czvf a.tar

浅析Linux驱动模型中的底层数据结构kobject和kset

1.kobject Linux内核用kobject来表示一个内核对象.它和Sysfs文件系统联系密切,在内核中注册到系统中的每个kobject对象在sysfs文件系统中对对应着一个文件目录.kobject数据结构通常的用法是嵌入到其对他的数据结构中(即容器,比如cdev结构),用于实现内核对该类数据结构对象的管理.这些数据结构(容器)通过kobject连接起来,形成了一个树状结构. 它在源码中的定义为: /*<include/linux/kobject.h>*/ struct kobject

几个Linux驱动面试题目

这几天面试几个想做安卓Linux驱动的,总体感觉上驱动基础还是比较薄弱,大部分情况是虽然做过驱动,但是基本上都是采用内核现成的,或者是开发板上已经有的,单独写过模块驱动很少,驱动机制理解不是很透彻.以下是几个随口问过的基础问题,供参考. 1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的? 2.写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的? 3.自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还

【Linux 驱动】设备驱动程序再理解

学习设备驱动编程也有一段时间了,也写过了几个驱动程序,因此有对设备驱动程序有了一些新的理解和认识,总结一下.学习设备驱动编程也有一段时间了,也写过了几个驱动程序,因此有对设备驱动程序有了一些新的理解和认识,总结一下. ★什么是驱动程序 刚开始学习设备驱动程序的时候,产生了许多的问题.什么是驱动程序?驱动程序是干嘛的?它是如何工作的?它又是如何跟操作系统联系起来的?一系列的问题,现在有些地方还是不一定清楚,但是相比起刚开始的那个阶段,感觉自己还是清楚了很多. 设备驱动程序说白了(实质)就是为应用程