Evo, posle skoro deset meseci imam malo vremena i rešio sam da ovu priču nekako dovedemo do kraja i krunišemo jednim "živim" projektom. Naravno, sve što budem uradio dokumentovaću i okačiti ovde.
Pa, da nastavimo tamo gde smo stali.
Dakle, ja se preslišavam: kada je UOWN postavljen na 0 (postavila ga je SIE) i posle generisanja TRNIF moramo da pogledamo sadržaj registra USTAT da bismo ustanovili šta je odrađeno.
E, sada postaje malo konfuzno jer ovaj registar ima 4 bajta i tipa je FIFO (prvi ušao-prvi izašao). Gledajući memorijsku mapu u podacima za ovaj tip controlera (DS39632C-page 66) ovaj registar se pojavljuje na adresi 0xF6C i širine je jedan bajt. Ostalim trima bajtovima izgleda ne možemo da pristupimo direktno nego samo pomeranjem sadržaja (bajtova) od "pozadi" ka "napred" tj. kada bajt koji vidimo na ovoj adresi "ispadne" a na njegovo mesto dođe bajt koji je "iza" njega.
To mi je jasno kada je registar pun tj. ima sva četiri bajta. To, dalje, znači da je SIE odradila četiri transakcije (ili SETUP ili OUT ili IN) i dokle god ne oslobodimo bar jedno "zadnje" mesto ona će hostu da šalje NAK. Oslobađanje mesta odn. pomeranje "u napred" postižemo brisanjem bita TRNIF (ukoliko grešim, ispravite me).
Dakle, šta se dešava kada je ovaj registar u nedefinisanom stanju (DS39632C-page 55) posle uključenja uređaja ili internih reset-a? Jer posle prvog RESET-a od strane hosta potrebno je pogledati da li imamo TRNIF i šta imamo u USTAT: u kom bajtu? U prvom ("prednjem") na adresi 0xF6C (što mi je logično) ili u "zadnjem" pa moram tri puta da obrišem TRNIF da bih "dovukao zadnji bajt" na mesto "prednjeg" bajta (što mi je nelogično).
Zašto mi je ono prvo logičnije? Zato što bi SIE trebalo da napuni prvi ("prednji") bajt, pa sledeći i tako redom dok ne napuni i "zadnji" bajt.
Još nešto.
Recimo da Ping-Pong baferovanje nije uključeno i da smo dobili OUT transakciju za Endpoint1_OUT i da je SIE u Endpoint1_OUT_bafer-u upisala neke podatke i UOWN prebacila u 0. I sada, dok mi to čitamo i spremamo odgovor (jer ipak nam je za to potrebno neko vreme), host u međuvremenu pošalje ponovo OUT transakciju za Endpoint1_OUT. SIE bi trebala da tu novu transakciju registruje u USTAT (ako ima mesta) i te nove podatke ponovo upiše u Endpoint1_OUT_bafer, zar ne? Pošto jezgro i dalje drži UOWN bit na 0 ... gde će SIE da upiše podatke jer joj je pristup onemogućen?
Da li grešim ako mislim da SIE neće ništa da upisuje u USTAT i u Endpoint1_OUT_bafer (pošto su joj i endpoint i ovaj bafer nedostupni) i da će da izbaci NAK svaki put kada host pošalje OUT transakciju za Endpoint1_OUT dokle god mi ne obrišemo TRNIF i ne prebcimo UOWN na 1 ali da će normalno da primi transakcije za ostale endpointe koje nisu opisane u "prednjem" bajtu?
Ili postoji neki drugi hardverski mehanizam koji rešava ovaj problem pa programer ne mora o tome da brine?
Za sada toliko.
Pozdrav od Pece.
Pozdrav, Peca.