296 lines
5.5 KiB
C
Raw Permalink Normal View History

2025-05-21 11:31:07 +08:00
/******************************************************************************
Copyright @2024 - 2044 Shenzhen dcenzix Technology Ltd.
******************************************************************************
@file cola_device.c
@brief
@author xiexiongwu
@version V1.0
@date 2024525
******************************************************************************/
/*----------------------------------------------*
* *
*----------------------------------------------*/
#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;
}