3、實現其probe、remove等函數
需要注意這兩個變量:name和owner。那麼的作用主要是為了和相關的platform_device關聯起來,owner的作用是說明模塊的所有者,驅動程序中一般初始化為THIS_MODULE。
加密磁頭的platform_driver定義如下:
static struct platform_driver secure_head_driver = {
.driver = {
.name = "secure_head",
},
.suspend = secure_head_suspend,
.resume = secure_head_resume,
.probe = secure_head_module_probe,
.remove = secure_head_module_remove,
};
注意其中的driver這個結構體,只初始化了name。接著看一下和driver相關的另一個結構,定義如下:
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
};
該結構中也有一個name變量。platform_driver從字面上來看就知道是設備驅動。設備驅動是為誰服務的呢?當然是設備了。platform_device就描述了設備對象。加密磁頭的platform_device定義如下(定義在arch/arm/mach-mx25/devices.c中):
static struct platform_device mxc_secure_head_device = {
.name = "secure_head",
.id = 0,
.num_resources = ARRAY_SIZE(imx_secure_head_resources),
.resource = imx_secure_head_resources,
.dev = {
.release = NULL,
},
};
它的name變量和剛才上面的platform_driver的name變量是一致的,內核正是通過這個一致性來為驅動程序找到資源,即platform_device中的resource。這個結構的定義如下,位於include/linux/ioport.h中:
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};
下面是磁頭的resource的定義:
static struct resource imx_secure_head_resources[] = {
[0] = {
.start = IOMUX_TO_IRQ(MX25_PIN_DE_B),
.end = IOMUX_TO_IRQ(MX25_PIN_DE_B),
.flags = IORESOURCE_IRQ,
},
};
注意:其中IORESOURCE_IRQ表示這個是中斷資源,IOMUX_TO_IRQ(MX25_PIN_DE_B)為加密磁頭所對應的中斷引腳的映射地址。這樣在注冊設備時內核才知道這些數據。