1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "usrp_e.h"
// Usage: usrp_e_i2c w address data0 data1 data 2 ....
// Usage: usrp_e_i2c r address count
int main(int argc, char *argv[])
{
int fp, ret, i, tmp;
struct usrp_e_i2c *i2c_msg;
int direction, address, count;
if (argc < 3) {
printf("Usage: usrp-e-i2c w address data0 data1 data2 ...\n");
printf("Usage: usrp-e-i2c r address count\n");
printf("All addresses and data in hex.\n");
exit(-1);
}
if (strcmp(argv[1], "r") == 0) {
direction = 0;
} else if (strcmp(argv[1], "w") == 0) {
direction = 1;
} else {
return -1;
}
sscanf(argv[2], "%X", &address);
printf("Address = %X\n", address);
fp = open("/dev/usrp_e0", O_RDWR);
printf("fp = %d\n", fp);
sleep(1);
if (direction) {
count = argc - 3;
} else {
sscanf(argv[3], "%X", &count);
}
printf("Count = %X\n", count);
i2c_msg = malloc(sizeof(i2c_msg) + count * sizeof(char));
i2c_msg->addr = address;
i2c_msg->len = count;
for (i = 0; i < count; i++) {
i2c_msg->data[i] = i;
}
if (direction) {
// Write
for (i=0; i<count; i++) {
sscanf(argv[3+i], "%X", &tmp);
i2c_msg->data[i] = tmp;
}
ret = ioctl(fp, USRP_E_I2C_WRITE, i2c_msg);
printf("Return value from i2c_write ioctl: %d\n", ret);
} else {
// Read
ret = ioctl(fp, USRP_E_I2C_READ, i2c_msg);
printf("Return value from i2c_read ioctl: %d\n", ret);
printf("Ioctl: %d Data read :", ret);
for (i=0; i<count; i++) {
printf(" %X", i2c_msg->data[i]);
}
printf("\n");
}
return 0;
}
|