Linux字符设备驱动--设备注册

学习Linux驱动,对学习过程进行的记录,在上一次的基础上对代码进行了扩充,并且附上自己对字符驱动的理解,刚开始学习, 理解不对的,还请指出。

在Linux驱动模型中,提供了一种一种虚拟总线,成为Platform总线,相应的设备为platform设备,驱动为platform驱动。因此,将设备和驱动区别对待,当设备和驱动匹配后(匹配由操作系统来做,驱动名字与设备名字一致时,为匹配,个人理解),会调用probe函数,完成一些初始化工作,probe函数在驱动中定义,完成一些硬件的初始化、资源的申请以及设备节点的生成等等工作,初始化生成的设备节点作为一个设备文件,对应用层开放,可以像访问一个文件一样访问,例如,read、write等等。

因此,在Platform驱动模型下,编写驱动程序的之前先要完成设备的定义,过程如下:

1、在平台文件(BSP)中定义设备

struct platform_device   
{  
 const char * name;  
 u32  id;  
 struct device dev;  
 u32  num_resources;  
 struct resource * resource;  
}; 

主要包括设备名 name ,name要和驱动名一致。

id:初始化成-1

dev:对于这个结构体不太理解,但是要关注的是它的一个成员,platform_data,这是一个指针,可以指向用户定义的结构体,因此,可以利用这个指针记录一些硬件配置信息等等,由于是自己定义的所以比较灵活。例如:

static struct plat_dev_data demo_gpio = {
.gpio = EXYNOS4_GPL2(0),
.desc = "LED",
};  
struct platform_device demo_device = {
.name = "lqled",
.id = -1,
.dev = {
.release = release,
.platform_data = &demo_gpio,
},
};

resource:同样是一个结构体,系统定义的,同样也是记录所需的资源,例如:中断、内存什么的。同一个设备可以申请多种硬件资源,用一个数组表示就可以了,num_resources表示数组的大小。

2、注册设备

设备的注册时通过,platform_device_register这个函数完成的,但是,用户可以不关心这个,直接将自己定义的设备的结构体的地址,添加到static struct platform_device *xxx_devices[] __initdata 这个数组里就行了,具体怎么实现的还不清楚,这个数组在我的开发板中,是在iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c中。

3、编译、生成镜像,下载到开发板

这样的话驱动注册就完成了,此外,利用一些宏定义,make menuconfig 、kconfig工具等可以实现内核的裁剪,比较简单。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/platform_device.h>
#include <mach/gpio-exynos4.h> //GPIO宏
#include <linux/user_header.h> //自定义的头文件
static struct plat_dev_data demo_gpio = {
.gpio = EXYNOS4_GPL2(0),
.desc = "LED",
};  
static void release(struct device *dev)

}
struct platform_device demo_device = {
.name = "lqled",
.id = -1,
.dev = {
.release = release,
.platform_data = &demo_gpio,
},
};
static int Module_Init(void)
{
printk(KERN_EMERG "Module_Init!\n");
return platform_device_register(&demo_device);
}
static void Module_Exit(void)
{
platform_device_unregister(&demo_device);
printk(KERN_EMERG "Module_Exit!\n");
}
module_init(Module_Init);
module_exit(Module_Exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("LiQiang");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值