setup.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <thread.h>
  4. #include "usb.h"
  5. int
  6. setupcmd(Endpt *e, int type, int req, int value, int index, byte *data, int count)
  7. {
  8. byte *wp;
  9. int n, i, fd;
  10. if (e == nil)
  11. abort();
  12. fd = e->dev->setup;
  13. if(fd < 0)
  14. sysfatal("RSC: this used to use the global usbsetup0\n");
  15. wp = malloc(8+count);
  16. if (wp == nil) sysfatal("setupcmd: malloc");
  17. wp[0] = type;
  18. wp[1] = req;
  19. PUT2(wp+2, value);
  20. PUT2(wp+4, index);
  21. PUT2(wp+6, count);
  22. memmove(wp+8, data, count);
  23. if (debugdebug) {
  24. fprint(2, "out\t%d\t[%d]", fd, 8+count);
  25. for(i=0; i<8+count; i++)
  26. fprint(2, " %.2ux", wp[i]);
  27. fprint(2, "\n");
  28. }
  29. n = write(fd, wp, 8+count);
  30. if (n < 0) {
  31. fprint(2, "setupcmd: write err: %r\n");
  32. return -1;
  33. }
  34. if (n != 8+count) {
  35. fprint(2, "setupcmd: short write: %d\n", n);
  36. return -1;
  37. }
  38. return n;
  39. }
  40. int
  41. setupreq(Endpt *e, int type, int req, int value, int index, int count)
  42. {
  43. byte *wp, buf[8];
  44. int n, i, fd;
  45. if (e == nil)
  46. abort();
  47. fd = e->dev->setup;
  48. if(fd < 0)
  49. sysfatal("RSC: this used to use the global usbsetup0\n");
  50. wp = buf;
  51. wp[0] = type;
  52. wp[1] = req;
  53. PUT2(wp+2, value);
  54. PUT2(wp+4, index);
  55. PUT2(wp+6, count);
  56. if (debugdebug) {
  57. fprint(2, "out\t%d\t[8]", fd);
  58. for(i=0; i<8; i++)
  59. fprint(2, " %.2ux", buf[i]);
  60. fprint(2, "\n");
  61. }
  62. n = write(fd, buf, 8);
  63. if (n < 0) {
  64. fprint(2, "setupreq: write err: %r\n");
  65. return -1;
  66. }
  67. if (n != 8) {
  68. fprint(2, "setupreq: short write: %d\n", n);
  69. return -1;
  70. }
  71. return n;
  72. }
  73. int
  74. setupreply(Endpt *e, void *buf, int nb)
  75. {
  76. uchar *p;
  77. int i, fd, nr;
  78. char err[32];
  79. fd = e->dev->setup;
  80. if(fd < 0)
  81. sysfatal("RSC: this used to use the global usbsetup0\n");
  82. while ((nr = read(fd, buf, nb)) < 0) {
  83. rerrstr(err, sizeof err);
  84. if (strcmp(err, "interrupted") != 0)
  85. break;
  86. }
  87. p = buf;
  88. if (debugdebug) {
  89. fprint(2, "in\t%d\t[%d]", fd, nr);
  90. for(i=0; i<nr; i++)
  91. fprint(2, " %.2ux", p[i]);
  92. fprint(2, "\n");
  93. }
  94. return nr;
  95. }