Hali,
Jobb hijjan ebbe a topic-ba kerult.
Kernel divert barkacsolnek egy ho- es paratartalommero szenzorhoz.
A gond az, hogy a fuggveny amit hasznalnek (i2c_smbus_read_word_data) ket reszletben kuldi / fogadja a dolgokat (start iras stop start olvasas stop), nekem viszont ugy kellene, hogy start iras restart olvasas stop.
Az eszkozzel nem tudok mit tenni, ha nem a masodik modszerrel kuldom, nem jo neki.
Van erre megodas? (Mondjuk nem egy sajat I2C driver irasa...)
Koszi,
/sza2
- 6338 megtekintés
Hozzászólások
Szerintem errefelé nézelődj:
http://kernel.org/doc/htmldocs/device-drivers/API-struct-i2c-msg.html
Szerk: És szerintem i2c_transfer() lesz a megfejtés.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Pont errefele nezelodok :-)
BTW, az i2c_smbus_*() joval egyszerubb...
/sza2
- A hozzászóláshoz be kell jelentkezni
Az lehet, hogy egyszerűbb, csak szerintem nem azt tudja, amire szükséged van.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Persze, erre rajottem en is, csak egy sohajtas volt, hogy miert nem lehet ugyanilyen egyszeruen repeated start-os megoldas is.
Viszont ugy tunik (Raspberry-n legalabbis) az i2c_transfer()-rel sem jo. Ugyanugy 2 transzfer van, van stop az elso vegen is:-(
u8 data_addr = CS114_DATA;
u8 temp_value[2];
struct i2c_msg temp_msg[2] = {
{client->addr, 0, 1, &data_addr},
{client->addr, I2C_M_RD, 2, temp_value}
};
i2c_transfer(client->adapter, temp_msg, 2);
/sza2
- A hozzászóláshoz be kell jelentkezni
Mérted? Oszcilloszkópon látod a stop feltételt a második start előtt?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Nem szkoppal mertem, de van egy I2C eszkozom ami tud monitor modban mukodni.
RPi:
(2012-10-28 21:41:07) [S] <20:w> 01 [P]
(2012-10-28 21:41:07) [S] <20:r> 01 24* [P]
Normalis cucc ami tud repeated start-ot:
(2012-10-28 22:05:17) [S] <20:w> 01
(2012-10-28 22:05:17) [S] <20:r> 24 38* [P]
A gond az, hogy a szenzorban levo state machine stop hatasara beallitja nullara az address register-t. Vegulis talan lehet workaround, ha egyel tobb byte-ot olvasok (a homeseklet adat az 1-es cimen kezdodok es ket byte), az elso kidobom a kukaba. De ez azert eleg csunya :-(
/sza2
- A hozzászóláshoz be kell jelentkezni
Gondolom, itt nem a slave address-ről beszélsz, hanem az eszközben elérhető regiszter címéről. Ha törlődik a belső pointer, akkor igen, szerintem jó az, ha kiolvasod addig, amíg kell, s az elejét eldobálod. Tegyük hozzá, én ebben semmi rondaságot nem látok.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Igen, azokrol a cimekrol. Megcsinaltam, mukodik, szerencsere nem okoz gondot, vegulis a 0-s cimen a statusz van.
Viszont okozhatna, pl. ha egy clear on read regiszter lenne ott, es mondjuk elveszne az az adat ami ott tarolodik (jo, tegyem el valami tmp-be). De azert fel tudnek vazolni olyan helyzetet, amikor ez komoly gondot okozna.
Viszont ugy tunik a 10 bit-es slave cimek kezelesenek repeated start-ot alkalmaznak (az adatlapban ez all), bar nem ertelmeztem tuzetesebben. Szoval lehet, hogy megis mukodi valahogy.
http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Perip… 36. oldal alja.
/sza2
- A hozzászóláshoz be kell jelentkezni
Igazából, ha egy probléma megoldható, nem szoktam azon keseregni, hogy adódhatna olyan helyzet, hogy nem lenne megoldható. Pontosabban bosszant kicsit, de pragmatikusan túllépek ezen. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ez egy kicsit rosszul hangzik:
by Tripel Hop » Tue Aug 28, 2012 10:25 pm
I did some direct programming of the I2C controller (BSC0) from user-space. It occured to me the BCM2835 doesn't support I2C repeated start. See the BCM2835 datasheet chapter 3 for more information.
(http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15840&p=161973)
/sza2
- A hozzászóláshoz be kell jelentkezni
Az szívás, ha a hardware nem tudja. Muszáj neked a repeated start? Annak az eszköznek, amivel kommunikálsz, nincs olyan üzemmódja, hogy ezt megkerüld?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Lasd lentebb. Igen, szivas...
/sza2
- A hozzászóláshoz be kell jelentkezni
Jézusom.
Írtam már drivert egy pár i2c szenzorhoz, szinte mindegyik start->write->wait->rstart->read->stop rendszerrel működött.
Szóval ez azért elég szégyen ha igaz.
- A hozzászóláshoz be kell jelentkezni
Pontosan hogyan probalod?
---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"
- A hozzászóláshoz be kell jelentkezni
temperature = i2c_smbus_read_word_data(client, CS114_DATA);
/sza2
- A hozzászóláshoz be kell jelentkezni
raspberry alól nem próbálam még i2c-t. ő viszont igen :) :
http://tim.jagenberg.info/2012/07/12/raspberry-pi_i2c/
hátha segít :)
---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"
- A hozzászóláshoz be kell jelentkezni
Sajnos ahogy latom user space, az nekem nem jo:-(
/sza2
- A hozzászóláshoz be kell jelentkezni
userspace driver az i2c-dev kernel modullal nem jó? Ott az ioctl I2C_RDWR mintha ezt csinálná.
- A hozzászóláshoz be kell jelentkezni
Koszi, lehet, hogy megnezem, hogy ugy mukodik-e egyaltalan. Sajnos a user space nem opcio.
/sza2
- A hozzászóláshoz be kell jelentkezni
Koszi, lehet, hogy megnezem, hogy ugy mukodik-e egyaltalan. Sajnos a user space nem opcio.
Puszta kivancsisagbol: a userspace miert nem opcio?
- A hozzászóláshoz be kell jelentkezni
Egyreszt, mert kernel driver-t akartam irni (amit a hwmon-on keresztul lehet elerni es kompatibilis a tobbi szenzor hasznalataval), masreszt a user-space-ben ugyanugy nem mukodik, de egyebkent ezt pont abban hozzaszolasban irtam, ami afelett van amire irtal.
/sza2
- A hozzászóláshoz be kell jelentkezni
Ez a hwmon-os dolog nem derult ki, igy mar ertem, kosz
- A hozzászóláshoz be kell jelentkezni
Kiprobaltam, nem megy:-(
Ugyanaz mint az i2c_transfer() kernel space eseten.
Egyebkent az ioctl-hoz szukseges struktura kisertetiesen hasonlit arra amit az i2c_transfer var. Szoval ez a ketto inkabb egy:-)
/sza2
- A hozzászóláshoz be kell jelentkezni
Ha még aktuális, akkor hasonlókat a adafruit-al csinálnék:
http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro
- A hozzászóláshoz be kell jelentkezni
Egy darabig foglalkoztam vele, de mivel a szutykos workaround-om megy, egy ideje nem nyultam hozza.
"Our distro is based on "Wheezy" but comes with hardware SPI, I2C, one wire, and WiFi support for our wifi adapters."
En a Raspbian-t hasznalom custom kernel-lel. A "with hardware SPI, I2C" reszt nem tudom ertelmezni. Mar nem emlekszem de a gyari Rasbpian-os kernelben vagy nincs beleforditva az SPI es az I2C, vagy hardveres.
/sza2
- A hozzászóláshoz be kell jelentkezni