Mahdollista lukea flash sisältö aud:n kautta ? - C koodaustaitoista apua tarvittaisiin...

Lähetä vastaus

Hymiöt
:D :) :;): :( :o :shock: :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :tyhmamina: :baaa: :bike: :blues: :pomppu: :bowdown: :thumbup:
Katso lisää hymiöitä

BBCode on Käytössä
[img] on käytössä
[url] on käytössä
Hymiöt ovat käytössä

Otsikko
   

Laajenna näkymää Otsikko: Mahdollista lukea flash sisältö aud:n kautta ? - C koodaustaitoista apua tarvittaisiin...

Kirjoittaja PetriK » 16 Marras 2007, 15:05

Bozo oli onnistunut lukemaan RAM alueen koodin itse tehdyllä parallax propeller pohjaisella prosessorilla. Lisäksi näyttäisi siltä että ROM alueenkin koodia ainakin alustapäin oli pystytty lukemaan.

Nyt ei muuta kuin vauhtia täällä suomenkin päässä hankkeeseen niin että saadaan laitteet ja ohjelmat kuntoon.

;-)))

Kirjoittaja PetriK » 15 Marras 2007, 18:22

ok - australiasta bozo (Mark W) joka yrittää purkaa sv1000 sh7052 pohjaista ecua oli onnistunut tekemään tuon AUD liitännän testausvalmiiksi. Ensimmäiset yritykset lukea oli antaneet bus error tuloksen, eli joko komentoja on enemmän kuin pelkkä read, väylän nopeus on väärä tai sitten osoitteessa oli jotain häikkää - tai jotain muuta.

Lähipäivinä kuullaan varmaan lisää...

Kirjoittaja timo3 » 15 Marras 2007, 12:06

Sitä vaan ajoin takaa tuolla järjestyksellä, että AUDATA linjaa
ohjauskäskyn antaessa joko lukemiselle tai kirjoittamiselle, voiko bitit osua väärin päin. Mutta ohjauskäsky on näköjään valittu sellaiseksi, että haluat lukee tavun, sanan tai pitkänsanan, niin se bittijono käännettynä ei aiheuta ohjauskäskyn muuttumista kirjoituskäskyksi.

luku
1000
1001
1010

kirjoitus
1100
1101
1110
Eli, tuo toinen bitti meinaa kirjoitetaanko vai luetaanko.

Kyllä se vaatii kirjoitettavaksi pitemmässä bittijonossa vähiten merkitsevä bitti ensiksi, johtuu varmaankin siitä kun yleensäkkin käännöstä tehdään jakojäännöksen avulla saadaan ensiksi vähitenmerkitsevät bitit hymm..ehkä.

Vaikka ns. "oikea" järjestys on toisinpäin, kuten esim. windows:n laskin ne muuttaa.

Laskimesta kun valitsee näytä ja Funktiolaskin, se osaa muuttaa desimaalit heksaks ja binääriks jne...




Edited By timo3 on 1195121241

Kirjoittaja PetriK » 15 Marras 2007, 09:44

Tossa patentissa on sivulla 12 kuvassa nähtävästi se mitenpäin bittijono kirjoitetaan, eli ensiksi bitit 3:0 sitten 7:4, 11:8, ... jne.

http://macmadigan.no-ip.com/BusaECU....763.pdf

Lisäksi siinä on taulukossa kuvattu mitä kaikkia komentoja ennen osoitteen kirjoittamista on mahdollista antaa. Mä yritin tutkia tuota yksi ilta, mutta vaatii enemmän aikaa ja päätin että kunhan softa on kasassa ja fyysinen yhteys on toteutettu niin sitten testaan että mistä on kysymys.

Tuo patenttihan puhuu pitkälti branch follow upista seuraamalla noita linjoja eikä siitä että AUD:n avulla voisi lukea tai kirjoittaa FLASH:iä.

FLASHIIN kirjoittaminen on kuvattu toisessa dokussa ja se vaatii prosessorikohtaisen assembler tai C ohjelman joka pitää ensin siirtää AUD:lla RAM alueelle jos oikein ymmärsin. Download on Renesasin termi ladata softa PC:ltä prosessorin flashiin.

Tässä linkki missä on lähdekoodi yhteen C-ohjelmaan, olen nähnyt myös toisen dokumentin jossa on vastaava koodi assemblerilla tehtynä.

http://macmadigan.no-ip.com/BusaECU....513.pdf

