娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月26日(星期一)

2020年05月26日 | mini2440 sd卡加載過程詳解

發布者:lqs1975 來源: eefocus關鍵字:mini2440  sd卡  加載過程 手機看文章 掃描二維碼
隨時隨地手機看文章

最近在研究wifi模組, 是sdio接口的, 而手頭剛好有一塊mini2440,了解了一下sdio加載的過程, 發現和sd卡加載的過程是類似的。 


這里用mini2440的內核源碼, 來剖析一下sd卡的加載過程:


首先, mini2440內核加載的時候, 就會指定一部分設備初始化列表:


//---------------------------- arch/arm/mach-s3c2440/mach-mini2440.c ----------------------------//

/* devices we initialise */

static struct platform_device *mini2440_devices[] __initdata = {

    &s3c_device_usb,

    &s3c_device_rtc,

    &s3c_device_lcd,

    &s3c_device_wdt,

    &s3c_device_i2c0,

    &s3c_device_iis,

    &mini2440_device_eth,

    &s3c24xx_uda134x,

    &s3c_device_nand,

    &s3c_device_sdi,                                        // sd設備

    &s3c_device_usbgadget,

};

/* MMC/SD  */

static struct s3c24xx_mci_pdata mini2440_mmc_cfg = {

    .gpio_detect   = S3C2410_GPG(8),                        // 插入檢測引腳

    .gpio_wprotect = S3C2410_GPH(8),                        // 寫保護引腳

    .set_power     = NULL,

    .ocr_avail     = MMC_VDD_32_33|MMC_VDD_33_34,           // 有效電壓范圍是3.2~3.3V, 3.3~3.4V

};

 

static void __init mini2440_machine_init(void)

{

    s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;                   

    platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));   

}

來看看s3c_device_sdi的定義:

//---------------------------- arch/arm/plat-s3c24xx/devs.c ----------------------------//

/* SDI */

static struct resource s3c_sdi_resource[] = {

    [0] = {

        .start = S3C24XX_PA_SDI,

        .end   = S3C24XX_PA_SDI + S3C24XX_SZ_SDI - 1,

        .flags = IORESOURCE_MEM,

    },

    [1] = {

        .start = IRQ_SDI,

        .end   = IRQ_SDI,

        .flags = IORESOURCE_IRQ,

    }

 

};

 

struct platform_device s3c_device_sdi = {

    .name   = "s3c2410-sdi",

    .id   = -1,

    .num_resources   = ARRAY_SIZE(s3c_sdi_resource),

    .resource   = s3c_sdi_resource,

};

有些人會奇怪, 我們這里不是在講解2440嗎, 為什么這里是s3c2410-sdi, 別急, 往下看:

//---------------------------- arch/arm/mach-s3c2440/mach-mini2440.c ----------------------------//

static void __init mini2440_machine_init(void)

{

    s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;                   

    platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));   

}

 

//---------------------------- arch/arm/plat-s3c24xx/s3c244x.c ----------------------------//

void __init s3c244x_map_io(void)

{

    iotable_init(s3c244x_iodesc, ARRAY_SIZE(s3c244x_iodesc));

 

    /* rename any peripherals used differing from the s3c2410 */

 

    s3c_device_sdi.name  = "s3c2440-sdi";                           // 重命名為s3c2440-sdi

    s3c_device_i2c0.name  = "s3c2440-i2c";

    s3c_device_nand.name = "s3c2440-nand";

    s3c_device_usbgadget.name = "s3c2440-usbgadget";

}

理解了吧?  

接下來講sd驅動的加載:


//---------------------------- drivers/mmc/host/s3cmci.c ----------------------------//

static struct platform_device_id s3cmci_driver_ids[] = {

    {

        .name = "s3c2410-sdi",

        .driver_data = 0,

    }, {

        .name = "s3c2412-sdi",

        .driver_data = 1,

    }, {

        .name = "s3c2440-sdi",

        .driver_data = 1,                            // 下面會用到!!!

    },

    { }

};

 

static struct platform_driver s3cmci_driver = {

   .driver = {

       .name = "s3c-sdi",

       .owner = THIS_MODULE,

       .pm = s3cmci_pm_ops,

   },

   .id_table = s3cmci_driver_ids,

   .probe = s3cmci_probe,

   .remove = __devexit_p(s3cmci_remove),

