Browse Source

Merge pull request #758 from JianRuiqian/master

[DeviceDrivers] improve sdio
Bernard Xiong 8 years ago
parent
commit
e47515d876

+ 2 - 0
components/drivers/include/drivers/mmcsd_card.h

@@ -135,6 +135,8 @@ struct rt_sdio_function {
 	rt_uint32_t		enable_timeout_val; /* max enable timeout in msec */
 
 	struct rt_sdio_function_tuple *tuples;
+    
+    void            *priv;
 };
 
 #define SDIO_MAX_FUNCTIONS		7

+ 1 - 1
components/drivers/include/drivers/mmcsd_host.h

@@ -111,7 +111,7 @@ struct rt_mmcsd_host {
 	rt_uint32_t	max_blk_count;  /* maximum block count */
 
 	rt_uint32_t   spi_use_crc;
-	struct rt_semaphore  bus_lock;
+	struct rt_mutex  bus_lock;
 	struct rt_semaphore  sem_ack;
 
 	rt_uint32_t       sdio_irq_num;

+ 2 - 0
components/drivers/include/drivers/sdio.h

@@ -229,6 +229,8 @@ rt_int32_t sdio_detach_irq(struct rt_sdio_function *func);
 void sdio_irq_wakeup(struct rt_mmcsd_host *host);
 rt_int32_t sdio_enable_func(struct rt_sdio_function *func);
 rt_int32_t sdio_disable_func(struct rt_sdio_function *func);
+void sdio_set_drvdata(struct rt_sdio_function *func, void *data);
+void* sdio_get_drvdata(struct rt_sdio_function *func);
 rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
                                rt_uint32_t              blksize);
 rt_int32_t sdio_register_driver(struct rt_sdio_driver *driver);

+ 4 - 4
components/drivers/sdio/mmcsd_core.c

@@ -49,12 +49,12 @@ static rt_uint32_t mmcsd_hotpluge_mb_pool[4];
 
 void mmcsd_host_lock(struct rt_mmcsd_host *host)
 {
-    rt_sem_take(&host->bus_lock, RT_WAITING_FOREVER);
+    rt_mutex_take(&host->bus_lock, RT_WAITING_FOREVER);
 }
 
 void mmcsd_host_unlock(struct rt_mmcsd_host *host)
 {
-    rt_sem_release(&host->bus_lock);
+    rt_mutex_release(&host->bus_lock);
 }
 
 void mmcsd_req_complete(struct rt_mmcsd_host *host)
@@ -713,7 +713,7 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void)
     host->max_blk_size = 512;
     host->max_blk_count = 4096;
 
-    rt_sem_init(&host->bus_lock, "sd_bus_lock", 1, RT_IPC_FLAG_FIFO);
+    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;
@@ -721,7 +721,7 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void)
 
 void mmcsd_free_host(struct rt_mmcsd_host *host)
 {
-    rt_sem_detach(&host->bus_lock);
+    rt_mutex_detach(&host->bus_lock);
     rt_sem_detach(&host->sem_ack);
     rt_free(host);
 }

+ 26 - 8
components/drivers/sdio/sdio.c

@@ -29,8 +29,8 @@
 #ifndef RT_SDIO_STACK_SIZE
 #define RT_SDIO_STACK_SIZE 512
 #endif
-#ifndef RT_SDIO_THREAD_PREORITY
-#define RT_SDIO_THREAD_PREORITY  0x40
+#ifndef RT_SDIO_THREAD_PRIORITY
+#define RT_SDIO_THREAD_PRIORITY  0x40
 #endif
 
 static rt_list_t sdio_cards;
@@ -1059,7 +1059,7 @@ static rt_int32_t sdio_irq_thread_create(struct rt_mmcsd_card *card)
         RT_ASSERT(host->sdio_irq_sem != RT_NULL);
 
         host->sdio_irq_thread = rt_thread_create("sdio_irq", sdio_irq_thread, host, 
-                             RT_SDIO_STACK_SIZE, RT_SDIO_THREAD_PREORITY, 20);
+                             RT_SDIO_STACK_SIZE, RT_SDIO_THREAD_PRIORITY, 20);
         if (host->sdio_irq_thread != RT_NULL) 
         {
             rt_thread_startup(host->sdio_irq_thread);
@@ -1079,7 +1079,7 @@ static rt_int32_t sdio_irq_thread_delete(struct rt_mmcsd_card *card)
     if (!host->sdio_irq_num) 
     {
         if (host->flags & MMCSD_SUP_SDIO_IRQ)
-                host->ops->enable_sdio_irq(host, 0);
+            host->ops->enable_sdio_irq(host, 0);
         rt_sem_delete(host->sdio_irq_sem);
         host->sdio_irq_sem = RT_NULL;
         rt_thread_delete(host->sdio_irq_thread);
@@ -1253,6 +1253,16 @@ err:
     return -RT_EIO;
 }
 
+void sdio_set_drvdata(struct rt_sdio_function *func, void *data)
+{
+    func->priv = data;
+}
+
+void* sdio_get_drvdata(struct rt_sdio_function *func)
+{
+    return func->priv;
+}
+
 rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
                                rt_uint32_t              blksize)
 {
@@ -1284,16 +1294,24 @@ rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
 rt_inline rt_int32_t sdio_match_card(struct rt_mmcsd_card           *card,
                                      const struct rt_sdio_device_id *id)
 {
+    rt_uint8_t num = 1;
+    
     if ((id->manufacturer != SDIO_ANY_MAN_ID) && 
         (id->manufacturer != card->cis.manufacturer))
         return 0;
-    if ((id->product != SDIO_ANY_PROD_ID) && 
-        (id->product != (card->cis.product | 1)))
-        return 0;
+    
+    while (num <= card->sdio_function_num)
+    {
+        if ((id->product != SDIO_ANY_PROD_ID) && 
+            (id->product == card->sdio_function[num]->product))
+            return 1;
+        num++;
+    }
 
-    return 1;
+    return 0;
 }
 
+
 static struct rt_mmcsd_card *sdio_match_driver(struct rt_sdio_device_id *id)
 {
     rt_list_t *l;