Eli itse en kuvittele tässä vaiheessa että AUD:lla voisi helposti Flashiin kirjoittaa - kirjoittamista varten on tuo FDT & Tx1/Rx1/FWE/MD1. Sen sijaan AUD saattaa auttaa siinä miten flashin sisältö luetaan.

Jos rakennat AUD liityntää huomaa myös että ainakin tuossa patentissa löytyy maininta siitä että AUD kellon asetetaan prossun kellotaajuuden harmoniseen kerrannaiseen, esim 1/4 tai 1/8. En ole varma että tämä tarvitaan, mutta tuollainen maininta siellä on.

Itse en ymmärrä prosessorin sisäistä rakennetta riittävästi jotta ymmärtäisin noita lohkokaavioita niin että voiko niiden kautta asettaa muistipaikan luettavaksi vai onko kyseessä vain tracing eli jos joku bittiyhdistelmä tulee linjaan niin se siinä tapauksessa kaiutetaan eteenpäin AUD:lle. Se että tuo AUD pitää mahdollisuuden kirjoittaa RAM alueelle kyllä tarkoittaa että se osaa myös varmaan lukea RAM alueelta ja siten todennäköisesti myös lukea Flash:iä.

mutta osaako AUD varata väylän niin että se pystyy lukemaan jotain tiettyä muistipaikkaa, vai osaako se vain "monitoroida" väylää ja huomaa jos joku osoite osuu väylään ja kaiuttaa sen eteenpäin - tämä on se kysymys mitä juuri nyt olen iltaisin pohtinut




Edited By PetriK on 1195113061

Kirjoittaja timo3 » 15 Marras 2007, 01:04

Kummin päin se bittijono kirjoitetaan, enemmän merkitsevät bitit ensiksi vai vähemmänmerkitsevät bitit ensiksi.

Laskimet muuttaa kai toisella tavalla mitä nuo muistiosoitteen osoitusbitit haluaa järjestykseksi bitelle vai?

Kirjoittaja PetriK » 14 Marras 2007, 22:46

0xFFFF0000-0xFFFFFFFF on ram osoite, tai jossain tuolla seuduin.Tarkemmin löytyy hw manuaalista.

Kyllä sinne käsitääeksni pitää aina viedä koko bittijono joka on tuon 0xFFFFFFFF mittainen. Tosin on jotain komentoja jossa pärjää vähemmälläkin ,mutta yleisesti ottaen olisi hyvä varmaan koko tuota määrää bittejä käsitellä.

Jokaisella kellopulssilla kai luetaan tai kirjoitetaan yksi neljän ryhmä. Se mitä ei vielä tiedetä että on ko kyseessä laskeva vai nouseva pulssi, mutta se selviää testaamalla.

Tuosta denson patentista saa vähän vinkkiä miten homma toimii:

http://www.freepatentsonline.com/7003763.html

Tuonne kannattaa rekisteröityä ja saa samalla lukuoikeudet niin että näkee kuvatkin.

Kirjoittaja timo3 » 14 Marras 2007, 18:18

Miten siinä flash:n luvussa osoitetaan muistipaikkaa, eli mikä muoto.

Alku ja loppuosoite
0x00000-0x3FFFF
vai
0x00000000-0x0003FFFF
??

Täytyykö siinä olla noita nollia edessä esim.
3FFFF
bitteinä 0011 1111 1111 1111 1111 vai 11 1111 1111 1111
1111

Entäs jos halutaan osoittaa muistipaikkaa yksi miten se bitteinä ilmoitetaan sille.

pelkkä 0001 yhdellä kellopulssilla ja PB6 ylös,
vai nuo viiden ryhmät erikseen jokaisella kellopulssilla 0000 0000 0000 0000 0001 ja PB6 ylös.

Eli täytyykö se bittijono olla aina tietyn pituinen ja jos luku on pieni niin nollia eteen?




Edited By timo3 on 1195057767

Kirjoittaja PetriK » 13 Marras 2007, 22:55

RR:ltä tuli koodi saatesanoilla että todennäköisesti tuo ajoitus ei ole niin tarkkaa... mä heitän tämän lähiviikkoina tuolle testiprossulle ja katsotaan mitä tapahtuu...


#define DIR 0x40; //PB6 direction line; write low
#define AUDCK 0x20; //PB5 clock
#define AUDSYNC_ 0x10; //PB4 Sync active low

dword Address
dword dataout