   .shutdown = s3cmci_shutdown,

};

 

static int __init s3cmci_init(void)

{

   return platform_driver_register(&s3cmci_driver);

}

 

module_init(s3cmci_init); 

驅動和設備匹配上的話,就會調用驅動的probe函數:

static int __devinit s3cmci_probe(struct platform_device *pdev)

{

struct s3cmci_host *host;

struct mmc_host *mmc;

 

    is2440 = platform_get_device_id(pdev)->driver_data;                 // 是否是2440, 這里就用到上面提到的driver_data,

 

    mmc = mmc_alloc_host(sizeof(struct s3cmci_host), &pdev->dev);       // 分配mmc_host結構體

 

    for (i = S3C2410_GPE(5); i <= S3C2410_GPE(10); i++) {               // SDCLK SDCMD DATA0~DATA3

        ret = gpio_request(i, dev_name(&pdev->dev));                    // 申請gpio資源

        if (ret) {

            dev_err(&pdev->dev, "failed to get gpio %dn", i);

 

            for (i--; i >= S3C2410_GPE(5); i--)

                gpio_free(i);

 

            goto probe_free_host;

        }

    }

 

host = mmc_priv(mmc);                                               // 獲取private域

host->mmc = mmc;

host->pdev = pdev;

host->is2440 = is2440;

 

host->pdata = pdev->dev.platform_data;                              // 即上面提到的mini2440_mmc_cfg

if (!host->pdata) {

pdev->dev.platform_data = &s3cmci_def_pdata;

host->pdata = &s3cmci_def_pdata;

}

 

if (is2440) {

host->sdiimsk = S3C2440_SDIIMSK;

host->sdidata = S3C2440_SDIDATA;

host->clk_div = 1;

} else {

host->sdiimsk = S3C2410_SDIIMSK;

host->sdidata = S3C2410_SDIDATA;

host->clk_div = 2;

}

 

    // 申請內存

host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);         // 這里會讀取IORESOURCE_MEM域

 

host->mem = request_mem_region(host->mem->start,

       resource_size(host->mem), pdev->name);

 

host->base = ioremap(host->mem->start, resource_size(host->mem));

 

 

host->irq = platform_get_irq(pdev, 0);                              // 這里會讀取IORESOURCE_IRQ域, 返回start地址

if (host->irq == 0) {

dev_err(&pdev->dev, "failed to get interrupt resouce.n");

ret = -EINVAL;

goto probe_iounmap;

}

 

    // 申請中斷,該中斷為讀寫SD卡數據時所產生的中斷

if (request_irq(host->irq, s3cmci_irq, 0, DRIVER_NAME, host)) {

dev_err(&pdev->dev, "failed to request mci interrupt.n");

ret = -ENOENT;

goto probe_iounmap;

}

 

    // 禁止上面所申請的中斷

    disable_irq(host->irq);                                             

    host->irq_state = false;

 

if (!host->pdata->no_detect) {                                      // 如果SD控制器具有檢測SD卡插拔狀態的功能

        ret = gpio_request(host->pdata->gpio_detect, "s3cmci detect");  // 申請插入檢測io

 

        host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);

        if (host->irq_cd >= 0) {

            if (request_irq(host->irq_cd, s3cmci_irq_cd,                // 注冊插入檢測中斷處理函數, 申請中斷,當有SD卡插入或拔出時,則進入該中斷

                        IRQF_TRIGGER_RISING |

                        IRQF_TRIGGER_FALLING,

                        DRIVER_NAME, host)) {

                dev_err(&pdev->dev,

                        "can't get card detect irq.n");

                ret = -ENOENT;

                goto probe_free_gpio_cd;

            }

        } else {

            dev_warn(&pdev->dev,

                    "host detect has no irq availablen");

            gpio_direction_input(host->pdata->gpio_detect);

        }

    }

 

