linux--platform驱动理论和例程

来源:互联网 发布:网络玄幻小说合集32 编辑:程序博客网 时间:2024/05/21 22:24

platform总线是linux2.6内核加入的一种新的虚拟总线,加入这个虚拟总线是为了程序的更好的移植,platform机制本身并不复杂,也是只有定义、注册两个步骤就能完成。。


platform驱动和传统的设备驱动模型相比,优势在于 platform 机制将设备本身的资源注册进内核,由内核同意管理,在驱动程序使用这些资源时使用统一的接口,这样提高了程序的可移植性

platform在linux设备模型中,其实就是一种虚拟总线没有对应的硬件结构。它的主要作用就是管理系统的外设资源,比如io内存,中断信号线。现在大多数处理器芯片都是soc,如s3c2440,它包括处理器内核(arm920t)和系统的外设(lcd接口,nandflash接口等)。linux在引入了platform机制之后,内核假设所有的这些外设都挂载在platform虚拟总线上,以便进行统一管理。

通过platform机制开发底层设备驱动的流程:

定义platform_device----->注册platform_device------>定义platform_driver----->注册platform_driver

下面从内核代码中吧各个描述结构体贴出解释:::

struct platform_device {
const char* name;/*平台设备的名称*/
int id;/*设备编号--配合设备名使用*/
struct device dev;
u32 num_resources;
struct resource*>
const struct platform_device_id*id_entry;
/* arch specific additions */
struct pdev_archdataarchdata;
};

分配一个platform_device设备

struct platform_device * platform_device_alloc(const char *name, int id);//参数 名称 和 id

注册平台设备使用的函数

int platform_device_add(struct platform_device *pdev);

平台设备资源描述结构体

struct resource {
resource_size_t start;//资源的起始物理地址
resource_size_t end;//资源的结束物理地址
const char *name;//资源的名字
unsigned long flags;//资源的类型--- 比如 MEM IO IRQ
struct resource *parent, *sibling, *child;//资源链表指针
};

获取资源结构体

struct resource *platform_get_resource(struct platform_device *dev,unsigned int type, unsigned int num)


dev --资源所属的设备

type---获取的资源类型

num----获取的资源数

平台驱动描述结构体

struct platform_driver {
int (*probe)(struct platform_device *);//驱动的具体操作函数
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
};

平台注册函数

int platform_driver_register(struct platform_driver *);

稍后贴代码:::

platform_device:::

#include<linux/init.h>
#include<linux/module.h>
#include<linux/device.h>
#include<linux/string.h>
#include<linux/kernel.h>
#include<linux/platform_device.h>

MODULE_AUTHOR("kong-hua-sheng");
MODULE_LICENSE("GPL");
/*记住步骤---首先要定义platform_device-----然后注册平台设备*/

static>
/*分配 设备结构*/
my_platform_device =>/*注册失败 释放相关内存*/
if(ret)
platform_device_put(my_platform_device);

return 0;
}

static int __exit my_platform_device_exit(void)
{
platform_device_unregister(my_platform_device);
return 0;
}
module_init(my_platfom_device_init);
module_exit(my_platform_device_exit);

platform_driver::::

#include<linux/init.h>
#include<linux/module.h>
#include<linux/device.h>
#include<linux/string.h>
#include<linux/kernel.h>
#include<linux/platform_device.h>

/*驱动和设备匹配 是通过名字来匹配的 -- */

MODULE_AUTHOR("kong-hua-sheng");
MODULE_LICENSE("GPL");
static>{
.probe = &my_probe,
.remove = &my_remove,
.driver = {
.owner = THIS_MODULE,
.name = "myp_dev",
},
};
static int __init my_platform_driver_init(void)
{
return platform_driver_register(&my_driver);

}

static int __exit my_platform_driver_exit(void)
{
platform_driver_unregister(&my_driver);
return 0;
}
module_init(my_platform_driver_init);
module_exit(my_platform_driver_exit);

0 0
原创粉丝点击