/*

Assumes writing to PB changes the PB I/O pins


*/
dword GetData(dword Address)
{
char AUD_ptr = 0;
char n;
dword result;

//initialize sequence
PB = 0; //all control, data low
wait(); //wait half cycle
PB = AUDCK; // set clock hi, cpu reads on rising edge
wait();

//write direction byte
PB = 10; //set data to DIR command, control low
wait(); //wait half cycle
PB = AUDCK; // set clock hi, cpu reads on rising edge
wait();

//write address, lsb nibble first
for(n=0,n<8,n++)
{
PB = Address & 0x0000000F; // out A[3:0], controls all low
Address =/ 16; // move A[7:4] -> A[3:0]
wait();
PB = AUDCK; // set clock hi, cpu reads on rising edge
wait();
}

PBset_input(0x0F); //routine that sets PB0:3 from outputs to inputs

// set direction and clockit
PB = DIR; //data 0, change the direction signal to read
wait();
PB = DIR + AUDCK;
wait();

while(!(PB & 1)) //loop until cpu sends ready byte
{
PB = DIR;
wait();
PB = DIR + AUDCK;
wait();
}

//set sync and clock it in
PB = DIR + AUDSYNC_; //set sync
wait();
PB = DIR + AUDSYNC_ + AUDCK;
wait();

//read out 8 4bit nibbles of data requested
PB = DIR + AUDSYNC_; // set clock low
result = 0;
for(n=0;n<8;n++)
{
wait();
PB = DIR + AUDSYNC_ + AUDCK; // cpu latches data out
wait(); // give it time to settle
result *= 16; // shift result left to make room for new bits
result += PD & 0x0F; // add bits to result
PB = DIR + AUDSYNC_; // clock low
}

return(result);

}



void wait(void)
{
// routine to give the desired delay / 2
}

void main()
{

dataout = GetData(0xffffc000);

DisplayLCDValue(dataout)

}

Kirjoittaja PetriK » 13 Marras 2007, 21:07

timo3 kirjoitti:Hyvältähän tuo näyttää ehkä..
Jos ihan rehellisiä ollaan en ymmärrä tuosta c kielestä yhtään mitään.
olis varmaan pitännyt joskus aikonaan alkaa opettelee sitä, eikä basic:a

äääh, ja mä kun vähän toivoin että sieltä olisi löytynyt kaveri joka auttaa laittamaan syntaksin kohdalleen. Se tulee olemaan kaikista eniten aikaa vievä haaste mulle joka ei muista kielestä enään mitään...

;-))


EDIT - mutta siis pointti: tuohon on varmaan monta erilaista tapaa koodata noi funktiot. Tämä oli se mikä tuli ekana mieleen, mutta on varmaan myös fiksumpiakin tapoja ... jos tulee mieleen niin kommentteja otetaan vastaan mielellään.




Edited By PetriK on 1194980931

Kirjoittaja timo3 » 13 Marras 2007, 20:50

Hyvältähän tuo näyttää ehkä..
Jos ihan rehellisiä ollaan en ymmärrä tuosta c kielestä yhtään mitään.
olis varmaan pitännyt joskus aikonaan alkaa opettelee sitä, eikä basic:a

Kirjoittaja PetriK » 13 Marras 2007, 18:42

Olisiko tässä koodilogiikan alkua ??? Syntaksi on pielessä kun en vaan enään muista, mutta logiikkaan kaipaisin kommentteja. Noi bittikäsittelyfunktiot ei vielä ole tässä.
/*

This program is supposed to send a memory address to the AUD line and get in return the contents of that memory address. It assumed that AUDCLK signal is produced by a processor timer and that for each timer pulse an interrupt is generated.


This is a draft for commenting.


Please do not pay attention to the syntax I just dont remember anymore how to write C. I am more concerned of the logic, propalbly this has some flaws, but maybe some ideas can be generated based on this.


The logic is very simple and communications just uses seven one bit registers (PB0..PB6):
- PB5 (AUDCLK) is a clock signal that is programmed going up and down with a small inbuilt delay. I dont know if this should be synchronized with a clock or if it can vary a lot. But as it is used for reading and writing I would assume it not being so citical to have an exact pulsewidth on this.
- Set PB5 (DIRection) down to write to the bus
- Set PB4 (AUDSYNCinverted) down to start reading
- Send to the bus PB0,PB1,PB2,PB3 (AUDATA) a dummybit 0000 to start the sequence
- Wait for next PB5 cycle
- Send to the bus PB0,PB1,PB2,PB3 (AUDATA) a command 1010, i.e. read from memory
- Send to the bus PB0,PB1,PB2,PB3 (AUDATA) the memory address e.g. 0xffffc000 4 bits at a time by each PB5 clock pulse
- Set PB6 (DIRection) up
- Wait from the bus PB0,PB1,PB2,PB3 (AUDATA) to receive readyflag bits 0001: wait for each clockpulse until changed.
- Set PB4 (AUDSYNCinverted) up as a signal that we are ready to start reading the memory contents
- Read from the bus PB0,PB1,PB2,PB3 (AUDATA) the memory content, e.g. 0x01234567, four bits at a time.
*/


