?? struct resource,struct platform_device和驅(qū)動(dòng)的關(guān)系 .txt
字號(hào):
static void __init smdk2410_map_io(void)
{
s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc));
s3c24xx_init_clocks(0);
s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs));
s3c24xx_set_board(&smdk2410_board);//---和s3c24xx_init_io()作用有什么區(qū)別么?
}
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
* to SMDK2410 */
/* Maintainer: Jonas Dietsche */
.phys_io= S3C2410_PA_UART,
.io_pg_offst= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params= S3C2410_SDRAM_PA + 0x100,
.map_io= smdk2410_map_io,
.init_irq= s3c24xx_init_irq,
.init_machine= smdk_machine_init,
.timer= &s3c24xx_timer,
MACHINE_END
以上變量初始化后在什么地方被調(diào)用的?
是不是以platform_driver_register()注冊(cè)的驅(qū)動(dòng)都要在devs.c和mach-s3c2410.c中初始化相應(yīng)的變量
首先你需要為SOC的各個(gè)功能部分定義他的一些資源.例如可用于訪問(wèn)的寄存器地址.中斷號(hào),DMA什么的。然后將這些資源(resource) 作為 platform 的dev .通過(guò)platform_add_devices函數(shù)將你定義的paltform_device變量注冊(cè)到系統(tǒng)的dev里面.。或者你可以象我這樣將你需要的驅(qū)動(dòng)添加:
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_bl,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c_device_sdi,
&s3c_device_adc,
&s3c_device_nand,
&s3c_device_usbgadget,
&s3c_device_ts,
&s3c_device_buttons,
&s3c_device_rtc,
&s3c_device_spi0,
&s3c_device_timer1,//add by cefanty for battery charging
};
這樣你的硬件的信息和資源就會(huì)注冊(cè)到系統(tǒng)中.
說(shuō)了半天,這回該說(shuō)這有什么用了。
你編寫的驅(qū)動(dòng)或者移植別人的驅(qū)動(dòng),一般在驅(qū)動(dòng)里有這樣的代碼,例如:
static struct platform_driver s3c2410sdi_driver =
{
.probe = s3c2410sdi_probe,
.remove = s3c2410sdi_remove,
.suspend= s3c2410mci_suspend,
.resume= s3c2410mci_resume,
.driver={
.name= "s3c2410-sdi",
.bus = &platform_bus_type,
.owner= THIS_MODULE,
},
};
看到 .name= "s3c2410-sdi",這條關(guān)鍵的語(yǔ)句沒(méi)有??,它和我在上面注冊(cè)的&s3c_device_sdi,里的device的名稱是一致的.我這里展開(kāi)我的s3c_device_sdi,的內(nèi)容
:
/* SDI */
static struct resource s3c_sdi_resource[] = {
[0] = {
.start = S3C2410_PA_SDI,
.end = S3C2410_PA_SDI + S3C24XX_SZ_SDI - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_SDI,
.end = IRQ_SDI,
.flags = IORESOURCE_IRQ,
},
[2] = {
.start = 3,
.end = 3,
.flags = IORESOURCE_DMA,
}
};
struct platform_device s3c_device_sdi = {
.name = "s3c2410-sdi",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_sdi_resource),
.resource = s3c_sdi_resource,
};
在驅(qū)動(dòng)程序里的init代碼大致如下:
static int __init s3c2410sdi_init(void)
{
return platform_driver_register(&s3c2410sdi_driver);
}
用platform_driver_register向系統(tǒng)注冊(cè)這個(gè)驅(qū)動(dòng)程序.而這個(gè)函數(shù)會(huì)在s3c2410sdi_driver的信息里提取name為搜索內(nèi)容,搜索系統(tǒng)注冊(cè)的device中有沒(méi)有這個(gè)platform_device。 如果有注冊(cè),那么接著會(huì)執(zhí)行platform_driver 里probe函數(shù).在這里顯然是s3c2410sdi_probe函數(shù) 在probe函數(shù)里,用的最多和剛才platform_device有關(guān)的語(yǔ)句是platform_get_resource,這條語(yǔ)句用于獲取platform_device里的resource資料.例如映射的IO地址,中斷等.剩下等得就是ioremap,和 request_irq等的事情了
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -