This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

  • TI Thinks Resolved

Linux/DRV2605: How to control an ERM using the Linux input subsystem

Prodigy 50 points

Replies: 11

Views: 630

Part Number: DRV2605

Tool/software: Linux

I am trying to test the DRV2605 using an ERM with the Linux driver (github.com/.../drv260x.c) installed. On startup the motor works during calibration, however I am unable to get it to work by writing to the device file as described in www.kernel.org/.../ff.html. Test code below

#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

#include <linux/input.h>
#include <sys/ioctl.h>

#define BITS_TO_LONGS(x) \
        (((x) + 8 * sizeof (unsigned long) - 1) / (8 * sizeof (unsigned long)))
unsigned long features[BITS_TO_LONGS(FF_CNT)];

int main(const int argc, const char **argv)
{
    int fd;

    if (argc != 2) {
        printf("usage: %s <device-file>\n", argv[0]);
        return 1;
    }

    fd = open(argv[1], O_RDWR);
    if (fd < 0) {
        printf("Error opening file '%s': %s\n", argv[1], strerror(errno));
        return 1;
    }

    int num_effects;
    if (ioctl(fd, EVIOCGEFFECTS, &num_effects) < 0) {
        printf("Error getting number of effects playable at the same time: %s\n", strerror(errno));
        return 1;
    }
    printf("%d effects playable at the same time\n", num_effects);

    struct ff_effect effect = {
        .type = FF_RUMBLE,
        .id = -1,
        .direction = 0,
        .trigger = {0, 0},
        .replay = {
            .length = 1000,
            .delay = 0
        }
    };
    effect.u.rumble.strong_magnitude = 0x7F;

    if (ioctl(fd, EVIOCSFF, &effect) < 0) {
        printf("Error creating new effect: %s\n", strerror(errno));
        return 1;
    }
    printf("New effect ID: %d\n", effect.id);

    struct input_event play = {
        .type = EV_FF,
        .code = effect.id,
        .value = 3
    };

    if (write(fd, (const void*) &play, sizeof(play)) < 0) {
        printf("Error writing effect to file: %s\n", strerror(errno));
        return 1;
    }
    printf("Wrote effect\n");

    return 0;
}

 The program runs fine with no errors but nothing happens to the ERM. 

  • In reply to h:

    Hello h,

    I'm facing the same issue and can you please share your working driver code of drv2605l?

    Thanks,

This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.