コード例 #1
0
ファイル: mmc_card.c プロジェクト: philippe-nuaa/xboot
static bool_t register_mmc_card(struct mmc_card_t * card)
{
	struct mmc_card_list * list;
	struct disk_t * disk;

	list = malloc(sizeof(struct mmc_card_list));
	if(!list || !card)
	{
		free(list);
		return FALSE;
	}

	if(!card->name || search_mmc_card(card->name))
	{
		free(list);
		return FALSE;
	}

	disk = malloc(sizeof(struct disk_t));
	if(!disk)
	{
		free(list);
		return FALSE;
	}

	disk->name = card->name;
	disk->size = card->info->sector_size;
	disk->count = card->info->sector_count;
	disk->read = mmc_read;
	disk->write = mmc_write;
	disk->sync = mmc_sync;
	disk->suspend = mmc_suspend;
	disk->resume = mmc_resume;
	disk->priv = (void *)card;
	card->priv = (void *)disk;

	if(!register_disk(disk))
	{
		free(list);
		free(disk);
		return FALSE;
	}

	list->card = card;
	list_add(&list->entry, &mmc_card_list->entry);

	return TRUE;
}
コード例 #2
0
ファイル: mmc_card.c プロジェクト: qioixiy/xboot
static bool_t register_mmc_card(struct mmc_card * card)
{
	struct mmc_card_list * list;
	struct disk * disk;

	list = malloc(sizeof(struct mmc_card_list));
	if(!list || !card)
	{
		free(list);
		return FALSE;
	}

	if(!card->name || search_mmc_card(card->name))
	{
		free(list);
		return FALSE;
	}

	disk = malloc(sizeof(struct disk));
	if(!disk)
	{
		free(list);
		return FALSE;
	}

	disk->name = card->name;
	disk->sector_size = card->info->sector_size;
	disk->sector_count = card->info->sector_count;
	disk->read_sectors = mmc_read_sectors;
	disk->write_sectors = mmc_write_sectors;
	disk->priv = (void *)card;
	card->priv = (void *)disk;

	if(!register_disk(disk, BLK_DEV_MMC))
	{
		free(list);
		free(disk);
		return FALSE;
	}

	list->card = card;
	list_add(&list->entry, &mmc_card_list->entry);

	return TRUE;
}
コード例 #3
0
ファイル: mmc_card.c プロジェクト: qioixiy/xboot
/*
 * probe all mmc card
 */
void mmc_card_probe(void)
{
	struct mmc_host_list * list;
	struct list_head * pos;
	struct mmc_host * host;
	struct mmc_card_info * info;
	struct mmc_card * card;
	s32_t i;

	/*
	 * remove all mmc card
	 */
	mmc_card_remove();

	/*
	 * probe all mmc card by mmc host controller
	 */
	for(pos = (&mmc_host_list->entry)->next; pos != (&mmc_host_list->entry); pos = pos->next)
	{
		list = list_entry(pos, struct mmc_host_list, entry);
		host = list->host;

		if(!host)
			continue;

		/*
		 * malloc mmc card information buffer.
		 */
		info = malloc(sizeof(struct mmc_card_info));
		if(!info)
		{
			LOG_E("can not malloc buffer for mmc card information");
			continue;
		}

		/*
		 * initialize mmc host controller
		 */
		if(host->init)
			host->init();

		if(!host->probe(info))
		{
			if(host->exit)
				host->exit();

			free(info);

			continue;
		}

		/*
		 * malloc mmc card buffer.
		 */
		card = malloc(sizeof(struct mmc_card));
		if(!card)
		{
			LOG_E("can not malloc buffer for mmc card");

			if(host->exit)
				host->exit();

			free(info);

			continue;
		}

		/*
		 * alloc mmc card's name
		 */
		i = 0;
		while(1)
		{
			snprintf((char *)card->name, 32, (const char *)"mmc%ld", i++);
			if(search_mmc_card(card->name) == NULL)
				break;
		}

		/*
		 * initialize mmc card's parameters
		 */
		card->info = info;
		card->host = host;

		/*
		 * decode mmc card information
		 */
		if(!mmc_card_decode(card))
		{
			LOG_E("fail to decode mmc card '%s' (%s)", card->name, card->host->name);
			free(card);
			free(info);
		}

		/*
		 * register mmc card
		 */
		if(register_mmc_card(card) == TRUE)
			LOG_I("found mmc card '%s' (%s)", card->name, card->host->name);
		else
		{
			LOG_E("fail to register mmc card '%s' (%s)", card->name, card->host->name);
			free(card);
			free(info);
		}
	}
}