设备管理器中基本函数

时间戳,每添加一个设备,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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值