PageRenderTime 60ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/psp/usbsnoopdriver/main.c

https://github.com/vpelletier/ps3-memorycard-adapter
C | 447 lines | 365 code | 52 blank | 30 comment | 14 complexity | 677a2b6894f48c1058765448858833ca MD5 | raw file
Possible License(s): GPL-2.0
  1. #include <pspkernel.h>
  2. #include <pspdebug.h>
  3. #include <pspkdebug.h>
  4. #include <pspsdk.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <pspusb.h>
  9. #include <pspusbbus.h>
  10. #include "usbsnoopdriver.h"
  11. #define ENDPOINT_COUNT 4
  12. #define ENDPOINT_DESCRIPTOR_COUNT (ENDPOINT_COUNT - 1)
  13. /* XXX: the exact set of required flags is unknown. */
  14. PSP_MODULE_INFO(MODULE_NAME, PSP_MODULE_KERNEL | PSP_MODULE_SINGLE_START |
  15. PSP_MODULE_SINGLE_LOAD | PSP_MODULE_NO_STOP, 1, 1);
  16. enum UsbEvents {
  17. SEND_TO_HOST_FLAG = 1,
  18. HOST_ATTACHED_FLAG = 2,
  19. };
  20. struct UsbDeviceReqParam {
  21. SceUID user_event;
  22. int user_event_flag;
  23. int *recv_size;
  24. };
  25. static SceUID g_events = -1;
  26. /* HI-Speed device descriptor */
  27. struct DeviceDescriptor devdesc_hi = {
  28. .bLength = 18,
  29. .bDescriptorType = 0x01,
  30. .bcdUSB = 0x200,
  31. .bDeviceClass = 0xff, //0,
  32. .bDeviceSubClass = 0,
  33. .bDeviceProtocol = 0xff, //0,
  34. .bMaxPacketSize = 64,
  35. .idVendor = SONY_VID, //0,
  36. .idProduct = SNOOPDRIVER_PID, //0,
  37. .bcdDevice = 0x100,
  38. .iManufacturer = 0,
  39. .iProduct = 0,
  40. .iSerialNumber = 0,
  41. .bNumConfigurations = 1
  42. };
  43. /* Hi-Speed configuration descriptor */
  44. struct ConfigDescriptor confdesc_hi = {
  45. .bLength = 9,
  46. .bDescriptorType = 2,
  47. .wTotalLength = (9+9+(3*7)),
  48. .bNumInterfaces = 1,
  49. .bConfigurationValue = 1,
  50. .iConfiguration = 0,
  51. .bmAttributes = 0x80, //0xC0,
  52. .bMaxPower = 100 //0
  53. };
  54. /* Hi-Speed interface descriptor */
  55. struct InterfaceDescriptor interdesc_hi = {
  56. .bLength = 9,
  57. .bDescriptorType = 4,
  58. .bInterfaceNumber = 0,
  59. .bAlternateSetting = 0,
  60. .bNumEndpoints = 3,
  61. .bInterfaceClass = 0xFF,
  62. .bInterfaceSubClass = 0, //0x1,
  63. .bInterfaceProtocol = 0xFF,
  64. .iInterface = 0 //1
  65. };
  66. /* Hi-Speed endpoint descriptors */
  67. struct EndpointDescriptor endpdesc_hi[ENDPOINT_DESCRIPTOR_COUNT] = {{
  68. .bLength = 7,
  69. .bDescriptorType = 5,
  70. .bEndpointAddress = 0x81,
  71. .bmAttributes = 2,
  72. .wMaxPacketSize = 64, //512,
  73. .bInterval = 0
  74. }, {
  75. .bLength = 7,
  76. .bDescriptorType = 5,
  77. .bEndpointAddress = 2,
  78. .bmAttributes = 2,
  79. .wMaxPacketSize = 64, //512,
  80. .bInterval = 0
  81. }, {
  82. .bLength = 7,
  83. .bDescriptorType = 5,
  84. .bEndpointAddress = 0x83, //3,
  85. .bmAttributes = 3, //2,
  86. .wMaxPacketSize = 1, //512,
  87. .bInterval = 100 //0
  88. }};
  89. /* Full-Speed device descriptor */
  90. struct DeviceDescriptor devdesc_full = {
  91. .bLength = 18,
  92. .bDescriptorType = 0x01,
  93. .bcdUSB = 0x101, //0x200,
  94. .bDeviceClass = 0xff, //0,
  95. .bDeviceSubClass = 0,
  96. .bDeviceProtocol = 0xff, //0,
  97. .bMaxPacketSize = 64,
  98. .idVendor = SONY_VID, //0,
  99. .idProduct = SNOOPDRIVER_PID, //0,
  100. .bcdDevice = 0x100,
  101. .iManufacturer = 0,
  102. .iProduct = 0,
  103. .iSerialNumber = 0,
  104. .bNumConfigurations = 1
  105. };
  106. /* Full-Speed configuration descriptor */
  107. struct ConfigDescriptor confdesc_full = {
  108. .bLength = 9,
  109. .bDescriptorType = 2,
  110. .wTotalLength = (9+9+(3*7)),
  111. .bNumInterfaces = 1,
  112. .bConfigurationValue = 1,
  113. .iConfiguration = 0,
  114. .bmAttributes = 0x80, //0xC0,
  115. .bMaxPower = 100 //0
  116. };
  117. /* Full-Speed interface descriptor */
  118. struct InterfaceDescriptor interdesc_full = {
  119. .bLength = 9,
  120. .bDescriptorType = 4,
  121. .bInterfaceNumber = 0,
  122. .bAlternateSetting = 0,
  123. .bNumEndpoints = 3,
  124. .bInterfaceClass = 0xFF,
  125. .bInterfaceSubClass = 0, //0x1,
  126. .bInterfaceProtocol = 0xFF,
  127. .iInterface = 0 //1
  128. };
  129. /* Full-Speed endpoint descriptors */
  130. struct EndpointDescriptor endpdesc_full[ENDPOINT_DESCRIPTOR_COUNT] = {{
  131. .bLength = 7,
  132. .bDescriptorType = 5,
  133. .bEndpointAddress = 0x81,
  134. .bmAttributes = 2,
  135. .wMaxPacketSize = 64,
  136. .bInterval = 0
  137. }, {
  138. .bLength = 7,
  139. .bDescriptorType = 5,
  140. .bEndpointAddress = 2,
  141. .bmAttributes = 2,
  142. .wMaxPacketSize = 64,
  143. .bInterval = 0
  144. }, {
  145. .bLength = 7,
  146. .bDescriptorType = 5,
  147. .bEndpointAddress = 0x83, //3,
  148. .bmAttributes = 3, //2,
  149. .wMaxPacketSize = 1, //64,
  150. .bInterval = 100 //0
  151. }};
  152. /* String descriptor */
  153. unsigned char strp[] = {
  154. 0x8, 0x3, '<', 0, '>', 0, 0, 0
  155. };
  156. /* Endpoint blocks */
  157. struct UsbEndpoint endp[ENDPOINT_COUNT] = {
  158. { 0, 0, 0 },
  159. { 1, 0, 0 },
  160. { 2, 0, 0 },
  161. { 3, 0, 0 },
  162. };
  163. /* Intefaces */
  164. struct UsbInterface intp = {
  165. 0xFFFFFFFF, 0, 1,
  166. };
  167. int (*getSockWriteLock)(void);
  168. int (*releaseSockWriteLock)(void);
  169. void (*sockWrite)(void *data, int size);
  170. struct packet_header_t {
  171. int action;
  172. int req_len;
  173. int data_len;
  174. } __attribute__((packed));
  175. /* Device request */
  176. int usb_request(int arg1, int arg2, struct DeviceRequest *req) {
  177. void *data = (void *) arg2;
  178. if (getSockWriteLock && releaseSockWriteLock && sockWrite) {
  179. int k1;
  180. k1 = pspSdkSetK1(0);
  181. struct packet_header_t packet_header;
  182. packet_header.action = USB_EXCHANGE_TYPE_REQUEST;
  183. packet_header.req_len = sizeof(struct DeviceRequest);
  184. packet_header.data_len = req->wLength;
  185. if (getSockWriteLock() == 0) {
  186. sockWrite(&packet_header, sizeof(struct packet_header_t));
  187. sockWrite(req, sizeof(struct DeviceRequest));
  188. sockWrite(data, req->wLength);
  189. releaseSockWriteLock();
  190. }
  191. pspSdkSetK1(k1);
  192. }
  193. return 0;
  194. }
  195. /* Unknown callback */
  196. int func28(int arg1, int arg2, int arg3) {
  197. return 0;
  198. }
  199. /* Attach callback, speed 1=full, 2=hi */
  200. int usb_attach(int speed, void *arg2, void *arg3) {
  201. sceKernelSetEventFlag(g_events, HOST_ATTACHED_FLAG);
  202. return 0;
  203. }
  204. /* Detach callback */
  205. int usb_detach(int arg1, int arg2, int arg3) {
  206. sceKernelClearEventFlag(g_events, HOST_ATTACHED_FLAG);
  207. return 0;
  208. }
  209. /* Forward define the driver structure */
  210. extern struct UsbDriver g_driver;
  211. /* USB data structures for hi and full speed endpoints */
  212. struct UsbData usbdata[2];
  213. int usbSnoopIsAttached(u32 *flags) {
  214. return sceKernelPollEventFlag(g_events, HOST_ATTACHED_FLAG, PSP_EVENT_WAITOR, flags);
  215. }
  216. int usbSnoopWaitForAttachment(void) {
  217. int k1;
  218. k1 = pspSdkSetK1(0);
  219. return sceKernelWaitEventFlag(g_events, HOST_ATTACHED_FLAG, PSP_EVENT_WAITOR, NULL, NULL);
  220. pspSdkSetK1(k1);
  221. }
  222. /* Callback for when a usbSnoopSendToHost request is done */
  223. int send_to_host_req_done(struct UsbdDeviceReq *req, int arg2, int arg3) {
  224. sceKernelSetEventFlag(g_events, SEND_TO_HOST_FLAG);
  225. return 0;
  226. }
  227. /* Data send (sync) */
  228. int usbSnoopSendToHost(int endp_index, void *data, int size) {
  229. int res;
  230. u32 result;
  231. struct UsbdDeviceReq send_req;
  232. int k1;
  233. k1 = pspSdkSetK1(0);
  234. sceKernelDcacheWritebackRange(data, size);
  235. memset(&send_req, 0, sizeof(struct UsbdDeviceReq));
  236. send_req.endp = &endp[endp_index];
  237. send_req.data = data;
  238. send_req.size = size;
  239. send_req.func = send_to_host_req_done;
  240. sceKernelClearEventFlag(g_events, ~SEND_TO_HOST_FLAG);
  241. res = sceUsbbdReqSend(&send_req);
  242. if (res) {
  243. pspSdkSetK1(k1);
  244. return res;
  245. }
  246. res = sceKernelWaitEventFlag(g_events, SEND_TO_HOST_FLAG,
  247. PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR,
  248. &result, NULL);
  249. pspSdkSetK1(k1);
  250. return res;
  251. }
  252. /* Callback for when a usbSnoopRecvFromHost request is done */
  253. int recv_from_host_req_done(struct UsbdDeviceReq *req, int arg2, int arg3) {
  254. struct UsbDeviceReqParam *recv_param = (struct UsbDeviceReqParam *) req->arg;
  255. if (req->retcode < 0) {
  256. *(recv_param->recv_size) = req->retcode;
  257. } else {
  258. *(recv_param->recv_size) = req->recvsize;
  259. }
  260. sceKernelDcacheInvalidateRange(req->data, req->size + (0x3f - (req->size & 0x3f)));
  261. sceKernelSetEventFlag(recv_param->user_event, recv_param->user_event_flag);
  262. return 0;
  263. }
  264. static struct UsbdDeviceReq g_recv_req[ENDPOINT_COUNT];
  265. static struct UsbDeviceReqParam g_recv_param[ENDPOINT_COUNT];
  266. /* Data recv (async) */
  267. int usbSnoopRecvFromHost(int endp_index, void *data, int size,
  268. int *recv_size, SceUID user_event, int user_event_flag) {
  269. struct UsbdDeviceReq *recv_req;
  270. struct UsbDeviceReqParam *recv_param;
  271. int res = 0;
  272. int k1;
  273. if ((int) data & 0x3f) {
  274. return -1;
  275. }
  276. if (endp_index > ENDPOINT_COUNT) {
  277. return -2;
  278. }
  279. k1 = pspSdkSetK1(0);
  280. /* Invalidate range */
  281. //sceKernelDcacheInvalidateRange(data, size + (0x3f - (size & 0x3f)));
  282. recv_req = &g_recv_req[endp_index];
  283. recv_param = &g_recv_param[endp_index];
  284. recv_param->user_event = user_event;
  285. recv_param->user_event_flag = user_event_flag;
  286. recv_param->recv_size = recv_size;
  287. memset(recv_req, 0, sizeof(struct UsbdDeviceReq));
  288. recv_req->data = data;
  289. recv_req->size = size;
  290. recv_req->endp = &endp[endp_index];
  291. recv_req->func = recv_from_host_req_done;
  292. recv_req->arg = (void *) recv_param;
  293. res = sceKernelClearEventFlag(user_event, ~user_event_flag);
  294. if (res < 0) {
  295. pspSdkSetK1(k1);
  296. return res;
  297. }
  298. res = sceUsbbdReqRecv(recv_req);
  299. pspSdkSetK1(k1);
  300. return res;
  301. }
  302. int usbSnoopCancelRecv(int endp_index) {
  303. int k1;
  304. int res;
  305. k1 = pspSdkSetK1(0);
  306. if (endp_index > ENDPOINT_COUNT) {
  307. pspSdkSetK1(k1);
  308. return -2;
  309. }
  310. res = sceUsbbdReqCancelAll(&endp[endp_index]);
  311. pspSdkSetK1(k1);
  312. return res;
  313. }
  314. int usbSnoopInit(struct module_args_t *arg){
  315. int k1;
  316. k1 = pspSdkSetK1(0);
  317. getSockWriteLock = arg->getSockWriteLock;
  318. releaseSockWriteLock = arg->releaseSockWriteLock;
  319. sockWrite = arg->sockWrite;
  320. pspSdkSetK1(k1);
  321. return 0;
  322. }
  323. /* USB start function */
  324. int start_func(int size, void *p)
  325. {
  326. /* Fill in the descriptor tables */
  327. memset(usbdata, 0, sizeof(usbdata));
  328. memcpy(usbdata[0].devdesc, &devdesc_hi, sizeof(devdesc_hi));
  329. usbdata[0].config.pconfdesc = &usbdata[0].confdesc;
  330. usbdata[0].config.pinterfaces = &usbdata[0].interfaces;
  331. usbdata[0].config.pinterdesc = &usbdata[0].interdesc;
  332. usbdata[0].config.pendp = usbdata[0].endp;
  333. memcpy(usbdata[0].confdesc.desc, &confdesc_hi, sizeof(confdesc_hi));
  334. usbdata[0].confdesc.pinterfaces = &usbdata[0].interfaces;
  335. usbdata[0].interfaces.pinterdesc[0] = &usbdata[0].interdesc;
  336. usbdata[0].interfaces.intcount = 1;
  337. memcpy(usbdata[0].interdesc.desc, &interdesc_hi, sizeof(interdesc_hi));
  338. usbdata[0].interdesc.pendp = usbdata[0].endp;
  339. memcpy(usbdata[0].endp[0].desc, &endpdesc_hi[0], sizeof(endpdesc_hi[0]));
  340. memcpy(usbdata[0].endp[1].desc, &endpdesc_hi[1], sizeof(endpdesc_hi[1]));
  341. memcpy(usbdata[0].endp[2].desc, &endpdesc_hi[2], sizeof(endpdesc_hi[2]));
  342. memcpy(usbdata[1].devdesc, &devdesc_full, sizeof(devdesc_full));
  343. usbdata[1].config.pconfdesc = &usbdata[1].confdesc;
  344. usbdata[1].config.pinterfaces = &usbdata[1].interfaces;
  345. usbdata[1].config.pinterdesc = &usbdata[1].interdesc;
  346. usbdata[1].config.pendp = usbdata[1].endp;
  347. memcpy(usbdata[1].confdesc.desc, &confdesc_full, sizeof(confdesc_full));
  348. usbdata[1].confdesc.pinterfaces = &usbdata[1].interfaces;
  349. usbdata[1].interfaces.pinterdesc[0] = &usbdata[1].interdesc;
  350. usbdata[1].interfaces.intcount = 1;
  351. memcpy(usbdata[1].interdesc.desc, &interdesc_full, sizeof(interdesc_full));
  352. usbdata[1].interdesc.pendp = usbdata[1].endp;
  353. memcpy(usbdata[1].endp[0].desc, &endpdesc_full[0], sizeof(endpdesc_full[0]));
  354. memcpy(usbdata[1].endp[1].desc, &endpdesc_full[1], sizeof(endpdesc_full[1]));
  355. memcpy(usbdata[1].endp[2].desc, &endpdesc_full[2], sizeof(endpdesc_full[2]));
  356. g_driver.devp_hi = usbdata[0].devdesc;
  357. g_driver.confp_hi = &usbdata[0].config;
  358. g_driver.devp = usbdata[1].devdesc;
  359. g_driver.confp = &usbdata[1].config;
  360. g_events = sceKernelCreateEventFlag("USBSnoopEvent", 0x200, 0, NULL);
  361. if(g_events < 0) {
  362. return -1;
  363. }
  364. return 0;
  365. }
  366. /* USB stop function */
  367. int stop_func(int size, void *p) {
  368. if(g_events >= 0) {
  369. sceKernelDeleteEventFlag(g_events);
  370. g_events = -1;
  371. }
  372. return 0;
  373. }
  374. /* USB host driver */
  375. struct UsbDriver g_driver = {
  376. .name = SNOOPDRIVER_NAME,
  377. .endpoints = ENDPOINT_COUNT,
  378. .endp = endp,
  379. .intp = &intp,
  380. .devp_hi = NULL, .confp_hi = NULL, .devp = NULL, .confp = NULL,
  381. .str = (struct StringDescriptor *) strp,
  382. .recvctl = usb_request, .func28 = func28, .attach = usb_attach, .detach = usb_detach,
  383. .unk34 = 0,
  384. .start_func = start_func,
  385. .stop_func = stop_func,
  386. .link = NULL
  387. };
  388. /* Entry point */
  389. int module_start(SceSize args, void *argp) {
  390. return sceUsbbdRegister(&g_driver);
  391. }
  392. /* Module stop entry */
  393. int module_stop(SceSize args, void *argp) {
  394. return sceUsbbdUnregister(&g_driver);
  395. }