linux平台设备驱动

一、platform_device的使用流程:声明struct platform_device *p_device

 

 

Platform_device的使用1、平台设备,通过struct platform_device 来进行描述。 struct platform_device {const char * name; //平台设备的名称 int id;//设备的ID,当ID=-1的时候,表示设备名称只有一个,否则表示设备编号struct device dev; u32 num_resources; struct resource * resource;struct platform_device_id *id_entry; };2、其中platform_device内包含两个重要的结构体,一个是struct device 该结构体描述设备相关的信息设备之间的层次关系以及设备与总线驱动的关系。struct device { struct device *parent;//指向父设备节点struct device_private *p;//描述的是klist,struct klist是对struct list_head的扩展,在此它的作用是连接设备列表中的孩子列表。Struct klist_node表示它的兄弟节点。struct kobject kobj;const char *init_name; /* initial name of the device */struct device_type *type; /*device_type结构表示设备的类型。一个设备类或者总线可以包含不同类型的设备,例如“分区”和“磁盘” , “鼠标”和“事件” 。device_type就可以标识某个设备类型和该设备的特有信息,它就等同于kobject结构中的kobj_type一样。如果name数据成员被指定,那么uevent成员函数就会把它包含在DEVTYPE变量中。*/struct semaphore sem; /* 该信号量用于同步其驱动 */struct bus_type *bus; /*设备所在的总线,指向所连接的总线 */struct device_driver *driver; /* 管理该设备的驱动 */void *driver_data; /* 设备的私有数据指针*/void *platform_data; /* Platform specific data, device core doesn't touch it */ struct dev_pm_info power; #ifdef CONFIG_NUMAint numa_node; /* NUMA node this device is close to */ #endifu64 *dma_mask; /*指向设备DMA屏蔽字。*/u64 coherent_dma_mask;/* Like dma_mask, but for alloc_coherent mappings as not all hardware supports 64 bit addresses for consistent allocations such descriptors. */struct device_dma_parameters *dma_parms;struct list_head dma_pools; /* dma pools (if dma'ble)聚集的DMA缓冲池 */struct dma_coherent_mem *dma_mem; /* 设备一致性DMA的屏蔽字 override *//* arch specific additions */ struct dev_archdata archdata;dev_t devt; /* dev_t, creates the sysfs "dev" */spinlock_t devres_lock; 设备自旋锁,用于互斥访问设备 struct list_head devres_head;struct klist_node knode_class; struct class *class;struct attribute_group **groups; /* optional groups */void (*release)(struct device *dev);释放设备描述符的回调函数。 };3、通过struct resource结构体来描述struct resource { resource_size_t start; resource_size_t end ;//资源起始的和结束的物理地址const char *name;//资源的名称 unsigned long flags;;//资源的类型,比如MEM,IO,IRQ类型struct resource *parent, *sibling, *child;;//资源链表的指针 }; 4、platform_device的使用1)声明该结构体struct platform_device *my_buttons_dev;//给该结构体分配空间和初始化。传入的参数为设备名字和设备ID,当ID=-1的时候表明该设备名称唯一my_buttons_dev = platform_device_alloc("my_buttons", -1);声明平台设备的资源struct resource static struct resource key_resource[]= { [0] = {.start = IRQ_EINT1, .end = IRQ_EINT1, .flags = IORESOURCE_IRQ, },[1] = { .start = IRQ_EINT2, .end = IRQ_EINT2, .flags = IORESOURCE_IRQ,}, }; //使用下面函数将该资源添加到平台设备里面去,使用该函数,会为 platform_device 中的resource结构体指针分配空间并且赋值//参数为 (struct platform_device *pdev,struct resource *res, unsigned int num)platform_device_add_resources(my_buttons_dev,key_resource,6); 3)//向系统注册该设备ret = platform_device_add(my_buttons_dev); if(ret)platform_device_put(my_buttons_dev); 并且在退出函数里面将该平台设备注销void platform_device_unregister(struct platform_device *pdev)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值