296 lines
5.5 KiB
C
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;
|
|
}
|