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:
- 8780 megtekintés
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 hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
A kernel I2C nem érdekel, nem is értek hozzá, de az érdekelne, hogy mi a hőmérő és páratartalom mérőd.
- A hozzászóláshoz be kell jelentkezni
Mi a cégnél Sensirion SHT21-et és SHT25-öt használunk, nagyon beváltak (csak mi atmel mikrokontrollerrel vezéreljük).
- A hozzászóláshoz be kell jelentkezni
FYI: atmellel is lehet oket i2c-n vezerelni
---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"
- A hozzászóláshoz be kell jelentkezni
Máshogy nem is lehet. De ha arra gondolsz, természetesen hardveres i2c-t használunk, nem bit-bang-et.
- A hozzászóláshoz be kell jelentkezni
Meg nem kesz termek, igy sajnos nem publikus :-(
/sza2
- A hozzászóláshoz be kell jelentkezni
Ha meg erdekel, a tipus Si7005.
http://www.silabs.com/products/sensors/humidity-sensors/Pages/Si7005.as…
http://www.youtube.com/watch?v=_KPRDDaUPQk
http://investor.silabs.com/releasedetail.cfm?ReleaseID=719328
/sza2
- A hozzászóláshoz be kell jelentkezni
Köszi!
Utánnanézek majd ennek is, hogy mit tud és mennyiért.
- A hozzászóláshoz be kell jelentkezni
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"
- A hozzászóláshoz be kell jelentkezni
En nem latom valoszinunek, hogy elobb lefusson.
Egyreszt a test114_update_device 5s mulva fut le elosszor a mod_timer hivasa utan.
Masreszt a biztonsag kedveert a test114_update_device-t teleraktam printk-val es jok a pointerek:-)
/sza2
- A hozzászóláshoz be kell jelentkezni
Interrupt contextből hívsz olyan függvényt, ami sleepelhet. Ez az álmoskönyv szerint fagyással jár. :)
Referenciák:
http://www.makelinux.net/ldd3/chp-7-sect-4
http://lxr.linux.no/linux+v3.6.5/drivers/i2c/i2c-core.c#L2157 -- az i2c_lock_adapter a hunyó
Workqueue-k környékén nézelődj:
http://www.makelinux.net/ldd3/chp-7-sect-6.shtml
Üdv,
Gergely
- A hozzászóláshoz be kell jelentkezni
Koszi!
En is erre keresgeltem, ez alapjan irtam at: https://gist.github.com/309746
De sajnos igy is fagyi.
Utolso lehelettel meg jon egy oops: Unable to handle kernel NULL pointer dereference at virtual address 00000000
Meg probalkozom azert...
/sza2
- A hozzászóláshoz be kell jelentkezni
Valamit nyilván nem inicializáltál. Élesíts kgdb-t aztán léptesd végig. Vagy logolás mindenhova.
- A hozzászóláshoz be kell jelentkezni
Igen, veletlenul kitoroltem egy "return 0;"-t a probe reszbol, igy a kod tovabb futott es egy kfree()-vel szepen felszabaditottam az elozoleg client data strukturanak lefoglalt helyet...
Most mukodni latszik.
Koszi!
/sza2
- A hozzászóláshoz be kell jelentkezni