diff --git a/components/drivers/include/drivers/mmcsd_card.h b/components/drivers/include/drivers/mmcsd_card.h index 511cc1167d..8a49978a17 100644 --- a/components/drivers/include/drivers/mmcsd_card.h +++ b/components/drivers/include/drivers/mmcsd_card.h @@ -161,7 +161,7 @@ struct rt_mmcsd_card { struct rt_sdio_cccr cccr; /* common card info */ struct rt_sdio_cis cis; /* common tuple info */ struct rt_sdio_function *sdio_function[SDIO_MAX_FUNCTIONS + 1]; /* SDIO functions (devices) */ - + rt_list_t blk_devices; /* for block device list */ }; #ifdef __cplusplus diff --git a/components/drivers/include/drivers/mmcsd_host.h b/components/drivers/include/drivers/mmcsd_host.h index c7f673aeb1..68e38c38ab 100644 --- a/components/drivers/include/drivers/mmcsd_host.h +++ b/components/drivers/include/drivers/mmcsd_host.h @@ -96,6 +96,8 @@ struct rt_mmcsd_host { rt_uint32_t max_blk_size; /* maximum block size */ rt_uint32_t max_blk_count; /* maximum block count */ + rt_uint32_t id; /* Assigned host id */ + rt_uint32_t spi_use_crc; struct rt_mutex bus_lock; struct rt_semaphore sem_ack; diff --git a/components/drivers/sdio/block_dev.c b/components/drivers/sdio/block_dev.c index 73e0c885ec..4a49075d27 100644 --- a/components/drivers/sdio/block_dev.c +++ b/components/drivers/sdio/block_dev.c @@ -21,7 +21,6 @@ #endif /* RT_SDIO_DEBUG */ #include -static rt_list_t blk_devices = RT_LIST_OBJECT_INIT(blk_devices); #define BLK_MIN(a, b) ((a) < (b) ? (a) : (b)) @@ -357,8 +356,8 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card) rt_int32_t err = 0; rt_uint8_t i, status; rt_uint8_t *sector; - char dname[4]; - char sname[8]; + char dname[8]; + char sname[12]; struct mmcsd_blk_device *blk_dev = RT_NULL; err = mmcsd_set_blksize(card); @@ -381,6 +380,10 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card) status = rt_mmcsd_req_blk(card, 0, sector, 1, 0); if (status == RT_EOK) { + rt_int32_t host_id = card->host->id; + + /* Initial blk_device link-list. */ + rt_list_init(&card->blk_devices); for (i = 0; i < RT_MMCSD_MAX_PARTITION; i++) { blk_dev = rt_calloc(1, sizeof(struct mmcsd_blk_device)); @@ -390,6 +393,10 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card) break; } + /* Given block device name is with allocated host id and its partition index. */ + rt_snprintf(dname, sizeof(dname), "sd%c%d", (host_id+'a'), i); + rt_snprintf(sname, sizeof(sname), "sem_sd%c%d", (host_id+'a'), i); + blk_dev->max_req_size = BLK_MIN((card->host->max_dma_segs * card->host->max_seg_size) >> 9, (card->host->max_blk_count * @@ -399,8 +406,6 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card) status = dfs_filesystem_get_partition(&blk_dev->part, sector, i); if (status == RT_EOK) { - rt_snprintf(dname, 4, "sd%d", i); - rt_snprintf(sname, 8, "sem_sd%d", i); blk_dev->part.lock = rt_sem_create(sname, 1, RT_IPC_FLAG_FIFO); /* register mmcsd device */ @@ -425,7 +430,7 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card) rt_device_register(&blk_dev->dev, dname, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); - rt_list_insert_after(&blk_devices, &blk_dev->list); + rt_list_insert_after(&card->blk_devices, &blk_dev->list); } else { @@ -434,7 +439,7 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card) /* there is no partition table */ blk_dev->part.offset = 0; blk_dev->part.size = 0; - blk_dev->part.lock = rt_sem_create("sem_sd0", 1, RT_IPC_FLAG_FIFO); + blk_dev->part.lock = rt_sem_create(sname, 1, RT_IPC_FLAG_FIFO); /* register mmcsd device */ blk_dev->dev.type = RT_Device_Class_Block; @@ -457,9 +462,9 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card) blk_dev->geometry.sector_count = card->card_capacity * (1024 / 512); - rt_device_register(&blk_dev->dev, "sd0", + rt_device_register(&blk_dev->dev, dname, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); - rt_list_insert_after(&blk_devices, &blk_dev->list); + rt_list_insert_after(&card->blk_devices, &blk_dev->list); } else { @@ -496,7 +501,7 @@ void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card) rt_list_t *l, *n; struct mmcsd_blk_device *blk_dev; - for (l = (&blk_devices)->next, n = l->next; l != &blk_devices; l = n, n = n->next) + for (l = (&card->blk_devices)->next, n = l->next; l != &card->blk_devices; l = n, n=n->next) { blk_dev = (struct mmcsd_blk_device *)rt_list_entry(l, struct mmcsd_blk_device, list); if (blk_dev->card == card) diff --git a/components/drivers/sdio/mmcsd_core.c b/components/drivers/sdio/mmcsd_core.c index 8c7062722d..a1a0af95f4 100644 --- a/components/drivers/sdio/mmcsd_core.c +++ b/components/drivers/sdio/mmcsd_core.c @@ -40,6 +40,7 @@ static struct rt_mailbox mmcsd_detect_mb; static rt_uint32_t mmcsd_detect_mb_pool[4]; static struct rt_mailbox mmcsd_hotpluge_mb; static rt_uint32_t mmcsd_hotpluge_mb_pool[4]; +static rt_uint32_t allocated_host_num = 0; void mmcsd_host_lock(struct rt_mmcsd_host *host) { @@ -707,8 +708,10 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void) host->max_dma_segs = 1; host->max_blk_size = 512; host->max_blk_count = 4096; + host->id = allocated_host_num; + allocated_host_num++; - rt_mutex_init(&host->bus_lock, "sd_bus_lock", RT_IPC_FLAG_PRIO); + rt_mutex_init(&host->bus_lock, "sd_bus_lock", RT_IPC_FLAG_FIFO); rt_sem_init(&host->sem_ack, "sd_ack", 0, RT_IPC_FLAG_FIFO); return host;