示例#1
0
文件: hidtool.c 项目: brmlab/brmscope
int main(int argc, char **argv)
{
usbDevice_t *dev;
char        buffer[4];    /* room for dummy report ID */
int         err;

    if(argc < 2){
        usage(argv[0]);
        exit(1);
    }
    if((dev = openDevice()) == NULL)
        exit(1);
    if(strcasecmp(argv[1], "read") == 0){
        int len = sizeof(buffer);
        if((err = usbhidGetReport(dev, 0, buffer, &len)) != 0){
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
        }else{
            hexdump(buffer + 1, sizeof(buffer) - 1);
        }
    }else if(strcasecmp(argv[1], "write") == 0){
        int i, pos;
        memset(buffer, 0, sizeof(buffer));
        for(pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++){
            pos += hexread(buffer + pos, argv[i], sizeof(buffer) - pos);
        }
        if((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0)   /* add a dummy report ID */
            fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
    }else{
        usage(argv[0]);
        exit(1);
    }
    usbhidCloseDevice(dev);
    return 0;
}
/**************************************************************************************
Function Name       :   main
Description         :   Read and Write the Password in the EEPROM
Parameters          :   commandline arguments
Return              :   NULL
**************************************************************************************/
int main(int argc, char **argv)
{
usbDevice_t *dev;
char        buffer[129];    /* room for dummy report ID */
int         err;

    if(argc < 2){
        usage(argv[0]);
        exit(1);
    }
    if((dev = openDevice()) == NULL)
        exit(1);
    if(strcasecmp(argv[1], "read") == 0){
        int len = sizeof(buffer);
        if((err = usbhidGetReport(dev, 0, buffer, &len)) != 0){
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
        }else{
            hexdump(buffer + 1, sizeof(buffer) - 1);
        }
    }else if(strcasecmp(argv[1], "write") == 0){
        memset(buffer, 0, sizeof(buffer));
        int i = 1;
        while(*argv[2] != '\0'){    
            buffer[i] += *argv[2]++;
            i++;
        }
        if((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0)   /* add a dummy report ID */
            fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
    }else{
        usage(argv[0]);
        exit(1);
    }
    usbhidCloseDevice(dev);
    return 0;
}
示例#3
0
uint8_t HIDwrite(usbDevice_t *dev, uint8_t reportId, uint8_t *buff, uint16_t size)
{
    unsigned int i;
    int len;
    int err;
    ucp_request_t request;
    ucp_response_t response;
    
    for(i=0; i<size; i+= 8)
    {
        request.reportid = reportId;
        memcpy((void*)&request.data[0], (void*)&buff[i], sizeof(request.data));
        
        if((err = usbhidSetReport(dev, (char*)&request, sizeof(request))) != 0)   /* add a dummy report ID */
            fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));        
        
        len = sizeof(response);
        if((err = usbhidGetReport(dev, reportId, (char*)&response, &len)) != 0)
        {
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
        }
        else
        {
            hexdump( (void*)&response.data[0], 8);            
        }
        
                
        if(usleep(50000) < 0) // sleep 50 ms
        {
            fprintf( stderr, "sleep ERR\n");
        }
    }
    
    return 0;
}
示例#4
0
int stompbox_read_rom(usbDevice_t *dev, stompbox_rom_t *rom)
{
	const int reportsize = 128;

	int romsize = 512;
	int report, len, err;


	for (report = 1, rom->size = 0;
	     rom->size < romsize;
	     report++, rom->size += reportsize) {
		len = reportsize;
		err = usbhidGetReport(dev, report,
				      (char *) (rom->raw + rom->size), &len);

		if (0 != err || reportsize != len) {
			fprintf(stderr,
				"Error reading ROM at %d: %s\n",
				rom->size, (0 != err ? usbErrorMessage(err)
                                                     : "reply is too short"));
			return -1;
		}
	}
	
	return 0;
}
// Read HID report
static int d16_read_rep(USBDEVHANDLE dev, int reportnum, char raw_data[8+1])
{
    char buffer[10];
    int err;
    int len = 8 + 1; /* report id 1 byte + 8 bytes data */
    memset(buffer, 0, sizeof(buffer));

    err = usbhidGetReport(dev, reportnum, buffer, &len);
    if ( err ) {
        printerr("error reading hid report: %s\n", usbErrorMessage(err));
        return -1;
    }

    if ( len != 9 || buffer[0] != reportnum ) {
        printerr("ERROR: wrong HID report returned! %d\n", len);
        return -2;
    }

    if ( raw_data ) {
        /* copy raw report data */
        memcpy(raw_data, buffer, len);
    }

    return 0;
}
示例#6
0
char* hidtool_read(usb_dev_handle *dev){
    memset(readbuffer, 0, 5);
    int         err;

    // convert r/w into struct.
    int len = sizeof(readbuffer);
    if((err = usbhidGetReport(dev, 0, readbuffer, &len)) != 0){
        fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
    }
    return readbuffer;
}
示例#7
0
int hidtool_write(usb_dev_handle *dev, char *data){
    int         err;

    memset(writebuffer, 0, 5);
    memcpy(writebuffer +1, data, 4);
    
    if((err = usbhidSetReport(dev, writebuffer, 5)) != 0){   /* add a dummy report ID */
	    fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
	    return 1;
	}
	return 0;
}
示例#8
0
static usbDevice_t  *openDevice(void)
{
usbDevice_t     *dev = NULL;
unsigned char   rawVid[2] = {USB_CFG_VENDOR_ID}, rawPid[2] = {USB_CFG_DEVICE_ID};
char            vendorName[] = {USB_CFG_VENDOR_NAME, 0}, productName[] = {USB_CFG_DEVICE_NAME, 0};
int             vid = rawVid[0] + 256 * rawVid[1];
int             pid = rawPid[0] + 256 * rawPid[1];
int             err;
    if((err = usbhidOpenDevice(&dev, vid, vendorName, pid, productName, 0)) != 0){
        fprintf(stderr, "error finding %s: %s\n", productName, usbErrorMessage(err));
        return NULL;
    }
    return dev;
}
// Write HID report
static int d16_write_rep(USBDEVHANDLE dev, int reportnum, char buffer[8+1])
{
    int err;
    int len = 8 + 1; /* report id 1 byte + 8 bytes data */

    buffer[0] = (char)reportnum;
    err = usbhidSetReport(dev, buffer, len);
    if ( err ) {
        printerr("error writing hid report: %s\n", usbErrorMessage(err));
        return -1;
    }

    return err;
}
示例#10
0
/**
 * API: Set the backlight brightness
 */
