-
-//! Handles a monitor command.
-void i2chandle(unsigned char app,
- unsigned char verb,
- unsigned char len){
- unsigned char i;
- switch(verb){
-
- case PEEK:
- break;
- case POKE:
- break;
-
- case READ:
- if(len>0) //optional parameter of length
- len=cmddata[0];
- if(!len) //default value of 1
- len=1;
- for(i=0;i<len;i++)
- cmddata[i]=I2C_Read(1); //Always acknowledge
- txdata(app,verb,len);
- break;
- case WRITE:
- cmddata[0]=0;
- for(i=0;i<len;i++)
- cmddata[0]+=I2C_Write(cmddata[i]);
- txdata(app,verb,1);
- break;
- case START:
- I2C_Start();
- txdata(app,verb,0);
- break;
- case STOP:
- I2C_Stop();
- txdata(app,verb,0);
- break;
- case SETUP:
- I2C_Init();
- txdata(app,verb,0);
- break;
- }
+//! Handles an i2c command.
+void i2c_handle_fn( uint8_t const app,
+ uint8_t const verb,
+ uint32_t const len)
+{
+ unsigned char i;
+ unsigned long l;
+ switch(verb)
+ {
+ case READ:
+ l = len;
+ if(l > 0) //optional parameter of length
+ l=cmddata[0];
+ if(!l) //default value of 1
+ l=1;
+ I2C_Start();
+ for(i=0; i < l; i++)
+ cmddata[i]=I2C_Read(i<l?1:0);
+ I2C_Stop();
+ txdata(app,verb,l);
+ break;
+ case WRITE:
+ I2C_Start();
+ cmddata[0] = cmddata[0] << 1;
+ for(i=0; i<len; i++) {
+ if (!I2C_Write(cmddata[i])) //if NACK
+ break;
+ }
+ I2C_Stop();
+ cmddata[0] = i;
+ txdata(app,verb,1);
+ break;
+ case PEEK:
+ l = cmddata[0];
+ I2C_Start();
+ unsigned char address = cmddata[1] << 1;
+ I2C_Write(address);
+ for(i=2; i < len; i++){
+ I2C_Write(cmddata[i]);
+ }
+ I2C_Start();
+ I2C_Write(address|1); // spit out the target address again and flip the read bit
+ I2CDELAY(1); // XXX We should wait for clock to go high here XXX
+ for(i=0; i < l; i++)
+ cmddata[i]=I2C_Read(i+1<l?1:0); // If the next i is still less than l, then ACK
+ I2C_Stop();
+ txdata(app,verb,l);
+ break;
+ case POKE:
+ break;
+
+ case START:
+ I2C_Start();
+ txdata(app,verb,0);
+ break;
+ case STOP:
+ I2C_Stop();
+ txdata(app,verb,0);
+ break;
+ case SETUP:
+ I2C_Init();
+ txdata(app,verb,0);
+ break;
+ }