欢迎转载,转载时需保留作者信息,谢谢。

邮箱:tangzhongp@163.com

博客园地址: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,手动创建设备节点

 
 

       alloc_chrdev_region(&dev, 0, 1, "buttons"):动态设备号

       register_chrdev_region:静态设备号

       register_chrdev

 

 

 

 

 

 

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1.2.   方案2,自动创建设备节点

 

       
   

alloc_chrdev_region(&dev, 0, 1, "buttons"):动态设备号

register_chrdev_region:静态设备号

cls = class_create(THIS_MODULE, "leds-atomic"); //

device_create(cls, NULL, dev, NULL, "myled");//dev/myled

 

 
 

在应用中使用 fd = open("/dev/myled", O_RDWR);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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驱动总览的更多相关文章

  1. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

  2. Linux 视频设备驱动V4L2最常用的控制命令

    http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...

  3. linux 2.6 驱动笔记(二)

    字符设备驱动 linux 2.6的字符驱动由cdev结构体描述,具体参考globalmem例子,代码主要分以下几部分: 1. 定义一个字符类型设备驱动的结构体 struct globalmem_dev ...

  4. linux 2.6 驱动笔记(一)

    本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...

  5. linux enc28j60网卡驱动移植(硬件spi和模拟spi)

    本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...

  6. 深入理解Linux字符设备驱动

    文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...

  7. Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】

    本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...

  8. arm驱动linux异步通知与异步IO【转】

    转自:http://blog.csdn.net/chinazhangzhong123/article/details/51638793 <[ arm驱动] linux异步通知与 异步IO> ...

  9. Smart210学习记录----beep linux字符设备驱动

    今天搞定了beep linux字符设备驱动,心里还是很开心的,哈哈...但在完成的过程中却遇到了一个非常棘手的问题,花费了我大量的时间,,,, 还是把问题描述一下吧,好像这个问题很普遍的,网上许多解决 ...

  10. 在开发板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 ...

随机推荐

  1. Centon6.5虚拟机桥接设置

    参考资料:http://blog.csdn.net/iamfafa/article/details/6209009 安装虚拟机的时候 就直接选择桥接,可以直接 使用 查看此状态下的配置如下 : 虚拟环 ...

  2. Qt之QNetworkInterface(查询网络接口),QHostInfo(查询主机IP)

    http://blog.csdn.net/u011012932/article/details/50775052 http://blog.csdn.net/u011012932/article/det ...

  3. vs2010 条件断点 has changed是什么意思?

    在vs2010 断点设置 condition里,有2个选项可以选择: 一个是true,另个是has changed,true好理解,如果表达式为真则停止.但是has changed是什么意思.看了官网 ...

  4. 基于PCA的人脸识别步骤

    代码下载:基于PCA(主成分分析)的人脸识别 人脸识别是一个有监督学习过程,首先利用训练集构造一个人脸模型,然后将测试集与训练集进行匹配,找到与之对应的训练集头像.最容易的方式是直接利用欧式距离计算测 ...

  5. B-树和B+树的应用:数据搜索和数据库索引

    B-树和B+树的应用:数据搜索和数据库索引  B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每 ...

  6. Button的设置及各种属性

    (1)UIButton类继承自UIControl,而UIControl继承自UIView,因为UIView就是个矩形区域,所以UIButton实例化的对象其实都是一个矩形,虽然有各种圆角.增加联系人. ...

  7. 如何提高banner设计含量--网上的一篇文章--感悟

    "修改": 本质上是改什么?改大小?图片?文字?颜色? 老板说:修改本质上是提高“设计含量”.检测一个作品设计含量的高低,可以将作品中每一个设计元素进行分析,看它的“属性”与“操作 ...

  8. Android Intent 解析之二

    服务端Intent运行过程: Sticky:这个类型的BroadCast表示某些Intent须要被保留,当新的应用起来后,须要关注这个消息,可是呢,又不须要启动这个应用来接收此消息,比方耳机插入等消息 ...

  9. activity_main.xml

    activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  10. Android 中 ListView 常用属性合集

    class ListView.FixedViewInfo//用来在列表内展现一个固定位置视图,如在列表顶端的header和在列表底端的footer 一.XML属性 1.ListView的XML属性 a ...