Задать вопрос
  • Как заставить работать SD в режиме mmc-spi на процессоре Altera NIOS2 под управением Linux?

    @dr_wap Автор вопроса
    Вот что удалось проследить отладчиком:
    Вызывается функция инициализации карты mmc_sd_init_card. Далее драйвер пытается получить CID в функции mmc_sd_get_cid. В этой функции карта переводится в IDLE с помощью функции mmc_go_idle. Далее выполняется SD_SEND_IF_COND в одноименной функции mmc_send_if_cond. Далее mmc_host_uhs и sd_get_host_max_current. Затем вызывается mmc_send_app_op_cond, из которой вызывается mmc_app_cmd. Приведу листинг функции на всякий случай:
    int mmc_wait_for_app_cmd(struct mmc_host *host, struct mmc_card *card,
    	struct mmc_command *cmd, int retries)
    {
    	struct mmc_request mrq = {NULL};
    
    	int i, err;
    
    	BUG_ON(!cmd);
    	BUG_ON(retries < 0);
    
    	err = -EIO;
    
    	/*
    	 * We have to resend MMC_APP_CMD for each attempt so
    	 * we cannot use the retries field in mmc_command.
    	 */
    	for (i = 0;i <= retries;i++) {
    		err = mmc_app_cmd(host, card);
    		if (err) {
    			/* no point in retrying; no APP commands allowed */
    			if (mmc_host_is_spi(host)) {
    				if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)
    					break;
    			}
    			continue;
    		}
    
    		memset(&mrq, 0, sizeof(struct mmc_request));
    
    		memset(cmd->resp, 0, sizeof(cmd->resp));
    		cmd->retries = 0;
    
    		mrq.cmd = cmd;
    		cmd->data = NULL;
    
    		mmc_wait_for_req(host, &mrq);
    
    		err = cmd->error;
    		if (!cmd->error)
    			break;
    
    		/* no point in retrying illegal APP commands */
    		if (mmc_host_is_spi(host)) {
    			if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)
    				break;
    		}
    	}
    
    	return err;
    }


    В цикле for на второй итерации mmc_app_cmd возвращает ошибку -110.

    На счет успешного считывания CID я наверное погорячился.