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

    文章

    10978

    浏览量

    206671
  • 设备
    +关注

    关注

    2

    文章

    4169

    浏览量

    69149

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

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

收藏 人收藏

    评论

    相关推荐

    嵌入式Linux下USB蓝牙设备驱动

    设备驱动,从而有助于蓝牙设备嵌入式领域广泛应用。【关键词】:蓝牙驱动;;USB设备;;MP;;嵌入式L
    发表于 04-24 09:30

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

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

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

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

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

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

    嵌入式Linux怎么移植实时设备驱动程序?

    Linux暴风雨般地占领了嵌入式系统市场。根据工业分析家分析,大约1/3到1/2的新的32位和64位嵌入式系统设计采用了Linux嵌入式
    发表于 03-27 08:14

    如何编写嵌入式Linux设备驱动程序?

    设备驱动程序在登记时申请的主设备一致,否则用户进程将无法访问到驱动程序。最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先调度。也就是说,系统必须在你的驱
    发表于 04-20 09:57

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

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

    嵌入式设备挂载目录

    嵌入式设备配置4.1 Linux内核添加NFS支持4.2 嵌入式设备挂载目录1. 背景嵌入式
    发表于 10-27 09:26

    嵌入式Linux开发的基本概念

    嵌入式Linux开发前,你可能需要知道这些基本概念 作者之前编写了一系列嵌入式Linux的开发文档: 关注公众【微联智控】,并回复【
    发表于 11-04 08:05

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

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

    嵌入式Linux存储设备包含什么

    前言:本文所说的嵌入式Linux存储设备包含:U盘、SD卡、NandFlash分区。本文主要实现嵌入式Linux在开机后,可自动检测存储外设
    发表于 12-21 08:19

    如何查看注册的主设备

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

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

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

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

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

    嵌入式设备获取公网IP的办法

    设备又没有该程序;方法设备采用的是嵌入式linux,其中的工具箱busybox中有轻量级的wget应用,因此可以用改应用获取
    发表于 10-19 18:33 1次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>设备</b><b class='flag-5'>获取</b>公网IP的办法