Skip to contentSkip to conversation

Need help adding platform UIO devices to board

DISCUSSION Alexander Varnin 2 participants 5 messages Nov 28, 2012 – Nov 29, 2012 1 message not in the archive

lore
Share & tools
lore
#0 lore raw

Hello!
I'm trying to add UIO device to my system to handle interrupt. But i'm facing following problem. Docs says, on reading device /dev/uio0 it will block until interrupt occurs. I've made simple program for test. It tries to write 1 to enable interrupts.

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

    int main()
    {
        int fd;
        char c = 1;
        fd = open("/dev/uio0", O_RDONLY);
        if (fd<0) {
            printf("open error: %d\n", errno);
             return 0;
        }
        printf("fd == %d\n", fd);
        int res = write(fd, &c, 1);
        if(res<0) {
            printf("write error: %d\n", errno);
        }
        return 0;
    }

And as the output i get

    fd ==
    3                                                                        

    write error: 9 

error 9 means "bad file descriptor". File /dev/uio0 is here. /sys/class/uio/uio0 folder i also. Reading are fails the same way.

Here is how i add device to the system in board specific code

    static struct uio_info cross_uio_info = {
       .name = "uio_mcross",
       .version = "0.1",
       .irq = IRQ_EINT14,
       .irq_flags = 0,
    };

    static struct platform_device minipos_cross_device = {
        .name          = "uio_pdrv_genirq",
        .id          = -1,
        .dev              = {
          .platform_data = &cross_uio_info,
        }
    };

and then add platform device.
Please, help.

#1 lore raw
Quoted 19 lines · Alexander Varnin

Hello!
I'm trying to add UIO device to my system to handle interrupt. But i'm facing following problem. Docs says, on reading device /dev/uio0 it will block until interrupt occurs. I've made simple program for test. It tries to write 1 to enable interrupts.

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

    int main()
    {
        int fd;
        char c = 1;
        fd = open("/dev/uio0", O_RDONLY);
        if (fd<0) {
            printf("open error: %d\n", errno);
             return 0;
Quoted 9 lines
        }
        printf("fd == %d\n", fd);
        int res = write(fd, &c, 1);
        if(res<0) {
            printf("write error: %d\n", errno);
        }
        return 0;
    }

open O_RDONLY and then write to it ?

return of 9 == EBADF

man 2 write

EBADF fd is not a valid file descriptor or is not open for writing.

hofrat

#2 lore raw

28.11.2012 23:03, Nicholas Mc Guire пишет:

Quoted 9 lines

open O_RDONLY and then write to it ?

return of 9 == EBADF

man 2 write

EBADF fd is not a valid file descriptor or is not open for writing.

hofrat

Yes, sorry, stupid mistake.
But with the correct rights O_RDWR i get error 22 EINVAL both on read and write. So problem is still there.

#3 lore raw
In reply to Alexander Varnin

29.11.2012 13:29, Alexander Varnin пишет:

Quoted 8 lines

28.11.2012 23:03, Nicholas Mc Guire пишет:
Yes, sorry, stupid mistake.
But with the correct rights O_RDWR i get error 22 EINVAL both on read and write. So problem is still there.

Signature · 3 lines
To unsubscribe from this list: send the line "unsubscribe linux-embedded" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Seems to be solved.

Problem was due to lines

if (count != sizeof(s32))
return -EINVAL;

in uio_read kernel function.

I've made read of 4 bytes, and it is ok.