嵌入式LINUX驱动学习之4.字符设备驱动编程(三)用户空间实现代码之驱动注册和卸载
说明:本例以生成的驱动模块为文件mychrdev.ko为例 ,所有执行都在下位机
一、注册驱动 模块:
insmod mychrdev.ko
二、查看注册的主设备号
cat /proc/devices
Character devices:
1 mem
5 /dev/tty
5 /dev/console
5 /dev/ptmx
........
244 myfile_cdev //主设备号244
........
三、根据主设备号创建字符设备文件
3.1方式一:通过bash创建
mknod /dev/mychrdev0 c 244 0
mknod /dev/mychrdev1 c 244 1
mknod /dev/mychrdev2 c 244 2
mknod /dev/mychrdev3 c 244 3
#命令说明:
# Usage: mknod [-m MODE] NAME TYPE MAJOR MINOR
# TYPE:
# b Block device
# c or u Character device
# p Named pipe (MAJOR and MINOR are ignored)
#
方式二:通过C语言编写代码创建,代码见附A,以编译好的文件名为:mychrdev_reg为例:
./mychrdev_reg 244 4 mychrdev
#命令说明:
# Usage:comm MAJOR minorct chrdev_name
四卸载驱动模块
rmmod mychrdev.ko
附A
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc , char * argv[]){
//对命令行输入的参数做判断
if (argc !=4){
printf("参数错误:\n");
printf(" comm <major> <minorct> <name>\n");
return -1;
}
unsigned long int i = 0;
dev_t dev_num;//定义设备号
dev_t major = strtoul(argv[1],NULL,0); 将主设备号转为整数型
int minorct = strtoul(argv[2],NULL,0);//将次设备号数量由字符型转为整形
int path_name_len;
char path_name[128] = "/dev/";//定义初始化保存设备名称的字符数组
char buf[4];//用于保存字符设备名称最后一位,即整形转为字符型的内容
strcat(path_name,argv[3]);//strcat(3)
path_name_len = strlen(path_name);
for(; i<minorct ;i++){
dev_num = makedev(major,i);//见帮忙手册mknod(2) makedev(3)
sprintf(buf,"%d",i);//sprintf(3)
strcat(path_name,buf);//为字符设备名称加编号
mknod(path_name,S_IFCHR,dev_num);//创建字符设备
path_name[path_name_len] = '\0';
}
return 0;
}