1.问:如何编写platform总线,设备,驱动这一套架构的设备驱动?
答:分为两个.c文件,一个是drv.c,一个是dev.c;前者实现平台驱动,后者实现平台设备,平台总线不用我们自己实现。
2.问:编写平台驱动的核心内容有哪些?
答:分配,设置,注册一个platform_driver
3.问:如何注册平台驱动?
答:使用platform_driver_register(struct platform_driver *drv)函数,该函数的参数为struct platform_driver
4.问:如何定义struct platform_driver?
答:简单实例:led_driver
static struct platform_driver led_driver =
{
.probe = led_probe,
.remove = led_remove,
.driver =
{
.name = “myleds”,
.owner = THIS_MODULE,
},
};
5.问:probe函数什么时候被调用?
答:当系统中有同名的平台设备和平台驱动时,就会调用probe函数。
6.问:probe函数有什么作用?
答:该函数可以做什么由你来决定,你可以只打印一句话,也可以做很复杂的事情。例如:led_probe函数就做了获取资源,映射IO,注册字符设备。
7.问:编写平台设备的核心内容是什么?
答:分配,设置,注册一个platform_device
8.问:如何注册平台设备?
答:使用platform_device_register(struct platform_device *pdev)函数,该函数的参数是struct platform_device
9.问:如何定义struct platform_device?
答:简单实例:led_device
static struct platform_device led_device =
{
.id = -1,
.name = “myleds”, //必须与led_driver的name一致
.resource = led_resources,
.num_resources = ARRAY_SIZE(led_resources),
.dev =
{
.release = led_release,
},
};
10.问:如何定义resource?
答:简单实例:led_resource
static struct resource led_resources[] =
{
[0] =
{
.start = 0x56000010,
.end = 0x56000010 + 8 - 1,
.flags = IORESOURCE_MEM,
},
[1] =
{
.start = 5,
.end = 5,
.flags = IORESOURCE_IRQ,
},
};