韦东山第二期——1.2_字符设备驱动程序之编写编译

作者:GWD 时间:2019.8.27

1、先写这两个,应用程序必须要告诉内核有这个程序,应用程序中需要什么接口, operation结构体中就有对应的接口,定义这个结构
韦东山第二期——1.2_字符设备驱动程序之编写编译_第1张图片
韦东山第二期——1.2_字符设备驱动程序之编写编译_第2张图片
在这里插入图片描述
2、将这个结构告诉内核
韦东山第二期——1.2_字符设备驱动程序之编写编译_第3张图片
在这里插入图片描述
内核怎么调用这个函数呢——第一个驱动的入口函数
3、但是每个驱动都有自己的入口函数,内核怎么知道哪个设备对应自己的入口呢?
答:要修饰一下,用module_init这个宏来修饰。这是一个结构体,里面有入口函数的指针,内核启动后会自动加载这个结构体。
4、使用设备类型+主设备号确定程序调用哪个设备,C表示字符型设备。
在这里插入图片描述
韦东山第二期——1.2_字符设备驱动程序之编写编译_第4张图片
在这里插入图片描述
韦东山第二期——1.2_字符设备驱动程序之编写编译_第5张图片
4、再梳理一下驱动的流程
韦东山第二期——1.2_字符设备驱动程序之编写编译_第6张图片
5、有入口就有出口,看一看出口(卸载)是怎样的,也是宏定义的结构体,在Linux中调用。
韦东山第二期——1.2_字符设备驱动程序之编写编译_第7张图片
6、第一个驱动实现的功能就是打印一些信息
韦东山第二期——1.2_字符设备驱动程序之编写编译_第8张图片
7、接下来编译加载
Makefile怎么写?
韦东山第二期——1.2_字符设备驱动程序之编写编译_第9张图片
第一行,编译依赖linux内核,加载前内核要先编译一次linux2.6以支持编译驱动。
韦东山第二期——1.2_字符设备驱动程序之编写编译_第10张图片
8、接下来拷到单板上测试一下
放到first_fs中
加载驱动用insmod命令
在这里插入图片描述
韦东山第二期——1.2_字符设备驱动程序之编写编译_第11张图片
9、代码


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

static int first_drv_open(struct inode *inode, struct file *file)
{
	printk("first_drv_open\n");
	return 0;
}

static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
	printk("first_drv_write\n");
	return 0;
}

static struct file_operations first_drv_fops = {
    .owner  =   THIS_MODULE,    /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */
    .open   =   first_drv_open,     
	.write	=	first_drv_write,	   
};


static int first_drv_init(void)
{
	register_chrdev(111, "first_drv", &first_drv_fops); // 注册, 告诉内核
	return 0;
}

static void first_drv_exit(void)
{
	unregister_chrdev(111, "first_drv"); // 卸载

}

module_init(first_drv_init);
module_exit(first_drv_exit);


MODULE_LICENSE("GPL");


你可能感兴趣的:(韦东山第二期)