平台概念的引入能够更好地描述设备的资源信息,例如总线地址、中断、DMA信息等。平台设备模型是对device与driver模型的扩展,它的总线为platform_bus_type:
平台设备使用platform_device结构描述,该结构定义如下:
平台设备的注册与注销接口如下:
int platform_device_register(struct platform_device*);//注册一个平台设备
void platform_device_unregister(struct platform_device*);//注销一个平台设备
平台驱动使用platform_driver结构描述:
平台设备驱动必须提供probe和remove方法,并且在probe中确保设备资源的可用性。平台驱动还支持电源管理和设备停止等事件。平台驱动的注册接口如下:
int platform_driver_register(struct platform_driver*drv);
void platform_driver_unregister(struct platform_driver*drv);
platform_driver_register和platform_driver_unregister本质上就是调用driver_register和driver_unregister。老的Linux内核需要在模块入口中调用这两个函数,新的Linux内核中只需要用module_platform_driver即可实现这两个函数的功能,具体用法见本节后面的例2.2。
resource结构是对平台资源的描述,定义如下:
在platform_device结构中可以设置多种资源信息。资源的flags标志包括:
#define IORESOURCE_IO 0x00000100//IO资源
#define IORESOURCE_MEM 0x00000200//内存资源
#define IORESOURCE_IRQ 0x00000400//中断资源
#define IORESOURCE_DMA 0x00000800//DMA资源
内核提供了一组函数,用来获取设备的资源信息:
//根据资源类型和序号来获取指定的资源。
struct resource*platform_get_resource(struct platform_device*dev,unsigned int type,unsigned int num);(www.xing528.com)
//根据序号获取资源中的中断号。
struct int platform_get_irq(struct platform_device*dev,unsigned int num);
//根据名称和类别获取指定的资源。
struct resource*platform_get_resource_byname(struct platform_device*dev,unsigned int type,char*name);
//根据名称获取资源中的中断号。
int platform_get_irq_byname(struct platform_device*dev,char*name);
例2.2 平台设备注册实例
本例代码在\samples\2model\2-2module_plateform。核心代码如下:
运行结果如下:
[root@urbetter drivers]#insmod plateformtest.ko
plate_test_probe enter...
[root@urbetter drivers]#rmmod plateformtest
plate_test_probe remove...
[root@urbetter drivers]#
例2.3 DM9000网卡平台设备资源获取实例
本例为DM9000网卡设备的资源获取实例。核心代码如下:
注册MMC平台设备驱动的代码如下:
上面的代码中使用了module_platform_driver取代旧的模块入口编写方式。设备检测函数dm9000_probe展示了获取平台设备资源的方法:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。