/* global variables */
boolean AUD_ADDR[7,3] /* table which is used for generating the AUD signals for
writing the memory address to the AUD bus */

boolean AUD_RESULT[7,3] /* table which is used for storing the AUD the result of the memory byte reading */

int AUD_PTR /* which step on write / read process we have ongoing */

boolean showLCD;
boolean AUD_PROCESS; /* indicates when AUD process can be started */



Interrupt_AUDCLK_signal(){ /* this is an interrupt that is executed on each clock signal, falling edge ??
This function is the brain that handles the AUD line and just uses global variables to store the results */



/* Write the memory address to the bus */
Case AUD_ PTR
1: PB6=1; PB0=1;PB1=1;PB2=1;PB3=1;/*write dummybit*/
2: PB0=1;PB1=0;PB2=1;PB3=0; /*write command 1010 */
3,4,5,6,7,8,9,10: /* write address bits 3:0 */
{ PB0=AUD_ADDR[AUD_ PTR-3,0]; PB1=AUD_ADDR[AUD_ PTR-3,1];
PB2=AUD_ADDR[AUD_ PTR-3,2]; PB3=AUD_ADDR[AUD_ PTR-3,3];}


11: PB6=1; /*Change direction*/

/* Increase pointer if either still writing to the bus or AUDSYNC enabled, or just wait until AUDSYNC is enabled */
if (AUD_ PTR < 11 & AUDSYNC != 1) AUD_ PTR++;



/* Read the memory byte contents from the bus */
Case AUD_PTR 12,13,14,15,17,18,19,20: /*read memory contents */
{ AUD_RESULT[AUD_PTR-12,0]=PB0; AUD_RESULT[AUD_PTR-12,1]=PB1;
AUD_RESULT[AUD_PTR-12,2]=PB2; AUD_RESULT[AUD_PTR-12,3]=PB3;}



/* If memory byte read into the memory let the main function know that audprocess stopped */
if AUD_PTR >= 20 { stop_AUDCLK_signal();AUD_PROCESS=false;AUD_PTR=0; show_LCD=True;}


if (AUD_PTR >= 12 & AUDSYNC == 1) AUD_PTR++; /* increase pointer further only when AUDSYNC is high */

}


initialize_AUDCLK_signal(){
/* to be written, based on processor register handling, just set the timer based signal on */
/* the frequency is max processor speed / 4 or slower than execution of interrupt subroutine on this program */
}


stop_AUDCLK_signal(){
/* to be written, based on processor register handling, just set the timer based signal off */
}


Initialize(){
/* to be written, based on processor register handling */
/*
set ports
set AUDCLK signal to 1khz ?
*/

AUD_PROCESS=True;
AUD_PTR=0;
show_LCD=False;

}



Main() /* very dummy main program, just process a fixed address and show it on the LCD once */
int xxx;
{

while (1) {
if (AUD_PROCESS & AUD_PTR==0 ){ /* start timer to output AUDCLK signal *
convert_to_bits(0xFFFFC3000); /* converts input to AUD_ADDR table */
initialize_AUDCLK_signal();
}



if (!AUD_PROCESS & show_LCD) {
xxx=bits_to_value(); /* read the AUD_result table to xxx */
send_to_LCD(xxx); /*send data to LCD to view the result*/
show_LCD=False; /* just show once */
}}}




Edited By PetriK on 1194974391

Kirjoittaja timo3 » 13 Marras 2007, 17:51

mutta miksi ihmeessä olisivat valinneet juuri TxD1 ja RxD1 signaalit miksi ei RxD2 ja TxD2 ?


