示例#1
0
bool_t AddSubMenuitem(struct menu_item * pParent, struct menu_item *pNewmenuitem, bool_t head)
{
    bool_t  result=false;
    struct tagRscNode  *temp_node;

    //check if any sub menuitem named this
    if(NULL!=SearchSubMenuitemByName(pParent,pNewmenuitem->name))
    {
        printf("There has been a sub menuitem named this!\n");
        return result;
    }
    if (head)
    {
        temp_node= Rsc_AddHeadSon((struct tagRscNode *)pParent, (struct tagRscNode *)pNewmenuitem, \
            sizeof(struct menu_item),RSCTYPE_USER,pNewmenuitem->name);
    }
    else
    {
        temp_node= Rsc_AddSon((struct tagRscNode *)pParent, (struct tagRscNode *)pNewmenuitem, \
            sizeof(struct menu_item),RSCTYPE_USER,pNewmenuitem->name);
    }

    if(temp_node!=NULL)
        result=true;
    return  result;
}
示例#2
0
文件: stddev.c 项目: Mars-Wu/djyos
//----安装输入设备-------------------------------------------------------------
//功能: 把输入设备登记到资源结点中
//参数: device_name,目标设备的资源名
//返回: 输入设备ID,-1表示失败
//-----------------------------------------------------------------------------
s32 Stddev_InstallDevice(char *device_name,enum _STDIN_INPUT_TYPE_ stdin_type,
                         void *myprivate)
{
    struct tagStdinDeviceRsc *djy_stdin;

    if(Rsc_SearchSon(&s_ptStdinDeviceRscTree->stdin_device_node,device_name))
    {
        return -1;
    }
    else
    {
        djy_stdin = Mb_Malloc(g_ptStdinDevicePool,0);
        if(djy_stdin != NULL)
        {
            Rsc_AddSon(&s_ptStdinDeviceRscTree->stdin_device_node,
                    &djy_stdin->stdin_device_node,sizeof(struct tagStdinDeviceRsc),
                    RSC_STDIN_OUT,device_name);
            djy_stdin->input_type = stdin_type;
            djy_stdin->stdin_private = (ptu32_t)myprivate;
            djy_stdin->input_counter = 0;
            djy_stdin->FocusMsgQ = tg_pDefaultFocusMsgQ;
            g_s32NextId += 1;
            djy_stdin->device_id = g_s32NextId;
            return djy_stdin->device_id;
        }
        else
        {
            Djy_SaveLastError(EN_MEM_TRIED);
            printf("内存不足\n\r");
            return -1;
        }

    }
}
示例#3
0
文件: spibus.c 项目: Mars-Wu/djyos
// =============================================================================
// 功能:将调用者提供的新增器件结点挂接到SPI总线结点上,并初始化器件所对应的参数配置寄
//       存器,调用者提供tagSPI_Device控制块
// 参数:BusName,新增子器件挂接的总线名称
//       DevName,器件名称
//       cs,该器件所属的片选序号
//       charlen,器件的字符长度,比特位数
//       mode,配置从器件模式,CHPA和CPOL组合成成的模式
//       freq,SPI总线的时钟频率,单位Hz
//       NewDev,新增器件指针
//       autocs,新增加设备是否自动片选
// 返回:控制块结点指针,添加失败时返回NULL
// =============================================================================
struct tagSPI_Device *SPI_DevAdd_s(char *BusName, char *DevName,
                                struct tagSPI_Device *NewDev)
{
    struct tagSPI_CB *SPI;
    tagSpiConfig spicfg;
    //查询是否该总线存在
    SPI = SPI_BusFind(BusName);
    if((NULL == SPI) || (NULL == NewDev))
        return NULL;

    //避免建立同名的SPI器件
    if(NULL != Rsc_SearchSon(&SPI->SPI_BusNode,DevName))
        return NULL;

    Rsc_AddSon(&SPI->SPI_BusNode,&NewDev->DevNode,
                sizeof(struct tagSPI_Device),RSC_SPI_DEVICE,DevName);

    spicfg.CharLen = NewDev->CharLen;
    spicfg.Mode    = NewDev->Mode;
    spicfg.Freq    = NewDev->Freq;
    spicfg.ShiftDir= NewDev->ShiftDir;

    if(true == SPI->MultiCsReg)
    {
        SPI_BusCtrl(NewDev,CN_SPI_CS_CONFIG,(ptu32_t)NewDev->Cs,(ptu32_t)&spicfg);
    }

