summaryrefslogtreecommitdiff
path: root/components/drivers/include
diff options
context:
space:
mode:
authorBernardXiong <[email protected]>2015-07-06 18:11:46 +0800
committerBernardXiong <[email protected]>2015-07-06 18:11:46 +0800
commit91d866d81a20e014b25365391ee1dda0f544fd01 (patch)
tree3e76f950f94da371b3f2f664267a0c169bb54553 /components/drivers/include
parent1488568801ac099d678d39e71c508543dd13ee17 (diff)
[DeviceDrivers] Use mutex to lock can_open/close
Diffstat (limited to 'components/drivers/include')
-rw-r--r--components/drivers/include/drivers/can.h332
1 files changed, 167 insertions, 165 deletions
diff --git a/components/drivers/include/drivers/can.h b/components/drivers/include/drivers/can.h
index a6c60cd28e..ec0f597f1c 100644
--- a/components/drivers/include/drivers/can.h
+++ b/components/drivers/include/drivers/can.h
@@ -3,80 +3,76 @@
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2015, RT-Thread Development Team
*
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
- * Date Author Notes
- * 2015-05-14 [email protected] first version
+ * Date Author Notes
+ * 2015-05-14 [email protected] first version
+ * 2015-07-06 Bernard remove RT_CAN_USING_LED.
*/
+
#ifndef CAN_H_
#define CAN_H_
#include <rtthread.h>
#ifndef RT_CANMSG_BOX_SZ
-#define RT_CANMSG_BOX_SZ 16
+#define RT_CANMSG_BOX_SZ 16
#endif
#ifndef RT_CANSND_BOX_NUM
-#define RT_CANSND_BOX_NUM 1
+#define RT_CANSND_BOX_NUM 1
#endif
enum CANBAUD
{
- CAN1MBaud=0, // 1 MBit/sec
- CAN800kBaud, // 800 kBit/sec
- CAN500kBaud, // 500 kBit/sec
- CAN250kBaud, // 250 kBit/sec
- CAN125kBaud, // 125 kBit/sec
- CAN100kBaud, // 100 kBit/sec
- CAN50kBaud, // 50 kBit/sec
- CAN20kBaud, // 20 kBit/sec
- CAN10kBaud // 10 kBit/sec
+ CAN1MBaud = 0, /* 1 MBit/sec */
+ CAN800kBaud, /* 800 kBit/sec */
+ CAN500kBaud, /* 500 kBit/sec */
+ CAN250kBaud, /* 250 kBit/sec */
+ CAN125kBaud, /* 125 kBit/sec */
+ CAN100kBaud, /* 100 kBit/sec */
+ CAN50kBaud, /* 50 kBit/sec */
+ CAN20kBaud, /* 20 kBit/sec */
+ CAN10kBaud /* 10 kBit/sec */
};
-#define RT_CAN_MODE_NORMAL 0
-#define RT_CAN_MODE_LISEN 1
-#define RT_CAN_MODE_LOOPBACK 2
-#define RT_CAN_MODE_LOOPBACKANLISEN 3
-#define RT_CAN_MODE_PRIV 0x01
-#define RT_CAN_MODE_NOPRIV 0x00
+#define RT_CAN_MODE_NORMAL 0
+#define RT_CAN_MODE_LISEN 1
+#define RT_CAN_MODE_LOOPBACK 2
+#define RT_CAN_MODE_LOOPBACKANLISEN 3
-#ifdef RT_CAN_USING_LED
-struct rt_can_led
-{
- rt_uint32_t pin,mode,init;
- struct rt_timer* timer;
- const char* timer_name;
-};
-#endif /*RT_CAN_USING_LED*/
+#define RT_CAN_MODE_PRIV 0x01
+#define RT_CAN_MODE_NOPRIV 0x00
struct rt_can_filter_item
{
- rt_uint32_t id :29;
- rt_uint32_t ide :1;
- rt_uint32_t rtr :1;
- rt_uint32_t mode :1;
- rt_uint32_t mask;
- rt_int32_t hdr;
+ rt_uint32_t id : 29;
+ rt_uint32_t ide : 1;
+ rt_uint32_t rtr : 1;
+ rt_uint32_t mode : 1;
+ rt_uint32_t mask;
+ rt_int32_t hdr;
#ifdef RT_CAN_USING_HDR
- rt_err_t (*ind)(rt_device_t dev, void* args ,rt_int32_t hdr, rt_size_t size);
- void* args;
+ rt_err_t (*ind)(rt_device_t dev, void *args , rt_int32_t hdr, rt_size_t size);
+ void *args;
#endif /*RT_CAN_USING_HDR*/
};
+
#ifdef RT_CAN_USING_HDR
#define RT_CAN_FILTER_ITEM_INIT(id,ide,rtr,mode,mask,ind,args) \
- {\
- id,\
- ide,\
- rtr,\
- mode,\
- mask,\
- -1,\
- ind,\
- args,\
- }
+ {(id), (ide), (rtr), (mode), (mask), -1, (ind), (args)}
#define RT_CAN_FILTER_STD_INIT(id,ind,args) \
RT_CAN_FILTER_ITEM_INIT(id,0,0,0,0xFFFFFFFF,ind,args)
#define RT_CAN_FILTER_EXT_INIT(id,ind,args) \
@@ -90,15 +86,9 @@ struct rt_can_filter_item
#define RT_CAN_EXT_RMT_DATA_FILTER_INIT(id,ind,args) \
RT_CAN_FILTER_ITEM_INIT(id,1,0,1,0xFFFFFFFF,ind,args)
#else
+
#define RT_CAN_FILTER_ITEM_INIT(id,ide,rtr,mode,mask) \
- {\
- id,\
- ide,\
- rtr,\
- mode,\
- mask,\
- -1,\
- }
+ {(id), (ide), (rtr), (mode), (mask), -1, }
#define RT_CAN_FILTER_STD_INIT(id) \
RT_CAN_FILTER_ITEM_INIT(id,0,0,0,0xFFFFFFFF)
#define RT_CAN_FILTER_EXT_INIT(id) \
@@ -115,26 +105,22 @@ struct rt_can_filter_item
struct rt_can_filter_config
{
- rt_uint32_t count;
- rt_uint32_t actived;
- struct rt_can_filter_item* items;
+ rt_uint32_t count;
+ rt_uint32_t actived;
+ struct rt_can_filter_item *items;
};
+
struct can_configure
{
- rt_uint32_t baud_rate;
- rt_uint32_t msgboxsz;
- rt_uint32_t sndboxnumber;
- rt_uint32_t mode :8;
- rt_uint32_t privmode :8;
- rt_uint32_t reserved :16;
- #ifdef RT_CAN_USING_LED
- const struct rt_can_led* rcvled;
- const struct rt_can_led* sndled;
- const struct rt_can_led* errled;
- #endif /*RT_CAN_USING_LED*/
- rt_uint32_t ticks;
+ rt_uint32_t baud_rate;
+ rt_uint32_t msgboxsz;
+ rt_uint32_t sndboxnumber;
+ rt_uint32_t mode : 8;
+ rt_uint32_t privmode : 8;
+ rt_uint32_t reserved : 16;
+ rt_uint32_t ticks;
#ifdef RT_CAN_USING_HDR
- rt_uint32_t maxhdr;
+ rt_uint32_t maxhdr;
#endif
};
@@ -147,80 +133,88 @@ struct can_configure
};
struct rt_can_ops;
-#define RT_CAN_CMD_SET_FILTER 0x13
-#define RT_CAN_CMD_SET_BAUD 0x14
-#define RT_CAN_CMD_SET_MODE 0x15
-#define RT_CAN_CMD_SET_PRIV 0x16
-#define RT_CAN_CMD_GET_STATUS 0x17
-#define RT_CAN_CMD_SET_STATUS_IND 0x18
+#define RT_CAN_CMD_SET_FILTER 0x13
+#define RT_CAN_CMD_SET_BAUD 0x14
+#define RT_CAN_CMD_SET_MODE 0x15
+#define RT_CAN_CMD_SET_PRIV 0x16
+#define RT_CAN_CMD_GET_STATUS 0x17
+#define RT_CAN_CMD_SET_STATUS_IND 0x18
-#define RT_DEVICE_CAN_INT_ERR 0x1000
+#define RT_DEVICE_CAN_INT_ERR 0x1000
enum RT_CAN_STATUS_MODE
{
- NORMAL = 0,
- ERRWARNING = 1,
- ERRPASSIVE = 2,
- BUSOFF = 4,
+ NORMAL = 0,
+ ERRWARNING = 1,
+ ERRPASSIVE = 2,
+ BUSOFF = 4,
};
enum RT_CAN_BUS_ERR
{
- RT_CAN_BUS_NO_ERR = 0,
- RT_CAN_BUS_BIT_PAD_ERR = 1,
- RT_CAN_BUS_FORMAT_ERR = 2,
- RT_CAN_BUS_ACK_ERR = 3,
- RT_CAN_BUS_IMPLICIT_BIT_ERR = 4,
- RT_CAN_BUS_EXPLICIT_BIT_ERR = 5,
- RT_CAN_BUS_CRC_ERR = 6,
+ RT_CAN_BUS_NO_ERR = 0,
+ RT_CAN_BUS_BIT_PAD_ERR = 1,
+ RT_CAN_BUS_FORMAT_ERR = 2,
+ RT_CAN_BUS_ACK_ERR = 3,
+ RT_CAN_BUS_IMPLICIT_BIT_ERR = 4,
+ RT_CAN_BUS_EXPLICIT_BIT_ERR = 5,
+ RT_CAN_BUS_CRC_ERR = 6,
};
+
struct rt_can_status
{
- rt_uint32_t rcverrcnt;
- rt_uint32_t snderrcnt;
- rt_uint32_t errcode;
- rt_uint32_t rcvpkg;
- rt_uint32_t dropedrcvpkg;
- rt_uint32_t sndpkg;
- rt_uint32_t dropedsndpkg;
- rt_uint32_t bitpaderrcnt;
- rt_uint32_t formaterrcnt;
- rt_uint32_t ackerrcnt;
- rt_uint32_t biterrcnt;
- rt_uint32_t crcerrcnt;
- rt_uint32_t rcvchange;
- rt_uint32_t sndchange;
- rt_uint32_t lasterrtype;
+ rt_uint32_t rcverrcnt;
+ rt_uint32_t snderrcnt;
+ rt_uint32_t errcode;
+ rt_uint32_t rcvpkg;
+ rt_uint32_t dropedrcvpkg;
+ rt_uint32_t sndpkg;
+ rt_uint32_t dropedsndpkg;
+ rt_uint32_t bitpaderrcnt;
+ rt_uint32_t formaterrcnt;
+ rt_uint32_t ackerrcnt;
+ rt_uint32_t biterrcnt;
+ rt_uint32_t crcerrcnt;
+ rt_uint32_t rcvchange;
+ rt_uint32_t sndchange;
+ rt_uint32_t lasterrtype;
};
+
#ifdef RT_CAN_USING_HDR
-struct rt_can_hdr {
- rt_uint32_t connected;
- rt_uint32_t msgs;
- struct rt_can_filter_item filter;
- struct rt_list_node list;
+struct rt_can_hdr
+{
+ rt_uint32_t connected;
+ rt_uint32_t msgs;
+ struct rt_can_filter_item filter;
+ struct rt_list_node list;
};
#endif
struct rt_can_device;
-typedef rt_err_t (*rt_canstatus_ind)(struct rt_can_device*, void*);
+typedef rt_err_t (*rt_canstatus_ind)(struct rt_can_device *, void *);
typedef struct rt_can_status_ind_type
{
rt_canstatus_ind ind;
- void* args;
+ void *args;
} *rt_can_status_ind_type_t;
+
struct rt_can_device
{
- struct rt_device parent;
+ struct rt_device parent;
- const struct rt_can_ops *ops;
- struct can_configure config;
- struct rt_can_status status;
- rt_uint32_t timerinitflag;
- struct rt_timer timer;
- struct rt_can_status_ind_type status_indicate;
+ const struct rt_can_ops *ops;
+ struct can_configure config;
+ struct rt_can_status status;
+
+ rt_uint32_t timerinitflag;
+ struct rt_timer timer;
+
+ struct rt_can_status_ind_type status_indicate;
#ifdef RT_CAN_USING_HDR
- struct rt_can_hdr* hdr;
+ struct rt_can_hdr *hdr;
#endif
- void *can_rx;
- void *can_tx;
+
+ struct rt_mutex lock;
+ void *can_rx;
+ void *can_tx;
};
typedef struct rt_can_device *rt_can_t;
@@ -229,68 +223,76 @@ typedef struct rt_can_device *rt_can_t;
#define RT_CAN_DTR 0
#define RT_CAN_RTR 1
-typedef struct rt_can_status * rt_can_status_t;
+typedef struct rt_can_status *rt_can_status_t;
struct rt_can_msg
{
- rt_uint32_t id :29;
- rt_uint32_t ide :1;
- rt_uint32_t rtr :1;
- rt_uint32_t rsv :1;
- rt_uint32_t len :8;
- rt_uint32_t priv :8;
- rt_uint32_t hdr :8;
- rt_uint32_t reserved :8;
- rt_uint8_t data[8];
+ rt_uint32_t id : 29;
+ rt_uint32_t ide : 1;
+ rt_uint32_t rtr : 1;
+ rt_uint32_t rsv : 1;
+ rt_uint32_t len : 8;
+ rt_uint32_t priv : 8;
+ rt_uint32_t hdr : 8;
+ rt_uint32_t reserved : 8;
+ rt_uint8_t data[8];
};
-typedef struct rt_can_msg* rt_can_msg_t;
-struct rt_can_msg_list {
- struct rt_list_node list;
+typedef struct rt_can_msg *rt_can_msg_t;
+
+struct rt_can_msg_list
+{
+ struct rt_list_node list;
#ifdef RT_CAN_USING_HDR
- struct rt_list_node hdrlist;
- struct rt_can_hdr* owner;
+ struct rt_list_node hdrlist;
+ struct rt_can_hdr *owner;
#endif
- struct rt_can_msg data;
+ struct rt_can_msg data;
};
+
struct rt_can_rx_fifo
{
- /* software fifo */
- struct rt_can_msg_list *buffer;
- rt_uint32_t freenumbers;
- struct rt_list_node freelist;
- struct rt_list_node uselist;
+ /* software fifo */
+ struct rt_can_msg_list *buffer;
+ rt_uint32_t freenumbers;
+ struct rt_list_node freelist;
+ struct rt_list_node uselist;
};
-#define RT_CAN__SND_RESUTL_OK 0
-#define RT_CAN__SND_RESUTL_ERR 1
-#define RT_CAN__SND_RESUTL_WAIT 2
+#define RT_CAN_SND_RESULT_OK 0
+#define RT_CAN_SND_RESULT_ERR 1
+#define RT_CAN_SND_RESULT_WAIT 2
-#define RT_CAN_EVENT_RX_IND 0x01 /* Rx indication */
-#define RT_CAN_EVENT_TX_DONE 0x02 /* Tx complete */
-#define RT_CAN_EVENT_TX_FAIL 0x03 /* Tx complete */
-#define RT_CAN_EVENT_RX_TIMEOUT 0x05 /* Rx timeout */
-#define RT_CAN_EVENT_RXOF_IND 0x06 /* Rx overflow */
+#define RT_CAN_EVENT_RX_IND 0x01 /* Rx indication */
+#define RT_CAN_EVENT_TX_DONE 0x02 /* Tx complete */
+#define RT_CAN_EVENT_TX_FAIL 0x03 /* Tx complete */
+#define RT_CAN_EVENT_RX_TIMEOUT 0x05 /* Rx timeout */
+#define RT_CAN_EVENT_RXOF_IND 0x06 /* Rx overflow */
-struct rt_can_sndbxinx_list {
- struct rt_list_node list;
- struct rt_completion completion;
- rt_uint32_t result;
+struct rt_can_sndbxinx_list
+{
+ struct rt_list_node list;
+ struct rt_completion completion;
+ rt_uint32_t result;
};
+
struct rt_can_tx_fifo
{
- struct rt_can_sndbxinx_list *buffer;
- struct rt_completion completion;
- struct rt_list_node freelist;
+ struct rt_can_sndbxinx_list *buffer;
+ struct rt_completion completion;
+ struct rt_list_node freelist;
};
+
struct rt_can_ops
{
- rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg);
- rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);
- int (*sendmsg)(struct rt_can_device *can, const void* buf, rt_uint32_t boxno);
- int (*recvmsg)(struct rt_can_device *can,void* buf, rt_uint32_t boxno);
+ rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg);
+ rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);
+ int (*sendmsg)(struct rt_can_device *can, const void *buf, rt_uint32_t boxno);
+ int (*recvmsg)(struct rt_can_device *can, void *buf, rt_uint32_t boxno);
};
+
rt_err_t rt_hw_can_register(struct rt_can_device *can,
- const char *name,
- const struct rt_can_ops *ops,
- void *data);
+ const char *name,
+ const struct rt_can_ops *ops,
+ void *data);
void rt_hw_can_isr(struct rt_can_device *can, int event);
#endif /*_CAN_H*/
+