2025-05-21 11:31:07 +08:00

296 lines
5.5 KiB
C

/******************************************************************************
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 <string.h>
/*----------------------------------------------*
* 全局变量 *
*----------------------------------------------*/
/**
* \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;
}