2009-05-04 11:05:26     reaing from simple-gpio

Document created by Aaronwu Employee on Aug 15, 2013
Version 1Show Document
  • View in full screen mode

2009-05-04 11:05:26     reaing from simple-gpio

Tom Proost (BELGIUM)

Message: 73573   

 

Hello all,

 

Hardware: BF537

 

uClinux: 2008R1.5

 

I'm working on a spi-controller project, I'm using I/O-expanders (mcp23s08), these produce an interrupt signal when inputs change.

 

The interrupt line is directly connected to GPIO_27.

 

I'm measuring voltages:

 

with spi-controller connected: gpio_27  -> 4,97V      

 

spi-controller disconnected: gpio_27 -> 0 V

 

I'm reading values using simple-gpio driver:

 

with spi-controller connected: gpio_27  -> read value: 49   

 

spi-controller disconnected: gpio_27 -> read value: 49

 

 

My (simple) code, based on simple-gpio-game.c:

 

btw, simple-gpio-game.c differs from simple-gpio-test.c in coding style and functions used: open <-> fopen, is there a real difference?

 

/* open gpio -> connected with interrupt-line from mcp23s08_1 */

   

 

   //gp1 = open("gpio27", "r+");      //use second option, difference?

    gp1 = open("gpio27", O_RDWR);

    if (!gp1)

        perror("unable to open specified device GPIO27");

    else {

        printf ("\ngpio27 opened\n"); }

   

    /* set it to input mode */

    if (write(gp1, "I", 1) != 1)

        perror("unable to set to input");

    else {                         // debug purposes

        printf ("set to input\n"); }

 

 

    /* read current value*/

    int bit = 0;

    printf ("read value: %i\n", bit);

    if (read(gp1, &bit, 1) != 1)

        perror("unable to read gpio27");

    else {                        

        printf ("read value: %i\n", bit); }

 

 

 

Could anybody give me a hint? Where do I go wrong?

 

Thanks in advance!

 

 

 

Regards,

 

Tom

TranslateQuoteReplyEditDelete

 

 

2009-05-04 18:41:35     Re: reaing from simple-gpio

Mike Frysinger (UNITED STATES)

Message: 73598   

 

except you deleted the fsync() call ...

QuoteReplyEditDelete

 

 

2009-05-05 06:43:48     Re: reaing from simple-gpio

Tom Proost (BELGIUM)

Message: 73649   

 

Indeed, sorry for that

 

Just to make sure (I'm new to this):

 

fsync() flushes all the data-changes to 'disk', so I can read the correct values later on from the file descriptor.

 

new code:

 

/* open gpio -> connected with interrupt-line from mcp23s08_1 */

    int        gp[2]

 

    gp[0] = open("gpio27", O_RDWR);

    if (!gp[0])

        perror("unable to open specified device GPIO27");

    else {

        printf ("\ngpio27 opened\n"); }

  

    /* set it to input mode */

    if (write(gp[0], "I", 1) != 1)

        perror("unable to set to input");

    else {                         // debug purposes

        printf ("set to input\n"); }

    if( fsync(gp[0]) == -1)

        perror("syncronisation fail");  

 

    int bit = 0;

    printf ("initialised buffer: %i\n", bit);

    if (read(gp[0], &bit, 1) != 1)

        perror("unable to read gpio27");

    else {             

        printf ("read value: %i\n", bit); }

 

 

output:

 

gpio27 opened

set to input

syncronisation fail: Invalid argument

initialised buffer: 0

read value: 49

 

 

Still the same results, sorry if it's a newbie-mistake.

 

regards

TranslateQuoteReplyEditDelete

 

 

2009-05-05 06:59:06     Re: reaing from simple-gpio

Tom Proost (BELGIUM)

Message: 73651   

 

when I use fsync(fileno(gp)); (int gp;  declared )

 

The kernel gives a fault:

 

/* Maybe null pointer? */

(with a lot of adress info etc)

 

btw, unistd.h is includes as is required for fsync.

TranslateQuoteReplyEditDelete

 

 

2009-05-05 07:03:48     Re: reaing from simple-gpio

Mike Frysinger (UNITED STATES)

Message: 73652   

 

flieno(gp) makes no sense at all.  it operates on a FILE* and returns the backing fd.  if you already have the backing fd, there is no reason whatsoever to use fileno().

Attachments

    Outcomes