字符设备驱动 以及Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <linux/module.h>       // module_init  module_exit
#include <linux/init.h>         // __init   __exit
#include <linux/cdev.h>
#include <linux/fs.h>
#define MYMAJOR     200
#define MYNAME      "chardev_test_byHc"
  
  
//DEVICE ID
dev_t devid;
  
static int chardev_open(struct inode *inode, struct file *file)
{
    printk(KERN_INFO "chardev open\n");
    return 0;
}
  
static ssize_t chardev_read(struct file *file, char __user *buf,
          size_t size, loff_t *ppos)
{
    return 0;
}
  
  
static const struct file_operations chardev_fops = {
  
    .open = chardev_open,
    .read = chardev_read,
};
  
static struct
{
    struct cdev cdev;
}chardev;
  
static int __init mymodule_init(void)
{  
    int ret = 0;
    printk(KERN_INFO "chrdev_init helloworld init\n");
    cdev_init(&chardev.cdev,&chardev_fops);
         
    alloc_chrdev_region(&devid,2,255,MYNAME);
    printk(KERN_INFO "MAJOR Number is %d\n",MAJOR(devid));
    printk(KERN_INFO "MINOR Number is %d\n",MINOR(devid));
    cdev_add(&chardev.cdev,devid,255);
         
    return 0;
}
static void __exit mymodule_exit(void)
{
    printk(KERN_INFO "chrdev_exit helloworld exit\n");
    cdev_del(&chardev.cdev);
    unregister_chrdev_region(devid,255);
  
}
  
  
module_init(mymodule_init);
module_exit(mymodule_exit);
  
// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL");              // 描述模块的许可证
MODULE_AUTHOR("Hanc");              // 描述模块的作者
MODULE_DESCRIPTION("module test");  // 描述模块的介绍信息
MODULE_ALIAS("alias xxx");          // 描述模块的别名信息

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CURRENT = $(shell uname -r )
KERNEL_TARGET=hello_test
MODULE_NAME :=$(KERNEL_TARGET)
MODULE_SUF=.ko
PWD:=$(shell pwd)
OUTPUT=$(PWD)/
KDIR=/lib/modules/$(CURRENT)/build
 
INCLUDE=-I/usr/src/linux-headers-4.9.0-3-common/include
EXTRA_CFLAGS = -Wall -g -DASD_KERNEL $(INCLUDE)
#ccflags-y+=$(shell if [ $(call cc-version) -ge 0490 ] ; then echo "-Wno-error=date-time -Wno-date-time"; fi ;)
 
obj-m:=$(MODULE_NAME).o
$(MODULE_NAME)-objs:=test.o
all:
    make -C $(KDIR) INCLUDE=$(INCLUDE) M=$(PWD) modules
clean:
    make -C $(KDIR) M=$(PWD) clean
.PHONY: modules clean

 

posted on   lydstory  阅读(120)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2020-03-31 文档解析关注-技术
2020-03-31 mfc添加控制台参数
2020-03-31 蜀道难
2019-03-31 VC++ HIDAPI实现USB数据读写
2019-03-31 进程隐藏
2019-03-31 服务程序
2019-03-31 光电系统显控软件

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示