一、相關概念
1.平台設備:
通常在Linux中,把SOC系統中集成的獨立外設單元(如:I2C、IIS、RTC、看門狗等)都被當作平台設備來處理。在Linux中用platform_device結構體來描述一個平台設備,在2.6.32內核中定義在:include/linux/platform_device.h中,如下:
struct platform_device {
const char *name; //設備名稱
int id; //設備編號,配合設備名稱使用
struct device dev;
u32 num_resources; //設備使用各類資源的數量
struct resource *resource; //設備使用的資源
};
現在你不必深入理解這個結構體,只要知道在Linux中是用這個結構體來定義一些平台設備的。比如在:arch/arm/plat-s3c24xx/devs.c中就定義了很多平台設備,下面我就只貼出RTC這一種的:
/* RTC */
static
struct
resource s3c_rtc_resource
[]
=
{
//
定義了
RTC
平台設備使用的資源,這些資源在驅動中都會用到
[
0
]
=
{
//IO
端口資源范圍
.
start
=
S3C24XX_PA_RTC
,
.
end
=
S3C24XX_PA_RTC
+
0xff
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
//RTC
報警中斷資源
.
start
=
IRQ_RTC
,
.
end
=
IRQ_RTC
,
.
flags
=
IORESOURCE_IRQ
,
},
[
2
]
=
{
//TICK
節拍時間中斷資源
.
start
=
IRQ_TICK
,
.
end
=
IRQ_TICK
,
.
flags
=
IORESOURCE_IRQ
}
};
struct
platform_device s3c_device_rtc
=
{
//
定義了
RTC
平台設備
.
name
=
"s3c2410-rtc"
,
//
設備名稱
.
id
=
-
1
,
.
num_resources
=
ARRAY_SIZE
(
s3c_rtc_resource
),
//
資源數量
.
resource
=
s3c_rtc_resource
,
//
引用上面定義的資源
};
EXPORT_SYMBOL
(
s3c_device_rtc
);
好了,定義了平台設備,那系統是怎麼來使用他的呢?我們打開:arch/arm/mach-s3c2440/mach-mini2440.c這個ARM 2440平台的系統入口文件,可以看到在系統初始化函數mini2440_machine_init中是使用platform_add_devices這個函數將一些平台設備添加到系統中的,如下:(至於系統是如何實現添加平台設備的,這裡我們不必研究,這些Linux系統都已經做好了的,我們要研究的是後面平台設備的驅動是如何實現的)
static
struct
platform_device
*
mini2440_devices
[]
__initdata
=
{
&
s3c_device_usb
,
&
s3c_device_lcd
,
&
s3c_device_wdt
,
&
s3c_device_i2c0
,
&
s3c_device_iis
,
&s3c_device_rtc,
//
這裡我們添加上
RTC
平台設備,默認是沒添加的
};
//
平台設備列表,也就是說我們要使用一個新的平台設備要先在上面定義,然後加到這個列表中,最後到驅動層去實現該設備的驅動
static void __init mini2440_machine_init(void)
{
#if defined (LCD_WIDTH)
s3c24xx_fb_set_platdata(&mini2440_fb_info);
#endif
s3c_i2c0_set_platdata(NULL);
//
將上面列表中的平台設備添加到系統總線中
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
friendly_arm_machine_init();
}
2.平台設備驅動:
這裡所講的平台設備驅動是指具體的某種平台設備的驅動,比如上面講的RTC平台設備,這裡就是指RTC平台設備驅動。在Linux中,系統還為平台設備定義了平台驅動結構體platform_driver,就好比系統為字符設備定義了file_operations一樣,但不要把平台設備跟字符設備、塊設備、網絡設備搞成了並列的概念,因平台設備也可以是字符設備等其他設備。注意:在被定義為平台設備的字符設備的驅動中,除了要實現字符設備驅動中file_operations的open、release、read、write等接口函數外,還要實現平台設備驅動中platform_driver的probe、remove、suspend、resume等接口函數。好了,在我們搞明白上面這些後,下面我們就來具體詳細分析講解RTC平台設備的驅動現實。