[linux] seriovy port a i2c

Marek Blasko blasko na vuje.sk
Pondělí Listopad 15 07:35:34 CET 1999


Dado Jan wrote:
> Nuz snazil som sa ti pomoct, ale neviem preco, neozval si sa.

nie tak smutne ja som nezabudol len mam trocha viac roboti ako zvladam. posielam
ti program kto ri som cez vykend zosmolil este nieje funkcny ale dufam ze
coskoro bude.

> Dufam ze tak este urobis, lebo uz som nasiel par veci o I2C, ktore som ti
> inak popisal v predchadzajucom maily (pre ostatnych: sukromnom, ak mate
> zaujem, je k dispozicii).

ak mozes tak posli a ja dufam ze to coskoro spravim do funkcneho stavu.

> Prezrel som serp84 aj prog84. Serp to robi cez ioperm, prog84 cez
> /dev/port.

ja sa to skusam robit cez ioperm.

> Inak je to velmi jednoduhe. Takze ak mi presne povies s ktorou castou mas
> problem, mozem ti rychlo odpisat, pripadne dat link na i2c. Len prosim
> specifikuj tvoj problem, obzvlast po tom, co som ti uz nieco poslal.

o tej jednoduchosti: to som si vsimol ale clovek najprv musi vediet tu cestu.

takze v prilohach je program i2cread.c system som odkukal z jedneho
readeru/writeru pre windows len som trochu upravil volave funkcie lebo povodne
boli robrnr cez vela zbitocnich premmenych. tak si to pozrite a poradte.
upozornujem ze to este nefunguje.

dakujem.

P.S.
v prilohe je aj reader.c je to program na citanie slovenskych telefonnych karied
(neskor to ma sluzit na prihlasovanie namiesto hesla) len neviem preco my necita
vystupne signaly RSR,CLK su funkcne a spravaju sa ako maju. je tam nastavena
dost velka medzera abi sa dalo sledovat co robi.
-- 
niesom pokoreny!
len rijem drzkou v zemi.
		klasik

Zz_indigo /*Marek Blasko*/
------------- další část ---------------
#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>

//Nastavenia
#define OUTAD 0x378  //adresa par. portu
#define INAD OUTAD+1 
#define CLK	0x02
#define RST	0x04
#define ON	0xf8
#define DATA	0x80
#define SLEP	5000
resetb() //reset karty
{ 
printf("reset\n");
	outb(ON,OUTAD);
	usleep(SLEP);
	outb(RST|ON,OUTAD);
	usleep(SLEP);
	outb(RST|CLK|ON,OUTAD);
	usleep(SLEP);
	outb(ON,OUTAD);
}

char readby() //nacitanie znaku
{ 
char outbyt=0,test;
int bit;
printf("read\n");
	for(bit=1;bit<256;bit<<=1)
		{
		if((test=inb(INAD))&DATA)
			outbyt=outbyt | bit;
		printf("++++%i\n",(int) test);
		outb(CLK|ON,OUTAD);
		usleep(SLEP);
		outb(ON,OUTAD);
		usleep(SLEP);
		}
	return(outbyt);
}

main()
{ 
int a;
ioperm(OUTAD,2,1);
resetb();
for(a=16;a!=0;a--)
	printf("%i \n",(int) readby());
outb(0,OUTAD);
}
------------- další část ---------------
#include <stdio.h>
#include <sys/io.h>
#include <unistd.h>

//utilita na poslanie signalu;
#define SCL 2		//bit nastavujuci scl vodic
#define N_SCL 253
#define SDA 1   	//bit nastavujuci sda vodic
#define N_SDA 254
#define SAN 252 	//netusim
#define READM 32	//vstupny bit
#define PAUSE 10 	//cas v microsekundach
#define PORT 0x2f8	//adresa portu

char outbit=SAN;

sda()
{
        outbit|=SDA;
        outb(outbit,PORT);
}

scl()
{
        outbit|=SCL;
        outb(outbit,PORT);
}

n_sda()
{
        outbit&=N_SDA;
        outb(outbit,PORT);
}

n_scl()
{
        outbit&=N_SCL;
        outb(outbit,PORT);
}
	
char wait()
{
	usleep(PAUSE);
	return(inb(PORT+1));
}

start() //startovaci signal
{
	scl();
	sda();
	wait();wait();wait();wait();
	n_sda();
	wait();
	n_scl();
	wait();
}

ende() //konciaci signal
{
	n_sda();
	wait();
	scl();
	wait();
	sda();
	wait();wait();
}

ack() // neviem ale je to nejake potvrdzovanie alebo co?
{
	sda();
	wait();
	scl();
	wait();
	n_scl();
}

high()	// zebi 1
{
	sda();
	wait();
	scl();
	wait();
	n_scl();
}

low()	// zebi 0
{
	n_sda();
	wait;
	scl();
	wait;
	n_scl();
}

char readbit()	//to je asi jasne uz z nazvu
{
char dx;
	sda();
	wait();
	scl();
	wait();
	dx=inb(PORT+1);
	n_scl();
	return(dx);
}

sendbyte(dta)	//posle znak dta
char dta;
{
char d;
	for(d=128;d!=0;d<<=1)
		{
		if(d&dta)
			high;
		else
			low;

		d>>=1;
		}
}

char readbyte()		//precita znak
{
char d,dat;
	dat=0;
	for(d=128;d!=0;d<<=1)
		if(readbit()&READM)
			dat|=d;
	return(dat);
}

aktiv1()
{
	sendbyte(160);
	ack();
}

aktiv2()
{
	sendbyte(161);
	ack();
}

getadress(ad)	//zadanie adresi
unsigned int ad;
{
	start();
	aktiv1();
	sendbyte(ad/256);
	ack();
	sendbyte(ad&255);
	ack();
}

writecom(adr,da)
unsigned int adr;
char da;
{
	getadress(adr);
	sendbyte(da);
	ack();
	ende();
}

char readcom(adr)
unsigned int adr;
{
char da;
	getadress(adr);
	start();
	aktiv2();
	da=readbyte();
	ack();
	ende();
	return(da);
}

main()
{
char buf[256],i;
unsigned int adres;
int coun;
ioperm(PORT,2,1);
printf("1-write string\n2-readstring");
scanf("%c",&i);
if(i=='1')
	{
	printf("napis text:");
	scanf("%s",&buf[0]);
	for(coun=0;buf[coun]!=0;coun++)
		writecom(coun,buf[coun]);
	}
else
	{
	for(coun=0;(buf[coun]=readcom(coun))!=0;coun++);
	printf("%s\n",buf);
	}
}



Další informace o konferenci linux