linux 内核配置sdio,linux SDIO实现
在Linu 2.6.21的SDIO驅動,它是除了是mmc_host的驅動外,還是一個Platform驅動.身兼兩職.
在這個版本中,首先是定義三個platform_deivce 以注冊到系統當中。但是它定義在
arch/arm/plat-s3c24xx/devs.c (這會讓人感當相當迷惑),它創建是 s3c-hsmmc設備
struct platform_device s3c_device_hsmmc0 = {
.name???????????? = "s3c-hsmmc",
.id?????????????? = 0,
.num_resources??? = ARRAY_SIZE(s3c_hsmmc0_resource),
.resource???????? = s3c_hsmmc0_resource,
.dev??????????? = {
.platform_data = &s3c_hsmmc0_platform,
}
};
struct platform_device s3c_device_hsmmc1 = {
.name???????????? = "s3c-hsmmc",
.id?????????????? = 1,
.num_resources??? = ARRAY_SIZE(s3c_hsmmc1_resource),
.resource???????? = s3c_hsmmc1_resource,
.dev??????????? = {
.platform_data = &s3c_hsmmc1_platform,
}
};
其platform_driver 定義在drivers/mmc/s3c-hsmmc.c
static struct platform_driver s3c_hsmmc_driver =
{
.probe????????? = s3c_hsmmc_probe,
.remove???????? = s3c_hsmmc_remove,
.suspend??????? = s3c_hsmmc_suspend,
.resume???????? = s3c_hsmmc_resume,
.driver???????? = {
.name?? = "s3c-hsmmc",
.owner? = THIS_MODULE,
},
};
static int __init s3c_hsmmc_drv_init(void)
{
return platform_driver_register(&s3c_hsmmc_driver);
}
static void __exit s3c_hsmmc_drv_exit(void)
{
platform_driver_unregister(&s3c_hsmmc_driver);
}
在s3c_hsmmc_probe函數中,會進行一系列的初始化操作.
Linux 2.6.28的SDIO的實現
Linux 2.6.28又做了進一步調整,原來的s3c-hsmmc的設備和驅動已經放棄,原來在s3c-hsmmc.c 已經成為殘余代碼,雖然在內核中,但是不會加入Makefile編譯。
其新的platform_device 定義分布定義在 dev-hsmmc.c /dev-hsmmc1.c / dev-hsmmc2.c,可以看到設備名字已經變成了
s3c-sdhci
struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata = {
.max_width?= 4,
.host_caps?= (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED |
MMC_CAP_SD_HIGHSPEED),
.cfg_ext_cd?= setup_sdhci0_irq_cd,
.detect_ext_cd?= detect_sdhci0_irq_cd,
.ext_cd??= S3C_EINT(13),
};
struct platform_device s3c_device_hsmmc0 = {
.name??= "s3c-sdhci",?.id??= 0,
.num_resources?= ARRAY_SIZE(s3c_hsmmc_resource),
.resource?= s3c_hsmmc_resource,
.dev??= {
.dma_mask??= &s3c_device_hsmmc_dmamask,
.coherent_dma_mask?= 0xffffffffUL,
.platform_data??= &s3c_hsmmc0_def_platdata,
},
};
它會在系統初始化注冊deivce.
而platform_driver定義在
drivers/mmc/host/sdhci-s3c.c
//drivers/mmc/host/sdhci-s3c.c
static struct platform_driver sdhci_s3c_driver = {
.probe??= sdhci_s3c_probe,
.remove??= __devexit_p(sdhci_s3c_remove),
.suspend??????? = sdhci_s3c_suspend,
.resume???????? = sdhci_s3c_resume,
.driver??= {
.owner?= THIS_MODULE,
.name?= "s3c-sdhci",?},
};
總結
以上是生活随笔為你收集整理的linux 内核配置sdio,linux SDIO实现的全部內容,希望文章能夠幫你解決所遇到的問題。