    printk("SPI Device %s Added Succeeded!\r\n",DevName);
    return (struct tagSPI_Device *)&NewDev->DevNode;
}
示例#4
0
文件: spibus.c 项目: Mars-Wu/djyos
// =============================================================================
// 功能:新增SPI总线结点到SPI总线类型结点,并初始化tagSPI_CB控制块结构体
// 参数:NewSPIParam,新增总线参数,参数说明详细请参照tagSPI_Param结构体
// 返回:返回建立的资源结点指针,失败时返回NULL
// =============================================================================
struct tagSPI_CB *SPI_BusAdd(struct tagSPI_Param *NewSPIParam)
{
    struct tagSPI_CB *NewSPI;
    if(NULL == NewSPIParam)
        goto exit_from_param;

    //避免重复建立同名的SPI总线
    if(NULL != Rsc_SearchSon(&s_SPIBusType,NewSPIParam->BusName))
        goto exit_from_readd;

    NewSPI = (struct tagSPI_CB *)M_Malloc(sizeof(struct tagSPI_CB),0);
    if(NewSPI == NULL)
        goto exit_from_malloc;

    //将总线结点挂接到总线类型结点的子结点
    Rsc_AddSon(&s_SPIBusType,&NewSPI->SPI_BusNode,
                sizeof(struct tagSPI_CB),RSC_SPIBUS,NewSPIParam->BusName);
    if(&NewSPI->SPI_BusNode == NULL)
        goto exit_from_add_node;

    //创建总线信号量和阻塞信号量
    NewSPI->SPI_BusSemp= Lock_SempCreate(1,1,CN_SEMP_BLOCK_FIFO,"spi bus semp");
    if(NewSPI->SPI_BusSemp== NULL)
        goto exit_from_spi_bus_semp;
    NewSPI->SPI_BlockSemp = Lock_SempCreate(1,0,CN_SEMP_BLOCK_FIFO,"spi block semp");
    if(NewSPI->SPI_BlockSemp== NULL)
        goto exit_from_spi_buf_semp;

    //tagSPI_CB控制块初始化
    NewSPI->SpecificFlag      = NewSPIParam->SpecificFlag;
    NewSPI->pTransferTxRx     = NewSPIParam->pTransferTxRx;
    NewSPI->pCsActive         = NewSPIParam->pCsActive;
    NewSPI->pCsInActive       = NewSPIParam->pCsInActive;
    NewSPI->pBusCtrl          = NewSPIParam->pBusCtrl;
    NewSPI->pTransferPoll     = NewSPIParam->pTransferPoll;

    //缓冲区初始化
    NewSPI->SPI_Buf.pBuf     = NewSPIParam->SPIBuf;
    NewSPI->SPI_Buf.MaxLen   = NewSPIParam->SPIBufLen;
    NewSPI->SPI_Buf.Offset   = 0;

    printk("%s Added Succeeded!\r\n",NewSPIParam->BusName);
    return NewSPI;

exit_from_spi_buf_semp:
    Lock_SempDelete(NewSPI->SPI_BusSemp);
exit_from_spi_bus_semp:
    Rsc_DelNode(&NewSPI->SPI_BusNode);
exit_from_add_node:
    free(NewSPI);
exit_from_malloc:
exit_from_readd:
exit_from_param:
    return NULL;
}
示例#5
0
文件: spibus.c 项目: Mars-Wu/djyos
// =============================================================================
// 功能:在SPI总线结点上增加器件,即总线上挂接的器件,并初始化器件所对应的参数配置寄
//       存器,该器件属于总线结点的子结点
// 参数:BusName,新增子器件挂接的总线名称
//       DevName,器件名称
//       cs,该器件所属的片选序号
//       charlen,器件的字符长度,比特位数
//       mode,配置从器件模式,CHPA和CPOL组合成成的模式
//       freq,SPI总线的时钟频率,单位Hz
//       autocs,新增加设备是否自动片选
// 返回:控制块结点指针,添加失败时返回NULL
// =============================================================================
struct tagSPI_Device *SPI_DevAdd(char *BusName ,char *DevName,u8 cs,u8 charlen,
                                u8 mode,u8 shiftdir,u32 freq,u8 autocs)
{
    struct tagSPI_CB      *SPI;
    struct tagSPI_Device *NewDev;
    tagSpiConfig spicfg;

    //查询是否该总线存在
    SPI = SPI_BusFind(BusName);
    if(NULL == SPI)
        return NULL;

    //避免建立同名的SPI器件
    if(NULL != Rsc_SearchSon(&SPI->SPI_BusNode,DevName))
        return NULL;

    //为新的器件结点动态分配内存
    NewDev = (struct tagSPI_Device *)M_Malloc(sizeof(struct tagSPI_Device),0);
    if(NULL == NewDev)
        return NULL;

    //为新结点初始化
    NewDev->Cs  = cs;
    Rsc_AddSon(&SPI->SPI_BusNode,&NewDev->DevNode,
                sizeof(struct tagSPI_Device),RSC_SPI_DEVICE,DevName);
    if(NULL == &NewDev->DevNode)
    {
        free(NewDev);
        return NULL;
    }

    NewDev->CharLen    = charlen;
    NewDev->Cs         = cs;
    NewDev->AutoCs     = autocs;
    NewDev->Mode       = mode;
    NewDev->Freq       = freq;
    NewDev->ShiftDir   = shiftdir;

    spicfg.CharLen = charlen;
    spicfg.Mode    = mode;
    spicfg.Freq    = freq;
    spicfg.ShiftDir= shiftdir;

    //如果SPI控制器有多套CS寄存器,则配置它,否则不作配置
    if(true == SPI->MultiCsReg)
    {
        SPI_BusCtrl(NewDev,CN_SPI_CS_CONFIG,(ptu32_t)cs,(ptu32_t)&spicfg);
    }

    printk("SPI Device %s Added Succeeded!\r\n",DevName);
    return NewDev;
}
示例#6
0
// =============================================================================
// 功能:在DjyBus总线树结点上增加新的总线类型结点,新增总线类型结点是DjyBus的子结点,
//       该函数带r,表示由调用者提供内存,即NewBusType由用户定义
// 参数:NewBusTypeName,创建总线类型名称
//       NewBusType,创建总线类型结点,用记定义
// 返回:返回建立的资源结点指针,失败时返回NULL
// =============================================================================
struct tagRscNode * DjyBus_BusTypeAdd_s(char* NewBusTypeName,
                                      struct tagRscNode * NewBusType)
{
    if((NewBusType == NULL) && (NewBusTypeName == NULL))
        return NULL;

