Portál AbcLinuxu, 9. května 2025 20:39

Dotaz: i2c_smbus_read_byte_data

Konqui avatar 2.12.2007 09:12 Konqui | skóre: 18 | blog: Konqui | Rožnov pod Radhoštěm
i2c_smbus_read_byte_data
Přečteno: 669×
Odpovědět | Admin
Zdravím.mám problém při kompilování nasledujícího kousku kódu
/* compass.c
#include  <errno.h>
#include  <string.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <unistd.h>
#include  <fcntl.h>
#include  <linux/i2c-dev.h>

/* Note that the documentation for the compass states its address as 0xC0.
 * However, this includes the low bit which specifies read or write.
 * Linux i2c does not include this bit in this address, so the actual
 * address is 0xC0 shifted down, 0x60.
 */
#define CMPS03_ADDR 0x60

/* The important registers on the compass. Internal/test registers omitted. */
#define CMPS03_SOFTWARE_REVISION 0x0
#define CMPS03_BEARING_BYTE 0x1
#define CMPS03_BEARING_WORD_HIGH 0x2
#define CMPS03_BEARING_WORD_LOW 0x3
#define CMPS03_CALIBRATE_CMD 0xF

int main(int argc, char *argv[]) {
   char *end;
   int res,file;
   int e1;
   char filename[20] ;
   long funcs;
    
   int heading_byte, heading_word_h, heading_word_l;
   int bearing_long, bearing_degrees;
   
   sprintf(filename,"/dev/i2c-0");
   if ((file = open(filename,O_RDWR)) < 0) {
     e1 = errno;
     if (e1 != ENOENT) {
       fprintf(stderr,"Error: Could not open file '%s' : %sn",
               filename,strerror(e1));
       if(e1 == EACCES)
         fprintf(stderr,"Run as root?n");
     }
   } 
   
   
   /* Get software revision number */
   res = i2c_smbus_read_byte_data(file, CMPS03_SOFTWARE_REVISION);
   if (res < 0) {
     printf("Cannot read software revision leveln");
   } else {
     printf("Software revision level: %02xn", res);
   }
   
   /* Loop and read from the compass. */
   while (1) {
     /* The heading byte is 0-255 for the 360 degrees. */
     heading_byte = i2c_smbus_read_byte_data(file, CMPS03_BEARING_BYTE);
     if (heading_byte < 0) { printf("Error reading from compass."); exit(1);}
     
     /* The high resolution heading is given in two registers, and is 10 * the 
      * heading in degrees, ie 359.9 degrees reads as 3599. */
     heading_word_h = i2c_smbus_read_byte_data(file, CMPS03_BEARING_WORD_HIGH);
     if (heading_word_h < 0) { printf("Error reading from compass."); exit(1);}
     heading_word_l = i2c_smbus_read_byte_data(file, CMPS03_BEARING_WORD_LOW);
     if (heading_word_l < 0) { printf("Error reading from compass."); exit(1);}
     
     /* Combine the two bytes, and get the heading in degrees. */
     bearing_long = heading_word_h * 256 + heading_word_l;
     bearing_degrees = bearing_long / 10;
     
     printf("Bearing: %d \n", bearing_degrees);
     
     /* Wait for a while. */
     usleep(200000);
   }
}
Kompilace vyhodí vždy tyto chyby:
[honza@AMD2000 ~]$ cc i2c.c
i2c.c:97:2: warning: no newline at end of file
/tmp/ccNQKa9S.o: In function `main':
i2c.c:(.text+0xbe): undefined reference to `i2c_smbus_read_byte_data'
i2c.c:(.text+0xfb): undefined reference to `i2c_smbus_read_byte_data'
i2c.c:(.text+0x12f): undefined reference to `i2c_smbus_read_byte_data'
i2c.c:(.text+0x163): undefined reference to `i2c_smbus_read_byte_data'
collect2: ld returned 1 exit status
Nevíte někdo co s tím?
Open/save dialogy z GTK+ jsou nejkřiklavější ukázkou toho nejdebilnějšího software, co vůbec může existovat.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

2.12.2007 20:06 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: i2c_smbus_read_byte_data
Odpovědět | | Sbalit | Link | Blokovat | Admin
No chybí tě deklarace funkce "i2c_smbus_read_byte_data" takže ti asi chybí nějakej hlavičkový soubor, nebo používáš špatnou knihovnu kde se ta funkce jmenuje jinak.
2.12.2007 20:10 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: i2c_smbus_read_byte_data
PS. Nemá tam být include <linux/i2c.h>
e.lisak avatar 2.12.2007 22:22 e.lisak | skóre: 23
Rozbalit Rozbalit vše Re: i2c_smbus_read_byte_data
Odpovědět | | Sbalit | Link | Blokovat | Admin
podle te posledni radky to vypada spise na chybejici knihovny
(collect2: ld returned 1 exit status)

zkuste pridat parametr -li2c (nebo neco v tom smyslu - pridani i2c knihovny)

Konqui avatar 5.12.2007 09:15 Konqui | skóre: 18 | blog: Konqui | Rožnov pod Radhoštěm
Rozbalit Rozbalit vše Re: i2c_smbus_read_byte_data
Při přidání parametru cc -li2c řekne, že daný parametr nezná.Nemáte nějaké jiné nápady?
Open/save dialogy z GTK+ jsou nejkřiklavější ukázkou toho nejdebilnějšího software, co vůbec může existovat.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.