if (!host->pdata->no_wprotect) {                                    // 如果SD控制器具有寫保護的功能

[1] [2] [3]
關鍵字:mini2440  sd卡  加載過程 引用地址:mini2440 sd卡加載過程詳解

上一篇:mini2440開發板之使用nfs無法啟動的問題(Virtualbox橋接網絡)
下一篇:mini2440+jlink+mkd 裸機按鍵中斷調試心得體會

推薦閱讀

又一條高世代面板生產線敲定!TCL周三宣布,公司計劃再投資建設一條11代超高清面板生產線(t7項目),主要生產和銷售65英寸以上的大屏8K液晶屏和OLED屏等,項目總投資約426.83億元,由TCL集團、華星光電和深圳市重大產業發展基金共同投資完成,計劃在2021年3月正式實現量產。  瞄準大屏前景再建11代線  此前,TCL旗下已有一條在建11代線項目,計劃2019...
消息獲悉,歷時兩個月,國內首創雙旋結構的BR6系列雙旋機器人在佛山高新區誕生,該產品拿下了中國設計領域的“奧斯卡”——2017中國好設計銀獎。 據BR6主要設計者佛山華數機器人有限公司常務副總經理楊林介紹,該產品直面行業痛點,新增了內旋轉功能,首創雙旋結構,打破了傳統機器人的運動方式。 以發展國產機器人產業為己任 2015年8月,武漢華中數...
汽車網關芯片本是長時間都不會有什么變化的領域,但 2020 年以來,多家芯片廠商發布了汽車網關全新解決方案。 2020 年初,NXP 推出新型 S32G 汽車網關處理器,它的主要角色是面向服務的網關,將幫助 OEM 從汽車制造商轉變為汽車數據驅動的服務提供商。 2020 年 1 月,TI 推出基于 Jacinto 7 處理器平臺的 DRA829V 網關處理器。 2020 ...
鑒于自動駕駛開發成本高,大眾和福特投資了合資公司Argo AI(進入ARGO AI微門戶)進行聯合開發。2019年7月,經過數月的談判之后,大眾同意以 70 億美元的估值向 Argo 注資 26 億美元。 其中,包括 10 億美元現金以及價值 16 億美元的大眾自動駕駛子公司 AID(Autonomous Intelligent Driving)。作為交易的一部分,大眾需要從福特手里收購...

史海拾趣

問答坊 | AI 解惑

AVR做USB控制器的更多實例

關于用AVR單片機作USB控制器,我們今天又有了新的發現,在一個網站有專門的頁面討論和收集此方面的內容,而且還給出了幾個典型應用,最為可貴的是:這里的大部分資料都是開源的。 AVR-USB介紹 Implementing USB 1.1 in Firmwar ...…

查看全部問答∨

請問大家有哪位知道那里有CAD視頻教程

請問大家有哪位知道那里有CAD視頻教程,最好能可以打包下載的。我想從基礎開始學…

查看全部問答∨

三星S3C2440A 的GPIO驅動如何寫

三星S3C2440A 的GPIO驅動如何寫 麻煩大家了 …

查看全部問答∨

怎么知道FPGA器件的保持時間 建立時間

怎么知道FPGA器件的保持時間 建立時間…

查看全部問答∨

求助WIN CE BIOS密碼問題。

有個小筆記本,裝的是CE 5.0,現在想換個linux,不記得進bios的密碼了(想設置U盤啟動),求高人,告知怎么讀出BIOS的密碼來。…

查看全部問答∨

為什么活動的時間改了?緊接著又結束了?

本來是11:10,終于等到快到了,可是突然時間又加了6個多小時~為什么啊? 這是搞什么啊? [ 本帖最后由 wllyj 于 2012-1-5 11:20 編輯 ]…

查看全部問答∨

大家覺得做網絡電話怎么樣呢?

就是做VOIP的,網絡 電話機,目前國內還沒正式開放,但在國外已經很成熟了…

查看全部問答∨

請大家給推薦一款測距傳感器

工業用的,探測距離一米到兩米的…

查看全部問答∨

本安電源

偶然找到的電路圖,大家分享…

查看全部問答∨

AMS1084中文規格書

AMS1084中文規格書 QQ:2632029606…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 乐至县| 普安县| 社会| 五台县| 台中市| 什邡市| 廊坊市| 汶上县| 丰宁| 海盐县| 淅川县| 什邡市| 太康县| 昌都县| 玛沁县| 桐乡市| 高邮市| 巩义市| 龙川县| 四会市| 吴川市| 浠水县| 兴国县| 鹰潭市| 舒城县| 晋中市| 合阳县| 东平县| 大石桥市| 始兴县| 茌平县| 英山县| 河津市| 镇康县| 潼南县| 焦作市| 崇明县| 闻喜县| 灌阳县| 安平县| 徐闻县|