2 - Rx block size is limited to < 2048, hardware bug?
3 - Group size is limited to < page size, kernel alloc/mmap API issues
4 - test whether Tx is transmitting data from provided buffers
5 - handle device unplug case
6 - handle temperature above threshold
7 - use bus address instead of physical address for DMA
8 - support for snapshot mode
9 - audit userspace interfaces
10 - get reserved major/minor if needed
14 #include <sys/types.h>
17 #include <sys/ioctl.h>
25 #include <sysfs/libsysfs.h>
37 void process_group(unsigned char *buf, uint32_t size)
39 uint16_t *buf16 = (uint16_t *)buf;
41 printf("RX: %p %u %04x %04x %04x %04x %04x %04x\n", buf, size,
42 buf16[0], buf16[1], buf16[2], buf16[3], buf16[4], buf16[5]);
47 struct sysfs_attribute *attr;
50 unsigned long mmap_size;
55 struct pollfd poll_fds;
59 path = "/sys/class/pocketchange/poch0/ch0/block_size";
60 attr = sysfs_open_attribute(path);
61 ret = sysfs_write_attribute(attr, "256", strlen("256"));
63 error(1, errno, "error writing attribute %s", path);
64 sysfs_close_attribute(attr);
66 path = "/sys/class/pocketchange/poch0/ch0/group_size";
67 attr = sysfs_open_attribute(path);
68 ret = sysfs_write_attribute(attr, "4096", strlen("4096"));
70 error(1, errno, "error writing attribute %s", path);
71 sysfs_close_attribute(attr);
73 path = "/sys/class/pocketchange/poch0/ch0/group_count";
74 attr = sysfs_open_attribute(path);
75 ret = sysfs_write_attribute(attr, "64", strlen("64"));
77 error(1, errno, "error writing attribute %s", path);
78 sysfs_close_attribute(attr);
80 fd = open("/dev/ch0", O_RDWR);
82 error(1, errno, "error opening device node");
84 path = "/sys/class/pocketchange/poch0/ch0/mmap_size";
85 attr = sysfs_open_attribute(path);
86 ret = sysfs_read_attribute(attr);
88 error(1, errno, "error reading attribute %s", path);
89 printf("%s", attr->value);
90 sscanf(attr->value, "%lu", &mmap_size);
91 sysfs_close_attribute(attr);
93 cbuf = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE,
95 if (cbuf == MAP_FAILED)
96 error(1, errno, "error mapping DMA buffers");
98 ret = ioctl(fd, POCH_IOC_TRANSFER_START, 0);
100 error(1, errno, "error starting transfer");
104 struct pconsume consume;
106 consume.offsets = offsets;
108 consume.nflush = nflush;
110 ret = ioctl(fd, POCH_IOC_CONSUME, &consume);
112 error(1, errno, "error consuming groups");
114 nflush = consume.nfetch;
116 for (i = 0; i < nflush; i++) {
117 process_group(cbuf + consume.offsets[i], 4096);
128 ret = ioctl(fd, POCH_IOC_TRANSFER_STOP, 0);
130 error(1, errno, "error starting transfer");
135 Please send patches to Greg Kroah-Hartman <greg@kroah.com> and
136 Vijay Kumar <vijaykumar@bravegnu.org> and Jaya Kumar <jayakumar.lkml@gmail.com>