首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >空ff_replay中的ff_effect子结构

空ff_replay中的ff_effect子结构
EN

Stack Overflow用户
提问于 2017-12-30 12:49:23
回答 1查看 314关注 0票数 1

我正在为一个不受支持的游戏垫开发一个力反馈驱动程序(linux)。

每当用户空间中的应用程序请求产生ff效果(例如隆隆声)时,驱动程序中的函数就会被调用:

代码语言:javascript
运行
复制
static int foo_ff_play(struct input_dev *dev, void *data, struct ff_effect *effect)

这是由init函数中的以下代码设置的:

代码语言:javascript
运行
复制
input_set_capability(dev, EV_FF, FF_RUMBLE);
input_ff_create_memless(dev, NULL, foo_ff_play);

我正在访问ff_effect结构(传递给我的foo_ff_play函数),如下所示:

代码语言:javascript
运行
复制
static int foo_ff_play(struct input_dev *dev, void *data, struct ff_effect *effect)
{
    u16 length;
    length = effect->replay.length;
    printk(KERN_DEBUG "length: %i", length);

    return 0;
}

问题是,报告的长度(在ff_effect->replay中)总是为零。

这是令人困惑的,因为我正在设备上运行fftest,fftest肯定设置了https://github.com/flosse/linuxconsole/blob/master/utils/fftest.c属性:(第308行)

代码语言:javascript
运行
复制
/* a strong rumbling effect */
effects[4].type = FF_RUMBLE;
effects[4].id = -1;
effects[4].u.rumble.strong_magnitude = 0x8000;
effects[4].u.rumble.weak_magnitude = 0;
effects[4].replay.length = 5000;
effects[4].replay.delay = 1000;

这与“无记忆”有关吗?如果不是,为什么ff_replay中的数据似乎为零?

提前谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-31 14:40:01

为什么重播是空的?

看看https://elixir.free-electrons.com/linux/v4.4/source/drivers/input/ff-memless.c#L406,我们发现:

代码语言:javascript
运行
复制
static void ml_play_effects(struct ml_device *ml)
{
    struct ff_effect effect;
    DECLARE_BITMAP(handled_bm, FF_MEMLESS_EFFECTS);

    memset(handled_bm, 0, sizeof(handled_bm));

    while (ml_get_combo_effect(ml, handled_bm, &effect))
        ml->play_effect(ml->dev, ml->private, &effect);

    ml_schedule_timer(ml);
}

ml_get_combo_effect通过调用ml_combine_effects.来设置效果,但是ml_combine_effects只是不将replay.length复制到传递给我们foo_play_effectff_effect结构(至少如果效果类型是FF_RUMBLE):https://elixir.free-electrons.com/linux/v4.4/source/drivers/input/ff-memless.c#L286

这就是为什么我们不能读出foo_play_effect函数中的ff_replay-数据的原因。

好的,重播是空的--我们如何确定我们需要多长时间才能播放这个效果(例如FF_RUMBLE)?

看来重播结构是我们甚至不需要进行的。是的,fftest设置长度,然后将效果上传到驱动程序,但是如果我们查看ml_ff_upload (https://elixir.free-electrons.com/linux/v4.4/source/drivers/input/ff-memless.c#L481),我们可以看到以下内容:

代码语言:javascript
运行
复制
if (test_bit(FF_EFFECT_STARTED, &state->flags)) {
    __clear_bit(FF_EFFECT_PLAYING, &state->flags);
    state->play_at = jiffies +
             msecs_to_jiffies(state->effect->replay.delay);
    state->stop_at = state->play_at +
             msecs_to_jiffies(state->effect->replay.length);
    state->adj_at = state->play_at;
    ml_schedule_timer(ml);
}

这意味着持续时间已经由input-subsystem.处理了。它启动效果,并在需要时停止它。

此外,我们可以在https://elixir.free-electrons.com/linux/v4.4/source/include/uapi/linux/input.h#L279看到

代码语言:javascript
运行
复制
/*
 * All duration values are expressed in ms. Values above 32767 ms (0x7fff)
 * should not be used and have unspecified results.
 */

这意味着我们必须使我们的效果发挥至少32767毫秒。其他一切(在此之前停止效果)都由调度程序决定--这不是我们的部分:D

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48034091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档