⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.c

📁 新一代基于事件的嵌入式操作系统dyos在三星的s3c44b0的arm芯片上的完整移植代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        handle->owner = pg_event_running;
        handle->iam = enum_iam_right;              //我是左手接口句柄
        if(pg_event_running->held_device == NULL)  //事件还没有打开过设备
        {
            handle->next = handle;      //句柄指针自成双向循环链表
            handle->previous = handle;
            pg_event_running->held_device = handle; //事件指针指向设备链表
        }else                                       //事件已经有打开的设备
        {
            //以下把新设备插入到事件打开的设备队列头部
            handle->next = pg_event_running->held_device;
            handle->previous = pg_event_running->held_device->previous;
            pg_event_running->held_device->previous->next = handle;
            pg_event_running->held_device->previous = handle;
        }
        result =  handle;
        }else
        {
            semp_post(pan->right_semp);
            result =  NULL;
        }
end_of_dev_open_right_scion:
    mutex_post(&tg_dev_mutex);
    return result;
}

//----快速打开设备右手接口-----------------------------------------------------
//功能: 按快速打开设备右手接口,只适用于曾经打开且一直没有被删除的设备,因为不用
//      按设备名查找设备,速度很快
//参数: handle,待打开的设备句柄,实际上存的是泛设备指针,
//      timeout,超时设置,单位是毫秒,cn_timeout_forever=无限等待,0则立即按
//      超时返回。非0值将被向上调整为cn_tick_ms的整数倍
//返回: 成功打开设备则返回true,否则返回flase.
//备注: 如果有多个用户共享本设备,为了充分共享,每次使用完毕后应该关闭设备,当需要
//      再次用同一句柄打开时,可以使用本函数.
//-----------------------------------------------------------------------------
bool_t dev_open_right_again(struct  dev_handle *handle,uint32_t timeout)
{
    struct  pan_device     *pan;
    bool_t result;
    if (handle == NULL) //句柄空
        return false;
    if( ! mutex_pend(&tg_dev_mutex,timeout))    //这是保护设备树的互斥量
        return false;

    pan = (struct  pan_device *)handle;    //句柄里存的实际是泛设备指针
    if(semp_pend(pan->right_semp,timeout)==false)//获取信号量
    {
        result = false;
        goto end_of_dev_open_right_again;
    }
    handle = mb_malloc(pg_device_handle_pool,0);  //分配泛设备句柄控制块
    if(handle == NULL)
    {//分配不成功
        handle = pan;    //恢复句柄指针
        result = false;
    }else
    {
        handle->dev_interfase = pan;
        handle->owner = pg_event_running;
        handle->iam = enum_iam_right;              //我是右手接口句柄
        if(pg_event_running->held_device == NULL)  //事件还没有打开过设备
        {
            handle->next = handle;
            handle->previous = handle;
            pg_event_running->held_device = handle;
        }else                                       //事件已经有打开的设备
        {
            //以下把新设备插入到事件打开的设备队列头部
            handle->next = pg_event_running->held_device;
            handle->previous = pg_event_running->held_device->previous;
            pg_event_running->held_device->previous->next = handle;
            pg_event_running->held_device->previous = handle;
        }
        result = true;
    }
end_of_dev_open_right_again:
    mutex_post(&tg_dev_mutex);
    return result;
}

//----关闭设备左手接口---------------------------------------------------------
//功能: 关闭设备左手接口,执行如下操作:
//      1.把设备的用户数减1,
//      2.从事件的held_device队列中删除泛设备句柄
//      3.释放句柄
//      4.句柄指针指向原打开设备的泛设备控制块,以备快速打开
//参数: handle,被关闭的设备句柄
//返回: 成功关闭返回被关闭设备的设备控制块地址,否则返回NULL
//-----------------------------------------------------------------------------
struct dev_handle * dev_close_left(struct  dev_handle *handle)
{
    struct pan_device *pan;
    struct dev_handle *next;
    if (handle == NULL)
        return NULL;
    if(handle->iam != enum_iam_left)
        return NULL;
    mutex_pend(&tg_dev_mutex,cn_timeout_forever);
    pan = handle->dev_interfase;
    if(handle->previous == handle)
    {//事件的held_device队列中只有一个设备
        handle->owner->held_device = NULL;
    }else
    {//held_device队列中有多个设备,把本设备从队列中取出.
        handle->next->previous = handle->previous;
        handle->previous->next = handle->next;
        if(handle->owner->held_device == handle)
            handle->owner->held_device = handle->next;
    }
    mutex_post(&tg_dev_mutex);
    mb_free(pg_device_handle_pool,handle);  //释放内存
    semp_post(pan->left_semp);
    //返回原打开设备的泛设备控制块,以备快速打开
    return (struct  dev_handle *)pan;
}

