summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorbernard.xiong <[email protected]>2009-11-26 09:28:06 +0000
committerbernard.xiong <[email protected]>2009-11-26 09:28:06 +0000
commit885045ef426614e669cbed538fbf135d974c1a36 (patch)
treeb9f8e68dd5972976489e962b113346c15046236c /bsp
parent719f923718694c48a54827cd5dc03f3621557cc7 (diff)
add semaphore to protect sdcard driver read and write; fix window keyboard event handler.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@177 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'bsp')
-rw-r--r--bsp/stm32_radio/sdcard.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/bsp/stm32_radio/sdcard.c b/bsp/stm32_radio/sdcard.c
index c9e94c244b..fbbc42aab3 100644
--- a/bsp/stm32_radio/sdcard.c
+++ b/bsp/stm32_radio/sdcard.c
@@ -2966,6 +2966,7 @@ static void DMA_RxConfiguration(uint32_t *BufferDST, uint32_t BufferSize)
static struct rt_device sdcard_device;
static SD_CardInfo SDCardInfo;
static struct dfs_partition part;
+static struct rt_semaphore sd_lock;
/* RT-Thread Device Driver Interface */
static rt_err_t rt_sdcard_init(rt_device_t dev)
@@ -2978,6 +2979,11 @@ static rt_err_t rt_sdcard_init(rt_device_t dev)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
+ if (rt_sem_init(&sd_lock, "sdlock", 1, RT_IPC_FLAG_FIFO) != RT_EOK)
+ {
+ rt_kprintf("init sd lock semaphore failed\n");
+ }
+
return RT_EOK;
}
@@ -3001,6 +3007,7 @@ static rt_size_t rt_sdcard_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_
// rt_kprintf("read: 0x%x, size %d\n", pos, size);
+ rt_sem_take(&sd_lock, RT_WAITING_FOREVER);
retry = 3;
/* read all sectors */
for (i = 0; i < size / SECTOR_SIZE; i ++)
@@ -3012,14 +3019,15 @@ __retry:
if (status != SD_OK)
{
if (--retry != 0) goto __retry;
- rt_kprintf("sd card read failed, status 0x%08x\n", status);
- return 0;
+ break;
}
}
+ rt_sem_release(&sd_lock);
+
if (status == SD_OK) return size;
- rt_kprintf("read failed: %d\n", status);
+ rt_kprintf("read failed: %d, buffer 0x%08x\n", status, buffer);
return 0;
}
@@ -3030,7 +3038,9 @@ static rt_size_t rt_sdcard_write (rt_device_t dev, rt_off_t pos, const void* buf
// rt_kprintf("write: 0x%x, size %d\n", pos, size);
- /* read all sectors */
+ rt_sem_take(&sd_lock, RT_WAITING_FOREVER);
+
+ /* write all sectors */
for (i = 0; i < size / SECTOR_SIZE; i ++)
{
status = SD_WriteBlock((part.offset + i)* SECTOR_SIZE + pos,
@@ -3039,13 +3049,14 @@ static rt_size_t rt_sdcard_write (rt_device_t dev, rt_off_t pos, const void* buf
if (status != SD_OK)
{
rt_kprintf("sd card write failed\n");
- return 0;
+ break;
}
}
+ rt_sem_release(&sd_lock);
if (status == SD_OK) return size;
- rt_kprintf("write failed: %d\n", status);
+ rt_kprintf("write failed: %d, buffer 0x%08x\n", status, buffer);
return 0;
}
@@ -3119,3 +3130,4 @@ void rt_hw_sdcard_init()
__return:
rt_kprintf("sdcard init failed\n");
}
+