XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_hal_dev.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_hal_dev.h"
15
16/* ==================== [Defines] =========================================== */
17
18#define TAG "hal_dev"
19#define DEV_TABLE_SIZE XF_HAL_TYPE_MAX
20
21/* ==================== [Typedefs] ========================================== */
22
23typedef struct _xf_hal_driver_t {
25 uint32_t flag : 16;
26 uint32_t dev_count : 16;
29#if XF_HAL_LOCK_IS_ENABLE
30 void *mutex;
31#endif
33
34/* ==================== [Static Prototypes] ================================= */
35
36/* ==================== [Static Variables] ================================== */
37
39
40/* ==================== [Macros] ============================================ */
41
42/* ==================== [Global Functions] ================================== */
43
45 const xf_driver_ops_t *driver_ops)
46{
47 XF_ASSERT(driver_ops, XF_ERR_INVALID_ARG, TAG, "driver_ops must not be NULL");
48 XF_ASSERT(type < DEV_TABLE_SIZE && type >= 0, XF_ERR_INVALID_ARG, TAG, "type must between 0 and %d", DEV_TABLE_SIZE);
49
50 xf_list_init(&dev_table[type].dev_list);
51 dev_table[type].driver_ops.open = driver_ops->open;
52 dev_table[type].driver_ops.ioctl = driver_ops->ioctl;
53 dev_table[type].driver_ops.write = driver_ops->write;
54 dev_table[type].driver_ops.read = driver_ops->read;
55 dev_table[type].driver_ops.close = driver_ops->close;
56 dev_table[type].dev_count = 0;
57 dev_table[type].flag = flag;
58 dev_table[type].constructor = constructor;
59#if XF_HAL_LOCK_IS_ENABLE
61 XF_ASSERT(!err, err, TAG, "lock init failed!");
62#endif
63
64 return XF_OK;
65}
66
68{
69 XF_ASSERT(type < DEV_TABLE_SIZE && type >= 0, _XF_HAL_FLAG_NOT_USE, TAG, "type must between 0 and %d", DEV_TABLE_SIZE);
70
71 uint32_t flag = dev_table[type].flag;
72
73 return flag;
74}
75
77{
78 XF_ASSERT(type < DEV_TABLE_SIZE && type >= 0, 0, TAG, "type must between 0 and %d", DEV_TABLE_SIZE);
79
80#if XF_HAL_LOCK_IS_ENABLE
82#endif
83
84 uint32_t dev_count = dev_table[type].dev_count;
85
86#if XF_HAL_LOCK_IS_ENABLE
88#endif
89
90 return dev_count;
91}
92
94{
95 XF_ASSERT(type < DEV_TABLE_SIZE && type >= 0, NULL, TAG, "type must between 0 and %d", DEV_TABLE_SIZE);
96
97 xf_err_t err = XF_OK;
98
99 xf_hal_dev_t *dev = dev_table[type].constructor(id);
100
101 if (dev == NULL) {
102 return NULL;
103 }
104
105 err = xf_hal_driver_ioctl(dev, XF_HAL_DEV_CMD_DEFAULT, (uint8_t *)dev + sizeof(xf_hal_dev_t));
106 if (err != XF_OK) {
107 XF_LOGE(TAG, "set default failed, %d", (int)err);
108 }
109
110 err = xf_hal_driver_ioctl(dev, XF_HAL_DEV_CMD_ALL, (uint8_t *)dev + sizeof(xf_hal_dev_t));
111 if (err != XF_OK) {
112 XF_LOGE(TAG, "set all failed, %d", (int)err);
113 }
114
115 return dev;
116}
117
119{
120 XF_ASSERT(dev, XF_ERR_INVALID_ARG, TAG, "dev must not be NULL");
121 XF_ASSERT(type < DEV_TABLE_SIZE && type >= 0, XF_ERR_INVALID_ARG, TAG, "type must between 0 and %d", DEV_TABLE_SIZE);
122 XF_ASSERT(!xf_hal_device_find(type, id), XF_ERR_INVALID_ARG, TAG, "Duplicate device registration!");
123
124 dev->type = type;
125 dev->id = id;
126 dev->platform_data = NULL;
127 xf_list_init(&dev->node);
128 xf_err_t err = xf_hal_device_add(dev);
129 UNUSED(err);
130 XF_ASSERT(!err, err, TAG, "device add failed!");
131
132 err = dev_table[type].driver_ops.open(dev);
133 XF_ASSERT(!err, err, TAG, "open failed:%d!", (int)err);
134
135#if XF_HAL_LOCK_IS_ENABLE
136 err = xf_lock_init(&dev->mutex);
137 XF_ASSERT(!err, err, TAG, "lock init failed!");
138#endif
139
140#if XF_HAL_LOCK_IS_ENABLE
142#endif
143
144 dev_table[type].dev_count++;
145
146#if XF_HAL_LOCK_IS_ENABLE
148#endif
149 XF_LOGD(TAG, "open success");
150
151 return XF_OK;
152}
153
154xf_err_t xf_hal_driver_ioctl(xf_hal_dev_t *dev, uint32_t cmd, void *config)
155{
156 XF_ASSERT(dev, XF_ERR_INVALID_ARG, TAG, "dev must not be NULL");
157 XF_ASSERT(config, XF_ERR_INVALID_ARG, TAG, "config must not be NULL");
158
159 xf_err_t err = dev_table[dev->type].driver_ops.ioctl(dev, cmd, config);
160 UNUSED(err);
161 XF_ASSERT(!err, err, TAG, "ioctl failed:%d!", (int)err);
162
163 XF_LOGD(TAG, "ioctl success");
164
165 return XF_OK;
166}
167
168int xf_hal_driver_read(xf_hal_dev_t *dev, void *buf, size_t count)
169{
170 XF_ASSERT(dev, XF_ERR_INVALID_ARG, TAG, "dev must not be NULL");
172 "device not support read:%d!", dev_table[dev->type].flag);
173
174 xf_err_t err = dev_table[dev->type].driver_ops.read(dev, buf, count);
175 XF_ASSERT(err >= 0, err, TAG, "driver read failed:%d!", (int) - err);
176
177 return err;
178}
179
180int xf_hal_driver_write(xf_hal_dev_t *dev, const void *buf, size_t count)
181{
182 XF_ASSERT(dev, XF_ERR_INVALID_ARG, TAG, "dev must not be NULL");
184 "device not support write:%d!", dev_table[dev->type].flag);
185
186 xf_err_t err = dev_table[dev->type].driver_ops.write(dev, buf, count);
187 XF_ASSERT(err >= 0, err, TAG, "driver write failed:%d!", (int) - err);
188
189 return err;
190}
191
193{
194 XF_ASSERT(dev, XF_ERR_INVALID_ARG, TAG, "dev must not be NULL");
195
196 xf_err_t err = dev_table[dev->type].driver_ops.close(dev);
197 UNUSED(err);
198 XF_ASSERT(!err, err, TAG, "driver close failed");
199
200#if XF_HAL_LOCK_IS_ENABLE
201 xf_lock_lock(dev_table[dev->type].mutex);
202#endif
203
204 xf_list_del_init(&dev->node);
205 xf_free(dev);
206 dev_table[dev->type].dev_count--;
207
208#if XF_HAL_LOCK_IS_ENABLE
209 xf_lock_unlock(dev_table[dev->type].mutex);
210#endif
211 XF_LOGD(TAG, "close success");
212
213 return XF_OK;
214}
215
217{
218 XF_ASSERT(dev, XF_ERR_INVALID_ARG, TAG, "dev must not be NULL");
220 "Duplicate device registration!");
221
222#if XF_HAL_LOCK_IS_ENABLE
223 xf_lock_lock(dev_table[dev->type].mutex);
224#endif
225
226 xf_list_init(&dev->node);
228
229#if XF_HAL_LOCK_IS_ENABLE
230 xf_lock_unlock(dev_table[dev->type].mutex);
231#endif
232
233 XF_LOGD(TAG, "Device registration successful");
234
235 return XF_OK;
236}
237
239{
240 XF_ASSERT(type < DEV_TABLE_SIZE && type >= 0, NULL, TAG, "type must between 0 and %d", DEV_TABLE_SIZE);
241
242 xf_hal_dev_t *dev = NULL;
243
244#if XF_HAL_LOCK_IS_ENABLE
246#endif
247
248 xf_list_t *dev_list = &dev_table[type].dev_list;
249 xf_list_for_each_entry(dev, dev_list, xf_hal_dev_t, node) {
250 if (dev->id == id) {
251 break;
252 }
253 }
254
255#if XF_HAL_LOCK_IS_ENABLE
257#endif
258
259 if (&dev->node == dev_list) {
260 dev = NULL;
261 }
262
263 return dev;
264}
265
266/* ==================== [Static Functions] ================================== */
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
#define BITS_CHECK(src, bits_mask)
检查变量 var 在 bits_mask 的位置上是否存在 1。
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_ERR_INVALID_ARG
Definition xf_err.h:46
@ XF_ERR_NOT_SUPPORTED
Definition xf_err.h:51
@ XF_OK
Definition xf_err.h:43
static void xf_list_init(xf_list_t *list)
动态初始化链表.
Definition xf_list.h:97
static void xf_list_add_tail(xf_list_t *new_node, xf_list_t *head)
xf_list_add_tail - 在指定节点之前添加一个 new_node.
Definition xf_list.h:168
static void xf_list_del_init(xf_list_t *entry)
xf_list_del_init - 从链表中删除节点, 并重新初始化.
Definition xf_list.h:266
#define xf_list_for_each_entry(pos, head, type, member)
list_for_each_entry - 迭代给定类型的链表。
Definition xf_list.h:732
xf_err_t xf_lock_init(xf_lock_t *p_lock)
初始化锁.
Definition xf_lock.c:48
int xf_lock_unlock(xf_lock_t lock)
解锁.
Definition xf_lock.c:88
int xf_lock_lock(xf_lock_t lock)
锁定直至成功.
Definition xf_lock.c:72
#define xf_free(x)
Definition xf_stdlib.h:39
static xf_osal_mutex_t mutex
Definition xf_main.c:35
xf_err_t(* open)(xf_hal_dev_t *dev)
Definition xf_hal_dev.h:58
int(* read)(xf_hal_dev_t *dev, void *buf, size_t count)
Definition xf_hal_dev.h:60
xf_err_t(* ioctl)(xf_hal_dev_t *dev, uint32_t cmd, void *config)
Definition xf_hal_dev.h:59
xf_err_t(* close)(xf_hal_dev_t *dev)
Definition xf_hal_dev.h:62
int(* write)(xf_hal_dev_t *dev, const void *buf, size_t count)
Definition xf_hal_dev.h:61
xf_list_t node
Definition xf_hal_dev.h:66
uint32_t id
Definition xf_hal_dev.h:68
void * platform_data
Definition xf_hal_dev.h:69
uint32_t type
Definition xf_hal_dev.h:67
xf_list_t dev_list
Definition xf_hal_dev.c:24
uint32_t dev_count
Definition xf_hal_dev.c:26
xf_hal_dev_create_t constructor
Definition xf_hal_dev.c:28
xf_driver_ops_t driver_ops
Definition xf_hal_dev.c:27
双向链表结构体.
Definition xf_list.h:64
xf_err_t xf_hal_driver_close(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:192
int xf_hal_driver_read(xf_hal_dev_t *dev, void *buf, size_t count)
Definition xf_hal_dev.c:168
xf_err_t xf_hal_driver_ioctl(xf_hal_dev_t *dev, uint32_t cmd, void *config)
Definition xf_hal_dev.c:154
static xf_hal_driver_t dev_table[DEV_TABLE_SIZE]
Definition xf_hal_dev.c:38
xf_err_t xf_hal_driver_open(xf_hal_dev_t *dev, xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:118
uint32_t xf_hal_driver_get_enable_count(xf_hal_type_t type)
Definition xf_hal_dev.c:76
int xf_hal_driver_write(xf_hal_dev_t *dev, const void *buf, size_t count)
Definition xf_hal_dev.c:180
xf_err_t xf_hal_device_add(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:216
struct _xf_hal_driver_t xf_hal_driver_t
uint32_t xf_hal_driver_get_flag(xf_hal_type_t type)
Definition xf_hal_dev.c:67
#define DEV_TABLE_SIZE
Definition xf_hal_dev.c:19
xf_hal_dev_t * xf_hal_device_find(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:238
xf_err_t xf_hal_driver_register(xf_hal_type_t type, xf_hal_flag_t flag, xf_hal_dev_create_t constructor, const xf_driver_ops_t *driver_ops)
Definition xf_hal_dev.c:44
#define TAG
Definition xf_hal_dev.c:18
xf_hal_dev_t * xf_hal_driver_create(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:93
xf_hal 设备抽象。
enum _xf_hal_type_t xf_hal_type_t
enum _xf_hal_flag_t xf_hal_flag_t
#define XF_HAL_DEV_CMD_ALL
Definition xf_hal_dev.h:35
xf_hal_dev_t *(* xf_hal_dev_create_t)(uint32_t id)
Definition xf_hal_dev.h:48
@ _XF_HAL_FLAG_NOT_USE
Definition xf_hal_dev.h:51
@ XF_HAL_FLAG_ONLY_WRITE
Definition xf_hal_dev.h:53
@ XF_HAL_FLAG_ONLY_READ
Definition xf_hal_dev.h:52
#define XF_HAL_DEV_CMD_DEFAULT
Definition xf_hal_dev.h:34
#define XF_LOGE(tag, format,...)
#define XF_LOGD(tag, format,...)
#define UNUSED(_x)