TEXT   13

mp750.c

Guest on 14th May 2021 12:42:38 AM

  1. /*
  2.  * mp750.c
  3.  * scans a page in a canon mp750 scanner
  4.  * and outputs a pnm
  5.  *
  6.  * dirty but works ;-)
  7.  *
  8.  * (c)  Christopher Albert
  9.  * with greatest thanks to Timo Lindfors for his script usbsnoop2libusb.pl
  10.  * that was used to prototype the driver
  11.  *
  12.  * All code of this project is released under the GNU General Public License v2
  13.  *
  14.  * /
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <assert.h>
  21. #include <signal.h>
  22. #include <ctype.h>
  23. #include <usb.h>
  24.  
  25. struct usb_dev_handle *devh;
  26.  
  27. void print_bytes(char *bytes, int len) {
  28.     int i;
  29.     if (len > 0) {
  30.       for (i=0; i<len; i++) {
  31.           fprintf(stderr,"%02x ", (int)((unsigned char)bytes[i]));
  32.       }
  33.       fprintf(stderr,"\n");
  34.  
  35.       /*printf("\"");
  36.         for (i=0; i<len; i++) {
  37.           printf("%c", isprint(bytes[i]) ? bytes[i] : '.');
  38.         }
  39.         printf("\"");*/
  40.     }
  41. }
  42.  
  43.  
  44. void release_usb_device(int dummy)
  45. {
  46.     int ret;
  47.     ret = usb_release_interface(devh, 0);
  48.     if (!ret)
  49.         printf("failed to release interface: %d\n", ret);
  50.     ret = usb_close(devh);
  51.     if (!ret)
  52.         printf("failed to close interface: %d\n", ret);
  53.     exit(1);
  54. }
  55.  
  56. struct usb_device *find_device(int vendor, int product) {
  57.     struct usb_bus *bus;
  58.    
  59.     for (bus = usb_get_busses(); bus; bus = bus->next) {
  60.       struct usb_device *dev;
  61.      
  62.       for (dev = bus->devices; dev; dev = dev->next) {
  63.           if (dev->descriptor.idVendor == vendor
  64.             && dev->descriptor.idProduct == product)
  65.             return dev;
  66.       }
  67.     }
  68.     return NULL;
  69. }
  70.  
  71. int main(int argc, char **argv)
  72. {
  73.     int ret, vendor, product;
  74.     struct usb_device *dev;
  75.     char buf[65535];
  76.     char wassup[512];
  77.     char img[3*1240*1800];
  78.  
  79.  
  80.    
  81.     usb_init();
  82.     usb_set_debug(0);
  83.     usb_find_busses();
  84.     usb_find_devices();
  85.  
  86.     vendor = 0x04a9;
  87.     product = 0x1706;
  88.    
  89.     dev = find_device(vendor, product);
  90.     assert(dev);
  91.  
  92.     devh = usb_open(dev);
  93.     assert(devh);
  94.    
  95.     signal(SIGTERM, release_usb_device);
  96.  
  97.     ret = usb_claim_interface(devh, 0);
  98.     if (ret != 0)
  99.     {
  100.         printf("claim failed with error %d\n", ret);
  101.             exit(1);
  102.     }
  103.     ret = usb_set_altinterface(devh, 0);
  104.     assert(ret >= 0);
  105.     ret = usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
  106.     ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000009);
  107.     ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000027);
  108.     ret = usb_set_configuration(devh, 0x0000001);
  109.     ret = usb_set_altinterface(devh, 0);
  110.    
  111.     memcpy(buf, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x64\x71\x81\x60\x28\x49\x81\x4c\x00\x00\x00\xff\xff\xff\x00\x00\xa7\xef\x81\x03\x00\x00\x00\x00\x02\x03\x00\x02\x00\x00\x00\x1c\xa7\xef\x81\x00\x00\x01\x00\x00\x00\x00\x00\x00\x02\x84\x00", 0x0000040);
  112.     ret = usb_interrupt_write(devh, 0x00000085, buf, 0x0000040, 1);
  113.    
  114.     memcpy(buf, "\xf3\x20\x00\x00\x00\x00\x00\x00\x0c\x00", 0x000000a);
  115.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x000000a, 10000);
  116.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  117.     print_bytes(wassup,ret);
  118.  
  119.     //irgend was initen
  120.     memcpy(buf, "\xeb\x80\x00\x00\x00\x00\x00\x00\x14\x00\x30\x35\x2f\x30\x39\x2f\x31\x37\x20\x32\x31\x3a\x35\x34\x00\x00\x00\x00\x00\x46", 0x000001e);
  121.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x000001e, 10000);
  122.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  123.     print_bytes(wassup,ret);
  124.  
  125.     //Papier einziehen
  126.     memcpy(buf, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x40\x64\x71\x81\x60\x28\x49\x81\x4c\x00\x00\x00\xff\xff\xff\x00\x00\xa7\xef\x81\x03\x00\x00\x00\x00\x02\x03\x00\x02\x00\x00\x00\x1c\xa7\xef\x81\x00\x00\x01\x00\x00\x00\x00\x00\x00\x02\x84\x00", 0x0000040);
  127.     ret = usb_interrupt_write(devh, 0x00000085, buf, 0x0000040, 1);
  128.    
  129.     memcpy(buf, "\xcf\x60\x00\x00\x00\x00\x00\x00\x0a\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff", 0x0000014);
  130.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x0000014, 10000);
  131.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  132.     print_bytes(wassup,ret);
  133.  
  134.     memcpy(buf, "\xf3\x20\x00\x00\x00\x00\x00\x00\x0c\x00", 0x000000a);
  135.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x000000a, 10000);
  136.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  137.     print_bytes(wassup,ret);
  138.    
  139.     memcpy(buf, "\xcf\x60\x00\x00\x00\x00\x00\x00\x0a\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff", 0x0000014);
  140.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x0000014, 10000);
  141.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  142.     print_bytes(wassup,ret);
  143.    
  144.     memcpy(buf, "\xcf\x60\x00\x00\x00\x00\x00\x00\x0a\x00\x01\x00\x00\x20\x00\x00\x00\x00\x00\xdf", 0x0000014);
  145. ret = usb_bulk_write(devh, 0x00000003, buf, 0x0000014, 10000);
  146.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  147.     print_bytes(wassup,ret);
  148.    
  149.     memcpy(buf, "\xe9\x20\x00\x00\x00\x00\x00\x00\x00\x00", 0x000000a);
  150.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x000000a, 10000);
  151.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  152.     print_bytes(wassup,ret);
  153.  
  154.     memcpy(buf, "\xdb\x20\x00\x00\x00\x00\x00\x00\x00\x00", 0x000000a);
  155.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x000000a, 10000);
  156.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  157.     print_bytes(wassup,ret);
  158.  
  159.     memcpy(buf, "\xdd\x20\x00\x00\x00\x00\x00\x00\x0a\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\xfd", 0x0000014);
  160.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x0000014, 10000);
  161.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  162.     print_bytes(wassup,ret);
  163.    
  164.     memcpy(buf, "\xde\x20\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x80\x96\x80\x96\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x04\xd8\x00\x00\x06\xe2\x08\x18\x00\x00\x00\x00\x00\x00\xff\x00\x00\x81\x00\x00\x02\x01\x00\x01\x00\x00\x00\x5b", 0x0000038);
  165.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x0000038, 10000);
  166.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  167.     print_bytes(wassup,ret);
  168.        
  169.     memcpy(buf, "\xf3\x20\x00\x00\x00\x00\x00\x00\x0c\x00", 0x000000a);
  170.     ret = usb_bulk_write(devh, 0x00000003, buf, 0x00000a, 10000);
  171.     ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  172.     print_bytes(wassup,ret);
  173.     int lastbyte=0;
  174.     while(1)
  175.     {  
  176.       wassup[4]=0;
  177.         memcpy(buf, "\xd4\x20\x00\x00\x00\x00\x00\x0c\x04\x00", 0x000000a);
  178.       ret = usb_bulk_write(devh, 0x00000003, buf, 0x00000a, 10000);
  179.       ret = usb_bulk_write(devh, 0x84, wassup, 0x200, 10000);
  180.       if (ret > 0 && wassup[4])
  181.       {  
  182.           memset(buf, 0, wassup[4]*0x100);
  183.           ret = usb_bulk_write(devh, 0x00000084, buf, wassup[4]*0x100, 10000);
  184.           memcpy(&img[lastbyte],buf,wassup[4]*0x100);
  185.           lastbyte+=wassup[4]*0x100;
  186.           //fwrite(buf,1,wassup[4]*0x100,stdout);
  187.           memset(buf, 0, 0x200);
  188.           ret =  usb_bulk_write(devh, 0x84, buf, 0x200, 10000);
  189.       }
  190.       else
  191.       {
  192.           usleep(100000);
  193.           if(lastbyte > 1000)
  194.               break;
  195.       }
  196.     }
  197.    
  198.     // code to separate RGB
  199.     int i,j;
  200.     for(i=0;i<lastbyte/(3*1240)-9;i++)
  201.     {
  202.       for(j=0;j<1240;j++)
  203.       {
  204.           memcpy(&img[1240*3*i+3*j+1],&img[1240*3*(i+4)+3*j+1],1);
  205.           memcpy(&img[1240*3*i+3*j+2],&img[1240*3*(i+8)+3*j+2],1);
  206.       }
  207.     }
  208.     printf("P6\n%d %d\n255\n", 1240,lastbyte/(3*1240) - 8);
  209.     fwrite(img,1,lastbyte-3*1240*8,stdout);
  210. }

Raw Paste


Login or Register to edit or fork this paste. It's free.