0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式Linux主设备号和次设备号的获取

Q4MP_gh_c472c21 来源:未知 作者:李倩 2018-05-23 17:18 次阅读

Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。

一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统,有两个LED指示灯LED灯需要独立的打开或者关闭。那么,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号分别为1和2。这里,次设备号就分别表示两个LED灯。

设备文件通常都在 /dev 目录下。如:

如上,前面第一个字符为c 的表示字符设备。在字符设备里,有主设备号和次设备号。如上1,4,7 分别是主设备号,0,1,3,7,70,71都是次设备号。一般的,主设备号标识出与设备关联的设备驱动。如 /dev/null 和 /dev/full 由 1 号驱动来管理,/dev/vcs 和/dev/vcs1由 7 号驱动来管理,/dev/ttyS6 由 4 号驱动来管理。

现在的 Linux 内核允许多个驱动共享一个主设备号,但更多的设备都遵循一个驱动对一个主设备号的原则。

内核由次设备号确定当前所指向的是哪个设备。根据所编写的驱动程序,可以从内核那里得到一个直接指向设备的指针,或者使用次设备号作为一个设备本地数组的索引。但不论如何,内核自身几乎不知道次设备号的什么事情。

设备号的内部表示在内核中,dev_t 类型( 在 linux/types.h 头文件有定义 ) 用来表示设备号,包括主设备号和次设备号两部分。对于 2.6.x 内核,dev_t 是个 32 位量,其中 12 位用来表示主设备号,20 位用来表示次设备号。

在 linux/types.h 头文件里定义有

主设备号和次设备号的获取

为了写出可移植的驱动程序,不能假定主设备号和次设备号的位数。不同的机型中,主设备号和次设备号的位数可能是不同的。应该使用MAJOR宏得到主设备号,使用MINOR宏来得到次设备号。下面是两个宏的定义:(linux/kdev_t.h)

#define MINORBITS 20 /*次设备号*/

#define MINORMASK ((1U << MINORBITS) - 1)             /*次设备号掩码*/  

#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) /*dev右移20位得到主设备号*/

#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) /*与次设备掩码与,得到次设备号*/

MAJOR宏将dev_t向右移动20位,得到主设备号;MINOR宏将dev_t的高12位清零,得到次设备号。相反,可以将主设备号和次设备号转换为设备号类型(dev_t),使用宏MKDEV可以完成这个功能。

#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))

MKDEV宏将主设备号(ma)左移20位,然后与次设备号(mi)相与,得到设备号

静态分配设备号

静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。对于一部分常用的设备,内核开发者已经为其分配了设备号。这些设备号可以在内核源码documentation/ devices.txt文件中找到。如果只有开发者自己使用这些设备驱动程序,那么其可以选择一个尚未使用的设备号。在不添加新硬件的时候,这种方式不会产生设备号冲突。但是当添加新硬件时,则很可能造成设备号冲突,影响设备的使用。

动态分配设备号

由于静态分配设备号存在冲突的问题,所以内核社区建议开发者使用动态分配设备号的方法。动态分配设备号的函数是alloc_chrdev_region()。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11229

    浏览量

    208927
  • 设备
    +关注

    关注

    2

    文章

    4473

    浏览量

    70540

原文标题:嵌入式Linux主设备号和次设备号详解

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式Linux下PCI设备驱动的设计

    ]。Linux因其开放源代码以及稳定的性能,越来越受到广大用户青睐。同时,基于Linux内核的嵌入式操作系统应用势头强劲,开发基于Linux设备
    发表于 10-08 09:44

    嵌入式驱动开发 Linux字符设备驱动

    1.嵌入式设备驱动概述2.字符设备驱动框架3.GPIO驱动程序设计实例4.中断处理和同步机制1.1驱动程序设计是嵌入式Linux开发中重要的
    发表于 10-09 17:21

    嵌入式设备如何获取公网IP?

    设备又没有该程序;方法设备采用的是嵌入式linux,其中的工具箱busybox中有轻量级的wget应用,因此可以用改应用获取
    发表于 10-27 08:09

    为什么要配置Linux系统嵌入式设备的串口通信​

    我们查看这些数据,那么问题来了,当我们可以让一个设备从串口使用UART的方式输出数据,这个设备和一个搭载Linux系统的嵌入式设备通信的时候
    发表于 12-16 07:24

    如何查看注册的主设备

    嵌入式LINUX驱动学习之4.字符设备驱动编程(三)用户空间实现代码之驱动注册和卸载一、注册驱动 模块:二、查看注册的主设备三、根据
    发表于 12-24 07:03

    嵌入式Linux设备驱动开发

    嵌入式Linux设备驱动开发 Linux 设备驱动的基本概念Linux
    发表于 09-10 13:10 82次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>设备</b>驱动开发

    嵌入式Linux字符设备驱动的设计与应用

    描述了基于嵌入式Linux的字符设备驱动程序的设计方法和实现过程。以电机、数码管、串口和mini键盘的驱动设计为例,详细阐述了嵌入式linux
    发表于 02-23 15:45 24次下载

    嵌入式Linux字符设备驱动的设计与应用

    描述了基于嵌入式Linux的字符设备驱动程序的设计方法和实现过程。以电机、数码管、串口和mini键盘的驱动设计为例,详细阐述了嵌入式linux
    发表于 07-14 17:31 31次下载

    嵌入式应用中的USB主设备功能

    嵌入式应用中的USB主设备功能 USB已经成为设备和PC之间通信的标准方式,从通用设备(如闪存设备和鼠标)到专用
    发表于 06-02 07:49 643次阅读

    嵌入式应用中的USB主设备功能

    嵌入式应用中的USB主设备功能 USB已经成为设备和PC之间通信的标准方式,从通用设备(如闪存设备和鼠标)到专用
    发表于 08-27 10:32 488次阅读

    基于嵌入式Linux LCD设备驱动分析

    基于嵌入式Linux LCD设备驱动分析
    发表于 10-30 16:20 14次下载
    基于<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> LCD<b class='flag-5'>设备</b>驱动分析

    嵌入式Linux驱动开发基础总结(下篇)

    14, 字符设备驱动程序设计基础主设备设备(二者一起为
    的头像 发表于 03-15 09:17 6241次阅读

    想要驾驭Linux驱动开发,必须深刻理解Linux总线设备驱动框架

    想要驾驭Linux驱动开发,必须深刻理解Linux总线设备驱动框架。之所以会形成这样的框架,主要是为了代码的可重用性,因为驱动和设备的关系是一对多的。正如
    的头像 发表于 03-22 11:08 1.1w次阅读
    想要驾驭<b class='flag-5'>Linux</b>驱动开发,必须深刻理解<b class='flag-5'>Linux</b>总线<b class='flag-5'>设备</b>驱动框架

    嵌入式Linux UART

    文章目录前言串口连接串口测试C代码微信公众前言这是前篇:嵌入式Linux i.MX开发板嵌入式Linux NFS
    发表于 11-01 16:26 8次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> UART

    推荐 | 几个我星标的嵌入式公众

    小麦大叔 推荐一位我的好朋友的公众:小麦大叔,主麦叔,万粉主。CSDN知名博客专家,万粉博主。麦叔公众和博客的内容博大精深,包括但不限于嵌入
    发表于 12-01 20:06 7次下载
    推荐 | 几个我星标的<b class='flag-5'>嵌入式</b>公众<b class='flag-5'>号</b>