![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux设备驱动入门
念愿
我是年轻一族,有梦想,想成功!
展开
-
使用autotools生成包含多文件的makefile
这里以简单的一段程序为例:/* * daemon.c * * Created on: 2012-7-13 * Author: liwei.cai */#include #include #include #include #include #include #include int main(){ pid_t pid; int i, fd; char原创 2012-07-16 21:19:45 · 1988 阅读 · 0 评论 -
如何创建守护进程fork()函数的运用
编写守护进程只要遵循一个特定的流程,就很方便写出自己的守护进程。第一步、创建子进程,父进程退出;pid = fork()if (pid > 0){exit(0); //父进程退出}第二步、在子进程中创建新会话;第三步、改变当前目录为根目录;第四步、重设文件权限掩码;第五步、关闭文件描述符;这样就基本创建了一个守护进程。下面看一个实例:作用是让该守原创 2012-07-21 00:50:38 · 2416 阅读 · 0 评论 -
异步:fasync_struct
这一节主要在上一节中添加了异步通知的功能,要注意观察和对比该字符设备的驱动是怎样一步步完善的。补充一下小知识:异步通知的意思是一旦设备就绪,就主动通知应用程序,这样应用程序根本读不需要查询设备状态。#include #include #include #include #include #include #include #include #include #incl原创 2012-08-07 18:18:12 · 4535 阅读 · 1 评论 -
信号:signal(), sigaction(), sigaddset(), sigemptyset(), sigismember(), sigprocmask()
实例一:如何使用信号函数捕捉相应的信号,并做相应的处理。/* * signal.c * * Created on: 2012-7-19 * Author: liwei.cai */#include #include #include //自定义信号处理函数void my_func(int sign_no){ if (sign_no == SIGINT原创 2012-07-21 00:53:14 · 6919 阅读 · 0 评论 -
Linux设备驱动入门----globalmem字符设备驱动
/* globalmem字符设备驱动 * 作者:liwei.cai * 日期:2012-08-03 * globalmem.c */#include #include #include #include #include #include #include #include #include #include #include #define GLOBALMEM原创 2012-08-06 10:42:04 · 2155 阅读 · 2 评论 -
共享内存的创建和映射shmget()和shmat()
共享内存的实现分为两步:1、创建共享内存,用到的函数是shmget();2、映射共享内存,就是把这段创建的共享内存映射到具体的进程空间去,使用的函数是:shmat();这样就可以使用不带缓冲的I/O读写命令对其进行操作了。实例如下:/* * shmem.c * * Created on: 2012-7-20 * Author: liwei.cai */原创 2012-07-21 00:52:10 · 10779 阅读 · 3 评论 -
消息:ftok(), msgget(), msgsnd(),msgrcv(),msgctl()
/* * msgsnd.c * * Created on: 2012-7-20 * Author: liwei.cai *///以下是消息队列发送端的代码,与接收端配合使用,//输入字符串quit时退出程序,其他字符串发送#include #include #include #include #include #include #include #de原创 2012-07-21 00:53:54 · 1808 阅读 · 1 评论 -
信号量和队列:semaphore and wait_queue_head_t
这一次是在globalmem的字符设备驱动的基础上,增加了并发控制(也就是多进程多共享资源的访问的控制),还增加了阻塞I/O 和poll轮询操作,因为我还是菜鸟,有很多东西还不懂,希望与大侠能指点学习Linux设备驱动的要点和关键点。还是看代码吧#include #include #include #include #include #include #include #in原创 2012-08-07 16:37:25 · 2355 阅读 · 2 评论 -
内核树的建立及其Hello World 模块的加载
内核树的建立及其Hello World 模块的加载 每每到了一定程度过后,对自己所做过的事,看过的书等做一些总结是很有必要的。初学驱动编程,面对的第一个难题就是这个驱动编程该怎么学,入门是关键。在前辈们推荐下和在网上搜索中,得出结论:不知道怎么学和该学些什么,那就看这两本书:O'REILLY写的《LINUX设备驱动程序》和宋宝华的《LINUX设备驱动程序(第3版)》,或者你有兴趣的原创 2012-09-20 09:06:53 · 1841 阅读 · 0 评论 -
关于EXPORT_SYMBOL的作用浅析
在查看内核驱动代码的时候会经常看到在一些函数后面总会跟EXPORT_SYMBOL()这样的宏定义,通过网上查阅,它的作用大致总结如下:1、定义说明 把内核函数的符号导出,也可以理解成将函数名作为符号导出;符号的意思就是函数的入口地址,或者说是把这些符号和对应的地址保存起来的,在内核运行的过程中,可以找到这些符号对应的地址的。2、相关处理 (1)、对编译所得的.ko进原创 2012-09-20 09:06:11 · 18643 阅读 · 0 评论 -
Linux设备中的并发控制
并发执行的唯一原因是:硬件中断服务。内核代码是可抢占的。什么是竞争?当 2 个执行的线路[有机会操作同一个数据结构(或者硬件资源), 混合的可能性就一直存在。避免竞争方法: 在你设计驱动时在任何可能的时候记住避免共享的资源. 如果没有并发存取, 就没有竞争情况. 因此小心编写的内核代码应当有最小的共享. 这个想法的最明显应用是避免使用全局变量. 如果你将一个资源放在多个执行原创 2012-09-20 09:04:40 · 1205 阅读 · 0 评论 -
简单的多路复用编程(I/O)----select()和poll函数的运用
多路复用一般用于I/O操作可能会被阻塞的情况,对可能会有阻塞的I/O的管道、网路进行编程。下面我们来看个例子来说明如何使用两个多路复用函数。 本实例中主要实现通过调用select()函数来监听3个终端的输入(分别重定向到两个管道文件的虚拟终端以及主程序所运行的虚拟终端),并分别进行相应的处理。通过监视主程序的虚拟终端标准输入来实现程序的控制(例如:程序结束);以两个管道作为数据的原创 2012-07-17 21:03:01 · 4491 阅读 · 0 评论 -
文件锁fcntl()函数的使用
问:为什么要使用文件锁?答:当多个用户共同使用、操作一个文件的情况时,Linux采用的方法就是给文件上锁,来避免共享的资源产生竞争的状态。问:文件锁有哪些类型?答:文件锁包括建议性锁和强制性锁。一般情况下,内核和系统都不适用建议性锁,采用强制性锁的影响很大,每次读写操作都必须检查是否有所存在。问:怎样实现文件上锁?答:在Linux中,实现文件上锁的函数有lockf() 和fcn原创 2012-07-17 21:01:36 · 7988 阅读 · 1 评论 -
GCC创建使用静态库,动态库
如何创建和使用,简而言之看代码,从例子入手:/* * unsgn_pow.c * * Created on: 2012-7-16 * Author: liwei.cai *///库函数unsigned long long unsgn_pow(unsigned int x , unsigned int y){ unsigned long long res = 1原创 2012-07-16 21:02:05 · 3242 阅读 · 0 评论 -
Linux设备驱动入门----I2C设备驱动
/* * I2C驱动的一些模板: * (1)、I2C总线驱动的的模块加载和卸载函数模板 * (2)、I2C总线通信方法 * (3)、I2C设备驱动模块的加载和卸载 * (4)、I2C设备驱动的文件操作接口 * (与普通驱动的文件操作一致,只是要使用 * i2c_client,i2c_driver,i2c_adapter,i2c_algorithm * 结构体和I2C原创 2012-08-13 15:53:44 · 1546 阅读 · 0 评论 -
使用多路复用实现3个串口的通信
如题,Linux环境下操作串口设备,实现多路复用。串口配置函数:/* * set_com_config.c * * Created on: 2012-7-18 * Author: liwei.cai */#include int set_com_config(int fd, int baud_rate, int data_bits, char parity原创 2012-07-19 19:52:07 · 9788 阅读 · 1 评论 -
Linux设备驱动入门----USB设备驱动
/**************************************** * USB主机与设备驱动 * 主机侧:由底到高:USB主机控制器硬件--> * USB主机控制器驱动--> USB核心层 --> USB * 设备驱动层 * 设备侧:UDC驱动程序、Gadget API和Gadget * 驱动程序 * 逻辑组织:设备(1) 配置(n) * 配置原创 2012-08-20 17:40:41 · 3022 阅读 · 2 评论 -
linux驱动入门---test驱动模块加载
编写一简单的字符驱动程序,这里的设备也就是一段内存,实现简单的都写功能, 并列出常用格式的Makefile已经驱动加载和卸载脚本。/* test_drv.c */#include #include #include #include #include #include #include #include #include #define TEST原创 2012-08-01 08:56:42 · 1938 阅读 · 6 评论 -
sysfs接口函数到建立_DEVICE_ATTR
sysfs接口:函数宏DEVICE_ATTR原型:#define DEVICE_ATTR(_name, _mode, _show, _store) struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)如对设备的使用 DEVICE_ATTR ,对总线使用 BUS_A转载 2012-11-06 08:46:08 · 1436 阅读 · 0 评论