    //避免重复创建同名的总线类型
    if(NULL != Rsc_SearchSon(&tg_djybus_root,NewBusTypeName))
        return NULL;

    Rsc_AddSon(&tg_djybus_root,NewBusType,
                sizeof(struct tagRscNode),RSC_RSCNODE,NewBusTypeName);

    return NewBusType;
}
示例#7
0
// =============================================================================
// 功能:在DjyBus总线树结点上增加新的总线类型结点,新增总线类型结点是DjyBus的子结点,
//       使用内存池分配的方式分配内存
// 参数:NewBusTypeName,总线类型名称
// 返回:返回建立的资源结点指针,失败时返回NULL
// =============================================================================
struct tagRscNode * DjyBus_BusTypeAdd (char* NewBusTypeName)
{
    struct tagRscNode * NewBusType;

    NewBusType = (struct tagRscNode *)M_Malloc(sizeof(struct tagRscNode),0);
    if(NewBusType == NULL)
        return NULL;

    //避免重复创建同名的总线类型
    if(NULL != Rsc_SearchSon(&tg_djybus_root,NewBusTypeName))
        return NULL;

    Rsc_AddSon(&tg_djybus_root,NewBusType,
                sizeof(struct tagRscNode),RSC_RSCNODE,NewBusTypeName);

