summaryrefslogtreecommitdiff
path: root/components/drivers
diff options
context:
space:
mode:
authorAubr.Cool <[email protected]>2017-08-29 11:42:38 +0800
committerAubr.Cool <[email protected]>2017-08-30 08:00:36 +0800
commit44bac92a93a3fac38e34727b47860e99d33e659b (patch)
tree635b2078efeecf6e2a8faebb65b4581aab657f81 /components/drivers
parentf5c1291826127762380ebb2f211c3e1dacd8450f (diff)
[Components]drivers can change txcompletion to sem
Diffstat (limited to 'components/drivers')
-rw-r--r--components/drivers/can/can.c40
-rw-r--r--components/drivers/include/drivers/can.h2
2 files changed, 21 insertions, 21 deletions
diff --git a/components/drivers/can/can.c b/components/drivers/can/can.c
index d1cc21dd3f..bbd1e2dcf6 100644
--- a/components/drivers/can/can.c
+++ b/components/drivers/can/can.c
@@ -154,20 +154,11 @@ rt_inline int _can_int_tx(struct rt_can_device *can, const struct rt_can_msg *da
rt_uint32_t result;
struct rt_can_sndbxinx_list *tx_tosnd = RT_NULL;
+ rt_sem_take(&(tx_fifo->sem), RT_WAITING_FOREVER);
level = rt_hw_interrupt_disable();
- if (!rt_list_isempty(&tx_fifo->freelist))
- {
- tx_tosnd = rt_list_entry(tx_fifo->freelist.next, struct rt_can_sndbxinx_list, list);
- RT_ASSERT(tx_tosnd != RT_NULL);
- rt_list_remove(&tx_tosnd->list);
- }
- else
- {
- rt_hw_interrupt_enable(level);
-
- rt_completion_wait(&(tx_fifo->completion), RT_WAITING_FOREVER);
- continue;
- }
+ tx_tosnd = rt_list_entry(tx_fifo->freelist.next, struct rt_can_sndbxinx_list, list);
+ RT_ASSERT(tx_tosnd != RT_NULL);
+ rt_list_remove(&tx_tosnd->list);
rt_hw_interrupt_enable(level);
no = ((rt_uint32_t)tx_tosnd - (rt_uint32_t)tx_fifo->buffer) / sizeof(struct rt_can_sndbxinx_list);
@@ -178,6 +169,7 @@ rt_inline int _can_int_tx(struct rt_can_device *can, const struct rt_can_msg *da
level = rt_hw_interrupt_disable();
rt_list_insert_after(&tx_fifo->freelist, &tx_tosnd->list);
rt_hw_interrupt_enable(level);
+ rt_sem_release(&(tx_fifo->sem));
continue;
}
@@ -191,8 +183,8 @@ rt_inline int _can_int_tx(struct rt_can_device *can, const struct rt_can_msg *da
rt_list_remove(&tx_tosnd->list);
}
rt_list_insert_before(&tx_fifo->freelist, &tx_tosnd->list);
- rt_completion_done(&(tx_fifo->completion));
rt_hw_interrupt_enable(level);
+ rt_sem_release(&(tx_fifo->sem));
if (result == RT_CAN_SND_RESULT_OK)
{
@@ -280,7 +272,7 @@ rt_inline int _can_int_tx_priv(struct rt_can_device *can, const struct rt_can_ms
static rt_err_t rt_can_open(struct rt_device *dev, rt_uint16_t oflag)
{
struct rt_can_device *can;
-
+ char tmpname[16];
RT_ASSERT(dev != RT_NULL);
can = (struct rt_can_device *)dev;
@@ -341,7 +333,9 @@ static rt_err_t rt_can_open(struct rt_device *dev, rt_uint16_t oflag)
rt_completion_init(&(tx_fifo->buffer[i].completion));
tx_fifo->buffer[i].result = RT_CAN_SND_RESULT_OK;
}
- rt_completion_init(&(tx_fifo->completion));
+
+ rt_sprintf(tmpname, "%stl", dev->parent.name);
+ rt_sem_init(&(tx_fifo->sem), tmpname, can->config.sndboxnumber, RT_IPC_FLAG_FIFO);
can->can_tx = tx_fifo;
dev->open_flag |= RT_DEVICE_FLAG_INT_TX;
@@ -535,14 +529,20 @@ static rt_err_t rt_can_control(struct rt_device *dev,
tx_fifo = (struct rt_can_tx_fifo *) can->can_tx;
if (can->config.privmode)
{
- rt_completion_done(&(tx_fifo->completion));
-
for (i = 0; i < can->config.sndboxnumber; i++)
{
- level = rt_hw_interrupt_disable();
- rt_list_remove(&tx_fifo->buffer[i].list);
+ level = rt_hw_interrupt_disable();
+ if(rt_list_isempty(&tx_fifo->buffer[i].list))
+ {
+ rt_sem_release(&(tx_fifo->sem));
+ }
+ else
+ {
+ rt_list_remove(&tx_fifo->buffer[i].list);
+ }
rt_hw_interrupt_enable(level);
}
+
}
else
{
diff --git a/components/drivers/include/drivers/can.h b/components/drivers/include/drivers/can.h
index 71b577eba0..ecf3b5f51e 100644
--- a/components/drivers/include/drivers/can.h
+++ b/components/drivers/include/drivers/can.h
@@ -280,7 +280,7 @@ struct rt_can_sndbxinx_list
struct rt_can_tx_fifo
{
struct rt_can_sndbxinx_list *buffer;
- struct rt_completion completion;
+ struct rt_semaphore sem;
struct rt_list_node freelist;
};