void
glcd2usb_backlight(PrivateData *p, int state)
{
	int err = 0;
	CT_glcd2usb_data *ctd = (CT_glcd2usb_data *) p->ct_data;
	int promille = (state == BACKLIGHT_ON) ? p->brightness : p->offbrightness;

	ctd->tx_buffer.bytes[0] = GLCD2USB_RID_SET_BL;
	ctd->tx_buffer.bytes[1] = promille * 255 / 1000;

	p->glcd_functions->drv_debug(RPT_DEBUG, "glcd2usb_backlight: new value = %d",
		ctd->tx_buffer.bytes[1]);

	if ((err = usbSetReport(ctd->device, USB_HID_REPORT_TYPE_FEATURE, ctd->tx_buffer.bytes, 2)) != 0) {
		p->glcd_functions->drv_report(RPT_ERR, "Error freeing display: %s\n", usbErrorMessage(err));
	}
}
示例#11
0
uint8_t HIDread(usbDevice_t *dev, uint8_t reportId, uint8_t *buff, uint16_t size)
{
    unsigned int i;
    int err;
    
    for(i=0; i<size; i+= 8)
    {
        ucp_response_t response;
        int len = sizeof(response);
        if((err = usbhidGetReport(dev, reportId, (char*)&response, &len)) != 0)
        {
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
        }
        else
        {
            memcpy((void*)&buff[i], (void*)&response.data, sizeof(response.data));
            hexdump( (void*)&buff[i], 8);
        }
    }
    
    return 0;
}
示例#12
0
/**
 * API: Poll for any pressed keys. Converts the bitmap of keys pressed into a
 * scancode (1-4) for each pressed key.
 * \note Only single key presses are detected.
 */