//----关闭设备右手接口---------------------------------------------------------
//功能: 关闭设备右手接口,执行如下操作:
//      1.把设备的用户数减1,
//      2.从事件的held_device队列中删除泛设备句柄
//      3.释放句柄
//      4.句柄指针指向原打开设备的泛设备控制块,以备快速打开
//参数: handle,被关闭的设备句柄
//返回: 成功关闭返回被关闭设备的设备控制块地址,否则返回NULL
//-----------------------------------------------------------------------------
struct dev_handle *dev_close_right(struct  dev_handle *handle)
{
    struct  pan_device *pan;
    if (handle == NULL)
        return NULL;
    if(handle->iam != enum_iam_right)
        return NULL;
    mutex_pend(&tg_dev_mutex,cn_timeout_forever);
    pan = handle->dev_interfase;
    if(handle->previous == handle)
    {
        handle->owner->held_device = NULL;
    }else
    {
        handle->next->previous = handle->previous;
        handle->previous->next = handle->next;
        if(handle->owner->held_device == handle)
            handle->owner->held_device = handle->next;
    }
    mutex_post(&tg_dev_mutex);
    mb_free(pg_device_handle_pool,handle);
    semp_post(pan->left_semp);
    //返回原打开设备的泛设备控制块,以备快速打开
    return (struct  dev_handle *)pan;
}

//----读设备函数---------------------------------------------------------------
//功能: 调用设备的读函数读取数据.
//参数: handle,设备句柄
//      其他参数:由设备开发者定义
//返回: 由设备开发者定义,推荐是实际读取的数据长度.
//-----------------------------------------------------------------------------
ptu32_t dev_read(struct  dev_handle *handle,ptu32_t src_buf,
                ptu32_t des_buf,ptu32_t len)
{
    if (handle == NULL)
        return 0;
    if(handle->iam == enum_iam_left)
        return (handle->dev_interfase->left_hand.io_read
                            (handle,src_buf,des_buf,len));
    else if(handle->iam == enum_iam_right)
        return (handle->dev_interfase->right_hand.io_read
                            (handle,src_buf,des_buf,len));
    return 0;
}

//----写设备函数---------------------------------------------------------------
//功能: 调用设备的写函数写入数据.
//参数: handle,设备句柄
//      其他参数:由设备开发者定义
//返回: 由设备开发者定义,推荐是实际写入的数据长度.
//-----------------------------------------------------------------------------
ptu32_t dev_write(struct  dev_handle *handle,ptu32_t src_buf,
                ptu32_t des_buf,ptu32_t len)
{
    if (handle == NULL)
        return 0;
    if(handle->iam == enum_iam_left)
        return (handle->dev_interfase->left_hand.io_write
                            (handle,src_buf,des_buf,len));
    else if(handle->iam == enum_iam_right)
        return (handle->dev_interfase->right_hand.io_write
                            (handle,src_buf,des_buf,len));
    return 0;
}

//----控制设备函数-------------------------------------------------------------
//功能: 调用设备的控制函数.
//参数: handle,设备句柄
//      其他参数:由设备开发者定义
//返回: 由设备开发者定义
//-----------------------------------------------------------------------------
ptu32_t dev_ctrl(struct  dev_handle *handle,uint32_t cmd,
                    ptu32_t data1,ptu32_t data2)
{
    if (handle == NULL)
        return 0;
    if(handle->iam == enum_iam_left)
        return (handle->dev_interfase->left_hand.io_ctrl
                            (handle,cmd,data1,data2));
    else if(handle->iam == enum_iam_right)
        return (handle->dev_interfase->right_hand.io_ctrl
                            (handle,cmd,data1,data2));
    return 0;
}


//----清理设备-----------------------------------------------------------------
//功能: 关闭一个设备队列中的所有设备,本函数用于事件完成后清理泄漏的资源,如果
//      一个事件线程打开设备没有关闭,直接结束可能引起资源泄漏,本函数由
//      y_event_done函数调用
//参数: handle,设备队列指针,双向循环链表
//返回: 无
//-----------------------------------------------------------------------------
void dev_cleanup(struct  event_script *event)
{
    if(event == NULL)
        return;
    while(event->held_device != NULL)
    {
        if(event->held_device->iam == enum_iam_left)
            dev_close_left(event->held_device);
        else
            dev_close_right(event->held_device);
    };
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -