linux驱动开发--字符设备:静态分配设备号

简介: <strong><u>字符设备</u></strong>(char device)<br><p>        采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备)。系统标准字符设备,例如:字符中断、串口等设备。常见待开发设备驱动的字符设备,例如:触摸屏、键盘、视频捕捉设备、音频设备等。</p> <p><img src
字符设备(char device)

        采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备)。系统标准字符设备,例如:字符中断、串口等设备。常见待开发设备驱动的字符设备,例如:触摸屏、键盘、视频捕捉设备、音频设备等。


设备号
主设备号
    用于标识设备类型,内核代码根据该号码对应设备文件和对应的设备驱动程序
次设备号
    用于标识通类型的不同设备个体,驱动程序根据该号码辨别具体操作的是哪个设备个体。

设备号数据类型
   dev_t 本质是一个unsigned int 数据类型, 高12位是主设备号,低20位是次设备号。<linux/kdev_t.h>
提取主设备号宏
    unsigned int MAJOR(dev_t dev);
提取次设备号宏
    unsigned int MINOR(dev_t dev);
合成设备号宏
   dev_t MKDEV(unsigned int ma, unsigned int mi);

设备号的静态分配
内核源代码Documentation/devices.txt文件
该文件列出本内核源代码发行包中已经被使用和可以使用的主设备号
在devices.txt中寻找可用的主设备号。

int register_chrdev_region(dev_t from, unsigned count, const char *name);
from:待申请的设备号
count:待申请的设备号数目
name:设备名称(出现在/proc/devices)
返回:成功返回0,失败返回负值。
向内核申请从from开始的count个设备号(数设备号不变,次设备号增加)

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名称: char_device_driver.c
*文件标识: 字符设备驱动 :静态分配设备号
*
*当前版本:1.0
*作者:wuyq 
*
*取代版本:xxx
*原作者:xxx
*完成日期:2013-11-26
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>

MODULE_LICENSE("GPL");
#define  CDD_MAJOR	200//cat /proc/devices找一个尚未使用的
#define  CDD_MINOR	0
#define  CDD_COUNT	1
dev_t dev = 0;

int __init cdd_init(void)
{
	int ret = 0;
	//dev = CDD_MAJOR<<20 + CDD_MINOR;
	dev = MKDEV(CDD_MAJOR, CDD_MINOR);//生成设备号
	//注册设备号;1、要注册的起始设备号2、连续注册的设备号个数3、名字
	ret = register_chrdev_region(dev, CDD_COUNT, "cdd_demo");
	if(ret < 0){
		printk("register_chrdev_region failed!\n");
		goto failure_register_chrdev;
	}
	printk("register_chrdev_region successed! #cat /proc/devices\n");
	return 0;
failure_register_chrdev:
	return ret;
}

void __exit cdd_exit(void)
{
	//注销设备号
	unregister_chrdev_region(dev, CDD_COUNT);
}	

module_init(cdd_init);
module_exit(cdd_exit);

KERNELDIR ?=/root/Desktop/work/ldd3/linux-2.6.31_TX2440A
PWD := $(shell pwd)
obj-m += char_device_driver.o

default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	@rm -f *.o *.ord* *.sy* *.mod.* *.ko


目录
相关文章
|
1月前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
41 5
|
2月前
|
Linux 开发工具 Perl
Linux命令替换目录下所有文件里有"\n"的字符为""如何操作?
【10月更文挑战第20天】Linux命令替换目录下所有文件里有"\n"的字符为""如何操作?
48 4
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
4月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
58 6
|
4月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
61 5
|
4月前
|
存储 缓存 Unix
Linux 设备驱动程序(三)(上)
Linux 设备驱动程序(三)
55 3
|
4月前
|
缓存 安全 Linux
Linux 设备驱动程序(一)((下)
Linux 设备驱动程序(一)
50 3
|
4月前
|
Linux
Linux 设备驱动程序(四)
Linux 设备驱动程序(四)
35 1
|
4月前
|
存储 数据采集 缓存
Linux 设备驱动程序(三)(中)
Linux 设备驱动程序(三)
52 1