设备驱动API

概述

YoC提供了一套简单设备模型框架,用来统一管理设备驱动的核心接口,包括设备的注册,注销,操作等,它位于硬件和应用程序之间,共分成三层,从上到下分别是 设备管理层设备驱动框架层设备驱动层

  • 设备管理层

实现了对设备驱动程序的封装。应用程序通过管理层的标准接口访问底层设备,设备驱动程序的更改不会对上层应用代码产生影响。从而降低了代码的耦合性、复杂性,提高了系统的可靠性。

  • 设备驱动框架层

同类硬件设备驱动的抽象,将同类硬件设备驱动中相同的部分抽象出来,留出不同部分的接口,由驱动程序实现。

  • 设备驱动层

一组驱使硬件设备工作的程序,实现提供注册及访问硬件设备的功能。

  • 使用方式

设备驱动根据设备模型定义,创建出具备硬件访问能力的设备实例,将该设备通过 driver_register() 接口注册到 设备管理器中。应用程序通过 device_find() 接口查找到设备,然后使用设备管理层接口来访问硬件。

接口定义

注册设备驱动

int driver_register(driver_t *drv, void *config, int idx);

注册设备驱动。

  • 设备驱动结构体 ```C typedef struct _driver_obj driver_t;

struct _driver_obj { slist_t node; char name; char type; int16_t ref; int16_t device_id;

aos_dev_t * (*init)(driver_t *drv, void *config, int id);
void    (*uninit)(aos_dev_t *dev);
int     (*lpm)(aos_dev_t *dev, int state);
int     (*open)(aos_dev_t *dev);
int     (*close)(aos_dev_t *dev);

};


* 参数
  * drv:设备驱动结构体指针
  * config:设备配置结构体指针
  * idx:设备ID

* 返回值
  * 0:注册成功
  * -1:注册失败

### 注销设备驱动

```C
int driver_unregister(const char *name);

注销设备驱动。

  • 参数

    • name:设备名字
  • 返回值

    • 0:注销成功
    • -1:注销失败

设备查找

aos_dev_t *device_find(const char *name, int id);

查找设备。

  • 参数

    • name:设备名字
    • id:设备ID
  • 返回值

    • NULL:查找失败
    • 非NULL:查找成功,返回设备对象指针

分配设备新节点

aos_dev_t *device_new(driver_t *drv, int size, int id);

为设备分配新节点。

  • 参数

    • drv:设备名字
    • size:设备大小
    • id:设备ID
  • 返回值

    • NULL:分配失败
    • 非NULL:分配成功,返回设备对象指针

释放设备节点

void device_free(aos_dev_t *dev);

释放设备节点。

  • 参数
    • dev:设备结构体指针
  • 返回值

锁住设备

int device_lock(aos_dev_t *dev);

锁住设备防止其他对象对该设备访问。

  • 参数
    • dev:设备结构体指针
  • 返回值
    • 返回0成功

释放设备

int device_unlock(aos_dev_t *dev);

释放设备允许其他对象对该设备访问。

  • 参数
    • dev:设备结构体指针
  • 返回值
    • 返回0成功

判断设备名是否有效

int device_valid(aos_dev_t *dev, const char *name);

判断设备名是否有效。

  • 参数

    • dev:设备结构体指针
    • name:设备名字
  • 返回值

    • 0:设备名字有效
    • 非0:设备名字无效

获取设备 ID

int device_tags(aos_dev_t *dev);

返回设备ID。

  • 参数

    • dev:设备结构体指针
  • 返回值

    • 大于等于0:设备ID
    • 其他值:获取失败

设备进入或离开lpm

int device_lpm(aos_dev_t *dev, int pm_state);

设备进入或离开lpm。

  • 参数

    • dev:设备结构体指针
    • pm_state:1表示进入lpm;0表示离开lpm。
  • 返回值

    • 0:成功
    • 其他值:失败

打开设备

aos_dev_t *device_open(const char *name);

返回设备驱动对象。

  • 参数
    • name:设备名字
  • 返回值
    • NULL:打开设备失败
    • 非NULL:打开设备成功,返回设备驱动对象指针

打开指定ID的设备

aos_dev_t *device_open_id(const char *name, int id);

返回设备驱动对象。

  • 参数
    • name:设备名字
    • id:设备ID
  • 返回值
    • NULL:打开设备失败
    • 非NULL:打开设备成功,返回设备驱动对象指针

关闭设备

int *device_close(const char *name);

关闭设备。

  • 参数
    • name:设备名字
  • 返回值
    • 0:关闭设备成功
    • 非0:关闭设备失败

接口实例

//simulate 实现
static sensor_driver_t sensor_driver = {
    .drv = {
        .name   = "simulate",
        .type   = "sensor",
        .init   = yoc_sensor_simu_init,
        .uninit = yoc_sensor_simu_uninit,
        .lpm    = yoc_sensor_simu_lpm,
        .open   = yoc_sensor_simu_open,
        .close  = yoc_sensor_simu_close,
    },
    .fetch      = yoc_sensor_simu_fetch,
    .getvalue   = yoc_sensor_simu_get,
};
//simulate 注册接口
void sensor_simulate_register(void *config, int idx)
{
    driver_register(&sensor_driver.drv, config, idx);
}
//外部注册并使用simulate设备
static void test_sensor_api(void)
{
    dev_t *sensor;
    sensor_simulate_t sv;
    int ret;

    sensor_simulate_register(NULL, 0);

    sensor = sensor_open_id("simulate", 0);    //打开“simulate0”设备
    YUNIT_ASSERT(sensor != NULL);

    ret = sensor_fetch(sensor);
    YUNIT_ASSERT(ret == 0);

    ret = sensor_getvalue(sensor, (void *)&sv, sizeof(sensor_simulate_t));
    YUNIT_ASSERT(ret == 0);

    sensor_close(sensor);                      //关闭“simulate0”设备
}

results matching ""

    No results matching ""