unsigned char
glcd2usb_poll_keys(PrivateData *p)
{
	CT_glcd2usb_data *ctd = (CT_glcd2usb_data *) p->ct_data;
	unsigned char keycode = 0;
	int err = 0, len = 2;
	int i;

	if ((err = usbGetReport(ctd->device, USB_HID_REPORT_TYPE_FEATURE,
				GLCD2USB_RID_GET_BUTTONS, ctd->tx_buffer.bytes, &len)) != 0) {
		p->glcd_functions->drv_report(RPT_ERR, "glcd2usb_poll_keys: Error getting button state: %s",
					      usbErrorMessage(err));
		return 0;
	}

	for (i = 0; i < 4; i++) {
		if (ctd->tx_buffer.bytes[1] & (1 << i)) {
			keycode = i + 1;
			break;
		}
	}

	return keycode;
}
示例#13
0
文件: main.c 项目: leeku11/KBDMOD_M3
static int uploadData(char *dataBuffer)
{
usbDevice_t *dev = NULL;
int         err = 0, len, mask, pageSize, deviceSize, i;
union{
    char            bytes[1];
    deviceInfo_t    info;
    deviceData_t    data;
}           buffer;

    if((err = usbOpenDevice(&dev, IDENT_VENDOR_NUM, IDENT_VENDOR_STRING, IDENT_PRODUCT_NUM, IDENT_PRODUCT_STRING, 1)) != 0){
        fprintf(stderr, "Error opening HIDBoot device: %s\n", usbErrorMessage(err));
        goto errorOccurred;
    }
    len = sizeof(buffer);
    if(endAddress[addressIndex] > startAddress[0]){    // we need to upload data
        if((err = usbGetReport(dev, USB_HID_REPORT_TYPE_FEATURE, 1, buffer.bytes, &len)) != 0){
            fprintf(stderr, "Error reading page size: %s\n", usbErrorMessage(err));
            goto errorOccurred;
        }
        if(len < sizeof(buffer.info)){
            fprintf(stderr, "Not enough bytes in device info report (%d instead of %d)\n", len, (int)sizeof(buffer.info));
            err = -1;
            goto errorOccurred;
        }
        pageSize = getUsbInt(buffer.info.pageSize, 2);
        deviceSize = getUsbInt(buffer.info.flashSize, 4);
        printf("Page size   = %d (0x%x)\n", pageSize, pageSize);
        printf("Device size = %d (0x%x); %d bytes remaining\n", deviceSize, deviceSize, deviceSize - 2048);
        if(endAddress[addressIndex] > deviceSize - 2048){
            fprintf(stderr, "Data (%d bytes) exceeds remaining flash size!\n", endAddress[addressIndex]);
            err = -1;
            goto errorOccurred;
        }
        if(pageSize < 128){
            mask = 127;
        }else{
            mask = pageSize - 1;
        }
        for (i = 0; i <= addressIndex; i++)
        {
           startAddress[i] &= ~mask;                  /* round down */
           endAddress[i] = (endAddress[i] + mask) & ~mask;  /* round up */
           printf("Uploading %d (0x%x) bytes starting at %d (0x%x)\n", endAddress[i] - startAddress[i], endAddress[i] - startAddress[i], startAddress[i], startAddress[i]);
           while(startAddress[i] < endAddress[i]){
               buffer.data.reportId = 2;
               memcpy(buffer.data.data, dataBuffer + startAddress[i], 128);
               setUsbInt(buffer.data.address, startAddress[i], 3);
               printf("\r0x%05x ... 0x%05x", startAddress[i], startAddress[i] + (int)sizeof(buffer.data.data));
               fflush(stdout);
               if((err = usbSetReport(dev, USB_HID_REPORT_TYPE_FEATURE, buffer.bytes, sizeof(buffer.data))) != 0){
                   //fprintf(stderr, "Error uploading data block: %s\n", usbErrorMessage(err));
                   continue;
                   goto errorOccurred;
               }
               startAddress[i] += sizeof(buffer.data.data);
           }
           printf("\n");
        }
    }
    if(leaveBootLoader){
        /* and now leave boot loader: */
        buffer.info.reportId = 1;
        usbSetReport(dev, USB_HID_REPORT_TYPE_FEATURE, buffer.bytes, sizeof(buffer.info));
        /* Ignore errors here. If the device reboots before we poll the response,
         * this request fails.
         */
    }
errorOccurred:
    if(dev != NULL)
        usbCloseDevice(dev);
    return err;
}
示例#14
0
int main(int argc, char **argv) {
	usbDevice_t *dev;
	char buffer[REPORT_SIZE]; /* room for dummy report ID */
	int err;

	if (argc < 2) {
		usage(argv[0]);
		exit(1);
	}
	if ((dev = openDevice()) == NULL)
		exit(1);
	if (strcasecmp(argv[1], "read") == 0) {
		int len = sizeof(buffer);
		if ((err = usbhidGetReport(dev, 0, buffer, &len)) != 0) {
			fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
		} else {
			int16dump(buffer + 1, sizeof(buffer) - 1);
		}
	} else if (strcasecmp(argv[1], "write") == 0) {
		int i, pos;
		memset(buffer, 0, sizeof(buffer));
		for (pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++) {
			pos += int16read(buffer + pos, argv[i], sizeof(buffer) - pos);
		}
		if ((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) /* add a dummy report ID */
			fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
	} else if (strcasecmp(argv[1], "writeinput") == 0) {
		int i, pos;
		// read initial positions
		int len = sizeof(buffer);
		if ((err = usbhidGetReport(dev, 0, buffer, &len)) != 0) {
			fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
		}
		// int16dump(buffer + 1, sizeof(buffer) - 1);
		char input[1000];
		int scanfEof;
		do {
			scanfEof = scanf("%[^\n]%*c", input);
			// printf("[%i] %s\n", scanfEof, input);
			int16read(buffer + 1, input, sizeof(buffer) - 1);
			// int16dump(buffer + 1, sizeof(buffer) - 1);
			buffer[0] ++;
			int retry = 0;
			do {
				if ((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) { /* add a dummy report ID */
					fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
				}
			} while (err != 0 && retry ++ < 3);
			if (err != 0) {
				// try to reconnect
				usbhidCloseDevice(dev);
				dev = openDevice();
				if ((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) { /* add a dummy report ID */
					fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
				}
			}
			//usleep(20000);
		} while (scanfEof > 0);
//		for (pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++) {
//			pos += int16read(buffer + pos, argv[i], sizeof(buffer) - pos);
//		}
//		if ((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) /* add a dummy report ID */
//			fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
	} else {
		usage(argv[0]);
		exit(1);
	}
	usbhidCloseDevice(dev);
	return 0;
}
// Enum function for building list of devices
static
int enumfunc(USBDEVHANDLE usbh, void *context)
{
    static const char vendorName[] = USB_IO16_VENDOR_NAME;
    static const char productName[] = USB_IO16_NAME;
    int err;
    char buffer[128 * sizeof(short)]; // max USB string is 128 UTF-16 chars
    int i;
    struct usb_io_internal_s *q;
    struct enumctx_s *ectx = (struct enumctx_s *)context;

    err = usbhidGetVendorString(usbh, buffer, sizeof(buffer));
    if ( err )
    {
        goto next;
    }

    if ( 0 != strcmp(buffer, vendorName) )
    {
        goto next;
    }

    err = usbhidGetProductString(usbh, buffer, sizeof(buffer));
    if ( err )
    {
        goto next;
    }

    if ( 0 != strcmp(buffer, productName) )
    {
        goto next;
    }

    /* Check the unique ID: USB_IO16_ID_STR_LEN  bytes at offset 1 (just after the report id) */
    err = d16_read_rep(usbh, 0, buffer);
    if ( err < 0 )
    {
        dbgprintf("Error reading report 0: %s\n", usbErrorMessage(err));
        goto next;
    }

    for ( i = 1; i <= USB_IO16_ID_STR_LEN; i++ )
    {
        unsigned char x = (unsigned char)buffer[i];
        if ( x <= 0x20 || x >= 0x7F )
        {
            dbgprintf("Bad USBIO16 ID string!\n");
            goto next;
        }
    }

    dbgprintf("Device %s found: ID=[%.*s]\n", productName, USB_IO16_ID_STR_LEN, &buffer[1]);

    // allocate & save info
    q = (struct usb_io_internal_s *)calloc(1, sizeof(struct usb_io_internal_s));
    if ( !q ) {
        dbgprintf("Malloc err\n");
        goto next; //$$$ revise
    }
    /* keep this device, continue */
    q->usbh = usbh;
    memcpy(q->idstr, &buffer[1], USB_IO16_ID_STR_LEN);
    q->type = 16; // put # of pins for now...
    q->urdi.serial_number = (void*)&q->idstr[0];
    q->urdi.device_path = (char*)g_dummyPath;

    if ( !ectx->head ) {
        ectx->head = q;
        ectx->tail = q;
    } else {
        ectx->tail->urdi.next = (pusb_io_device_info_t)q;
        ectx->tail = q;
    }

    ++ectx->numdevs;
    return 1;

next:
    /* Continue search */
    usbhidCloseDevice(usbh);
    return 1;
}
示例#16
0
int main(int argc, char **argv)
{


    int option = 0;      // For getopt temp option

    usbDevice_t *dev;
    ucp_cmd_t buffer;    //room for dummy report ID
    int         err;

    //Initialize globalArgs before we get to work
    globalArgs.rFlag = 0;   //False
    globalArgs.iFlag = 0;   //False
    globalArgs.wFlag = 0;   //False
    globalArgs.fFlag = 0;   //False
    globalArgs.pFlag = 0;   //False
    globalArgs.hashFlag = 0;   //False
    globalArgs.kFlag = 0;   //False
    strncpy(globalArgs.pin,"0000",sizeof(globalArgs.pin)); //Default pin
    globalArgs.offset = 0; //Default
    globalArgs.size = 512; //Default
    globalArgs.fileName = NULL;
    globalArgs.file = NULL;

    //Check if no arguments at all
    if(argc==1) printUsage(argv[0]);

    //If there's some argument, parse them
    while((option = getopt(argc, argv, "rwif:o:p:Pk:s:h?")) !=-1){
    //Check option flags
    switch(option){
        case 'r':
            globalArgs.rFlag = 1; //True
            break;
        case 'w':
            globalArgs.wFlag = 1; //True
            break;
        case 'i':
            globalArgs.iFlag = 1; //True
            break;
        case 'f':
            globalArgs.fFlag = 1; //True
            globalArgs.fileName = optarg;
            printf("File: %s\n",globalArgs.fileName);
            break;
        case 'o':
            globalArgs.offset = atoi(optarg);
            break;
        case 'p':
            globalArgs.pFlag = 1; //True
            strncpy(globalArgs.pin,optarg, sizeof(globalArgs.pin));
            break;
        case 'P':
            globalArgs.hashFlag=1; //True
            break;
        case 'k':
            globalArgs.kFlag = 1; //True
            globalArgs.keyboard = optarg;
            printf("Keyboard: %s\n", globalArgs.keyboard);
        case 's':
            globalArgs.size = atoi(optarg);
            break;
        case 'h':
        case '?':
            printUsage(argv[0]);
            break;
        //Unknown flag, don't know what to do
        default:
            //After getopt prints the error
            printUsage(argv[0]);
            break;
    }
    }

    //Check that only one action is done at a time
    if(globalArgs.rFlag + globalArgs.wFlag + globalArgs.iFlag > 1) printUsage(argv[0]);
    //Check that not set PIN and read HASH are given at a time
    if(globalArgs.pFlag + globalArgs.hashFlag > 1) printUsage(argv[0]);
    //Check that if write from file to device, we are given a file and a pin to encrypt!
    if(globalArgs.wFlag  && !globalArgs.fFlag) printUsage(argv[0]);
    if(globalArgs.wFlag && !globalArgs.pFlag) printUsage(argv[0]);
    //Also check pin for read flag
    if(globalArgs.rFlag && !globalArgs.pFlag) printUsage(argv[0]);

    //Try to open the device, exit if no device present.
    if((dev = openDevice()) == NULL) exit(1);

    //Clean the buffer before working with it
    memset((void*)&buffer, 0, sizeof(buffer));
    

    //Check and perform the desired commands
    if(globalArgs.rFlag){  //READ COMMAND
        buffer.cmd = UCP_CMD_READ;
        deviceRead.offset = globalArgs.offset;
        deviceRead.size = globalArgs.size;
        memcpy((void*)&buffer.buff, (void*)&deviceRead, sizeof(deviceRead));

        //give some feedback
        fprintf(stderr,"Reading from the MemType: offset=%d bytes, size=%d bytes.\n",deviceRead.offset, deviceRead.size);

    }else if(globalArgs.wFlag){  //WRITE COMMAND
        buffer.cmd = UCP_CMD_WRITE;
        deviceRead.offset = globalArgs.offset;
        deviceRead.size = readXML(globalArgs.fileName);
        memcpy((void*)&buffer.buff, (void*)&deviceRead, sizeof(deviceRead));

        //give some feedback
        fprintf(stderr,"Writing to the MemType: offset=%d bytes, size=%d bytes.\n",deviceRead.offset, deviceRead.size);

    }else if(globalArgs.iFlag){  //INFO COMMAND
        buffer.cmd = UCP_CMD_INFO;
    }else if(globalArgs.hashFlag){ //READ PIN HASH COMMAND
        buffer.cmd = UCP_CMD_READ_PIN;
    }else if(globalArgs.pFlag){ //SET PIN COMMAND
        buffer.cmd = UCP_CMD_SET_PIN;
        buffer.buff[0] = 16; //sizeof hash in bytes
    }else if(globalArgs.kFlag){
        buffer.cmd = UCP_CMD_KEYBOARD;
    }
       
        //Add a dummy report ID and send data to device 
        buffer.reportid = 2;
        if((err = usbhidSetReport(dev, (char*)&buffer, sizeof(buffer))) != 0)
            fprintf(stderr, "Error sending data to device: %s\n", usbErrorMessage(err));

        //Read back report 
        int len = sizeof(buffer);
        if((err = usbhidGetReport(dev, 2, (char*)&buffer, &len)) != 0)
        {   //... if not OK, print error
            fprintf(stderr, "Error reading data from device: %s\n", usbErrorMessage(err));
        }
        else //... if OK, do things :)
        {
            fprintf( stderr, "\nMemType CMD Response: ");
            hexdump( (void*)&buffer.cmd, sizeof(buffer.cmd)+sizeof(buffer.buff));
            fprintf( stderr, "Received data from the device: \n");
            switch(buffer.cmd)
            {
                case UCP_CMD_RESET:
                    fprintf( stderr, "RESET\n");
                    break;
                case UCP_CMD_READ:
                    fprintf( stderr, "READ\n");
                    cmdRead(dev, deviceRead.size);
                    break;
                case UCP_CMD_WRITE:
                    fprintf( stderr, "WRITE\n");
                    cmdWrite(dev, flashMemory, deviceRead.size);
                    fprintf(stderr, "[ENCRYPTION TEST] only hexdump");
                    break;
                case UCP_CMD_SET_PIN:
                    fprintf(stderr, "SET PIN\n");
                    cmdSetPin(dev);
                    break;
                case UCP_CMD_READ_PIN:
                    fprintf(stderr, "READ PIN HASH\n");
                    cmdReadPinHash(dev);
                    break;
                case UCP_CMD_KEYBOARD:
                    fprintf(stderr, "KEYBOARD\n");
                    cmdKeyboard(dev);
                    break;
                case UCP_CMD_DATA:
                    fprintf( stderr, "DATA\n");
                    break;
                case UCP_CMD_INFO:
                    fprintf( stderr, "sizeof(info) -> %lu\n", sizeof(deviceInfo));
                    memcpy((void*)&deviceInfo, (void*)buffer.buff, sizeof(deviceInfo));
                    
                    /* Call info */
                    cmdInfo(&deviceInfo);
                    break;
                case UCP_CMD_ERROR:  //Wait! the device returned one error!
                    switch( (unsigned char) buffer.buff[0] )
                    {
                        case UCP_ERR:
                            fprintf( stderr, "GENERIC ERROR\n");
                            break;
                        case UCP_ERR_PACKET:
                            fprintf( stderr, "PACKET ERROR\n");
                            break;
                        case UCP_ERR_CMD:
                            fprintf( stderr, "CMD ERROR\n");
                            break;
                        case UCP_ERR_ADDR:
                            fprintf( stderr, "ADDR ERROR\n");
                            break;
                        case UCP_ERR_SIZE:
                            fprintf( stderr, "SIZE ERRROR\n");
                            break;
                        case UCP_ERR_PROTOCOL:
                            fprintf( stderr, "PROTOCOL ERROR\n");
                            break;
                        case UCP_ERR_LOCKED:
                            fprintf( stderr, "DEVICE LOCKED ERROR\n");
                            break; 
                        default:
                            fprintf( stderr, "UNKNOWN ERROR\n");
                    }
                    break;
                default:
                    fprintf( stderr, "UNKNOWN CMD ERROR\n");
            }
        }

    usbhidCloseDevice(dev);
    
    return 0;
}
示例#17
0
/**
 * API: Initialize glcd2usb connection type.
 */
int
glcd2usb_init(Driver *drvthis)
{
	PrivateData *p = (PrivateData *)drvthis->private_data;
	CT_glcd2usb_data *ctd;

	static int didUsbInit = 0;
	struct usb_bus *bus;
	struct usb_device *dev;
	usb_dev_handle *handle = NULL;
	int err = 0;
	int rval, retries = 3;
	int len;

	/* Set up connection type low-level functions */
	p->glcd_functions->blit = glcd2usb_blit;
	p->glcd_functions->close = glcd2usb_close;
	p->glcd_functions->set_backlight = glcd2usb_backlight;
	p->glcd_functions->poll_keys = glcd2usb_poll_keys;

	/* Allocate memory structures */
	ctd = (CT_glcd2usb_data *) calloc(1, sizeof(CT_glcd2usb_data));
	if (ctd == NULL) {
		report(RPT_ERR, "%s/glcd2usb: error allocating connection data", drvthis->name);
		return -1;
	}
	p->ct_data = ctd;

	/*
	 * Try to find and open a device. Only the first device found will be
	 * recognized.
	 */
	if (!didUsbInit) {
		usb_init();
		didUsbInit = 1;
	}

	usb_find_busses();
	usb_find_devices();

	for (bus = usb_get_busses(); bus != NULL; bus = bus->next) {
		for (dev = bus->devices; dev != NULL; dev = dev->next) {

			if (dev->descriptor.idVendor == GLCD2USB_VID
			    && dev->descriptor.idProduct == GLCD2USB_PID) {

				handle = usb_open(dev);
				if (!handle) {
					report(RPT_WARNING, "%s/glcd2usb: cannot open USB device: %s",
					       drvthis->name, usb_strerror());
					continue;
				}
				else {
					goto found_dev;
				}
			}
		}
	}

found_dev:
	if (handle) {
		debug(RPT_DEBUG, "%s/glcd2usb: opening device succeeded", drvthis->name);
	}
	else {
		report(RPT_ERR, "%s/glcd2usb: no GLCD2USB device found", drvthis->name);
		goto err_out;
	}

	if (usb_set_configuration(handle, 1))
		report(RPT_WARNING, "%s/glcd2usb: could not set configuration: %s",
		       drvthis->name, usb_strerror());

	/*
	 * now try to claim the interface and detach the kernel HID driver on
	 * Linux and other operating systems which support the call.
	 */
	while ((rval = usb_claim_interface(handle, 0)) != 0 && retries-- > 0) {
#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
		if (usb_detach_kernel_driver_np(handle, 0) < 0) {
			report(RPT_WARNING, "%s/glcd2usb: could not detach kernel HID driver: %s",
			       drvthis->name, usb_strerror());
		}
#endif
	}
	if (rval != 0)
		report(RPT_WARNING, "%s/glcd2usb: could not claim interface", drvthis->name);

	/*
	 * Continue anyway, even if we could not claim the interface. Control
	 * transfers should still work.
	 */
	ctd->device = handle;

	/* Query device */
	memset(&(ctd->tx_buffer), 0, sizeof(ctd->tx_buffer));
	len = sizeof(display_info_t);

	if ((err = usbGetReport(ctd->device, USB_HID_REPORT_TYPE_FEATURE, GLCD2USB_RID_GET_INFO, ctd->tx_buffer.bytes, &len)) != 0) {
		report(RPT_ERR, "%s/glcd2usb: query display parameters: %s",
		       drvthis->name, usbErrorMessage(err));
		goto err_out;
	}

	if (len < (int)sizeof(ctd->tx_buffer.display_info)) {
		report(RPT_ERR, "%s/glcd2usb: incomplete display info report (%d instead of %d)",
		       drvthis->name, len, (int)sizeof(ctd->tx_buffer.display_info));
		goto err_out;
	}

	if (!(ctd->tx_buffer.display_info.flags & FLAG_VERTICAL_UNITS)) {
		report(RPT_ERR, "%s/glcd2usb: unsupported display layout", drvthis->name);
		goto err_out;
	}

	if (ctd->tx_buffer.display_info.width > GLCD_MAX_WIDTH
	    || ctd->tx_buffer.display_info.width <= 0
	    || ctd->tx_buffer.display_info.height > GLCD_MAX_HEIGHT
	    || ctd->tx_buffer.display_info.height <= 0) {
		report(RPT_ERR, "%s/glcd2usb: display size out of range: %dx%d",
		       drvthis->name, ctd->tx_buffer.display_info.width,
		       ctd->tx_buffer.display_info.height);
		goto err_out;
	}
	p->framebuf.layout = FB_TYPE_VPAGED;
	p->framebuf.px_width = ctd->tx_buffer.display_info.width;
	p->framebuf.px_height = ctd->tx_buffer.display_info.height;
	p->framebuf.size = (p->framebuf.px_height + 7) / 8 * p->framebuf.px_width;
	report(RPT_INFO, "%s/glcd2usb: using display size %dx%d", drvthis->name,
	       ctd->tx_buffer.display_info.width, ctd->tx_buffer.display_info.height);

	ctd->paged_buffer = malloc(p->framebuf.size);
	if (ctd->paged_buffer == NULL) {
		report(RPT_ERR, "%s/glcd2usb: cannot allocate memory", drvthis->name);
		goto err_out;
	}
	memset(ctd->paged_buffer, 0x55, p->framebuf.size);

	ctd->dirty_buffer = malloc(p->framebuf.size);
	if (ctd->dirty_buffer == NULL) {
		report(RPT_ERR, "%s/glcd2usb: cannot allocate memory", drvthis->name);
		goto err_out;
	}

	/* Allocate the display (turn off the 'whirl') */
	ctd->tx_buffer.bytes[0] = GLCD2USB_RID_SET_ALLOC;
	ctd->tx_buffer.bytes[1] = 1;
	if ((err = usbSetReport(ctd->device, USB_HID_REPORT_TYPE_FEATURE, ctd->tx_buffer.bytes, 2)) != 0) {
		report(RPT_ERR, "%s/glcd2usb: Error allocating display: %s",
		       drvthis->name, usbErrorMessage(err));
		goto err_out;
	}

	return 0;

err_out:
	glcd2usb_close(p);
	return -1;
}
示例#18
0
int main(int argc, char **argv)
{
usbDevice_t *dev;
char        buffer[65];    /* room for dummy report ID */
int         err;
char        quiet = 0;

    if ( argc < 2) {
        usage(argv[0]);
        exit(1);
    }
    if ( (dev = openDevice()) == NULL)
        exit(1);

    if ( strcasecmp(argv[1], "read") == 0) {
        int len = sizeof(buffer);
        if ( (err = usbhidGetReport(dev, 0, buffer, &len)) != 0) {
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
        } else {
            hexdump(buffer + 1, sizeof(buffer) - 1);
        }
    } else if ( strcasecmp(argv[1], "write") == 0) {
        int i, pos;
        bzero(buffer, sizeof(buffer));
        for ( pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++) {
            pos += hexread(buffer + pos, argv[i], sizeof(buffer) - pos);
        }
	/*
	printf("%d\n",buffer[0]);
	printf("%d\n",buffer[1]);
	printf("%d\n",buffer[2]);
	printf("%d\n",buffer[3]);
	*/
        //if ( (err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0)   /* add a dummy report ID */
        if ( (err = usbhidSetReport(dev, buffer, pos)) != 0)   /* add a dummy report ID */
            fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
    } else if ( strcasecmp( argv[1], "interactive" ) == 0 ) {
        int t = 0;
            for ( t = 0; t < argc; t++ )
	        if ( strcasecmp(argv[t], "quiet") == 0 )
	            quiet = 1;

	char *help = "q = exit\nr = read\nw = write <Data separated by spaces as decimal or hex (8bit unsigned)>\n";

	if ( !quiet )
	    printf("%s",help);

	char exit = 0;
	while ( exit != 1 )
	{
		int nbytes = 350;

		if ( !quiet )
			printf("> ");

		char *input;
		input = (char *) malloc (nbytes + 1);
		int cnt = getline(&input, &nbytes, stdin);

		if ( strncasecmp(input, "q", 1) == 0 )
		{

			if ( !quiet )
			    printf("bye.\n");

			exit = 1;

		} else if ( strncasecmp(input, "r", 1) == 0 ) {

			if ( !quiet )
			    printf("reading...\n");

			int len = sizeof(buffer) ;
			if ( (err = usbhidGetReport(dev, 0, buffer, &len)) != 0)
			{
				fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
				exit = 1;
			} else {
				hexdump(buffer + 1, sizeof(buffer) - 1);
			}

		} else if ( strncasecmp(input, "w ", 2) == 0 ) {
        		int i, pos;
			input[0] = 32; // kommando durch leerzeichen ersetzen
			bzero(buffer, sizeof(buffer));

			if ( !quiet )
				printf("sending data... ");

			for ( pos = 1, i = 2; i < cnt -1 && pos < sizeof(buffer); i++) {
				//printf(">%c\n", input[i]);
				pos += hexread( buffer + pos, &input[i], sizeof(buffer) - pos);
			}
			if ( (err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0)   // add a dummy report ID
			{
				fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
    				usbhidCloseDevice(dev);
				if ( (dev = openDevice()) != NULL)
					printf("reconnect...\n");
				else
					exit = 1;
			} else {
				if ( !quiet )
					printf("ok.\n");
			}
		} else
			printf("%s",help);
	}
    } else {
        usage(argv[0]);
        exit(1);
    }
    usbhidCloseDevice(dev);
    return 0;
}