linux设备驱动开发入门
1.linux内核模块开发入门
基本步骤
1 | graph LR; |
1.实例
1 |
|
2.修改模块代码所在的目录的Kconfig文件
1 | config MY_MODULE |
3.修改该目录下的Makefile文件
1 | obj-$(CONFIG_MY_MODULE) += module.o |
4.运行内核模块
1 | dmesg -C #清除内核已打印的信息 |
5.linux设备驱动开发
linux内核用设备号来区分不同的设备,设备号是一个32位的无符号整数,dev_t类型,而且设备号可以分为两个部分,
1.主设备号
占12位
2.次设备号
占20位
常用的api
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25MAJOR(dev_t dev);
//获取设备号的主设备号
MINOR(dev_t dev);
//获取设备的次设备号
MKDEV(int major,int minor);
//创建一个设备
int register_chrdev_region(dev_t from,unsigned count,char *name);
//手动注册一个设备到内核
int alloc_chrdev_regionda(dev_t *dev,unsigned baseminor,unsigned count,const char *name);
//只需要主次设备号和fops即可注册设备
int __register_chrdev(unsigned int major, unsigned int baseminor,
unsigned int count, const char *name,
const struct file_operations *fops)
void unregister_chrdev_region(dev_t from,unsigned count);
//注销一个设备
//动态注册一个设备到内核中
//分配成功后会在/proc/devices中查看到设备号对应的设备名称
cdev_alloc(void);
cdev_init(struct cdev *dev,struct file_operations *fops);
cdev_add(struct cdev *dev,dev_t devnum,unsigned int count);
cdev_del(struct cdev *dev);
//将数据从内核空间拷贝到用户空间
unsigned long copy_to_user(void __user *to,const void *from,unsigned long n);
unsigned long copy_from_user(void *to,void *from,unsigned long n);基本步骤
1
2graph LR;
a(申请设备号)-->b(注册设备号)-->c(设置设备对应的file_ops)-->d(将其加入到内核的链表中)