从DM9000驱动看platform device与driver的关系

本文详细探讨了Linux内核中的platform device和driver之间的关系,包括相关数据结构如device、resource、platform_device、device_driver及platform_driver,以及资源注册、驱动注册的过程。通过实例分析了DM9000驱动如何利用平台设备机制与驱动进行匹配和交互,揭示了平台设备驱动模型的工作原理。
摘要由CSDN通过智能技术生成

 快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

 

本文适用于

ADSP-BF561

uclinux-2008r1.5-rc3 (smp patch)

Visual DSP++ 5.0(update 5)

 

 

欢迎转载,但请保留作者信息


内核中的platform driver机制需要将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform device提供的标准接口进行申请并使用。这样可以提高驱动和资源管理的独立性。本文的目的就是希望弄清楚platform device和driver之间的关系。

1.1    相关数据结构
1.1.1   device
这个结构体定义为:

struct device {

     struct klist       klist_children;

     struct klist_node  knode_parent;      /* node in sibling list */

     struct klist_node  knode_driver;

     struct klist_node  knode_bus;

     struct device      *parent;

 

     struct kobject kobj;

     char bus_id[BUS_ID_SIZE];   /* position on parent bus */

     struct device_type *type;

     unsigned      is_registered:1;

     unsigned      uevent_suppress:1;

     struct device_attribute uevent_attr;

     struct device_attribute *devt_attr;

 

     struct semaphore   sem; /* semaphore to synchronize calls to

                        * its driver.

                        */

 

     struct bus_type    * bus;        /* type of bus device is on */

     struct device_driver *driver;    /* which driver has allocated this

                          device */

     void     *driver_data; /* data private to the driver */

     void     *platform_data;    /* Platform specific data, device

                          core doesn't touch it */

     struct dev_pm_info power;

 

#ifdef CONFIG_NUMA

     int      numa_node;    /* NUMA node this device is close to */

#endif

     u64      *dma_mask;    /* dma mask (if dma'able device) */

     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 list_head   dma_pools;    /* dma pools (if dma'ble) */

 

     struct dma_coherent_mem *dma_mem; /* internal for coherent mem

                            override */

     /* arch specific additions */

     struct dev_archdata    archdata;

 

     spinlock_t         devres_lock;

     struct list_head   devres_head;

 

     /* class_device migration path */

     struct list_head   node;

     struct class       *class;

     dev_t              devt;         /* dev_t, creates the sysfs "dev" */

     struct attribute_group **groups; /* optional groups */

 

     void (*release)(struct device * dev);

};

这个结构体有点复杂,不过我们暂时用不了这么多。

 

 

 

1.1.2   resource
这个结构体定义为:

/*

 * Resources are tree-like, allowing

 * nesting etc..

 */

struct resource {

     resource_size_t start;

     resource_size_t end;

     const char *name;

     unsigned long flags;

     struct resource *parent, *sibling, *child;

};

在这个结构体中,start和end的意义将根据flags中指定的资源类型进行解释。内核对资源进行了分类,一共有四种类型:

#define IORESOURCE_IO       0x00000100    /* Resource type */

#define IORESOURCE_MEM      0x00000200

#define IORESOURCE_IRQ      0x00000400

#define IORESOURCE_DMA      0x00000800

对于DM9000来说,其定义的资源如下:

static struct resource dm9000_bfin_resources[] = {

     {

         .start = 0x2C000000,

         .end = 0x2C000000 + 0x7F,

         .flags = IORESOURCE_MEM,

     }, {

         .start = IRQ_PF10,

         .end = IRQ_PF10,

         .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,

     },

};

也就是说,它定义了两种类型的资源。从这里也可以看出resource结构体里面的name成员没有太大的用处。

 

1.1.3   platform_device
这个结构体定义为:

struct platform_device {

     const char    * name;

     u32      id;

     struct device dev;

     u32      num_resources;

     struct resource    * resource;

};

它对device加了一层包装,添加了resource的内容。看看DM9000的定义:

static struct platform_device dm9000_bfin_device = {

     .name = "dm9000",

     .id = -1,

     .num_resources = ARRAY_SIZE(dm9000_bfin_resources),

     .resource = dm9000_bfin_resources,

};

注意这里的name。

1.1.4   device_driver
这个结构体定义为:

struct device_driver {

     const char         * name;

     struct bus_type        * bus;

 

     struct kobject         kobj;

     struct klist       klist_devices;

     struct klist_node  knode_bus;

 

     struct module      * owner;

     const char         * mod_name;   /* used for built-in modules */

     struct module_kobject  * mkobj;

 

     int  (*probe) (struct device * dev);

     int  (*remove) (struct device * dev);

     void (*shutdown)   (struct device * dev);

     int  (*suspend)    (struct device * dev, pm_message_t state);

     int  (*resume) (struct device * dev);

};

 

 

1.1.5   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 (*suspend_late)(struct platform_device *, pm_message_t state);

     int (*resume_early)(struct p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值