Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(668)

Side by Side Diff: src/libusb-glue.c

Issue 2364793002: Revert "Uprev libmtp to 1.1.12" (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libmtp@master
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/libopenusb1-glue.c ('k') | src/libusb1-glue.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * \file libusb-glue.c 2 * \file libusb-glue.c
3 * Low-level USB interface glue towards libusb. 3 * Low-level USB interface glue towards libusb.
4 * 4 *
5 * Copyright (C) 2005-2007 Richard A. Low <richard@wentnet.com> 5 * Copyright (C) 2005-2007 Richard A. Low <richard@wentnet.com>
6 * Copyright (C) 2005-2012 Linus Walleij <triad@df.lth.se> 6 * Copyright (C) 2005-2012 Linus Walleij <triad@df.lth.se>
7 * Copyright (C) 2006-2007 Marcus Meissner 7 * Copyright (C) 2006-2007 Marcus Meissner
8 * Copyright (C) 2007 Ted Bullock 8 * Copyright (C) 2007 Ted Bullock
9 * Copyright (C) 2008 Chris Bagwell <chris@cnpbagwell.com> 9 * Copyright (C) 2008 Chris Bagwell <chris@cnpbagwell.com>
10 * 10 *
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 LIBMTP_ERROR("Device %d (VID=%04x and PID=%04x) is a %s %s.\n", 669 LIBMTP_ERROR("Device %d (VID=%04x and PID=%04x) is a %s %s.\n",
670 i, 670 i,
671 dev->libusb_device->descriptor.idVendor, 671 dev->libusb_device->descriptor.idVendor,
672 dev->libusb_device->descriptor.idProduct, 672 dev->libusb_device->descriptor.idProduct,
673 mtp_device_table[j].vendor, 673 mtp_device_table[j].vendor,
674 mtp_device_table[j].product); 674 mtp_device_table[j].product);
675 break; 675 break;
676 } 676 }
677 } 677 }
678 if (!device_known) { 678 if (!device_known) {
679 device_unknown(i, 679 // This device is unknown to the developers
680 dev->libusb_device->descriptor.idVendor, 680 LIBMTP_ERROR("Device %d (VID=%04x and PID=%04x) is UNKNOWN.\n",
681 dev->libusb_device->descriptor.idProduct); 681 » i,
682 » dev->libusb_device->descriptor.idVendor,
683 » dev->libusb_device->descriptor.idProduct);
684 LIBMTP_ERROR("Please report this VID/PID and the device model to the "
685 » "libmtp development team\n");
686 /*
687 * Trying to get iManufacturer or iProduct from the device at this
688 * point would require opening a device handle, that we don't want
689 * to do right now. (Takes time for no good enough reason.)
690 */
682 } 691 }
683 // Save the location on the bus 692 // Save the location on the bus
684 retdevs[i].bus_location = dev->bus_location; 693 retdevs[i].bus_location = dev->bus_location;
685 retdevs[i].devnum = dev->libusb_device->devnum; 694 retdevs[i].devnum = dev->libusb_device->devnum;
686 i++; 695 i++;
687 dev = dev->next; 696 dev = dev->next;
688 } 697 }
689 *devices = retdevs; 698 *devices = retdevs;
690 *numdevs = i; 699 *numdevs = i;
691 free_mtpdevice_list(devlist); 700 free_mtpdevice_list(devlist);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 * 5. Send remaining bytes. If this happens to be exactly sizeof(endpoint) 814 * 5. Send remaining bytes. If this happens to be exactly sizeof(endpoint)
806 * then also send a zero-length package. 815 * then also send a zero-length package.
807 * 816 *
808 * Further there is some special quirks to handle zero reads from the 817 * Further there is some special quirks to handle zero reads from the
809 * device, since some devices can't do them at all due to shortcomings 818 * device, since some devices can't do them at all due to shortcomings
810 * of the USB slave controller in the device. 819 * of the USB slave controller in the device.
811 */ 820 */
812 #define CONTEXT_BLOCK_SIZE_1 0x3e00 821 #define CONTEXT_BLOCK_SIZE_1 0x3e00
813 #define CONTEXT_BLOCK_SIZE_2 0x200 822 #define CONTEXT_BLOCK_SIZE_2 0x200
814 #define CONTEXT_BLOCK_SIZE CONTEXT_BLOCK_SIZE_1+CONTEXT_BLOCK_SIZE_2 823 #define CONTEXT_BLOCK_SIZE CONTEXT_BLOCK_SIZE_1+CONTEXT_BLOCK_SIZE_2
815
816 static short 824 static short
817 ptp_read_func ( 825 ptp_read_func (
818 unsigned long size, PTPDataHandler *handler,void *data, 826 unsigned long size, PTPDataHandler *handler,void *data,
819 unsigned long *readbytes, 827 unsigned long *readbytes,
820 int readzero 828 int readzero
821 ) { 829 ) {
822 PTP_USB *ptp_usb = (PTP_USB *)data; 830 PTP_USB *ptp_usb = (PTP_USB *)data;
823 unsigned long toread = 0; 831 unsigned long toread = 0;
824 int result = 0; 832 int result = 0;
825 unsigned long curread = 0; 833 unsigned long curread = 0;
834 unsigned long written;
826 unsigned char *bytes; 835 unsigned char *bytes;
827 int expect_terminator_byte = 0; 836 int expect_terminator_byte = 0;
828 unsigned long usb_inep_maxpacket_size;
829 unsigned long context_block_size_1;
830 unsigned long context_block_size_2;
831 uint16_t ptp_dev_vendor_id = ptp_usb->rawdevice.device_entry.vendor_id;
832
833 //"iRiver" device special handling
834 if (ptp_dev_vendor_id == 0x4102 || ptp_dev_vendor_id == 0x1006) {
835 usb_inep_maxpacket_size = ptp_usb->inep_maxpacket;
836 if (usb_inep_maxpacket_size == 0x400) {
837 context_block_size_1 = CONTEXT_BLOCK_SIZE_1 - 0x200;
838 context_block_size_2 = CONTEXT_BLOCK_SIZE_2 + 0x200;
839 }
840 else {
841 context_block_size_1 = CONTEXT_BLOCK_SIZE_1;
842 context_block_size_2 = CONTEXT_BLOCK_SIZE_2;
843 }
844 }
845 837
846 // This is the largest block we'll need to read in. 838 // This is the largest block we'll need to read in.
847 bytes = malloc(CONTEXT_BLOCK_SIZE); 839 bytes = malloc(CONTEXT_BLOCK_SIZE);
848 while (curread < size) { 840 while (curread < size) {
849 841
850 LIBMTP_USB_DEBUG("Remaining size to read: 0x%04lx bytes\n", size - curread); 842 LIBMTP_USB_DEBUG("Remaining size to read: 0x%04lx bytes\n", size - curread);
851 843
852 // check equal to condition here 844 // check equal to condition here
853 if (size - curread < CONTEXT_BLOCK_SIZE) 845 if (size - curread < CONTEXT_BLOCK_SIZE)
854 { 846 {
855 // this is the last packet 847 // this is the last packet
856 toread = size - curread; 848 toread = size - curread;
857 // this is equivalent to zero read for these devices 849 // this is equivalent to zero read for these devices
858 if (readzero && FLAG_NO_ZERO_READS(ptp_usb) && toread % 64 == 0) { 850 if (readzero && FLAG_NO_ZERO_READS(ptp_usb) && toread % 64 == 0) {
859 toread += 1; 851 toread += 1;
860 expect_terminator_byte = 1; 852 expect_terminator_byte = 1;
861 } 853 }
862 } 854 }
863 else if (ptp_dev_vendor_id == 0x4102 || ptp_dev_vendor_id == 0x1006) { 855 else if (curread == 0)
864 » //"iRiver" device special handling 856 // we are first packet, but not last packet
865 » if (curread == 0) 857 toread = CONTEXT_BLOCK_SIZE_1;
866 » » // we are first packet, but not last packet 858 else if (toread == CONTEXT_BLOCK_SIZE_1)
867 » » toread = context_block_size_1; 859 toread = CONTEXT_BLOCK_SIZE_2;
868 » else if (toread == context_block_size_1) 860 else if (toread == CONTEXT_BLOCK_SIZE_2)
869 » » toread = context_block_size_2; 861 toread = CONTEXT_BLOCK_SIZE_1;
870 » else if (toread == context_block_size_2) 862 else
871 » » toread = context_block_size_1; 863 LIBMTP_INFO("unexpected toread size 0x%04x, 0x%04x remaining bytes\n",
872 » else 864 » (unsigned int) toread, (unsigned int) (size-curread));
873 » » LIBMTP_INFO("unexpected toread size 0x%04x, 0x%04x remaining bytes\n",
874 » » » » (unsigned int) toread, (unsigned int) (size-curr ead));
875
876 } else
877 » toread = CONTEXT_BLOCK_SIZE;
878 865
879 LIBMTP_USB_DEBUG("Reading in 0x%04lx bytes\n", toread); 866 LIBMTP_USB_DEBUG("Reading in 0x%04lx bytes\n", toread);
880 867
881 result = USB_BULK_READ(ptp_usb->handle, 868 result = USB_BULK_READ(ptp_usb->handle,
882 ptp_usb->inep, 869 ptp_usb->inep,
883 (char*) bytes, 870 (char*) bytes,
884 toread, 871 toread,
885 ptp_usb->timeout); 872 ptp_usb->timeout);
886 873
887 LIBMTP_USB_DEBUG("Result of read: 0x%04x\n", result); 874 LIBMTP_USB_DEBUG("Result of read: 0x%04x\n", result);
888 875
889 if (result < 0) { 876 if (result < 0) {
890 return PTP_ERROR_IO; 877 return PTP_ERROR_IO;
891 } 878 }
892 879
893 LIBMTP_USB_DEBUG("<==USB IN\n"); 880 LIBMTP_USB_DEBUG("<==USB IN\n");
894 if (result == 0) 881 if (result == 0)
895 LIBMTP_USB_DEBUG("Zero Read\n"); 882 LIBMTP_USB_DEBUG("Zero Read\n");
896 else 883 else
897 LIBMTP_USB_DATA(bytes, result, 16); 884 LIBMTP_USB_DATA(bytes, result, 16);
898 885
899 // want to discard extra byte 886 // want to discard extra byte
900 if (expect_terminator_byte && result == toread) 887 if (expect_terminator_byte && result == toread)
901 { 888 {
902 LIBMTP_USB_DEBUG("<==USB IN\nDiscarding extra byte\n"); 889 LIBMTP_USB_DEBUG("<==USB IN\nDiscarding extra byte\n");
903 890
904 result--; 891 result--;
905 } 892 }
906 893
907 int putfunc_ret = handler->putfunc(NULL, handler->priv, result, bytes); 894 int putfunc_ret = handler->putfunc(NULL, handler->priv, result, bytes, &writ ten);
908 if (putfunc_ret != PTP_RC_OK) 895 if (putfunc_ret != PTP_RC_OK)
909 return putfunc_ret; 896 return putfunc_ret;
910 897
911 ptp_usb->current_transfer_complete += result; 898 ptp_usb->current_transfer_complete += result;
912 curread += result; 899 curread += result;
913 900
914 // Increase counters, call callback 901 // Increase counters, call callback
915 if (ptp_usb->callback_active) { 902 if (ptp_usb->callback_active) {
916 if (ptp_usb->current_transfer_complete >= ptp_usb->current_transfer_total) { 903 if (ptp_usb->current_transfer_complete >= ptp_usb->current_transfer_total) {
917 // send last update and disable callback. 904 // send last update and disable callback.
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 if (priv->curoff + tocopy > priv->size) 1057 if (priv->curoff + tocopy > priv->size)
1071 tocopy = priv->size - priv->curoff; 1058 tocopy = priv->size - priv->curoff;
1072 memcpy (data, priv->data + priv->curoff, tocopy); 1059 memcpy (data, priv->data + priv->curoff, tocopy);
1073 priv->curoff += tocopy; 1060 priv->curoff += tocopy;
1074 *gotlen = tocopy; 1061 *gotlen = tocopy;
1075 return PTP_RC_OK; 1062 return PTP_RC_OK;
1076 } 1063 }
1077 1064
1078 static uint16_t 1065 static uint16_t
1079 memory_putfunc(PTPParams* params, void* private, 1066 memory_putfunc(PTPParams* params, void* private,
1080 » unsigned long sendlen, unsigned char *data 1067 » unsigned long sendlen, unsigned char *data,
1068 » unsigned long *putlen
1081 ) { 1069 ) {
1082 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)private; 1070 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)private;
1083 1071
1084 if (priv->curoff + sendlen > priv->size) { 1072 if (priv->curoff + sendlen > priv->size) {
1085 priv->data = realloc (priv->data, priv->curoff+sendlen); 1073 priv->data = realloc (priv->data, priv->curoff+sendlen);
1086 priv->size = priv->curoff + sendlen; 1074 priv->size = priv->curoff + sendlen;
1087 } 1075 }
1088 memcpy (priv->data + priv->curoff, data, sendlen); 1076 memcpy (priv->data + priv->curoff, data, sendlen);
1089 priv->curoff += sendlen; 1077 priv->curoff += sendlen;
1078 *putlen = sendlen;
1090 return PTP_RC_OK; 1079 return PTP_RC_OK;
1091 } 1080 }
1092 1081
1093 /* init private struct for receiving data. */ 1082 /* init private struct for receiving data. */
1094 static uint16_t 1083 static uint16_t
1095 ptp_init_recv_memory_handler(PTPDataHandler *handler) { 1084 ptp_init_recv_memory_handler(PTPDataHandler *handler) {
1096 PTPMemHandlerPrivate* priv; 1085 PTPMemHandlerPrivate* priv;
1097 priv = malloc (sizeof(PTPMemHandlerPrivate)); 1086 priv = malloc (sizeof(PTPMemHandlerPrivate));
1098 handler->priv = priv; 1087 handler->priv = priv;
1099 handler->getfunc = memory_getfunc; 1088 handler->getfunc = memory_getfunc;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)handler->priv; 1130 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)handler->priv;
1142 *data = priv->data; 1131 *data = priv->data;
1143 *size = priv->size; 1132 *size = priv->size;
1144 free (priv); 1133 free (priv);
1145 return PTP_RC_OK; 1134 return PTP_RC_OK;
1146 } 1135 }
1147 1136
1148 /* send / receive functions */ 1137 /* send / receive functions */
1149 1138
1150 uint16_t 1139 uint16_t
1151 ptp_usb_sendreq (PTPParams* params, PTPContainer* req, int dataphase) 1140 ptp_usb_sendreq (PTPParams* params, PTPContainer* req)
1152 { 1141 {
1153 uint16_t ret; 1142 uint16_t ret;
1154 PTPUSBBulkContainer usbreq; 1143 PTPUSBBulkContainer usbreq;
1155 PTPDataHandler memhandler; 1144 PTPDataHandler memhandler;
1156 unsigned long written = 0; 1145 unsigned long written = 0;
1157 unsigned long towrite; 1146 unsigned long towrite;
1158 1147
1159 char txt[256]; 1148 char txt[256];
1160 1149
1161 » (void) ptp_render_ofc (params, req->Code, sizeof(txt), txt); 1150 » (void) ptp_render_opcode (params, req->Code, sizeof(txt), txt);
1162 LIBMTP_USB_DEBUG("REQUEST: 0x%04x, %s\n", req->Code, txt); 1151 LIBMTP_USB_DEBUG("REQUEST: 0x%04x, %s\n", req->Code, txt);
1163 1152
1164 /* build appropriate USB container */ 1153 /* build appropriate USB container */
1165 usbreq.length=htod32(PTP_USB_BULK_REQ_LEN- 1154 usbreq.length=htod32(PTP_USB_BULK_REQ_LEN-
1166 (sizeof(uint32_t)*(5-req->Nparam))); 1155 (sizeof(uint32_t)*(5-req->Nparam)));
1167 usbreq.type=htod16(PTP_USB_CONTAINER_COMMAND); 1156 usbreq.type=htod16(PTP_USB_CONTAINER_COMMAND);
1168 usbreq.code=htod16(req->Code); 1157 usbreq.code=htod16(req->Code);
1169 usbreq.trans_id=htod32(req->Transaction_ID); 1158 usbreq.trans_id=htod32(req->Transaction_ID);
1170 usbreq.payload.params.param1=htod32(req->Param1); 1159 usbreq.payload.params.param1=htod32(req->Param1);
1171 usbreq.payload.params.param2=htod32(req->Param2); 1160 usbreq.payload.params.param2=htod32(req->Param2);
(...skipping 18 matching lines...) Expand all
1190 "PTP: request code 0x%04x sending req wrote only %ld byt es instead of %d", 1179 "PTP: request code 0x%04x sending req wrote only %ld byt es instead of %d",
1191 req->Code, written, towrite 1180 req->Code, written, towrite
1192 ); 1181 );
1193 ret = PTP_ERROR_IO; 1182 ret = PTP_ERROR_IO;
1194 } 1183 }
1195 return ret; 1184 return ret;
1196 } 1185 }
1197 1186
1198 uint16_t 1187 uint16_t
1199 ptp_usb_senddata (PTPParams* params, PTPContainer* ptp, 1188 ptp_usb_senddata (PTPParams* params, PTPContainer* ptp,
1200 » » uint64_t size, PTPDataHandler *handler 1189 » » unsigned long size, PTPDataHandler *handler
1201 ) { 1190 ) {
1202 uint16_t ret; 1191 uint16_t ret;
1203 int wlen, datawlen; 1192 int wlen, datawlen;
1204 unsigned long written; 1193 unsigned long written;
1205 PTPUSBBulkContainer usbdata; 1194 PTPUSBBulkContainer usbdata;
1206 » uint64_t bytes_left_to_transfer; 1195 » uint32_t bytes_left_to_transfer;
1207 PTPDataHandler memhandler; 1196 PTPDataHandler memhandler;
1208 1197
1209 1198
1210 LIBMTP_USB_DEBUG("SEND DATA PHASE\n"); 1199 LIBMTP_USB_DEBUG("SEND DATA PHASE\n");
1211 1200
1212 /* build appropriate USB container */ 1201 /* build appropriate USB container */
1213 usbdata.length = htod32(PTP_USB_BULK_HDR_LEN+size); 1202 usbdata.length = htod32(PTP_USB_BULK_HDR_LEN+size);
1214 usbdata.type = htod16(PTP_USB_CONTAINER_DATA); 1203 usbdata.type = htod16(PTP_USB_CONTAINER_DATA);
1215 usbdata.code = htod16(ptp->Code); 1204 usbdata.code = htod16(ptp->Code);
1216 usbdata.trans_id= htod32(ptp->Transaction_ID); 1205 usbdata.trans_id= htod32(ptp->Transaction_ID);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 ret = PTP_ERROR_IO; 1247 ret = PTP_ERROR_IO;
1259 return ret; 1248 return ret;
1260 } 1249 }
1261 1250
1262 static uint16_t ptp_usb_getpacket(PTPParams *params, 1251 static uint16_t ptp_usb_getpacket(PTPParams *params,
1263 PTPUSBBulkContainer *packet, unsigned long *rlen) 1252 PTPUSBBulkContainer *packet, unsigned long *rlen)
1264 { 1253 {
1265 PTPDataHandler memhandler; 1254 PTPDataHandler memhandler;
1266 uint16_t ret; 1255 uint16_t ret;
1267 unsigned char *x = NULL; 1256 unsigned char *x = NULL;
1268 unsigned long packet_size;
1269 PTP_USB *ptp_usb = (PTP_USB *) params->data;
1270
1271 packet_size = ptp_usb->inep_maxpacket;
1272 1257
1273 /* read the header and potentially the first data */ 1258 /* read the header and potentially the first data */
1274 if (params->response_packet_size > 0) { 1259 if (params->response_packet_size > 0) {
1275 /* If there is a buffered packet, just use it. */ 1260 /* If there is a buffered packet, just use it. */
1276 memcpy(packet, params->response_packet, params->response_packet_ size); 1261 memcpy(packet, params->response_packet, params->response_packet_ size);
1277 *rlen = params->response_packet_size; 1262 *rlen = params->response_packet_size;
1278 free(params->response_packet); 1263 free(params->response_packet);
1279 params->response_packet = NULL; 1264 params->response_packet = NULL;
1280 params->response_packet_size = 0; 1265 params->response_packet_size = 0;
1281 /* Here this signifies a "virtual read" */ 1266 /* Here this signifies a "virtual read" */
1282 return PTP_RC_OK; 1267 return PTP_RC_OK;
1283 } 1268 }
1284 ptp_init_recv_memory_handler (&memhandler); 1269 ptp_init_recv_memory_handler (&memhandler);
1285 » ret = ptp_read_func(packet_size, &memhandler, params->data, rlen, 0); 1270 » ret = ptp_read_func(PTP_USB_BULK_HS_MAX_PACKET_LEN_READ, &memhandler, pa rams->data, rlen, 0);
1286 ptp_exit_recv_memory_handler (&memhandler, &x, rlen); 1271 ptp_exit_recv_memory_handler (&memhandler, &x, rlen);
1287 if (x) { 1272 if (x) {
1288 memcpy (packet, x, *rlen); 1273 memcpy (packet, x, *rlen);
1289 free (x); 1274 free (x);
1290 } 1275 }
1291 return ret; 1276 return ret;
1292 } 1277 }
1293 1278
1294 uint16_t 1279 uint16_t
1295 ptp_usb_getdata (PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler) 1280 ptp_usb_getdata (PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler)
1296 { 1281 {
1297 uint16_t ret; 1282 uint16_t ret;
1298 PTPUSBBulkContainer usbdata; 1283 PTPUSBBulkContainer usbdata;
1284 unsigned long written;
1299 PTP_USB *ptp_usb = (PTP_USB *) params->data; 1285 PTP_USB *ptp_usb = (PTP_USB *) params->data;
1300 int putfunc_ret; 1286 int putfunc_ret;
1301 1287
1302 LIBMTP_USB_DEBUG("GET DATA PHASE\n"); 1288 LIBMTP_USB_DEBUG("GET DATA PHASE\n");
1303 1289
1304 memset(&usbdata,0,sizeof(usbdata)); 1290 memset(&usbdata,0,sizeof(usbdata));
1305 do { 1291 do {
1306 unsigned long len, rlen; 1292 unsigned long len, rlen;
1307 1293
1308 ret = ptp_usb_getpacket(params, &usbdata, &rlen); 1294 ret = ptp_usb_getpacket(params, &usbdata, &rlen);
(...skipping 21 matching lines...) Expand all
1330 // getting data. It appears Windows ignores the contents of this 1316 // getting data. It appears Windows ignores the contents of this
1331 // field entirely. 1317 // field entirely.
1332 if (ret < PTP_RC_Undefined || ret > PTP_RC_Speci ficationOfDestinationUnsupported) { 1318 if (ret < PTP_RC_Undefined || ret > PTP_RC_Speci ficationOfDestinationUnsupported) {
1333 libusb_glue_debug (params, "ptp2/ptp_usb _getdata: detected a broken " 1319 libusb_glue_debug (params, "ptp2/ptp_usb _getdata: detected a broken "
1334 "PTP header, code field insan e."); 1320 "PTP header, code field insan e.");
1335 ret = PTP_ERROR_IO; 1321 ret = PTP_ERROR_IO;
1336 } 1322 }
1337 break; 1323 break;
1338 } 1324 }
1339 } 1325 }
1340 » » if (rlen == ptp_usb->inep_maxpacket) { 1326 » » if (usbdata.length == 0xffffffffU) {
1341 /* Copy first part of data to 'data' */ 1327 /* Copy first part of data to 'data' */
1342 putfunc_ret = 1328 putfunc_ret =
1343 handler->putfunc( 1329 handler->putfunc(
1344 » » » » params, handler->priv, rlen - PTP_USB_BULK_ HDR_LEN, usbdata.payload.data 1330 » » » » params, handler->priv, rlen - PTP_USB_BULK_ HDR_LEN, usbdata.payload.data,
1331 » » » » &written
1345 ); 1332 );
1346 if (putfunc_ret != PTP_RC_OK) 1333 if (putfunc_ret != PTP_RC_OK)
1347 return putfunc_ret; 1334 return putfunc_ret;
1348 1335
1349 /* stuff data directly to passed data handler */ 1336 /* stuff data directly to passed data handler */
1350 while (1) { 1337 while (1) {
1351 unsigned long readdata; 1338 unsigned long readdata;
1352 uint16_t xret; 1339 uint16_t xret;
1353 1340
1354 xret = ptp_read_func( 1341 xret = ptp_read_func(
1355 » » » » » 0x20000000, 1342 » » » » » PTP_USB_BULK_HS_MAX_PACKET_LEN_READ,
1356 handler, 1343 handler,
1357 params->data, 1344 params->data,
1358 &readdata, 1345 &readdata,
1359 0 1346 0
1360 ); 1347 );
1361 if (xret != PTP_RC_OK) 1348 if (xret != PTP_RC_OK)
1362 return xret; 1349 return xret;
1363 » » if (readdata < 0x20000000) 1350 » » if (readdata < PTP_USB_BULK_HS_MAX_PACKET_LEN_READ)
1364 break; 1351 break;
1365 } 1352 }
1366 return PTP_RC_OK; 1353 return PTP_RC_OK;
1367 } 1354 }
1368 if (rlen > dtoh32(usbdata.length)) { 1355 if (rlen > dtoh32(usbdata.length)) {
1369 /* 1356 /*
1370 * Buffer the surplus response packet if it is >= 1357 * Buffer the surplus response packet if it is >=
1371 * PTP_USB_BULK_HDR_LEN 1358 * PTP_USB_BULK_HDR_LEN
1372 * (i.e. it is probably an entire package) 1359 * (i.e. it is probably an entire package)
1373 * else discard it as erroneous surplus data. 1360 * else discard it as erroneous surplus data.
(...skipping 30 matching lines...) Expand all
1404 len=dtoh32(usbdata.length)-PTP_USB_BULK_HDR_LEN; 1391 len=dtoh32(usbdata.length)-PTP_USB_BULK_HDR_LEN;
1405 1392
1406 /* autodetect split header/data MTP devices */ 1393 /* autodetect split header/data MTP devices */
1407 if (dtoh32(usbdata.length) > 12 && (rlen==12)) 1394 if (dtoh32(usbdata.length) > 12 && (rlen==12))
1408 params->split_header_data = 1; 1395 params->split_header_data = 1;
1409 1396
1410 /* Copy first part of data to 'data' */ 1397 /* Copy first part of data to 'data' */
1411 putfunc_ret = 1398 putfunc_ret =
1412 handler->putfunc( 1399 handler->putfunc(
1413 params, handler->priv, rlen - PTP_USB_BULK_HD R_LEN, 1400 params, handler->priv, rlen - PTP_USB_BULK_HD R_LEN,
1414 » » » » usbdata.payload.data 1401 » » » » usbdata.payload.data,
1402 » » » » &written
1415 ); 1403 );
1416 if (putfunc_ret != PTP_RC_OK) 1404 if (putfunc_ret != PTP_RC_OK)
1417 return putfunc_ret; 1405 return putfunc_ret;
1418 1406
1419 if (FLAG_NO_ZERO_READS(ptp_usb) && 1407 if (FLAG_NO_ZERO_READS(ptp_usb) &&
1420 » » len+PTP_USB_BULK_HDR_LEN == ptp_usb->inep_maxpacket) { 1408 » » len+PTP_USB_BULK_HDR_LEN == PTP_USB_BULK_HS_MAX_PACKET_LEN_R EAD) {
1421 1409
1422 LIBMTP_USB_DEBUG("Reading in extra terminating byte\n"); 1410 LIBMTP_USB_DEBUG("Reading in extra terminating byte\n");
1423 1411
1424 // need to read in extra byte and discard it 1412 // need to read in extra byte and discard it
1425 int result = 0; 1413 int result = 0;
1426 char byte = 0; 1414 char byte = 0;
1427 result = USB_BULK_READ(ptp_usb->handle, 1415 result = USB_BULK_READ(ptp_usb->handle,
1428 ptp_usb->inep, 1416 ptp_usb->inep,
1429 &byte, 1417 &byte,
1430 1, 1418 1,
1431 ptp_usb->timeout); 1419 ptp_usb->timeout);
1432 1420
1433 if (result != 1) 1421 if (result != 1)
1434 » » LIBMTP_INFO("Could not read in extra byte for %d bytes long file, return value 0x%04x\n", ptp_usb->inep_maxpacket, result); 1422 » » LIBMTP_INFO("Could not read in extra byte for PTP_USB_BULK_H S_MAX_PACKET_LEN_READ long file, return value 0x%04x\n", result);
1435 » » } else if (len+PTP_USB_BULK_HDR_LEN == ptp_usb->inep_maxpacket & & params->split_header_data == 0) { 1423 » » } else if (len+PTP_USB_BULK_HDR_LEN == PTP_USB_BULK_HS_MAX_PACKE T_LEN_READ && params->split_header_data == 0) {
1436 int zeroresult = 0; 1424 int zeroresult = 0;
1437 char zerobyte = 0; 1425 char zerobyte = 0;
1438 1426
1439 1427
1440 LIBMTP_INFO("Reading in zero packet after header\n"); 1428 LIBMTP_INFO("Reading in zero packet after header\n");
1441 1429
1442 zeroresult = USB_BULK_READ(ptp_usb->handle, 1430 zeroresult = USB_BULK_READ(ptp_usb->handle,
1443 ptp_usb->inep, 1431 ptp_usb->inep,
1444 &zerobyte, 1432 &zerobyte,
1445 0, 1433 0,
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1611 return ptp_usb_event (params, event, PTP_EVENT_CHECK_FAST); 1599 return ptp_usb_event (params, event, PTP_EVENT_CHECK_FAST);
1612 } 1600 }
1613 1601
1614 uint16_t 1602 uint16_t
1615 ptp_usb_event_wait (PTPParams* params, PTPContainer* event) { 1603 ptp_usb_event_wait (PTPParams* params, PTPContainer* event) {
1616 1604
1617 return ptp_usb_event (params, event, PTP_EVENT_CHECK); 1605 return ptp_usb_event (params, event, PTP_EVENT_CHECK);
1618 } 1606 }
1619 1607
1620 uint16_t 1608 uint16_t
1621 ptp_usb_event_async (PTPParams* params, PTPEventCbFn cb, void *user_data) {
1622 /* Unsupported */
1623 return PTP_ERROR_CANCEL;
1624 }
1625
1626 int LIBMTP_Handle_Events_Timeout_Completed(struct timeval *tv, int *completed) {
1627 /* Unsupported */
1628 return -12;
1629 }
1630
1631 uint16_t
1632 ptp_usb_control_cancel_request (PTPParams *params, uint32_t transactionid) { 1609 ptp_usb_control_cancel_request (PTPParams *params, uint32_t transactionid) {
1633 PTP_USB *ptp_usb = (PTP_USB *)(params->data); 1610 PTP_USB *ptp_usb = (PTP_USB *)(params->data);
1634 int ret; 1611 int ret;
1635 unsigned char buffer[6]; 1612 unsigned char buffer[6];
1636 1613
1637 htod16a(&buffer[0],PTP_EC_CancelTransaction); 1614 htod16a(&buffer[0],PTP_EC_CancelTransaction);
1638 htod32a(&buffer[2],transactionid); 1615 htod32a(&buffer[2],transactionid);
1639 ret = usb_control_msg(ptp_usb->handle, 1616 ret = usb_control_msg(ptp_usb->handle,
1640 USB_TYPE_CLASS | USB_RECIP_INTERFACE, 1617 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
1641 0x64, 0x0000, 0x0000, 1618 0x64, 0x0000, 0x0000,
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
1834 * Clear any stalled endpoints 1811 * Clear any stalled endpoints
1835 * On misbehaving devices designed for Windows/Mac, quote from: 1812 * On misbehaving devices designed for Windows/Mac, quote from:
1836 * http://www2.one-eyed-alien.net/~mdharm/linux-usb/target_offenses.txt 1813 * http://www2.one-eyed-alien.net/~mdharm/linux-usb/target_offenses.txt
1837 * Device does Bad Things(tm) when it gets a GET_STATUS after CLEAR_HALT 1814 * Device does Bad Things(tm) when it gets a GET_STATUS after CLEAR_HALT
1838 * (...) Windows, when clearing a stall, only sends the CLEAR_HALT command, 1815 * (...) Windows, when clearing a stall, only sends the CLEAR_HALT command,
1839 * and presumes that the stall has cleared. Some devices actually choke 1816 * and presumes that the stall has cleared. Some devices actually choke
1840 * if the CLEAR_HALT is followed by a GET_STATUS (used to determine if the 1817 * if the CLEAR_HALT is followed by a GET_STATUS (used to determine if the
1841 * STALL is persistant or not). 1818 * STALL is persistant or not).
1842 */ 1819 */
1843 clear_stall(ptp_usb); 1820 clear_stall(ptp_usb);
1844 #if 0
1845 // causes troubles due to a kernel bug in 3.x kernels before/around 3.8
1846 // Clear halts on any endpoints 1821 // Clear halts on any endpoints
1847 clear_halt(ptp_usb); 1822 clear_halt(ptp_usb);
1848 // Added to clear some stuff on the OUT endpoint 1823 // Added to clear some stuff on the OUT endpoint
1849 // TODO: is this good on the Mac too? 1824 // TODO: is this good on the Mac too?
1850 // HINT: some devices may need that you comment these two out too. 1825 // HINT: some devices may need that you comment these two out too.
1851 #endif
1852 usb_resetep(ptp_usb->handle, ptp_usb->outep); 1826 usb_resetep(ptp_usb->handle, ptp_usb->outep);
1853 usb_release_interface(ptp_usb->handle, (int) ptp_usb->interface); 1827 usb_release_interface(ptp_usb->handle, (int) ptp_usb->interface);
1854 } 1828 }
1855 if (FLAG_FORCE_RESET_ON_CLOSE(ptp_usb)) { 1829 if (FLAG_FORCE_RESET_ON_CLOSE(ptp_usb)) {
1856 /* 1830 /*
1857 * Some devices really love to get reset after being 1831 * Some devices really love to get reset after being
1858 * disconnected. Again, since Windows never disconnects 1832 * disconnected. Again, since Windows never disconnects
1859 * a device closing behaviour is seldom or never exercised 1833 * a device closing behaviour is seldom or never exercised
1860 * on devices when engineered and often error prone. 1834 * on devices when engineered and often error prone.
1861 * Reset may help some. 1835 * Reset may help some.
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
2134 { 2108 {
2135 return (usb_control_msg(ptp_usb->handle, 2109 return (usb_control_msg(ptp_usb->handle,
2136 USB_DP_DTH|USB_RECIP_ENDPOINT, 2110 USB_DP_DTH|USB_RECIP_ENDPOINT,
2137 USB_REQ_GET_STATUS, 2111 USB_REQ_GET_STATUS,
2138 USB_FEATURE_HALT, 2112 USB_FEATURE_HALT,
2139 ep, 2113 ep,
2140 (char *) status, 2114 (char *) status,
2141 2, 2115 2,
2142 ptp_usb->timeout)); 2116 ptp_usb->timeout));
2143 } 2117 }
OLDNEW
« no previous file with comments | « src/libopenusb1-glue.c ('k') | src/libusb1-glue.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698