Jetson - eMMC启动流程

开机识别

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版权协议,转载请附上原文出处链接和本声明。