[Megoldva] Kernel async I2C (Raspberry PI)

Hi,

Egy kernel driver-ben kellene aszinkron (non-blocking?) modon kezelnem I2C-t. Szinkron mod megy tokeletesen, de amint aszinkron kezelnem, sz@rrafagyas van.

Gondoltam csinalok egy timer-t ami az I2C eszkozt idonkent megszolitja, az eredmenyt elteszi egy bufferbe, ujra elesiti magat, a buffer pedig sysfs-en keresztul erheto el.

Mi lenne erre a megoldas?

Koszi,

/sza2

szerk:

Leegyszerusitve, ez nem megy:

http://pastebin.com/kP5LCK2c

Hozzászólások

Ugyan nem értek a kernel programozásához, de azért beleszólok, mert ilyen kedvem van. :)

Van I2C hardware támogatásod, vagy a dolog úgy néz ki, hogy van két portlábad, aztán vagy alacsonyszintbe teszed az SCL, SDA vonalakat, vagy elengeded őket, illetve vissza tudod olvasni a vonalak logikai szintjét, mint bejövő adatot, illetve a slave device részéről wait-et? Egyáltalán mi az, amit csinálnod kell?

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A kernel I2C infrasrtukturajat (hardveres) hasznalom, azon belul is egy hwmon eszkoz lenne (homero + paratartalommero). Nem kezelem direkt modon a vonalakat (ezzel nincs is gond).

A gond az, hogy az adatok ugy allnak elo, hogy start -> konverzio -> stop - > kiolvasas. Ebbol a konverzio idejere nem szeretnem blokkolni az egesz rendszert. Arra gondoltam, a diver indulasakor lenne egy start, elkezdodne a konverzio, majd egy timer adott ido mulva (mondjuk 1s) menezne hogy befejezodott-e a konverzio, ha igen -> stop, kiolvasas, start, timer ujrainditas es kezdodik elorol onnan, hogy megvizsgalom vege-e a konverzionak.

Ha a driver show fuggvenyebol inditom a fenti dolgot, minden OK, viszont a fenti megoldassal (teszt -> stop -> kiolvasas -> start) mindig az egyel korabbi erteket kapom vissza (hiszen a legutolso olvasaskor inditott konverzio altal letrejovo ertek kerul a bufferbe), ami eleg gaz, ha tegyuk fel az utolso olvasas ota eltel pl. 10perc.

/sza2

Lehet, hogy hülyeség, de nem lehet, hogy a test114_update_device előbb fut le, minthogy a test114_probe végig érne?
És mivel a test114_i2c csak a test114_probe végén van inicializálva, ezért a test114_update_device-ban a i2c_smbus_read_byte_data (ami ugye ezt használja) is egy random memóriaterületről fog olvasni, persze számára értelmetlen adatot, amibe belefagy.

------------------
My Open-Source Android "Projects"