Új hozzászólás Aktív témák

  • Peter789

    senior tag

    Ugyan picit off, de azért mégis kötődik valamennyire az openwrt-hez és az ar71xx-hez, lévén hogy a carambola2-re próbálok keresztfordítani egy saját C programot - hátha tud valaki segíteni... :R

    A kérdéses programrészlet:

    ...
    // read 4 byte from a register
    uint32_t I2C_ReadRegister4(uint8_t reg)
    {
    uint8_t data[5];
    data[0] = reg;
    if (write(g_i2cFile, data, 1) != 1) {
    perror("I2C_ReadRegister set register");
    }
    if (read(g_i2cFile, data, 4) != 4) {
    perror("I2C_ReadRegister read value");
    }
    return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
    }

    // read 8 byte from a register
    uint64_t I2C_ReadRegister8(uint8_t reg)
    {
    uint8_t data[9];
    data[0] = reg;
    if (write(g_i2cFile, data, 1) != 1) {
    perror("I2C_ReadRegister set register");
    }
    if (read(g_i2cFile, data, 8) != 8) {
    perror("I2C_ReadRegister read value");
    }
    return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24) | (data[4] << 32) | (data[5] << 40) | (data[6] << 48) | (data[7] << 56);
    }
    ...

    A fordítás sikeres, de közben ezeket a figyelmeztetéseket dobja:

    ...
    i2c_pic.c: In function 'I2C_ReadRegister8':
    i2c_pic.c:110:9: warning: left shift count >= width of type [enabled by default]
    i2c_pic.c:110:9: warning: left shift count >= width of type [enabled by default]
    i2c_pic.c:110:9: warning: left shift count >= width of type [enabled by default]
    i2c_pic.c:110:9: warning: left shift count >= width of type [enabled by default]
    ...

    Ahol pedig lekérdezem a 8 byte-os regiszterláncot és kiiratom, a 64 bites érték helyett csak egy 32 biteset kapok...

    uint64_t RegVal1 = I2C_ReadRegister8(0x00);
    printf("%" PRIu64 "\n",RegVal1);

    Az azonos sémára felépülő I2C_ReadRegister1/2/4 lekérdezések tökéletesen működnek... Tudom hogy maga a proci 32 bites, dehát ettől szoftverből még tudnia kéne kezelni a 64 bites változókat is, nem? Vagy a GCC-t kellene valahogyan paraméterezni hogy támogassa a 64 biteseket is? Vagy lehet kernel szinten van a hiba, azt kellene másképp paraméterezve fordítani?

    Az még lemaradt, hogy a linux/i2c-dev.h -t használja a program. Azt tudom hogy az SMBus 4 byte-ra van korlátozva, de szerintem ez nem SMBus-ként kezeli a portot - és még ha így is lenne, akkor is szerintem nem a változó szélességének túllépésére panaszkodna hanem egyszerűen segmentation fault-ba futnék vagy hasonlóba... Magát a buszt a kmod-i2c-gpio adja, az eszköz rajta pedig egy általam írt PIC ami többek között egy DS1307-es RTC-t és egy 24C02 EEPROM-ot emulál külön slave címeken. A két emulált eszköz tökéletesen működik a kmod-rtc-ds1307-el és az at24 kernel modulokkal és magát az I2C kommunikációt kívülről vizsgálva digit analizáló eszközzel látszik hogy a PIC képes akárhány byte-ból álló folyamatos láncolvasásra válaszolni a szoftveres I2C buszon keresztül, tehát ez sem lehet szűk keresztmetszet...

    [ Szerkesztve ]

    ----------------------------------------------------------------------------------------------------------------- AquAgorA ...Pál apostol nyomában:                                                                          http://fleettracker.eu/index.php/component/aquagora

Új hozzászólás Aktív témák