Projet

Général

Profil

2 jalaffon
#ifdef M32C87
#include "sfr32c87.h"
#endif

#ifdef M32C83
#include "sfr32c83.h"
#endif


#include <itron.h>
#include <kernel.h>
#include "kernel_id.h"
#include "periph.h"
#include "uart0.h"
#include "dma0.h";



3 jalaffon
Tperiph periph['z'-'A'];
2 jalaffon
#define eot 0x0D

void periph_init (void)
{
int i;
uart0_init();
dma0_init();
3 jalaffon
for (i=0;i<'z'-'A';i++)
2 jalaffon
periph[i].maj=periph[i].val=periph[i].ev=0;

}

void periph_nom(char * nom){
char c;
int i=0;
c=*nom;
do{
periph_write('I',c);
dly_tsk(0);
i++;
3 jalaffon
if (i>=64) break;
2 jalaffon
}while (c=*(++nom));
periph_write('I',0);
dly_tsk(0);
}

int periph_read (unsigned char a,int * val)
{
int i;
/* addr &= ~0x20;
addr = addr -'A';
if (addr>26)
return 0;
*/
if (!periph[ADDR(a)].maj){
periph_inter(a);
// dly_tsk(10);
}
if (periph[ADDR(a)].maj) {
periph[ADDR(a)].maj=0;
*val = periph[ADDR(a)].val;
return 1;
}
*val = periph[ADDR(a)].val;
return 0;
}

void periph_write(char addr,int valeur)
{
CanFrame comm;
comm.data.id=addr; comm.data.rtr=':'; comm.data.val=valeur;
snd_dtq (CanTx, (VP_INT) comm.msg);
}

void iperiph_write(char addr,int valeur)
{
CanFrame comm;
comm.data.id=addr; comm.data.rtr=':'; comm.data.val=valeur;
ipsnd_dtq (CanTx, (VP_INT) comm.msg);
}

void periph_inter(char addr)
{
CanFrame comm;
comm.data.id=addr; comm.data.rtr='?';
snd_dtq (CanTx,(VP_INT) comm.msg);
}

void iperiph_inter(char addr)
{
CanFrame comm;
comm.data.id=addr; comm.data.rtr='?';
ipsnd_dtq (CanTx,(VP_INT) comm.msg);
}

void periph_even(char addr)
{
CanFrame comm;
comm.data.id=addr; comm.data.rtr='!';
snd_dtq (CanTx,(VP_INT) comm.msg);
}

void iperiph_even(char addr)
{
CanFrame comm;
comm.data.id=addr; comm.data.rtr='!';
ipsnd_dtq (CanTx,(VP_INT) comm.msg);
}

3 jalaffon
static int hex_2_int (char * str)
{
int i;
long val;
val=0;
for (i=0;i<4;i++)
{
val=(val*16);
val+=(str[i]>='A')?(int) str[i]-'A'+10:(int)str[i]-'0';
}
if (val>0x7FFF) val=val-0x10000;
return val;
2 jalaffon
}

static void int_2_hex(unsigned int val, char * str)
{
int i;
char c;

for (i=3;i>=0;i--)
{
c = val & 0x0F;
c+='0';
if (c>'9') c+='A'-'9'-1;
str[i]=c;
val=val>>4;
}
}

void periph_rx(VP_INT foo)
{
char c;
unsigned int valeur;
CanFrame msg;

while (1)
{
if (rcv_dtq (CanRx,(VP_INT *) &msg)==E_OK)
{
c=msg.data.id;
if (c=='!'){
set_flg(event,msg.data.val);
continue;
}
if (c<'A' || c>'z')
continue;
c=ADDR(msg.data.id);

if (msg.data.rtr=='!'){
periph[c].val=1;
periph[c].maj++;
if (periph[c].ev)
set_flg(ev_periph,periph[c].ev);
continue;
}

if (msg.data.rtr==':'){
periph[c].val=msg.data.val;
periph[c].maj++;
if (periph[c].ev)
set_flg(ev_periph,periph[c].ev);
continue;
}
}
}
}

void periph_tx(VP_INT foo) // test emission trame formatee
{
CanFrame rec;
char buf_em[8];
UINT flag;
char valid;

while(1)
{
if (rcv_dtq (CanTx,(VP_INT *) &rec.msg)==E_OK)
{
//buf_em[0]=eot; //0x0A??
buf_em[0]=rec.data.id;
valid=0;
if (rec.data.rtr==':' || rec.data.rtr==0){
buf_em[1]=':';
int_2_hex (rec.data.val,&buf_em[2]);
buf_em[6]=eot;
buf_em[7]=0;
valid=1;
}
if (rec.data.rtr=='?' || rec.data.rtr==1){
buf_em[1]='?';
buf_em[2]=eot;
buf_em[3]=0;
//buf_em[3]=buf_em[4]=buf_em[5]=buf_em[6]='-';
//buf_em[4]=0;
valid=1;
}
if (!valid)
continue;

uart0_itx(buf_em);
/* uart0_str_dma(buf_em); // declenche transfert
// Attention le debugger peu prendre la main n'importe quand et bloquer
// la detection de fin d'envoi de message
// Le timeout permet de debloquer la situation

wai_flg(ev_bus_fin_tr,(FLGPTN) 0x0001,TWF_ANDW,&flag);

//twai_flg(ev_bus_fin_tr,(FLGPTN) 0x0001,TWF_ANDW,&flag,5);
//clr_flg( ID_ev_bus_fin_tr,(FLGPTN) 0);
*/
wai_flg(ev_bus_fin_tr,(FLGPTN) 0x0001,TWF_ANDW,&flag);
}
}
}