Xiuye_XY于 2021-08-03 19:17:07 发布343 收藏 3
分类专栏: 笔记 C/C++ Linux
版权
编辑笔记同时被 3 个专栏收录正在上传…重新上传取消
128 篇文章0 订阅
订阅专栏
编辑C/C++
278 篇文章2 订阅
订阅专栏
编辑Linux
61 篇文章0 订阅
订阅专栏
驱动源码
#include <linux/init.h>
-
#include <linux/module.h>
-
#include <linux/kernel.h>
-
#include <linux/fs.h>
-
#include <linux/delay.h>
-
#define major_version 200
-
#define driver1_name "driver1"
-
static char read_buf[100] = "Hello driver1";
-
static char write_buf[100];
-
static int driver1_open(struct inode *inode,struct file *file){
-
printk("driver1 open\r\n");
-
return 0;
-
}
-
static int driver1_close(struct inode *inode,struct file *file){
-
printk("driver1 close\r\n");
-
return 0;
-
}
-
static ssize_t driver1_read(struct file *file, char __user * buf, size_t count, loff_t *ppos){
-
printk("driver1 read\r\n");
-
copy_to_user(buf,read_buf,count);
-
return 0;
-
}
-
static ssize_t driver1_write(struct file *file, const char __user * buf, size_t count, loff_t *ppos){
-
int ret = 0;
-
printk("driver1 write\r\n");
-
ret = copy_from_user(write_buf,buf,count);
-
if(!ret){
-
printk("receive data: %s \r\n",write_buf);
-
}
-
return 0;
-
}
-
static struct file_operations ops={
-
.owner = THIS_MODULE,
-
.open = driver1_open,
-
.release = driver1_close,
-
.read = driver1_read,
-
.write = driver1_write
-
};
-
static int __init driver1_init(void)
-
{
-
int ret ;
-
printk("%s,%d\r\n", __func__, __LINE__);
-
ret= register_chrdev(major_version,driver1_name, &ops);
-
return ret;
-
}
-
static void __exit driver1_exit(void)
-
{
-
printk("%s,%d\r\n", __func__, __LINE__);
-
unregister_chrdev(major_version, driver1_name);
-
}
-
module_init(driver1_init);
-
module_exit(driver1_exit);
-
MODULE_LICENSE("GPL");
Makefile文件:(像obj-m ,-C, M= 等好像是规定的,不要随便改写)
-
#内核的源码路径, ?= 条件赋值, uname -r 得到内核的版本号
-
KERNELDIR = /lib/modules/$(shell uname -r)/build
-
# 生成模块
-
obj-m := driver1.o
-
# := 立即赋值, 得到当前的绝对路径
-
PWD := $(shell pwd)
-
# -C 切换工作路径, make -c
-
modules:
-
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
-
clean:
-
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules* *.mod
-
.PHONY: modules clean
应用程序调用驱动文件:
-
#include<iostream>
-
#include<unistd.h>
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
#include <fcntl.h>
-
using namespace std;
-
int main(int argc,char*argv[]){
-
int ret = 0;
-
int fd = 0;
-
char *filename;
-
char read_buf[100],write_buf[100]="hello,driver1";
-
if(argc < 2){
-
cout << "cmd one param!" << endl;
-
return -5;
-
}
-
filename = argv[1];
-
fd = open(filename,O_RDWR);
-
if(fd < 0){
-
cout << "Cannot open file,"<<filename<< endl;
-
return -1;
-
}
-
ret = read(fd,read_buf,100);
-
if(ret < 0){
-
cout << "read file "<<filename << " failed."<<endl;
-
return -2;
-
}
-
cout<< "read buf:" << read_buf << endl;
-
ret = write(fd,write_buf,100);
-
if(ret <0){
-
cout << "write file "<< filename << " failed." <<endl;
-
return -3;
-
}
-
ret = close(fd);
-
if(ret <0){
-
cout << "close file "<< filename << " failed." <<endl;
-
return -3;
-
}
-
cout << "app end" << endl;
-
return 0;
-
}
编译驱动
-
make -C /lib/modules/5.8.0-63-generic/build M=/home/xiuye/Documents/cpp/driver1 modules
-
make[1]: Entering directory '/usr/src/linux-headers-5.8.0-63-generic'
-
CC [M] /home/xiuye/Documents/cpp/driver1/driver1.o
-
MODPOST /home/xiuye/Documents/cpp/driver1/Module.symvers
-
CC [M] /home/xiuye/Documents/cpp/driver1/driver1.mod.o
-
LD [M] /home/xiuye/Documents/cpp/driver1/driver1.ko
-
make[1]: Leaving directory '/usr/src/linux-headers-5.8.0-63-generic'
加载驱动
insmod driver1.ko 或者 modprobe driver1.ko
创建设备文件(如果/dev下没有驱动名的文件)
mknod /dev/driver1 c 200 0
-
root@ubuntu:cpp/driver1# ls /dev/driver1
-
/dev/driver1
-
root@ubuntu:cpp/driver1# cat /proc/devices | grep driver1
-
200 driver1
应用程序调用驱动(只能在root下调用,否则失败,不知道原因):
-
root@ubuntu:cpp/driver1# ./a.out /dev/driver1
-
read buf:Hello driver1
-
app end
查看驱动打印消息:
-
root@ubuntu:cpp/driver1# dmesg
-
[ 5062.671752] driver1_exit,76
-
[ 5078.688136] driver1_init,63
-
[ 5303.464000] driver1 open
-
[ 5303.464002] driver1 read
-
[ 5303.464030] driver1 write
-
[ 5303.464030] receive data: hello,driver1
-
[ 5303.464031] driver1 close
删除驱动:
-
root@ubuntu:cpp/driver1# rmmod driver1
-
root@ubuntu:cpp/driver1# dmesg
-
[ 5438.032293] driver1_exit,76
删除设备文件,直接用 rm 命令。
echo $? 显示当前程序返回值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)