120 lines
3.3 KiB
C
120 lines
3.3 KiB
C
|
|
#ifndef _HUGEIC_DEV_H_
|
|||
|
|
#define _HUGEIC_DEV_H_
|
|||
|
|
#include "osal/atomic.h"
|
|||
|
|
|
|||
|
|
#ifdef __cplusplus
|
|||
|
|
extern "C" {
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
struct dev_obj;
|
|||
|
|
|
|||
|
|
struct devobj_ops{
|
|||
|
|
#ifdef CONFIG_SLEEP
|
|||
|
|
int32 (*suspend)(struct dev_obj *obj);
|
|||
|
|
int32 (*resume)(struct dev_obj *obj);
|
|||
|
|
#endif
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#ifndef OS_BLKLIST
|
|||
|
|
#define OS_BLKLIST
|
|||
|
|
struct os_blklist{
|
|||
|
|
void *hdl;
|
|||
|
|
};
|
|||
|
|
typedef struct os_blklist os_blklist_t;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
struct dev_obj{
|
|||
|
|
uint16 dev_id;
|
|||
|
|
uint8 busy; /* device 被使用状态,由驱动代码设置。
|
|||
|
|
有8bit可用,驱动代码根据 read/write/... 设置不同的bit位 */
|
|||
|
|
uint8 suspend: 1, /* device进入suspend状态,由dev_suspend API设置 */
|
|||
|
|
hotplug: 1, /* 热插拔设备 */
|
|||
|
|
rev: 6;
|
|||
|
|
atomic8_t ref;
|
|||
|
|
struct dev_obj *next;
|
|||
|
|
#ifdef CONFIG_SLEEP
|
|||
|
|
struct os_blklist blklist;
|
|||
|
|
#endif
|
|||
|
|
const struct devobj_ops *ops;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/*热插拔设备*/
|
|||
|
|
struct dev_hotplug_obj{
|
|||
|
|
struct dev_hotplug_obj *next;
|
|||
|
|
void *hdl;
|
|||
|
|
uint16 dev_id; //设备ID -> see devid.h
|
|||
|
|
uint16 dev_type; //热插拔设备类型
|
|||
|
|
void *info; //设备信息
|
|||
|
|
};
|
|||
|
|
typedef int32 (*dev_hotplug_walkcb)(const struct dev_hotplug_obj *dev);
|
|||
|
|
int32 dev_hotplug_in(void *hdl, uint16 dev_id, uint16 dev_type, void *info);
|
|||
|
|
int32 dev_hotplug_out(void *hdl);
|
|||
|
|
int32 dev_hotplug_walk(uint16 type, dev_hotplug_walkcb cb);
|
|||
|
|
|
|||
|
|
#define DEV_BUSY(dev, val, set) dev_busy((struct dev_obj *)(dev), val, set)
|
|||
|
|
#define DEV_SUSPENDED(dev, suspend) dev_suspended((struct dev_obj *)(dev), suspend)
|
|||
|
|
#define HALDEV_SUSPENDED(dev) if(dev_suspended((struct dev_obj *)dev, 1)) return RET_ERR
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* dev core module initialize
|
|||
|
|
* @return return RET_OK if initialize sucess, else return RET_ERR.
|
|||
|
|
**/
|
|||
|
|
extern int32 dev_init(void);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* get dev by dev_id
|
|||
|
|
* @param[in] dev_id device id
|
|||
|
|
* @return return device object if device exist, else return NULL.
|
|||
|
|
**/
|
|||
|
|
extern struct dev_obj *dev_get(uint16 dev_id);
|
|||
|
|
|
|||
|
|
#define DEV_PUT(dev) dev_put((struct dev_obj *)(dev))
|
|||
|
|
extern void dev_put(struct dev_obj *dev);
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* set or clear device busy flag.
|
|||
|
|
*/
|
|||
|
|
extern void dev_busy(struct dev_obj *dev, uint8 busy, uint8 set);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* register device into dev manager.
|
|||
|
|
* @param[in] dev_id device id.
|
|||
|
|
* @param[in] device object to register.
|
|||
|
|
* @return return RET_OK if register sucess, else return RET_ERR.
|
|||
|
|
**/
|
|||
|
|
extern int32 dev_register(uint16 dev_id, struct dev_obj *device);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* unregister device into dev manager.
|
|||
|
|
* @param[in] device object to unregister.
|
|||
|
|
* @return return RET_OK if register sucess, else return RET_ERR.
|
|||
|
|
**/
|
|||
|
|
extern int32 dev_unregister(struct dev_obj *device);
|
|||
|
|
|
|||
|
|
/* 检查指定的device是否已经被suspend,
|
|||
|
|
参数suspend:表示如果device已经被suspend,是否suspend当前task
|
|||
|
|
*/
|
|||
|
|
int32 dev_suspended(struct dev_obj *dev, uint8 suspend);
|
|||
|
|
/**
|
|||
|
|
* device suspend when system enter sleep.
|
|||
|
|
* @param[in] dsleep sleep or deep sleep.
|
|||
|
|
* @return return RET_OK if unregister sucess, else return RET_ERR.
|
|||
|
|
**/
|
|||
|
|
extern int32 dev_suspend(uint16 type);
|
|||
|
|
extern int32 dev_suspend_hook(struct dev_obj *dev, uint16 type);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* device resume when system resume.
|
|||
|
|
* @return return RET_OK if unregister sucess, else return RET_ERR.
|
|||
|
|
**/
|
|||
|
|
extern int32 dev_resume(uint16 type, uint32 wkreason);
|
|||
|
|
extern int32 dev_resume_hook(struct dev_obj *dev, uint16 type, uint32 wkreason);
|
|||
|
|
|
|||
|
|
extern int32 pin_func(uint16 dev_id, int32 request);
|
|||
|
|
|
|||
|
|
#ifdef __cplusplus
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#endif
|