标签:form 对象 for 函数 获取 虚拟地址 类型 ons 物理地址
1,内核以实现总线,只需写驱动和设备的信息;
2,设备链表、驱动链表;总线完成链表匹配(name);驱动执行probe函数,向上层提供open、read、write接口需要在probe函数中注册字符设备驱动;在probe函数中根据设备信息操作硬件;ioremap物理地址映射成虚拟地址操作硬件;总线编译再内核中;设备提供信息(中断号/地址);
总线完成设备和驱动的匹配;
3,platform是一个虚拟的总线,platform中采用分离思想。将设备信息和设备驱动分离,在内核中所有的设备信息被放到一条链表中,设备驱动放到一条链表中。链表中的成员通过总线进行匹配,匹配成功后执行驱动中的probe函数。设备信息和设备驱动分离后会执行驱动中的remove函数。
4,设备端: 1.分配对象struct platform_device pdev;
2.对象初始化struct platform_device {
const char *name;//用于匹配的名字
int id; //总线号 -1
struct device dev;//所有设备的父类
u32 num_resources;//资源数
struct resource * resource;//资源结构体
}
struct device {
void (*release)(struct device *dev);
}
struct resource {
resource_size_t start; //物理起始地址 0x0001a00
resource_size_t end; //物理结束地址 0x0001a00+20
const char *name; //名字,一般不填
unsigned long flags; //资源类型 IORESOURCE_IO/MEM
}
3.对象的注册 int platform_device_register(struct platform_device *pdev)
对象的注销 void platform_device_unregister(struct platform_device *pdev)
platform总线:它是有内核提供,提供设备和驱动端的注册和注销的方法,以及匹配过程。
驱动端:1.分配对象 struct platform_driver pdrv;
2.对象初始化 struct platform_driver {
int (*probe)(struct platform_device *);//匹配成功执行的函数
int (*remove)(struct platform_device *);//卸载一方执行的函数
struct device_driver driver;
const struct platform_device_id *id_table;//id_table 匹配方式
};
struct device_driver {
const char *name;//nema匹配方式
struct module *owner;
};
3.注册 int platform_driver_register(struct platform driver *);
注销 void platform_driver_unregister(struct platform driver *);
5,驱动端获取设备信息的函数
struct resource *platform_get_resource(struct platform_device *dev,unsigned int type, unsigned int num)
参数1:pdev;参数2:资源类型;参数3:第几个资源。
返回值:成功返回设备信息结构体,失败返回NULL
标签:form 对象 for 函数 获取 虚拟地址 类型 ons 物理地址
原文地址:https://www.cnblogs.com/device/p/11405529.html