simplifying of the proto spaghetti code (still doesn't work)

master
Dario Ernst 15 years ago
parent c6542e4a3f
commit 8c24da5c8c

@ -106,12 +106,13 @@ int cnt, vid, pid;
if(cnt < 0){
fprintf(stderr, "\nUSB error in iteration %d: %s\n", i, usb_strerror());
}
rxValue = ((int)buffer[1] & 0xff) | (((int)buffer[0] & 0xff) << 8);
rxIndex = ((int)buffer[3] & 0xff) | (((int)buffer[2] & 0xff) << 8);
rxIndex = ((int)buffer[1] & 0xff) | (((int)buffer[0] & 0xff) << 8);
fprintf(stderr, "request = 0x%04x\n", opcode);
fprintf(stderr, "rxValue = 0x%04x value = 0x%04x\n", rxValue, addr);
fprintf(stderr, "rxIndex = 0x%04x index = 0x%04x\n", rxIndex, value);
// fprintf(stderr, "answer: opcode=0x%02x addr=0x%02x value=0x%04x (%i)\n", buffer[1],buffer[0],rxIndex,rxIndex);
fprintf(stderr, "answer: value=0x%04x (%i)\n", rxIndex,rxIndex);
// fprintf(stderr, "rxValue = 0x%04x value = 0x%04x\n", rxValue, addr);
// fprintf(stderr, "rxIndex = 0x%04x index = 0x%04x\n", rxIndex, value);
} else {
usage();
}

