杰里,dev_manager详解,源码讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

///设备注册信息
struct__dev_reg{
char*logo;//设备选择使用的逻辑盘符
char*name;//设备名称,底层匹配设备节点使用
char*storage_path;//设备路径,文件系统mount时使用
char*root_path;//设备文件系统根目录
char*fs_type;//文件系统类型,如:fat,sdfile
};
struct__dev_reg用来注册设备,提供设备相关信息。

const struct__dev_reg dev_reg[];//设备注册信息表
在注册表中填写所有需要注册的设备信息。

设备管理器用于管理所有设备。

采用双向环形链表管理。

设备节点信息,该节点信息是挂在设备管理器双向链表上。

每个设备的参数信息就是设备注册信息。

设备管理器通过时间戳来判断当前激活的设备。

设备添加函数:
再判断是否已经加到设备管理器的双向链表上;
没添加则申请节点添加;
然后再判断是否需要挂载;
最后填充设备节点信息。

指定logo来删除设备:
对于已经挂载的设备,需要先卸载,然后释放节点空间。

//*----------------------------------------------------------------------------*/ /**@brief获取上一个设备节点
@param
dev:当前设备节点
valid:
1:有效可播放设备中查找,
0:所有设备,包括有可播放设备及无可播放设备中查找
@return成功返回设备设备节点,失败返回NULL
@note根据当前设置的参数设备节点,找链表中的上一个设备
*/
/*----------------------------------------------------------------------------*/ struct__dev*dev_manager_find_prev(struct__dev*dev,u8valid)//获取上一个设备节点{
if(dev==NULL){
return NULL;
}
struct__dev*p=NULL;
os_mutex_pend(&__this->mutex,0);
if(dev_manager_check(dev)==NULL){//检查设备是否在线
///传入的参数无效,返回活动设备
os_mutex_post(&__this->mutex);
return dev_manager_find_active(valid);//返回活动设备
}
list_for_each_entry(p,&dev->entry,entry){
if((void*)p==(void*)(&__this->list)){
continue;
}
if(!(p->fmnt)){
continue;
}
if(valid){
if(p->valid){
os_mutex_post(&__this->mutex);
return p;
}
}else{
os_mutex_post(&__this->mutex);
return p;
}
}
os_mutex_post(&__this->mutex);
return NULL;
}
//*----------------------------------------------------------------------------*/ /**@brief获取下一个设备节点
@param
dev:当前设备节点
valid:
1:有效可播放设备中查找,
0:所有设备,包括有可播放设备及无可播放设备中查找
@return成功返回设备设备节点,失败返回NULL
@note根据当前设置的参数设备节点,找链表中的下一个设备
*/
/*----------------------------------------------------------------------------*/ struct__dev*dev_manager_find_next(struct__dev*dev,u8valid)//获取下一个设备节点{
if(dev==NULL){
return NULL;
}
struct__dev*p=NULL;
os_mutex_pend(&__this->mutex,0);
if(dev_manager_check(dev)==NULL){
///传入的参数无效,返回活动设备
os_mutex_post(&__this->mutex);
return dev_manager_find_active(valid);
}
list_for_each_entry_reverse(p,&dev->entry,entry){//反向搜索
if((void*)p==(void*)(&__this->list)){
continue;
}
if(!(p->fmnt)){
continue;
}
if(valid){
if(p->valid){
os_mutex_post(&__this->mutex);
return p;
}
}else{
os_mutex_post(&__this->mutex);
return p;
}
}
os_mutex_post(&__this->mutex);
return NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief获取当前活动设备节点
@param
valid:
1:有效可播放设备中查找,
0:所有设备,包括有可播放设备及无可播放设备中查找
@return成功返回设备设备节点,失败返回NULL
@note
*/
/*----------------------------------------------------------------------------*/
//遍历设备管理器上所有节点
//只处理挂载的设备
//对于挂载设备,判断时间戳,谁的时间戳最大,随就是活动设备
//根据valid标志,细分为:可播放设备中查找还是所有挂载设备中查找
struct__dev*dev_manager_find_active(u8valid)//获取当前活动设备节点,即查找时间戳最大的设备{
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;
}。

相关文档
最新文档