Esempio n. 1
0
//----安装输入设备-------------------------------------------------------------
//功能: 把输入设备登记到资源结点中
//参数: 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;
        }

    }
}
Esempio n. 2
0
// =========================================================================
// 函数功能:在子菜单项中寻找名字为name的子菜单
// 输入参数:pParent:父菜单项,name:子菜单项的名字
// 输出参数:
// 返回值    :找到的子菜单为name的菜单项(NULL没有找到)
// 说明          :
// =========================================================================
struct menu_item* SearchSubMenuitemByName(struct menu_item * pParent, const char * name)
{
   struct menu_item *result=NULL;

   result=(struct menu_item*)Rsc_SearchSon((struct tagRscNode * )pParent, name);//已经做了参数的检查
   return result;
}
Esempio n. 3
0
// =============================================================================
// 功能:将调用者提供的新增器件结点挂接到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;
}
Esempio n. 4
0
// =============================================================================
// 功能:新增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;
}
Esempio n. 5
0
// =============================================================================
// 功能:在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;
}
Esempio n. 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;
}
Esempio n. 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;
}
Esempio n. 8
0
//----设置输入焦点------------------------------------------------------------
//功能: 设置输入设备的输入焦点,即把输入消息(例如键盘击键、鼠标点击)传给谁
//参数: device_name,目标设备的资源名
//      focus_evtt,新的焦点
//返回: true =成功,false=输入设备找不到
//----------------------------------------------------------------------------
bool_t Stddev_SetFocus(char *device_name, tpInputMsgQ FocusMsgQ)
{
    struct tagStdinDeviceRsc *result;

    result =
        (struct tagStdinDeviceRsc *)Rsc_SearchSon
        (&s_ptStdinDeviceRscTree->stdin_device_node,device_name);
    if(result != NULL)
    {
        result->FocusMsgQ = FocusMsgQ;
        return true;
    }
    else
    {
        return false;
    }
}
Esempio n. 9
0
//----卸载输入设备-------------------------------------------------------------
//功能: 把输入设备从资源接点删除,从"input device"资源的子资源中,找到
//      "device_name"资源接点,删除之,并把内存释放到pg_stdin_device_pool
//      内存池中
//参数: device_name,目标设备的资源名
//返回: true = 成功删除,0=失败。
//-----------------------------------------------------------------------------
bool_t Stddev_UnInstallDevice(char *device_name)
{
    struct  tagRscNode *temp;
    struct tagStdinDeviceRsc *djy_stdin;
    djy_stdin = (struct tagStdinDeviceRsc *)Rsc_SearchSon(
                 &s_ptStdinDeviceRscTree->stdin_device_node,device_name);
    if(djy_stdin == NULL)
        return false;

    temp = &djy_stdin->stdin_device_node;
    if(Rsc_DelNode(temp) != NULL)
    {
        Mb_Free(g_ptStdinDevicePool,djy_stdin);
        return true;
    }
    else
        return false;
}
Esempio n. 10
0
// =============================================================================
// 功能:根据总线类型名称查找总线类型节点,返回查找到的结点指针
// 参数:BusTypeName,待查找的总线类型结点名称
// 返回:结点指针,NULL时查找失败
// =============================================================================
struct tagRscNode * DjyBus_BusTypeFind(char * BusTypeName)
{
    return Rsc_SearchSon(&tg_djybus_root,BusTypeName);
}
Esempio n. 11
0
// =============================================================================
// 功能:查找SPI总线类型结点的子结点中是否存被查找名称的总线
// 参数:BusName,查找的总线名称
// 返回:查找的控制块结点指针,未找到时返回NULL
// =============================================================================
struct tagSPI_CB *SPI_BusFind(char *BusName)
{
    return (struct tagSPI_CB*)Rsc_SearchSon(&s_SPIBusType,BusName);
}