时间戳,每添加一个设备,counter就累加1,值越大就是最晚添加的设备或激活的设备
static u32 __dev_manager_get_time_stamp(void)//获取时间戳
{
u32 counter = __this->counter;
__this->counter ++;
return counter;
}
通过logo,先在dev_reg中查找,查看是否有设备的注册信息
找到后在struct __dev_manager dev_mg;即设备管理器结构体中查找
查找该设备是否已经添加到设备管理器中
不在设备管理器中,则申请内存空间,填写设备信息,添加到设备管理器中的双向链表上
根据挂载标志,判断设备是否需要挂载
挂载:将设备根目录挂到系统目录上,通过系统目录和设备目录组合来访问设备中的文件
int __dev_manager_add(char *logo, u8 need_mount)//添加设备,是否需要挂载
{
if (logo == NULL) {//logo为空指针,返回参数错误
return DEV_MANAGER_ADD_ERR_PARM;//参数错误
}
int i;
printf("%s add start\n", logo);//打印logo
struct __dev_reg *p = NULL;
struct __dev_reg *n;
for(n=(struct __dev_reg *)dev_reg; n->logo != NULL; n++){//扫描整个设备注册信息表
if (!strcmp(n->logo, logo)) {//比对logo,比对一致,p指向该设备,即dev_reg[n]
p = n;
break;
}
}
//p不为NULL,表示找到该设备的注册信息
if (p) {
///挂载文件系统
if (dev_manager_list_check_by_logo(logo)) {//检查设备是不是在双向链表list中
printf("dev online aready, err!!!\n");
return DEV_MANAGER_ADD_IN_LIST_AREADY;//设备已经在list中
}
//设备不在list中
struct __dev *dev = (struct __dev *)zalloc(sizeof(struct __dev));//新建设备节点,申请内存空间
if(dev == NULL){//申请失败
return DEV_MANAGER_ADD_ERR_NOMEM;//无存储空间
}
os_mutex_pend(&__this->mutex, 0);//申请互斥信号量
if(need_mount){//需要挂载
dev->fmnt = mount(p->name, p->storage_path, p->fs_type, 3, NULL);//挂载
}
dev->parm = p;//设备参数就是设备注册信息
dev->valid = (dev->fmnt ? 1 : 0);//1表示有可播放文件,0表示无可播放文件
dev->active_stamp = __dev_manager_get_time_stamp();//timer_get_ms();//获取时间戳
list_add_tail(&dev->entry, &__this->list);//将设备添加到链表尾端
os_mutex_post(&__this->mutex);//释放互斥量
//打印行数命、logo、挂载信息、时间戳
printf("%s, %s add ok, dev->fmnt = %x, %d\n", __FUNCTION__, logo, (int)dev->fmnt, dev->active_stamp);
if(dev->fmnt == NULL){
return DEV_MANAGER_ADD_ERR_MOUNT_FAIL;//挂载失败
}
return DEV_MANAGER_ADD_OK;//设备添加成功
}
printf("dev_manager_add can not find logo %s\n",logo);//找不到该设备
return DEV_MANAGER_ADD_ERR_NOT_FOUND;//未找到
}
从设备管理器上删除一个设备。
删除设备,将logo指定的设备从设备管理器双向链表上删除
释放设备节点空间
static int __dev_manager_del(char *logo)//删除一个设备
{
if (logo == NULL) {
return -1;
}
struct __dev *dev, *n;
os_mutex_pend(&__this->mutex, 0);//申请互斥量
list_for_each_entry_safe(dev, n, &__this->list, entry) {
if (!strcmp(dev->parm->logo, logo)) {//比对相同,表明查找到了
///卸载文件系统
if(dev->fmnt){
unmount(dev->parm->storage_path);
}
list_del(&dev->entry);//删除节点
free(dev);//释放空间
printf("%s, %s del ok\n", __FUNCTION__, logo);
break;
}
}
os_mutex_post(&__this->mutex);//释放互斥量
return 0;
}
//----------------------------------------------------------------------------/
/**@brief 通过设备节点检查设备是否在线
@param dev:设备节点
@return 成功返回设备节点, 失败返回NULL
@note 通过设备节点检查设备是否在设备链表中
/
/----------------------------------------------------------------------------*/
//设备在线条件:设备信息在设备管理器双向链表上、设备挂载
struct __dev *dev_manager_check(struct __dev *dev)//通过设备节点检查设备是否在线
{
if (dev == NULL) {
return NULL;
}
struct __dev *p;
list_for_each_entry(p, &__this->list, entry) {//扫描链表
if(!(p->fmnt)){//如果没挂载,直接判断下一个节点
continue;
}
//如果有设备挂载,判断是否是需要查找的设备
//需判断dev在链表中,因此扫描整个链表
if (dev == p) {
return p;
}
}
return NULL;
}
//----------------------------------------------------------------------------/
/**@brief 通过盘符检查设备是否在线
@param logo:逻辑盘符,如:sd0/sd1/udisk0
@return 成功返回设备节点, 失败返回NULL
@note 通过设备节点检查设备是否在设备链表中
/
/----------------------------------------------------------------------------*/
struct __dev *dev_manager_check_by_logo(char *logo)//通过盘符logo检查设备是否在线
{
if (logo == NULL) {
return NULL;
}
struct __dev *dev;
list_for_each_entry(dev, &__this->list, entry) {//扫描链表
if(!(dev->fmnt)){//如果没挂载,直接判断下一个节点
continue;
}
//如果有设备挂载,判断是否是需要查找的设备的盘符
if (!strcmp(dev->parm->logo, logo)) {
return dev;
}
}
return NULL;
}
//----------------------------------------------------------------------------/
/**@brief 获取当前活动设备节点
@param
valid:
1:有效可播放设备中查找,
0:所有设备,包括有可播放设备及无可播放设备中查找
@return 成功返回设备设备节点,失败返回NULL
@note
/
/----------------------------------------------------------------------------*/
//遍历设备管理器上所有节点
//只处理挂载的设备
//对于挂载设备,判断时间戳,谁的时间戳最大,随就是活动设备
//根据valid标志,细分为:可播放设备中查找还是所有挂载设备中查找
struct __dev *dev_manager_find_active(u8 valid)//获取当前活动设备节点,即查找时间戳最大的设备
{
struct __dev *dev = NULL;
struct __dev *active = NULL;
os_mutex_pend(&__this->mutex, 0);
list_for_each_entry(dev, &__this->list, entry) {
if(!(dev->fmnt)){//设备挂载
continue;
}
if(valid){//可播放设备
if (dev->valid) {//设备是否为可播放设备
if (active) {
if (active->active_stamp < dev->active_stamp) {//时间戳比对大小
active = dev;//大的赋值给active
}
} else {
active = dev;
}
}
}else{//全部设备
if (active) {
if (active->active_stamp < dev->active_stamp) {//时间戳比对大小
active = dev;//大的赋值给active
}
} else {
active = dev;
}
}
}
os_mutex_post(&__this->mutex);
return active;
}