开机识别
sdio扫描
drivers/mmc/host/sdhci-tegra.c
static int sdhci_tegra_probe(struct platform_device *pdev)
{
... ...
host = sdhci_pltfm_init(pdev, soc_data->pdata, sizeof(*tegra_host));
... ...
}
drivers/mmc/host/sdhci-pltfm.c
struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev,
const struct sdhci_pltfm_data *pdata,
size_t priv_size)
{
... ...
host = sdhci_alloc_host(&pdev->dev,
sizeof(struct sdhci_pltfm_host) + priv_size);
... ...
}
drivers/mmc/host/sdhci.c
struct sdhci_host *sdhci_alloc_host(struct device *dev,
size_t priv_size)
{
... ...
mmc = mmc_alloc_host(sizeof(struct sdhci_host) + priv_size, dev);
... ...
}
drivers/mmc/core/host.c
struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
{
... ...
INIT_DELAYED_WORK(&host->detect, mmc_rescan);
... ...
}
drivers/mmc/host/sdhci-tegra.c
static void sdhci_delayed_detect(struct work_struct *work)
{
... ...
if (sdhci_add_host(host))
goto err_add_host;
... ...
}
divers/mmc/host/sdhci.c
int __sdhci_add_host(struct sdhci_host *host)
{
... ...
ret = mmc_add_host(mmc);
... ...
}
drivers/mmc/core/host.c
int mmc_add_host(struct mmc_host *host)
{
... ...
mmc_start_host(host);
... ...
}
drivers/mmc/core/core.c
void mmc_start_host(struct mmc_host *host)
{
... ...
_mmc_detect_change(host, 0, false);
}
static void _mmc_detect_change(struct mmc_host *host, unsigned long delay,
bool cd_irq)
{
... ...
mmc_schedule_delayed_work(&host->detect, delay);
... ...
}
struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
{
... ...
out:
if (host->caps & MMC_CAP_NEEDS_POLL)
mmc_schedule_delayed_work(&host->detect, HZ);
}
插入识别
TODO
中断模式
TODO
数据传输
TODO
附录
cmd
include/linux/mmc/sdio.h
/* SDIO commands type argument response */
#define SD_IO_SEND_OP_COND 5 /* bcr [23:0] OCR R4 */
#define SD_IO_RW_DIRECT 52 /* ac [31:0] See below R5 */
include/linux/mmc/mmc.h
/* Standard MMC commands (4.1) type argument response */
#define MMC_GO_IDLE_STATE 0 /* bc */
#define MMC_SEND_OP_COND 1 /* bcr [31:0] OCR R3 */
#define MMC_ALL_SEND_CID 2 /* bcr R2 */
#define MMC_SET_RELATIVE_ADDR 3 /* ac [31:16] RCA R1 */
#define MMC_SLEEP_AWAKE 5 /* ac [31:16] RCA 15:flg R1b */
#define MMC_SWITCH 6 /* ac [31:0] See below R1b */
#define MMC_SELECT_CARD 7 /* ac [31:16] RCA R1 */
#define MMC_SEND_EXT_CSD 8 /* adtc R1 */
#define MMC_SEND_CSD 9 /* ac [31:16] RCA R2 */
#define MMC_SEND_STATUS 13 /* ac [31:16] RCA R1 */
#define MMC_APP_CMD 55 /* ac [31:16] RCA R1 */
版权声明:本文为u014414101原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。