看了一些资料,对驱动程序的编写大概有了些了解。但是仍然没有形成系统的概念,写这个帖子整理一下思路。
驱动程序中要定义一个设备名
#define DEVICE_NAME "EmbedSky_leds"
定义个主设备号
#define LED_MAJOR 231
定义一个file_operations 类型的结构,应用程序操作设备文件时所调用的open,read,write等函数,最终会调用这个结构中指定的对应函数
struct file_operations EmbedSky_leds_fops =
{
.owner = THIS_MODULE;//这句的作用还不明白,谁能补充?
.open = EmbedSky_leds_open;
.ioctl = EmbedSky_leds_ioctl;
};
接下来定义EmbedSky_leds_open()和EmbedSky_leds_ioctl()函数。
定义设备初始化函数
static int __init EmbedSky_leds_init(void)
{
在初始化函数里调用
regist_chrdev(LED_MAJOR,DEVICE_NAME,&EmbedSky_leds_fop)注册设备驱动程序。参数为主设备号,设备名字,file_operations结构。
在初始化函数里还调用class_create(THIS_MODULE,DEVICE_NAME)函数注册一个类,目的是用mdev在“/dev/"目录下建立设备节点,这个原理还不清楚。
}
定义一个设备卸载函数
static void __exit EmbedSky_leds_exit(void)
{
在卸载函数里卸载驱动程序
unregister_chrdev(LED_MAJOR,DEVICE_NAME);
}
指定驱动程序的初始化函数和卸载函数
module_init(EmbedSky_leds_init);
module_exit(EmbedSky_leds_exit);
还有一些不是必须的信息
MODULE_LICENSE("GPL") ; //遵循的协议
MODULE_AUTHOR("YW912");//驱动程序的作者
未完待续。。。
文章评论(0条评论)
登录后参与讨论