00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "korebot.h"
00017
00033
00041 void kio_GetFWVersion( knet_dev_t * dev ,
00042 unsigned int * version )
00043 {
00044 unsigned char val;
00045
00046 knet_read8( dev , KIO_FWVersion, &val );
00047 *version = val;
00048 }
00049
00050
00051
00067 int kio_ReadAnalog(knet_dev_t * dev, unsigned int an, uint16_t *value, uint32_t *time)
00068 {
00069 char addr;
00070 char val;
00071 char buf[6];
00072 char * ptr;
00073 char i;
00074
00075 if(an > 11)
00076 return -1;
00077
00078 addr = KIO_ANReadBase + (an * 6);
00079
00080 i = 0;
00081 while(i < 6)
00082 {
00083 if(knet_read8(dev , addr, &buf[i]) < 0)
00084 return -2;
00085 i++;
00086 addr++;
00087 }
00088
00089 ptr = (char*)value;
00090 ptr[0] = buf[1];
00091 ptr[1] = buf[0];
00092
00093 ptr = (char*)time;
00094 ptr[0] = buf[5];
00095 ptr[1] = buf[4];
00096 ptr[2] = buf[3];
00097 ptr[3] = buf[2];
00098
00099 return 0;
00100 }
00101
00102
00103
00104
00105
00123 int kio_ReadCAN(knet_dev_t * dev, uint32_t *id, char *len, uint32_t *can_data1, uint32_t *can_data2, char *can_status, uint32_t *time)
00124 {
00125 char n_mess;
00126 char addr;
00127 char val;
00128 char buf[19];
00129 char * ptr;
00130 int i;
00131
00132 addr = KIO_CANReadBase;
00133
00134 if (knet_lltransfer( dev, &addr, 1, buf, 19) < 0)
00135 return -2;
00136 if(buf[0] == 0)
00137 return -1;
00138
00139
00140 n_mess = buf[0] - 1;
00141
00142 ptr = (char*)id;
00143 ptr[0] = buf[1];
00144 ptr[1] = buf[2];
00145 ptr[2] = buf[3];
00146 ptr[3] = buf[4];
00147
00148 ptr = (char*)len;
00149 ptr[0] = buf[5];
00150
00151 ptr = (char*)can_data1;
00152 ptr[0] = buf[9];
00153 ptr[1] = buf[8];
00154 ptr[2] = buf[7];
00155 ptr[3] = buf[6];
00156
00157 ptr = (char*)can_data2;
00158 ptr[0] = buf[13];
00159 ptr[1] = buf[12];
00160 ptr[2] = buf[11];
00161 ptr[3] = buf[10];
00162
00163 ptr = (char*)can_status;
00164 ptr[0] = buf[14];
00165
00166 ptr = (char*)time;
00167 ptr[0] = buf[15];
00168 ptr[1] = buf[16];
00169 ptr[2] = buf[17];
00170 ptr[3] = buf[18];
00171
00172 addr = KIO_ClearCAN;
00173 knet_write8(dev, addr, 0);
00174
00175 return n_mess;
00176
00177 }
00178
00179
00195 int kio_SendCAN(knet_dev_t * dev, uint32_t id, uint32_t can_data1, uint32_t can_data2, char len, char can_status)
00196 {
00197 char addr;
00198 char val;
00199 char temp;
00200
00201 if (len > 8)
00202 len = 8;
00203
00204 addr = KIO_CANWriteBase;
00205
00206 temp = id >> 24;
00207 knet_write8(dev, addr, temp);
00208 temp = id >> 16;
00209 knet_write8(dev, addr, temp);
00210 temp = id >> 8;
00211 knet_write8(dev, addr, temp);
00212 temp = id;
00213 knet_write8(dev, addr, temp);
00214
00215 addr++;
00216
00217 temp = can_data1 >> 24;
00218 knet_write8(dev, addr, temp);
00219 temp = can_data1 >> 16;
00220 knet_write8(dev, addr, temp);
00221 temp = can_data1 >> 8;
00222 knet_write8(dev, addr, temp);
00223 temp = can_data1;
00224 knet_write8(dev, addr, temp);
00225
00226 temp = can_data2 >> 24;
00227 knet_write8(dev, addr, temp);
00228 temp = can_data2 >> 16;
00229 knet_write8(dev, addr, temp);
00230 temp = can_data2 >> 8;
00231 knet_write8(dev, addr, temp);
00232 temp = can_data2;
00233 knet_write8(dev, addr, temp);
00234
00235 addr+= 2;
00236
00237
00238 knet_write8(dev, addr, can_status);
00239 addr--;
00240
00241 knet_write8(dev, addr, len);
00242
00243 addr = KIO_Status;
00244 knet_read8(dev,addr,&val);
00245
00246 return val;
00247
00248
00249 }
00250
00251
00252
00265 int kio_SetANValue(knet_dev_t * dev, unsigned int an, unsigned int value)
00266 {
00267 char addr;
00268
00269 if(an > 7)
00270 return -1;
00271
00272 addr = KIO_ANWriteBase + an;
00273
00274 knet_write8(dev, addr, value);
00275
00276 return 0;
00277 }
00278
00279
00280
00296 int kio_ConfigIO(knet_dev_t * dev, unsigned io, unsigned config)
00297 {
00298 if(io > 15)
00299 return -1;
00300
00301 switch(config)
00302 {
00303 case 0 :
00304 knet_write8(dev , KIO_IOConfigIn, io);
00305 break;
00306 case 1 :
00307 knet_write8(dev , KIO_IOConfigOut, io);
00308 break;
00309 case 2 :
00310 knet_write8(dev , KIO_IOConfigPwm, io);
00311 break;
00312 default:
00313 return -2;
00314 break;
00315 }
00316 return 0;
00317 }
00318
00319
00331 int kio_ReadIO(knet_dev_t * dev, unsigned int io)
00332 {
00333 char val;
00334
00335 if(io > 15)
00336 return -1;
00337
00338 knet_read8(dev , KIO_IOReadBase + io, &val);
00339
00340 if(val == 2)
00341 return -2;
00342 else
00343 return val;
00344 }
00345
00346
00358 int kio_SetIO(knet_dev_t * dev, unsigned int io)
00359 {
00360 if(io > 15)
00361 return -1;
00362
00363 knet_write8(dev , KIO_IOSetBase, io);
00364
00365 return 0;
00366 }
00367
00368
00381 int kio_ChangeLed(knet_dev_t * dev, unsigned state)
00382 {
00383 char addr;
00384
00385 if(state > 2)
00386 return -1;
00387
00388 addr = KIO_IOChgLed + state;
00389 knet_write8(dev , addr, 16);
00390
00391 return 0;
00392 }
00393
00394
00406 int kio_ChangeIO(knet_dev_t * dev, unsigned int io)
00407 {
00408 if(io > 15)
00409 return -1;
00410
00411 knet_write8(dev , KIO_IOChgBase, io);
00412
00413 return 0;
00414 }
00415
00427 int kio_ClearIO(knet_dev_t * dev, unsigned int io)
00428 {
00429 if(io > 15)
00430 return -1;
00431
00432 knet_write8(dev , KIO_IOClearBase, io);
00433
00434 return 0;
00435 }
00436
00437
00449 int kio_ChangePWM_ratio(knet_dev_t * dev, unsigned int io, unsigned int ratio)
00450 {
00451 char addr;
00452
00453 if (io > 15)
00454 return -1;
00455
00456 addr = KIO_PWMRatio + io;
00457 knet_write8(dev, addr, ratio);
00458
00459 return 0;
00460 }
00461
00462
00473 int kio_ChangePWM_freq(knet_dev_t * dev, uint16_t freq)
00474 {
00475 char addr;
00476 char temp;
00477
00478 addr = KIO_FreqBase;
00479
00480 temp = freq;
00481 knet_write8(dev, addr, temp);
00482
00483 addr++;
00484 temp = freq >> 8;
00485 knet_write8(dev, addr, temp);
00486
00487 return 0;
00488 }
00489
00490
00501 int kio_ChangePW(knet_dev_t * dev, unsigned int io)
00502 {
00503 if(io > 6)
00504 return -1;
00505
00506 knet_write8(dev , KIO_PWChgBase, io);
00507
00508 return 0;
00509 }
00510
00511
00522 int kio_SetPW(knet_dev_t * dev, unsigned int io)
00523 {
00524 if(io > 6)
00525 return -1;
00526
00527 knet_write8(dev , KIO_PWSetBase, io);
00528
00529 return 0;
00530 }
00531
00532
00543 int kio_ClearPW(knet_dev_t * dev, unsigned int io)
00544 {
00545 if(io > 6)
00546 return -1;
00547
00548 knet_write8(dev , KIO_PWClearBase, io);
00549
00550 return 0;
00551 }
00552
00553
00567 int kio_Timer(knet_dev_t * dev, unsigned action)
00568 {
00569 if(action > 2)
00570 return -1;
00571
00572 knet_write8(dev , KIO_TimerBase, action);
00573
00574 return 0;
00575 }
00576
00577
00583 void kio_i2c_StartScan(knet_dev_t * dev)
00584 {
00585 knet_write8(dev, KIO_I2CScan, 1);
00586 }
00587
00588
00602 int kio_i2c_ListScan(knet_dev_t * dev, char * list)
00603 {
00604 unsigned char val;
00605 char addr;
00606 int len;
00607
00608 if(!list)
00609 return -1;
00610
00611
00612 knet_read8( dev , KIO_I2C_ScanRead, &val );
00613 len = val;
00614 addr = KIO_I2CList;
00615
00616 if (knet_lltransfer( dev, &addr, 1, list, len) < 0)
00617 return -2;
00618
00619 return val;
00620 }
00621
00622
00632 void kio_i2c_StartRead(knet_dev_t * dev, char device, char reg, char n_read)
00633 {
00634 char addr;
00635
00636 addr = KIO_I2CReadBase +1;
00637 knet_write8(dev, addr, device);
00638
00639 if(n_read > 4)
00640 n_read = 4;
00641 addr++;
00642 knet_write8(dev, addr, n_read);
00643
00644 knet_write8(dev, KIO_I2CReadBase, reg);
00645
00646 }
00647
00648
00661 int kio_i2c_ReturnRead(knet_dev_t * dev, char n_read, uint32_t *values)
00662 {
00663 char addr;
00664 char buf[4];
00665 char i;
00666 char *ptr;
00667
00668 if (n_read > 4)
00669 n_read = 4;
00670
00671 addr = KIO_I2CReturnRead;
00672 if (knet_lltransfer( dev, &addr, 1, buf, n_read) < 0)
00673 return -2;
00674
00675 ptr = (char*)values;
00676
00677 i = 0;
00678 while(i < n_read)
00679 {
00680 ptr[i] = buf[i];
00681 i++;
00682 }
00683 return 0;
00684 }
00685
00686
00699 int kio_i2c_Write(knet_dev_t * dev, char device, char reg, char txdata)
00700 {
00701
00702 char addr;
00703
00704 addr = KIO_I2CWriteAddr;
00705
00706 knet_write8(dev, addr, device);
00707
00708 addr++;
00709 knet_write8(dev, addr, reg);
00710
00711 addr = KIO_I2CWriteBase;
00712 knet_write8(dev, addr, txdata);
00713
00714 }