mini6410 platform设备驱动

本文深入解析Linux平台总线(platform bus)的概念与实现机制,包括platform_bus_type的定义及其核心函数platform_match的作用;同时介绍了platform_device和platform_driver的结构与功能,并详细说明了它们的注册与注销过程。

platform设备的思想就是将注册函数在linux/platform_device.h定义了platform_device_register 和 platform_driver 函数 ,使得挂接在该总线上的 设备和驱动由其管理

一、可以看到在platform.c 中有 platform_bus的定义和match函数

struct bus_type platform_bus_type = {
	.name		= "platform",
	.dev_attrs	= platform_dev_attrs,
	.match		= platform_match,
	.uevent		= platform_uevent,
	.pm		= &platform_dev_pm_ops,
};


static int platform_match(struct device *dev, struct device_driver *drv)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_driver *pdrv = to_platform_driver(drv);

	/* Attempt an OF style match first */
	if (of_driver_match_device(dev, drv))
		return 1;

	/* Then try to match against the id table */
	if (pdrv->id_table)
		return platform_match_id(pdrv->id_table, pdev) != NULL;

	/* fall-back to driver name match */
	return (strcmp(pdev->name, drv->name) == 0);
}


在内核启动的时候就注册了platform总线。


二、再看platform对应的platform_device的结构

struct platform_device {
	const char	* name;   //名字,这将代替内嵌的device中的名字 
	int		id;        ///设备id,用于给插入相同的名字的设备编号,只有一个的话填-1
	struct device	dev;      //内嵌的Dev的结构
	u32		num_resources;  //资源的数目
	struct resource	* resource;    //指向资源数组的指针

	const struct platform_device_id	*id_entry;

	/* arch specific additions */
	struct pdev_archdata	archdata;
};


platform_device 的注册和注销函数

int platform_device_register(struct platform_device *);</span>
void platform_device_unregister(struct platform_device *);</span>

注册成功后会在/sys/bbus/platform/device中创建一个软连接,指向/sys/device目录

注意:两者定义在linux/base/platform.c 中,也就是说他们是由总线一起管理的


三、再看platform对应的platform_driver 结构

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;
};


里面同样内嵌了 device_driver 结构 还有 probe 探针函数


platform_driver 的注册和注销函数

int platform_driver_register(struct platform_driver *);</span>

void platform_driver_unregister(struct platform_driver *);</span>
注册成功后会在/sys/bus/platform/driver 下创建一个名为name的目录


三、platform的资源

现在我们来关注 platform_device 结构体中的resource 

u32 num_resources;  //资源的数目
struct resource	* resource;    //指向资源数组的指针</span>

struct resource {
	resource_size_t start;
	resource_size_t end;
	const char *name;
	unsigned long flags;
	struct resource *parent, *sibling, *child;
};

定义在/include/linux/ioport.h 中

resource 中的 start和end分别代表资源的起始地址和结束地址,flags 代表资源的类型,一般有 IORESOURECE_MEM 和 IOSOURCE_IRQ

当为iosource时 start 和end 分别代表起始和结束的中断号

 

还有很多...包括资源的具体定义。还有platform设备的静态注册、、、、




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值