Initial check in
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
#include <fx2.h>
|
||||
#include <fx2_regs.h>
|
||||
#include <fx2_i2c.h>
|
||||
#include <fx2_eeprom.h>
|
||||
#include <tri.h>
|
||||
//#include <lcd\lcd_7565r.h>
|
||||
|
||||
#define DATAINPTR ((BYTE xdata *)&EP1INBUF [8])
|
||||
#define DATAOUTPTR ((BYTE xdata *)&EP1OUTBUF[8])
|
||||
|
||||
|
||||
//extern BYTE fx2_i2c_read( BYTE, BYTE, BYTE xdata *);
|
||||
|
||||
|
||||
// ================================================================================================
|
||||
// EP1
|
||||
//
|
||||
// Default processing of I2C and EEPROM packets. Inherited EP1 packet handlers normally
|
||||
// don't override I2C and EEPROM packet processing. They implement (most of the time) new
|
||||
// features, which have simple data transfer only. EP1 is not intented to use for transfering
|
||||
// large amount of data, e.g.: jtag, or LA stream.
|
||||
//
|
||||
// BUF[0] : dir[7] + command[6..0]
|
||||
// BUF[1] : address
|
||||
// BUF[2] : address ext
|
||||
// BUF[3] : subaddress[lo]/eeprom page address[lo]
|
||||
// BUF[4] : subaddress[hi]/eeprom page address[lo]
|
||||
// BUF[5] : length (max 32)
|
||||
// BUF[6] : offset
|
||||
// BUF[7] : timeout in ms
|
||||
// ================================================================================================
|
||||
void tri_ep1out( void)
|
||||
{
|
||||
bool rd; // true if eeprom/i2c xfer operation is read
|
||||
BYTE cmd; // the actual command
|
||||
|
||||
WORD address; // device address + address extension
|
||||
WORD subaddr; // sub address for repeated start read
|
||||
WORD page; // eeprom page number
|
||||
BYTE length; // data length
|
||||
BYTE offset; // offset in eeprom page
|
||||
BYTE tmo; // timeout
|
||||
|
||||
// ------------------------------------------------------
|
||||
// parse command
|
||||
// ------------------------------------------------------
|
||||
rd = EP1OUTBUF[0] & 0x80;
|
||||
cmd = EP1OUTBUF[0] & 0x7F;
|
||||
|
||||
address = *(WORD*)&EP1OUTBUF[1]; // I2C address
|
||||
subaddr = *(WORD*)&EP1OUTBUF[3]; // sub address for RS
|
||||
page = *(WORD*)&EP1OUTBUF[3]; // page number
|
||||
length = *(BYTE*)&EP1OUTBUF[5]; // data length
|
||||
offset = *(BYTE*)&EP1OUTBUF[6]; // offset in page
|
||||
tmo = *(BYTE*)&EP1OUTBUF[7]; // timeout
|
||||
|
||||
if( length > 132)
|
||||
length = 132;
|
||||
|
||||
// ------------------------------------------------------
|
||||
// prepare status block
|
||||
// ------------------------------------------------------
|
||||
EP1INBUF[0] = EP1OUTBUF[0];
|
||||
EP1INBUF[1] = EP1OUTBUF[1];
|
||||
EP1INBUF[2] = EP1OUTBUF[2];
|
||||
EP1INBUF[3] = EP1OUTBUF[3];
|
||||
EP1INBUF[4] = EP1OUTBUF[4];
|
||||
EP1INBUF[5] = EP1OUTBUF[5];
|
||||
EP1INBUF[6] = EP1OUTBUF[6];
|
||||
EP1INBUF[7] = I2C_OK;
|
||||
|
||||
if(rd)
|
||||
{
|
||||
switch(cmd)
|
||||
{
|
||||
case CMD_IIC_READ:
|
||||
EP1INBUF[7] = fx2_i2c_read( address, length, DATAINPTR);
|
||||
EP1INBC = 8 +length;
|
||||
break;
|
||||
|
||||
case CMD_IIC_READ_RSW:
|
||||
EP1INBUF[7] = fx2_i2c_read_rsw( address, subaddr, length, DATAINPTR);
|
||||
EP1INBC = 8 +length;
|
||||
break;
|
||||
/*
|
||||
case 1://CMD_EEPROM_BOOT:
|
||||
EP1INBUF[7] = FX2_EEPROM_ReadPage0( 0,8, DATAINPTR);
|
||||
EP1INBC = 8 +8;
|
||||
break;
|
||||
|
||||
case 2://CMD_EEPROM_RAW:
|
||||
EP1INBUF[7] = FX2_EEPROM_ReadPage( page, 32, DATAINPTR);
|
||||
EP1INBC = 8 +32;
|
||||
break;
|
||||
*/
|
||||
default:
|
||||
EP1INBC = 8;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// *(WORD*)&EP1INBUF[6] = length;
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case CMD_IIC_WRITE:
|
||||
EP1INBUF[7] = fx2_i2c_write( address, length, DATAOUTPTR);
|
||||
/*
|
||||
lcd_gotoxy( 0, 1);
|
||||
lcd_putx2(EP1OUTBUF[0]);
|
||||
lcd_putx2(EP1OUTBUF[1]);
|
||||
lcd_putx2(EP1OUTBUF[2]);
|
||||
lcd_putx2(EP1OUTBUF[3]);
|
||||
lcd_putx2(EP1OUTBUF[4]);
|
||||
lcd_putx2(EP1OUTBUF[5]);
|
||||
lcd_putx2(EP1OUTBUF[6]);
|
||||
lcd_putx2(EP1OUTBUF[7]);
|
||||
*/
|
||||
break;
|
||||
|
||||
case 1://CMD_EEPROM_RAW:
|
||||
EP1INBUF[7] = FX2_EEPROM_WritePage( page, 32, DATAOUTPTR);
|
||||
break;
|
||||
}
|
||||
|
||||
EP1INBC = 8;
|
||||
}
|
||||
|
||||
EP1OUTBC = 0x40; // re-arm EP1OUT
|
||||
}
|
||||
Reference in New Issue
Block a user