    return NewBusType;
}
示例#8
0
文件: tpl.c 项目: Mars-Wu/djyos
// =============================================================================
// 函数功能:TransProto_GetTypeNode
//          根据指定的family和type找到指定的type资源节点
// 输入参数:family(域,AF_INET等)
//          type,(类型,SOCK_DGRAM等)
//          create,true则找不到对应的节点就建立,否则不建立
// 输出参数:无
// 返回值  :返回找到的或者建立的type节点,如果不存在
// 说明    :如果没有对应的FAMILY和TYPE则会创建对应的FAMILY或者TYPE
// =============================================================================
tagNetRscNode *__TPL_GetTypeNode(int family, int type, bool_t needcreate)
{
	bool_t  findit;
	tagNetRscNode *result;
	tagNetRscNode *temp;
	tagNetRscNode *headson;
	
	if(NULL != pgNetRscNodeTree)
	{
		findit = false;
		//先找family
		headson = (tagNetRscNode *)Rsc_GetSon(pgNetRscNodeTree);
		if(NULL == headson) //没有需要建立
		{
			findit = false;
		}
		else
		{
			temp = headson;
			do{
				if(temp->number == family)
				{
					findit = true;
					result = temp;
					temp = headson;
				}
				else
				{
					temp = (tagNetRscNode *)Rsc_GetNext(&temp->node);
				}
			}while(headson != temp);
		}
		if(true == findit)  
		{
			//找到了family节点,则在该family节点上查找type节点
			findit = false;
			headson = (tagNetRscNode *)Rsc_GetSon(&result->node);
			if(NULL == headson)
			{
				findit = false;
			}
			else
			{
				temp = headson;
				do{
					if(type == temp->number)
					{
						result = temp;
						findit = true;
						temp = headson;
					}
					else
					{
						temp = (tagNetRscNode *)Rsc_GetNext(&temp->node);
					}
					
				}while(temp != headson);
			}
			if(true != findit)//没有找到type节点
			{
				if(true == needcreate)
				{
					temp = result;
					result = M_Malloc(sizeof(tagNetRscNode), CN_TIMEOUT_FOREVER);
					if(NULL != result)
					{
						result->number = type;
						Rsc_AddSon(&temp->node, &result->node,\
								    sizeof(tagNetRscNode),RSC_RSCNODE,NULL);
					}
				}
				else
				{
					result = NULL;
				}
			}
		}
		else 
		{
			//没有找到family节点,看是否需要建立
			if(true == needcreate)
			{
				result = M_Malloc(sizeof(tagNetRscNode), CN_TIMEOUT_FOREVER);
				if(result != NULL)
				{
					result->number = family;
					Rsc_AddSon(pgNetRscNodeTree, &result->node, \
							sizeof(tagNetRscNode),RSC_RSCNODE,NULL);
					//建立对应的type节点
					temp = result;
					result = M_Malloc(sizeof(tagNetRscNode), CN_TIMEOUT_FOREVER);
					if(NULL != result)
					{
						result->number = type;
						Rsc_AddSon(&temp->node, &result->node, \
								sizeof(tagNetRscNode),RSC_RSCNODE,NULL);
					}
				}
			}
			else
			{
				result = NULL;
			}
		}	
	}
	return result;
}
示例#9
0
文件: tpl.c 项目: Mars-Wu/djyos
// =============================================================================
// 函数功能:TPL_RegisterProto
//          添加一个具体的传输层协议
// 输入参数:family(域,AF_INET等)
//          type,(类型,SOCK_DGRAM等)
//          protocal,(协议号)
//          proto,具体的传输层协议
// 输出参数:
// 返回值  :注册成功的资源树节点,NULL表示注册不成功(空间不足)
// 说明    :如果没有对应的FAMILY和TYPE则会创建对应的FAMILY或者TYPE
// =============================================================================
tagTplProtoRscNode* TPL_RegisterProto(int family, int type, int protocal,\
		                           tagTlayerProto *proto)
{
	tagTplProtoRscNode *result = NULL;
	tagNetRscNode *typenode = NULL;
	tagTplProtoRscNode *headson = NULL;
	tagTplProtoRscNode *temp = NULL;

	if((NULL != proto)&&(NULL != pgNetRscNodeTree))
	{
		if(true == Lock_MutexPend(pgNetRscNodeSync, CN_TIMEOUT_FOREVER))
		{
			typenode = __TPL_GetTypeNode(family, type, true);
			if(NULL != typenode) //找到或者创建成功了
			{
				headson = (tagTplProtoRscNode *)Rsc_GetSon(&typenode->node);
				if(NULL == headson)
				{
					//现在的type下还没有节点,则完全可以建立新的
					result = M_Malloc(sizeof(tagTplProtoRscNode), CN_TIMEOUT_FOREVER);
					if(NULL != result)
					{
						result->protocal = protocal;
						result->proto = *proto;
						Rsc_AddSon(&typenode->node, &result->node,\
								sizeof(tagTplProtoRscNode),RSC_RSCNODE,NULL);
					}
				}
				else
				{
					//看看是否有重复的,有重复的不必再添加,否则要添加
					temp = headson;
				    do{
				    	if(temp->protocal == protocal)
				    	{
				    		result = temp;
				    		temp = headson;
				    	}
				    	else
				    	{
				    		temp = (tagTplProtoRscNode *)Rsc_GetNext(&temp->node);
				    	}
				    }while(temp != headson);
				    if(result != NULL) //已经有存在的
				    {
				    	result = NULL;
				    }
				    else
				    {
						//没有protocal的节点,建立
						result = M_Malloc(sizeof(tagTplProtoRscNode), CN_TIMEOUT_FOREVER);
						if(NULL != result)
						{
							result->protocal = protocal;
							result->proto = *proto;
							Rsc_AddSon(&typenode->node, &result->node,\
									sizeof(tagTplProtoRscNode),RSC_RSCNODE,NULL);
						}
				    }
				}
			}
			Lock_MutexPost(pgNetRscNodeSync);
		}	
	}
	return result;
}