【linux驱动】linux驱动总览
欢迎转载,转载时需保留作者信息,谢谢。
博客园地址:http://www.cnblogs.com/embedded-tzp
Csdn博客地址:http://blog.csdn.net/xiayulewa
1.1. 应用,设备,总线,驱动关系,应用到驱动

为了简化问题,上图省略了app层与driver层中间的libc层。
linux驱动的开发步骤:设备号→设备(struct cdev,struct input_dev等)→驱动(struct file_operations)→应用层接口(创建/dev)
linux应用的open最终调用驱动struct file_operations的open,依次类推。
设备节点:
即/dev目录下面的设备,当驱动层申请设备号后,通过cat /proc/devices 可以查询到申请设备的主次设备号。然后管理员可以手动去创建该设备,命令形式为:mknod -m 777 /dev/buttons c 249 0
以linux下的/dev/fb0设备节点为例:
tang@tang-vm ~ $ cat /proc/devices
Character devices:
...
29 fb
...
可见其主设备号为29.
tang@tang-vm ~ $ ls /dev/fb0 -l
crw-rw---- 1 root video 29, 0 4月 14 00:01 /dev/fb0
设备节点/dev/fb0主设备号与cat /proc/devices得到的一致。
1.1.1. 方案1,手动创建设备节点
|
。
![]() |
1.1.2. 方案2,自动创建设备节点
|
||||
|
||||
1.1.2.1. /dev设备节点自动创建原理
l 在sysfs下创建类
/sys
├── class
│ ├── input
│ │ ├── event0 -> ../../devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input0/event0
│ ├── leds → 由cls = class_create(THIS_MODULE, "leds"); //创建设备类
│ │ └── phy0-led -> ../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/phy0-led →由 device_create(cls, NULL, dev, NULL, "phy0-led"); //创建/sys/class/leds/phy0-led
l udev自动加载
加载模块insmod *.ko的时候,用户空间中的udev会自动响应 device_create(…)函数,内核产生uevent, 在kset下产生uevent文件,其文件内容为action(add, remove等), 通过netlink socket被守护进程udevd捕获后,扫描/sys下的uevent文件,在/dev下自动创建对应的设备号。 见下面例子
l e.g
cls = class_create(THIS_MODULE, "leds-atomic"); //
device_create(cls, NULL, dev, NULL, "myled");//dev/myled
当insmod 该驱动后,
cat /sys/class/leds-atomic/myled/uevent(文件在内核中数据结构为struct attribute)
→ MAJOR=250
MINOR=0
DEVNAME=myled
因此,udevd根据上述uevent文件在创建设备节点 /dev/myled, major和minor分别为250和0。
【linux驱动】linux驱动总览的更多相关文章
- linux块设备驱动之实例
1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major = register_blkdev(sbull_major, "sbull&quo ...
- Linux 视频设备驱动V4L2最常用的控制命令
http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...
- linux 2.6 驱动笔记(二)
字符设备驱动 linux 2.6的字符驱动由cdev结构体描述,具体参考globalmem例子,代码主要分以下几部分: 1. 定义一个字符类型设备驱动的结构体 struct globalmem_dev ...
- linux 2.6 驱动笔记(一)
本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...
- linux enc28j60网卡驱动移植(硬件spi和模拟spi)
本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...
- 深入理解Linux字符设备驱动
文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...
- Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】
本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...
- arm驱动linux异步通知与异步IO【转】
转自:http://blog.csdn.net/chinazhangzhong123/article/details/51638793 <[ arm驱动] linux异步通知与 异步IO> ...
- Smart210学习记录----beep linux字符设备驱动
今天搞定了beep linux字符设备驱动,心里还是很开心的,哈哈...但在完成的过程中却遇到了一个非常棘手的问题,花费了我大量的时间,,,, 还是把问题描述一下吧,好像这个问题很普遍的,网上许多解决 ...
- 在开发板Linux上挂载"驱动"挂载不成功,出现提示server 172.27.52.100 not responding, still trying
1.在开发板具体操作步骤如下: 1.1 :设置IP ifconfig eth0 172.27.52.200 1.2 :ping通 虚拟机Linux 主机Linux ping XXX.XXX.X ...
随机推荐
- Dapper 基础用法
Dapper是.Net下的一个简单orm框架,具有以下特点: 1.简单,只需要一个文件即可(SqlMapper.cs) 2.快速,下面是一个查询结果集在500以上的运行速度对比 3.不要求特定的db ...
- PROPAGATION_REQUIRED
PROPAGATION_REQUIRED (2009-05-13 13:26:52) 转载▼ 事务传播行为种类 Spring在TransactionDefinition接口中规定了7种类型的事务传 ...
- paip.tree 生成目录树到txt后的折叠查看
paip.tree 生成目录树到txt后的折叠查看 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.ne ...
- 解决warning: incompatible implicit declaration of built-in function 'malloc'
因为代码中使用了malloc函数和字符串函数.编译时出现错误 warning: incompatible implicit declaration of built-in function 'mall ...
- ThinkPHP - Widget 工具
提出问题:widget能实现什么功能? 显示右侧博文: 1.首先在Home目录下新建Widget文件夹,之后建立对应文件 2.拿最热Hot新闻来举例: 在Tpl目录下Common公共文件夹里的righ ...
- 获取系统的emoji表情定制键盘
首先 ,想要获取系统的表情,要首先知道表情对应的UTF8 的编码方式,我将其中一部分的图片展示出来 ,然后用UIButton 排列,iOS 7后又增加了300多个表情符号,这些都可以百度查到,现在上代 ...
- POJ 3276 Face The Right Way 翻转(开关问题)
题目:Click here 题意:n头牛排成一列,F表示牛面朝前方,B表示面朝后方,每次转向K头连续的牛的朝向,求让所有的牛都能面向前方需要的最少的操作次数M和对应的最小的K. 分析:一个区间反转偶数 ...
- POJ 1458 最长公共子序列 LCS
经典的最长公共子序列问题. 状态转移方程为 : if(x[i] == Y[j]) dp[i, j] = dp[i - 1, j - 1] +1 else dp[i, j] = max(dp[i - 1 ...
- VC++共享数据段实现进程之间共享数据
当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段.; #pragma data_seg()//恢复到正常段继续编程 ...
- validform 一行代码完成所有验证
validform一行代码完成所有验证 在使用的时候想更改提示效果为右侧提示却一直不能成功 tiptype可以为1.2 和 自定义函数.2 表示右侧提示. 注意:tiptype为 2 时,各表单元素对 ...