@ -10,6 +10,7 @@
usbMsgLen_t usbFunctionSetup(uchar data[8]) {
usbRequest_t *rq = (void *)data;
static uchar dataBuffer[5];
uint16_t recv;
if(rq->bRequest == 100) {
dataBuffer[0] = (thermoData [0] & 0xff00)>>8;
@ -26,23 +27,18 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) {
usbMsgPtr = dataBuffer;
return 4;
} else {
uint8_t opcode = (uint8_t) ((rq->bRequest & 0xff00)>>8);
uint8_t opcode = (uint8_t) rq->bRequest;
uint8_t addr = (uint8_t) rq->wValue.bytes[0];
uint8_t valH = (uint8_t) rq->wIndex.bytes[0];
uint8_t valL = (uint8_t) rq->wIndex.bytes[1];
uint16_t send = (valH << 8) | valL;
// uint16_t recv = spi_master_communicate(opcode, addr, send);
uint16_t recv = spi_master_transceive(opcode, addr, send);
dataBuffer[0] = opcode;
dataBuffer[1] = addr;
dataBuffer[2] = valH;
dataBuffer[3] = valL;
spi_mst_start_packet();
spi_mst_write_read(5,dataBuffer);
spi_mst_end_packet();
usbMsgPtr = dataBuffer+1;
return 4;
dataBuffer[0] = (recv & 0xff00) >> 8;
dataBuffer[1] = (recv & 0xff);
usbMsgPtr = dataBuffer;
return 2;
}

@ -126,24 +126,15 @@ void spi_mst_write_read(uint8_t len, uint8_t *data){
void spi_sla_handle_packet(){
// TODO: make slave not hangup in case of partial read
uint8_t opcode, addr, do_write;
uint16_t data;
opcode = readbuf[0];
addr = readbuf[1];
do_write = spi_proto_needswrite(opcode);
if(do_write){
data = spi_proto_handlewrite(opcode, addr);
writebuf[0]=opcode;
writebuf[1]=addr;
writebuf[2]=(data>>8)&0xff;
writebuf[3]=(data)&0xff;
} else {
writebuf[0]=0;
writebuf[1]=2;
writebuf[2]=4;
writebuf[3]=6;
data = (readbuf[3]<<8)&0xff | readbuf[4];
spi_proto_handleread(opcode, addr, data);
}
uint16_t data, newdata;
opcode = readbuf[1];
addr = readbuf[2];
data = (readbuf[3]<<8)&0xff | readbuf[4];
newdata = spi_proto_slaveaction(opcode, addr, data);
writebuf[0]=opcode;
writebuf[1]=addr;
writebuf[2]=(newdata>>8)&0xff;
writebuf[3]=(newdata)&0xff;
}

@ -22,6 +22,7 @@ void spi_mst_start_packet();
void spi_mst_end_packet();
void spi_mst_write(uint8_t len, uint8_t *data);
void spi_mst_read(uint8_t len, uint8_t *data);
void spi_mst_write_read(uint8_t len, uint8_t *data);
void spi_sla_handle_packet();

@ -3,88 +3,51 @@
/***** MASTER *****/
uint8_t read_data[2];
uint8_t write_data[4];
uint8_t mst_buf[5];
void talk_to_slave(uint8_t opcode, uint8_t addr, uint8_t flags)
uint16_t spi_master_transceive(uint8_t opcode, uint8_t addr, uint16_t value)
{
write_data[0] = opcode;
write_data[1] = addr;
spi_mst_start_packet();
spi_mst_write(flags & SPI_WRITE_DATA? 4 : 3, write_data);
spi_mst_read(flags & SPI_READ_DATA? 2 : 0, read_data);
spi_mst_end_packet();
}
uint16_t spi_master_communicate(uint8_t opcode, uint8_t addr, uint16_t value)
{
uint8_t flags = spi_proto_needs(opcode);
write_data[0] = opcode;
write_data[1] = addr;
write_data[2] = value >> 8;
write_data[3] = value & 0xff;
spi_mst_start_packet();
spi_mst_write_read(4,write_data);
spi_mst_end_packet();
while(write_data[0] == 0){
spi_mst_start_packet();
spi_mst_write_read(4,write_data);
spi_mst_end_packet();
}
return (write_data[2] << 8) | read_data[3];
}
uint8_t spi_proto_needs(uint8_t opcode)
{
uint8_t r = SPI_NONE;
switch(opcode)
{
case 1: case 2: case 3:
r = SPI_READ_DATA;
break;
case 4: case 5:
r = SPI_WRITE_DATA;
break;
}
return r;
do{
mst_buf[0] = opcode;
mst_buf[1] = addr;
mst_buf[2] = value >> 8;
mst_buf[3] = value & 0xff;
mst_buf[4] = 0; // additional 0 to read the last byte from the slave
spi_mst_start_packet();
spi_mst_write_read(5,mst_buf);
spi_mst_end_packet();
} while(mst_buf[1] == 0); // wait for echoed opcode
// bytes from slave are received shifted right by one
return (mst_buf[3] << 8) | mst_buf[4];
}
uint16_t read_temperature(uint8_t number)
{
talk_to_slave(1, number, SPI_READ_DATA);
return (read_data[0] << 8) | read_data[1];
return 0;
}
uint8_t read_var8(uint8_t number)
{
talk_to_slave(2, number, SPI_READ_DATA);
return read_data[1];
return 0;
}
uint16_t read_var16(uint8_t number)
{
talk_to_slave(3, number, SPI_READ_DATA);
return (read_data[0] << 8) | read_data[1];
return 0;
}
void write_var8(uint8_t number, uint8_t value)
{
write_data[2] = 0;
write_data[3] = number;
talk_to_slave(4, number, SPI_WRITE_DATA);
}
void write_var16(uint8_t number, uint16_t value)
{
write_data[2] = value >> 8;
write_data[3] = value & 0xff;
talk_to_slave(5, number, SPI_WRITE_DATA);
}
void call_func(uint8_t number)
{
talk_to_slave(6, number, SPI_NONE);
}
@ -92,33 +55,33 @@ void call_func(uint8_t number)
/***** SLAVE *****/
uint8_t spi_proto_needswrite(uint8_t opcode) {
if(opcode == 4 || opcode == 5) return 0;
return 1;
}
uint16_t spi_proto_handlewrite(uint8_t opcode, uint8_t addr) {
if(opcode == 4) {
return (uint16_t) (*spi_proto_globals8[addr]);
} else if(opcode == 5) {
return (*spi_proto_globals16[addr]);
} else {
return 0xFeFe;
}
}
void spi_proto_handleread(uint8_t opcode, uint8_t addr, uint16_t data) {
if(opcode == 2) {
*spi_proto_globals8[addr] = (uint8_t) data;
} else if(opcode == 3) {
*spi_proto_globals16[addr] = data;
} else if (opcode == 6) {
funptr_t func = spi_proto_funcs[addr];
(*func)();
} else {
// boom
}
uint16_t spi_proto_slaveaction(uint8_t opcode, uint8_t addr, uint16_t data) {
uint16_t retval = 0;
switch(opcode){
case 0:
retval = data;
break;
case 1:
//TODO
retval = 0;
break;
case 2:
retval = (*spi_proto_globals8[addr]);
break;
case 3:
retval = (*spi_proto_globals16[addr]);
break;
case 4:
(*spi_proto_globals8[addr]) = data;
break;
case 5:
(*spi_proto_globals16[addr]) = data;
break;
case 6:
(*spi_proto_funcs[addr])();
break;
}
return retval;
}
/***** SLAVE END *****/

@ -9,9 +9,8 @@
#define SPI_READ_DATA 0x10
#define SPI_NONE 0
uint16_t spi_master_communicate(uint8_t opcode, uint8_t address, uint16_t value);
uint16_t spi_master_transceive(uint8_t opcode, uint8_t address, uint16_t value);
uint8_t spi_proto_needs(uint8_t opcode);
uint16_t read_temperature(uint8_t number);
uint8_t read_var8(uint8_t number);
@ -30,9 +29,7 @@ extern funptr_t spi_proto_funcs[];
*/
#include "spi_pointers.h"
uint8_t spi_proto_needswrite(uint8_t opcode);
uint16_t spi_proto_handlewrite(uint8_t opcode, uint8_t addr);
void spi_proto_handleread(uint8_t opcode, uint8_t addr, uint16_t data);
uint16_t spi_proto_slaveaction(uint8_t opcode, uint8_t addr, uint16_t data);
/***** SLAVE END *****/

Loading…
Cancel
Save