Olit muuten aivan oikeassa RxD2 ja TxD2 ovat juuri ne jotka menevät epromille ja TxD1 ja RxD1 jonnekin muualle.
Mun on varovasti yritettävä harjata tuo levy puhtaaks, noista kukkuu luukuista mitatessa tulee helposti noita vierekkäiden nastojen heittoja.

Täytyis saada puhtaaks se liittimen osa niin näkis mihin nuo käyttämättömät nasta menee.
Tota FWE kun yritin mittailla liittimestä se näyttäis johtavan lähen joka toiseen nastaa enemmän ja vähemmän.

Täytyy tässä välissä käydä koittamassa vieläkö kawa lähtee käyntii.

Edit.

Lähetän sulle kuvat siitä levystä.




Edited By timo3 on 1194969233

Kirjoittaja PetriK » 13 Marras 2007, 17:30

timo3 kirjoitti:TxD ja RxD menee ATMEL 93C66 (eprom) ja MD1:n lähtee suoraan prossun alle, eikä vastapuolekta mittaamalla näytä tulevan mihinkään pisteeseen prossun alla.
FWE kiertää useampien vastusten kautta ja haarautuu niin moneksi, ettei edes yrittänyt mittailla sitä.

Tietysti vois tinata ne suoraan prossun jalkoihin, mutta mitä noida prommereita on tullut rakenneltua, niissä jo kaapelointikin on aiheuttanut virheitä luvussa/kirjoituksessa, joten kokemuuttani melkein taas väitän, että jos niissä jaloissa on kiinni muita komponentteja luku ja kirjoitus onnistuu aika huonolla prosentilla.
Jos siellä on muita komponentteja jaloissa pulssien lasku ja nousu ajat viivästyvät ja ajoitus ei taas täsmää, varsinkin suuremmilla siirtonopeuksilla.

Hmmm... olet varmaan oikeassa mutta herättää kyllä kysymyksiä:

- Olisivatko uskaltaneet jättää MD1 kellumaan, olisi ihan uskomatonta jos kelluisi vapaasti.
- TxD, Rxd ovat myös confattavissa PortC IO linjoiksi. Voihan olla että jostain syystä käyttävät juuri noita portteja sarjaliikenteeseen EPROM.n kanssa - mutta miksi ihmeessä olisivat valinneet juuri TxD1 ja RxD1 signaalit miksi ei RxD2 ja TxD2 ?
- FWE haarautuu mulla tuonne jänniteregulaattorille ja laittaa sieltä regulaattorin kellosignaalin pois päältä.

Mulla tuo 4kb serial eprom IC502 on kytketty TxD2 ja RxD2 linjoihin. Olen kyllä miettinyt että mihin ihmeeseen tarvitaan tuota 4kb IC502:sta ja en ole vielä ihan keksinyt kun prosessorissa itsessään on kuitenkin satoja kiloja muistia. Ehkäpä nuo YoshBox tyyppisellä laitteella kirjoitettavat kartat on tarkoitettu tallennettaviksi sinne tai sitten noi mahdollisesti ajonaikaisesti tallentuvat lambdakorjauksen tiedot menevät sinne ? (Flashiin kun voi kirjoittaa vain blokki kerrallaan)

Olisiko sulla kuvia piirilevystä vaikka vaan osittainkin avatusta niin voisi vähän vertailla... ?




Edited By PetriK on 1194968089

Kirjoittaja timo3 » 13 Marras 2007, 14:21

TxD ja RxD menee ATMEL 93C66 (eprom) ja MD1:n lähtee suoraan prossun alle, eikä vastapuolekta mittaamalla näytä tulevan mihinkään pisteeseen prossun alla.
FWE kiertää useampien vastusten kautta ja haarautuu niin moneksi, ettei edes yrittänyt mittailla sitä.

Tietysti vois tinata ne suoraan prossun jalkoihin, mutta mitä noida prommereita on tullut rakenneltua, niissä jo kaapelointikin on aiheuttanut virheitä luvussa/kirjoituksessa, joten kokemuuttani melkein taas väitän, että jos niissä jaloissa on kiinni muita komponentteja luku ja kirjoitus onnistuu aika huonolla prosentilla.
Jos siellä on muita komponentteja jaloissa pulssien lasku ja nousu ajat viivästyvät ja ajoitus ei taas täsmää, varsinkin suuremmilla siirtonopeuksilla.

Kirjoittaja PetriK » 13 Marras 2007, 05:23

Entä mittasitko että löytyykö sarjadata liittimeltä vai mistä päättelet että piuhat ei mene sinne saakka ?

Ylös