ARM驱动学习之静态申请字符类设备号

                               ARM驱动学习之静态申请字符类设备号

内核文件:
宏定义MKDEV的头文件“include/linux/kdev_t.h”
register_chrdev_region 和 unregister_chrdev_region在头文件"include/linux/fs.h"


1.“module_param.c“改写为“request_cdev_num.c”
修改Makefile对应名字

2.添加linux头文件
/*字符设备函数*/
#include 
/*MDKDEV转换设备号数据类型宏定义*/
#include 
/*定义字符设备的结构体*/
#include 

3.删除数组并宏定义:
//定义两个设备号
#define DEVICE_MINOR_NUM 2
#define DEV_MAJOR 0
#define DEV_MINOR 0

int numdev_major = DEV_MAJOR ;
int numdev_minor = DEV_MINOR ;
/*主设备号*/
module_param(numdev_major,int,S_IRUSR);
/*次设备号*/
module_param(numdev_minor,int,S_IRUSR);

4.sscdev_init中定义:
int ret = 0;
dev_t num_dev;
if(numdev_major){
    num_dev = MKDEV(numdev_major,numdev_minor);
    ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME);
    if(ret < 0)
    {
        printk(KERN_EMERG "register_chrdev_region req is %d is failed \n",num_dev );
    }
    printk(KERN_EMERG "numdev_major %d is success \n",numdev_major);

}else{  
    printk(KERN_EMERG "numdev_major %d is failed \n",numdev_major);
}

5.sscdev_init中定义:
unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM); 

6.加载运行
– 使用命令“cat /proc/devices”查看已经被注册的主设备,设备号9没有被注
册
– insmod /mnt/udisk/request_cdev_num.ko numdev_major=9 numdev_minor=0
– 使用命令“cat /proc/devices”查看,设备号9被注册为scdev
– rmmod request_cdev_num numdev_major=9 numdev_minor=0

源码:

#include 
/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/
#include 
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/

/*定义module_param module_param_array的头文件*/
#include 
/*定义module_param module_param_array中perm的头文件*/
#include 

/*字符设备函数*/
#include 
/*MDKDEV转换设备号数据类型宏定义*/
#include 
/*定义字符设备的结构体*/
#include 

#define DEVICE_NAME "sscdev"
#define DEVICE_MINOR_NUM 2
#define DEV_MAJOR 0
#define DEV_MINOR 0


MODULE_LICENSE("Dual BSD/GPL");
/*声明是开源的,没有内核版本限制*/
MODULE_AUTHOR("iTOPEET_dz");
/*声明作者*/

static int numdev_major = DEV_MAJOR ;//主设备号
static int numdev_minor = DEV_MINOR ;//次设备号

module_param(numdev_major,int,S_IRUSR);
module_param(numdev_minor,int,S_IRUSR);



static int sscdev_init(void)
{
	int ret = 0;
	dev_t num_dev;
	if(numdev_major){
		num_dev = MKDEV(numdev_major,numdev_minor);
		//宏命令,用于处理各种设备号相关的数据
		//设备注册
		ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME);
		if(ret < 0)
		{
			 printk(KERN_EMERG "register_chrdev_region req is %d is failed \n",num_dev );
			 return -1;
		}
		printk(KERN_EMERG "numdev_major %d is success \n",numdev_major);
	}
	else{
		printk(KERN_EMERG "numdev_major %d is failed \n",numdev_major);
	}
		
	printk(KERN_EMERG "sscdev enter!\n");
	/*打印信息,KERN_EMERG表示紧急信息*/
	return 0;
}

static void sscdev_exit(void)
{	
	unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM);
	printk(KERN_EMERG "sscdev exit!\n");
}


module_init(sscdev_init);
/*初始化函数*/
module_exit(sscdev_exit);
/*卸载函数*/

Makefile:

#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
#obj-m += mini_linux_module.o 
obj-m += request_cdev_num.o 
#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/topeet/Android4.0/iTop4412_Kernel_3.0
#当前目录变量
PWD ?= $(shell pwd)

#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
#$(PWD)当前目录变量
#modules要执行的操作
all:
	make -C $(KDIR) M=$(PWD) modules
		
#make clean执行的操作是删除后缀为o的文件
clean:
	rm -rf *.mod.c *.o *.order *.ko *.mod.o *.symvers

你可能感兴趣的:(嵌入式,C,arm开发,学习)