Hi! I am working on a hid under Linux Suse and i want to communicate with it. it is working under Windows, I have to adapt it also for Linux. I was able to read out some device infos, but I have some problem with sending and recieving data from the device. I wrote a little c-program to handle a communication. I don't get any error messages from the ioctl() but there happen strange things:
My stdout: /******************************************************************* ewien-134:/home/ogu1234/knx# ./knx4 Vendor_ID:0x03eb Product: 0x0001 Version: 1.0.4. 1 Application, Location: 1, devnum: 2, ifnum: 0 Senden... knx_send 1 report_id=0, report_type= 2 knx_send vor for-Schleife: uindex:0 - rc:0 value = 5 knx_send vor for-Schleife: uindex:1 - rc:0 value = ffffffb1 knx_send vor for-Schleife: uindex:2 - rc:0 value = 4 knx_send vor for-Schleife: uindex:3 - rc:0 value = 1f knx_send vor for-Schleife: uindex:4 - rc:0 value = 50 knx_send 6 send = 0 ...gesendet...fd closed /***************************************************************************** The second value is on ffffffb1 and not on b1, that must be because value is defined as __s32, or not? How can I modify this in linux, because I think it is not enough to adapt the hiddev.h and set "_u32 value" in the hiddev_usage_ref.... Could you help me? Greetings from Vienna Günther *********************************************** ************ProgrammCode*********************** *********************************************** #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <asm/types.h> #ifndef HID_MAX_USAGES #define HID_MAX_USAGES 1024 #endif #include <linux/hiddev.h> int getUsageCode_Out0( int ); int match_fail( const char*, short ); int fd, version; struct hiddev_devinfo device_info; #define READ_BUFFER_LENGTH 5 /* File-global */ unsigned long usageCode; /* * In: report - The report buffer (always 64 bytes), including record_ID * fd - The file descriptor as delivered by init() * Out: - * * Returns: 0 if ok, or the error code of a failed ioctl() call */ int knx_send( const char report[5], int fd ) { int rc = 0, uindex; // send output report struct hiddev_usage_ref uref; struct hiddev_report_info rinfo; // always send 5 bytes, assume 0x01 (report_id) is prepended uref.report_id = 0x00;//*report++; // report_id byte: special treatment uref.report_type = HID_REPORT_TYPE_OUTPUT; uref.field_index = 0x00; // uref.usage_code = 0xFFA10005; uref.usage_code = usageCode; for( uindex = 0; uindex < 5; uindex++ ) { uref.usage_index = uindex; uref.value = *report++; printf("knx_send vor for-Schleife: uindex:%d - rc:%d\n", uindex,rc); printf("value = %-12x\n", uref.value); if( (rc=ioctl( fd, HIDIOCSUSAGE, &uref )) != 0 ) { printf("knx_send fehler 1: uindex:%d - rc:%d\n", uindex,rc); return rc; } } rinfo.report_type = HID_REPORT_TYPE_OUTPUT; rinfo.report_id = 0x00; rinfo.num_fields = 1; if( (rc=ioctl( fd, HIDIOCSREPORT, &rinfo )) != 0 ) { printf("knx_send fehler 2"); return rc; } printf("knx_send 6\n"); return 0; } /* * In: device path - Typically, "/dev/usb/hiddev0" * vendorId - 4 hex digits passed as a string, e.g. "2c58" * productId - 4 hex digits passed as a string, see above * versionId - 4 hex digits passed as a string, see above * Out: - * * Returns: A valid file descriptor as returned by open(), or < 0 on error */ int knx_init( char* device_path, const char* vendorId, const char* productId, const char* versionId ) { struct hiddev_devinfo device_info; int fd = open ( device_path, O_RDWR ); if (fd < 0) { printf("open() failed, check the connection to the device\n"); exit(1); } if (ioctl (fd, HIDIOCGDEVINFO, &device_info) | ioctl (fd, HIDIOCGVERSION, &version) ==-1) { close(fd); printf("GDEVINFO failed\n"); } printf(" Vendor_ID:0x%04hx Product: 0x%04hx Version: %d.%d.%d.\n", device_info.vendor, device_info.product, version >> 16, (version >> 8) & 0xff, version & 0xff); printf("%i Application%s, ", device_info.num_applications, (device_info.num_applications==1?"":"s")); printf(" Location: %d, devnum: %d, ifnum: %d\n", device_info.busnum, device_info.devnum, device_info.ifnum); if (getUsageCode_Out0( fd ) < 0) { printf("getusageCode_Out0 kleiner 0\n"); return -8; } printf("Ausgabe"); if (*vendorId != 0 || *productId != 0 || *versionId != 0) { /* * If vendorID, productId, or versionId provided: * Check if device matches them! */ printf("if abfrage: vendorId != 0 || *productId != 0 || *versionId != 0"); int rc = ioctl( fd, HIDIOCGDEVINFO, &device_info ); if (rc < 0) { printf("ioctl in init -Fehler"); return -16; } if ((*vendorId != 0) && match_fail(vendorId, device_info.vendor)){ printf("VendorID failed"); return -4; } if ((*productId != 0) && match_fail(productId, device_info.product)){ printf("ProductID Failed"); return -4; } if ((*versionId != 0) && match_fail(versionId, device_info.version)){ printf("VersionID failed"); return -4; } } printf("init fertig"); return fd; } /* * In: fd - The file descriptor of the currently opened device * Out: - * Returns: 0 if ok, error code of close() if not */ int knx_exit( int fd ) { return close( fd ); } /* * Internally used functions - don't export to Ruby! */ int getUsageCode_Out0( int fd ) { struct hiddev_usage_ref uref; int rc; uref.report_type = HID_REPORT_TYPE_OUTPUT; uref.report_id = 0x00; uref.field_index = 0; uref.usage_index = 0; rc = ioctl( fd, HIDIOCGUCODE, &uref ); if (rc < 0) return rc; usageCode = uref.usage_code; printf("return 0"); return 0; } int match_fail( const char* id_string, short value ) { int id; sscanf( id_string, "%4x", &id ); return (id == value) ? 0 : 1; } int main(int argc, char **argv[]) { int send, close, uc; char report[5]; fd=knx_init("/dev/usb/hiddev0","03eb", "0001", "0100"); printf("fd = %d\n",fd); printf("Senden...\n"); report[0] = 0x05; report[1] = 0xb1; report[2] = 0x04; report[3] = 0x1f; report[4] = 0x50; send=knx_send(report, fd); printf("send = %d\n",send); if (send==0) printf("...gesendet"); close=knx_exit(fd); if (close==0) printf("...fd closed"); return 1; } Günther Obrist Moeller Gebäudeautomation KG Scheydgasse 42, 1210 Wien AUT Entwicklung Wien (Diplomant) -- Günther Obrist Moeller Gebäudeautomation KG Scheydgasse 42, 1210 Wien AUT Entwicklung Wien (Diplomant) ------------------------------------------------------- SF.Net email is sponsored by: Tame your development challenges with Apache's Geronimo App Server. Download it for free - -and be entered to win a 42" plasma tv or your very own Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel