/****************************************************************************** Copyright @2024 - 2044 Shenzhen dcenzix Technology Ltd. ****************************************************************************** @file cola_device.c @brief 设备节点管理 @author xiexiongwu @version V1.0 @date 2024年5月25日 ******************************************************************************/ /*----------------------------------------------* * 包含头文件 * *----------------------------------------------*/ #include "cola_device.h" #include /*----------------------------------------------* * 全局变量 * *----------------------------------------------*/ /** * \brief 设备挂载列表 */ struct cola_device *device_list = NULL; /*----------------------------------------------* * 函数原型说明 * *----------------------------------------------*/ /** *@brief 设备是否存在 * *@param [in] cola_device_t *dev 设备句柄 *@return bool true:存在;false:不存在 * */ bool cola_device_is_exists(cola_device_t *dev) { cola_device_t *cur = device_list; if(!dev || !dev->name || !strlen(dev->name)) { return false; } while (cur != NULL) { if (strcmp(cur->name, dev->name) == 0) { return true; } cur = cur->next; } return false; } /** *@brief 入设备队列 * *@param [in] cola_device_t *dev 设备句柄 *@return void * */ void device_list_insert(cola_device_t *dev) { cola_device_t *cur = device_list; if (NULL == device_list) { device_list = dev; dev->next = NULL; } else { while (NULL != cur->next) { cur = cur->next; } cur->next = dev; dev->next = NULL; } } /** *@brief 驱动注册 * *@param [in] cola_device_t *dev 设备句柄 *@return void * */ void cola_device_register(cola_device_t *dev) { if ((NULL == dev) || (cola_device_is_exists(dev))) { return; } if ((NULL == dev->name) || (NULL == dev->dops)) { return; } device_list_insert(dev); } /** *@brief 驱动查找 * *@param [in] char *name 设备名称 *@return cola_device_t *dev 设备句柄 * */ cola_device_t *cola_device_find(const char *name) { cola_device_t *cur = device_list; while (cur != NULL) { if (strcmp(cur->name, name) == 0) { return cur; } cur = cur->next; } return NULL; } /** *@brief 硬件抽象初始化接口 * *@param [in] cola_device_t *dev 设备句柄 *@return int open结果 * */ int cola_device_init(cola_device_t *dev) { if (dev) { if (dev->dops->init) { return dev->dops->init(dev); } } return 0; } /** *@brief 硬件抽象打开接口 * *@param [in] cola_device_t *dev 设备句柄 *@param [in] int oflag 打开标志 *@return int open结果 * */ int cola_device_open(cola_device_t *dev, int oflag) { if (dev) { if (dev->dops->open) { return dev->dops->open(dev, oflag); } } return 0; } /** *@brief 硬件抽象关闭接口 * *@param [in] cola_device_t *dev 设备句柄 *@return int close结果 * */ int cola_device_close(cola_device_t *dev) { if (dev) { if (dev->dops->close) { return dev->dops->close(dev); } } return 0; } /** *@brief 硬件抽象数据读取接口 * *@param [in] cola_device_t *dev 设备句柄 *@param [in] int pos 操作类型 *@param [in] void *buffer 数据 *@param [in] int size 数据长度 *@return int 读取长度 * */ int cola_device_read(cola_device_t *dev, int pos, void *buffer, int size) { if (dev) { if (dev->dops->read) { return dev->dops->read(dev, pos, buffer, size); } } return 0; } /** *@brief 硬件抽象数据写入接口 * *@param [in] cola_device_t *dev 设备句柄 *@param [in] int pos 操作类型 *@param [in] void *buffer 数据 *@param [in] int size 数据长度 *@return int 写入长度 * */ int cola_device_write(cola_device_t *dev, int pos, const void *buffer, int size) { if (dev) { if (dev->dops->write) { return dev->dops->write(dev, pos, buffer, size); } } return 0; } /** *@brief 硬件抽象数据控制接口 * *@param [in] cola_device_t *dev 设备句柄 *@param [in] int cmd 命令 *@param [in] void *arg 参数 *@return int 处理结果 * */ int cola_device_ctrl(cola_device_t *dev, int cmd, void *arg) { if (dev) { if (dev->dops->control) { return dev->dops->control(dev, cmd, arg); } } return 0; } /** *@brief 硬件抽象数据配置接口 * *@param [in] cola_device_t *dev 设备句柄 *@param [in] void *args 参数 *@param [in] void *var 变量 *@return int 处理结果 * */ int cola_device_cfg(cola_device_t *dev, void *args, void *var) { if (dev) { if (dev->dops->config) { return dev->dops->config(dev, args, var); } } return 0; } /** *@brief 设置驱动属于哪个任务 * *@param [in] cola_device_t *dev 设备句柄 *@param [in] void *owner 任务 *@return void * */ void cola_device_set_owner(cola_device_t *dev, const void *owner) { dev->owner = (void *)owner; }