二、相關概念
1、平台裝置:
通常在Linux中,把SoC系統中整合的獨立外設單元(如:I2C、IIS、RTC、看門狗等)都被當作平台裝置來處理。在Linux中用platform_device結構體來描述一個平台裝置,在2.6.30.4核心中定義在:include/linux/platform_device.h中,如下:
| struct platform_device { const char * name; //裝置名稱 int id; struct device dev; u32 num_resources; //裝置使用各類資源的數量 struct resource * resource; //裝置使用的資源
struct platform_device_id *id_entry; }; |
現在你不必深入理解這個結構體,只要知道在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-smdk2440.c這個ARM 2440平台的系統入口檔案,可以看到在系統初始化函數smdk2440_machine_init中是使用platform_add_devices這個函數將一些平台裝置添加到系統中的,如下:(至於系統是如何?添加平台裝置的,這裡我們不必研究,這些Linux系統都已經做好了的,我們要研究的是後面平台裝置的驅動是如何?的)
| static struct platform_device *smdk2440_devices[] __initdata = { &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis,DE> &s3c_device_rtc, //這裡我們添加上RTC平台裝置,預設是沒添加的 }; //平台裝置列表,也就是說我們要使用一個新的平台裝置要先在上面定義,然後加到這個列表中,最後到驅動層去實現該裝置的驅動
static void __init smdk2440_machine_init(void) { s3c24xx_fb_set_platdata(&smdk2440_fb_info); s3c_i2c0_set_platdata(NULL); //將上面列表中的平台裝置添加到系統匯流排中 platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices)); smdk_machine_init(); } |
2、平台裝置驅動:
這裡所講的平台裝置驅動是指具體的某種平台裝置的驅動,比如上面講的RTC平台裝置,這裡就是指RTC平台裝置驅動。在Linux中,系統還為平台裝置定義了平台驅動結構體platform_driver,就好比系統為字元裝置定義了file_operations一樣,但不要把平台裝置跟字元裝置、塊裝置、網路裝置搞成了並列的概念,因平台裝置也可以是字元裝置等其他裝置。注意:在被定義為平台裝置的字元裝置的驅動中,除了要實現字元裝置驅動中file_operations的open、release、read、write等介面函數外,還要實現平台裝置驅動中platform_driver的probe、remove、suspend、resume等介面函數。好了,在我們搞明白上面這些後,下面我們就來具體詳細分析講解RTC平台裝置的驅動現實。