1308行,由mmc_host取得s3cmci_host。
1313行,讀取SDICON即SDI控制寄存器的值,保存在mci_con中。
1316-1328行,如果ios->power_mode為MMC_POWER_ON或MMC_POWER_UP,則執(zhí)行這個(gè)分支。
S3C_GPIO_SFN宏定義在arch/arm/plat-samsung/include/plat/gpio-cfg.h文件中:
S3C_GPIO_PULL_NONE宏定義在arch/arm/plat-samsung/include/plat/gpio-cfg.h文件中:
s3c_gpio_cfgall_range函數(shù)定義在drivers/gpio/gpio-samsung.c文件中:
可以看到,s3c_gpio_cfgall_range函數(shù)設(shè)置從GPE5開(kāi)始的6個(gè)GPIO,即GPE5、GPE6、GPE7、GPE8、GPE9、GPE10。使用參數(shù)cfg設(shè)置GPECON寄存器,使用參數(shù)pull設(shè)置GPEUP寄存器。
GPECON寄存器對(duì)應(yīng)的位置被設(shè)置為01,即使能相關(guān)SDI功能。
1330-1341行,如果ios->power_mode為MMC_POWER_OFF或者default,則執(zhí)行這個(gè)分支。
1332行,調(diào)用gpio_direction_output(S3C2410_GPE(5),0)關(guān)閉SDI時(shí)鐘。
1335行,mci_con |=S3C2440_SDICON_SDRESET,根據(jù)S3C2440數(shù)據(jù)手冊(cè),這句用于reset整個(gè)sd/mmc模塊。
1343行,調(diào)用s3cmci_set_clk(host,ios)設(shè)置時(shí)鐘,s3cmci_set_clk定義在drivers/mmc/host/s3cmci.c文件中:
1346-1349行,如果ios->clock不為0,使能時(shí)鐘,否則禁用時(shí)鐘。
1351行,將mci_con寫(xiě)回SDICON寄存器。
1361行,用ios->bus_width設(shè)置數(shù)據(jù)總線寬度host->bus_width。
s3cmci_request函數(shù)定義在drivers/mmc/host/s3cmci.c文件中:
struct mmc_request代表一個(gè)request,該結(jié)構(gòu)體定義在include/linux/mmc/core.h文件中:
1271行,將host->status設(shè)置為"mmcrequest",host->status主要用于記錄request處理所處的階段及狀態(tài),方便調(diào)試使用。
1272行,設(shè)置host->cmd_is_stop為0,從字面上理解,我認(rèn)為host->cmd_is_stop代表command是否是stop命令(即有一個(gè)command是stop),0表示不是stop命令。
1273行,將mmc_requestmrp保存在host->mrq中,方便以后使用。
1275-1280行,如果卡不存在,則調(diào)用mmc_request_done(mmc,mrq)結(jié)束這次request處理,否則,調(diào)用s3cmci_send_request(mmc)。
s3cmci_send_request函數(shù)定義在drivers/mmc/host/s3cmci.c文件中: