(1/5) Multi-register I/O This patch adds functionality for reading multiple contiguous registers at once. This is used by new code in an upcoming patch which reads/writes as much as 1.3mb over these registers! This functionality replaces the original single-register-read code, which has been reimplemented as a wrapper. It is not intended for existing single-register-access users to change. I also removed some duplicate prototypes from dc1394_internal.h Tested on Linux but not OSX. Index: libdc1394/dc1394/internal.h =================================================================== --- libdc1394.orig/dc1394/internal.h +++ libdc1394/dc1394/internal.h @@ -150,10 +150,6 @@ dc1394error_t dc1394_print_camera_info_platform (dc1394camera_t *camera); dc1394error_t dc1394_find_cameras_platform(dc1394camera_t ***cameras_ptr, uint32_t* numCameras); -dc1394error_t -GetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t *value); -dc1394error_t -SetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t value); dc1394error_t _dc1394_capture_basic_setup (dc1394camera_t * camera, dc1394video_frame_t * frame); Index: libdc1394/dc1394/linux/control.c =================================================================== --- libdc1394.orig/dc1394/linux/control.c +++ libdc1394/dc1394/linux/control.c @@ -308,52 +308,54 @@ dc1394_find_cameras_platform(dc1394camer } dc1394error_t -GetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t *value) +GetCameraROMValues(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_quads) { DC1394_CAST_CAMERA_TO_LINUX(craw, camera); - int retval=1, retry= DC1394_MAX_RETRIES; + int i, retval=1, retry= DC1394_MAX_RETRIES; /* retry a few times if necessary (addition by PDJ) */ while(retry--) { #ifdef DC1394_DEBUG_LOWEST_LEVEL - fprintf(stderr,"get reg at 0x%llx : ", offset + CONFIG_ROM_BASE); + fprintf(stderr,"get %d regs at 0x%llx : ", num_quads, offset + CONFIG_ROM_BASE); #endif - retval= raw1394_read(craw->handle, 0xffc0 | camera->node, offset + CONFIG_ROM_BASE, 4, value); + retval= raw1394_read(craw->handle, 0xffc0 | camera->node, offset + CONFIG_ROM_BASE, 4 * num_quads, value); #ifdef DC1394_DEBUG_LOWEST_LEVEL - fprintf(stderr,"0x%lx\n",*value); + fprintf(stderr,"0x%lx [...]\n", value[0]); #endif usleep(DC1394_SLOW_DOWN); if (!retval) { - /* conditionally byte swap the value */ - *value= ntohl(*value); - return ( retval ? DC1394_RAW1394_FAILURE : DC1394_SUCCESS ); + goto out; } else if (errno != EAGAIN) { return ( retval ? DC1394_RAW1394_FAILURE : DC1394_SUCCESS ); } } - - *value= ntohl(*value); + +out: + /* conditionally byte swap the value */ + for (i = 0; i < num_quads; i++) + value[i] = ntohl(value[i]); return ( retval ? DC1394_RAW1394_FAILURE : DC1394_SUCCESS ); } dc1394error_t -SetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t value) +SetCameraROMValues(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_quads) { DC1394_CAST_CAMERA_TO_LINUX(craw, camera); - int retval=1, retry= DC1394_MAX_RETRIES; + int i, retval=1, retry= DC1394_MAX_RETRIES; /* conditionally byte swap the value (addition by PDJ) */ - value= htonl(value); + for (i = 0; i < num_quads; i++) + value[i] = htonl(value[i]); /* retry a few times if necessary */ while(retry--) { #ifdef DC1394_DEBUG_LOWEST_LEVEL - fprintf(stderr,"set reg at 0x%llx to value 0x%lx\n", offset + CONFIG_ROM_BASE, value); + fprintf(stderr,"set %d regs at 0x%llx to value 0x%lx [...]\n", num_quads, offset + CONFIG_ROM_BASE, value); #endif - retval= raw1394_write(craw->handle, 0xffc0 | camera->node, offset + CONFIG_ROM_BASE, 4, &value); + retval= raw1394_write(craw->handle, 0xffc0 | camera->node, offset + CONFIG_ROM_BASE, 4 * num_quads, value); usleep(DC1394_SLOW_DOWN); Index: libdc1394/dc1394/macosx/control.c =================================================================== --- libdc1394.orig/dc1394/macosx/control.c +++ libdc1394/dc1394/macosx/control.c @@ -197,43 +197,45 @@ dc1394_find_cameras_platform(dc1394camer } dc1394error_t -GetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t *value) +GetCameraROMValues(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_quads) { DC1394_CAST_CAMERA_TO_MACOSX(craw, camera); IOFireWireLibDeviceRef d = craw->iface; FWAddress full_addr; - int retval; + int i, retval; UInt32 length; UInt64 addr = CONFIG_ROM_BASE + offset; full_addr.addressHi = addr >> 32; full_addr.addressLo = addr & 0xffffffff; - length = 4; + length = 4 * num_quads; retval = (*d)->Read (d, (*d)->GetDevice (d), &full_addr, value, &length, true, craw->generation); if (retval != 0) { fprintf (stderr, "Error reading (%x)...\n", retval); return DC1394_FAILURE; } - *value = ntohl (*value); + for (i = 0; i < num_quads; i++) + value[i] = ntohl (value[i]); return DC1394_SUCCESS; } dc1394error_t -SetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t value) +SetCameraROMValues(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_quads) { DC1394_CAST_CAMERA_TO_MACOSX(craw, camera); IOFireWireLibDeviceRef d = craw->iface; FWAddress full_addr; - int retval; + int i, retval; UInt32 length; UInt64 addr = CONFIG_ROM_BASE + offset; full_addr.addressHi = addr >> 32; full_addr.addressLo = addr & 0xffffffff; - value = htonl (value); + for (i = 0; i < num_quads; i++) + value[i] = htonl (value[i]); length = 4; retval = (*d)->Write (d, (*d)->GetDevice (d), &full_addr, &value, &length, Index: libdc1394/dc1394/register.c =================================================================== --- libdc1394.orig/dc1394/register.c +++ libdc1394/dc1394/register.c @@ -20,6 +20,7 @@ #include "control.h" #include "internal.h" #include "offsets.h" +#include "register.h" #include "utils.h" #include "config.h" @@ -60,7 +61,7 @@ /* Get/Set Command Registers */ /********************************************************************************/ dc1394error_t -GetCameraControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t *value) +GetCameraControlRegisters(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_regs) { int retval; @@ -74,7 +75,7 @@ GetCameraControlRegister(dc1394camera_t } */ //fprintf(stderr,"trying to get 0x%llx",camera->command_registers_base+offset); - retval = GetCameraROMValue(camera, camera->command_registers_base+offset, value); + retval = GetCameraROMValues(camera, camera->command_registers_base+offset, value, num_regs); //fprintf(stderr,"retval = %d",retval); @@ -82,7 +83,7 @@ GetCameraControlRegister(dc1394camera_t } dc1394error_t -SetCameraControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t value) +SetCameraControlRegisters(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_regs) { int retval; @@ -95,7 +96,7 @@ SetCameraControlRegister(dc1394camera_t } */ //fprintf(stderr,"trying to set 0x%llx\n",camera->command_registers_base+offset); - retval= SetCameraROMValue(camera, camera->command_registers_base+offset, value); + retval= SetCameraROMValues(camera, camera->command_registers_base+offset, value, num_regs); return retval; } @@ -104,7 +105,7 @@ SetCameraControlRegister(dc1394camera_t /* Get/Set Advanced Features Registers */ /********************************************************************************/ dc1394error_t -GetCameraAdvControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t *value) +GetCameraAdvControlRegisters(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_regs) { if (camera == NULL) return DC1394_FAILURE; @@ -114,11 +115,11 @@ GetCameraAdvControlRegister(dc1394camera return DC1394_FAILURE; } */ - return GetCameraROMValue(camera, camera->advanced_features_csr+offset, value); + return GetCameraROMValues(camera, camera->advanced_features_csr+offset, value, num_regs); } dc1394error_t -SetCameraAdvControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t value) +SetCameraAdvControlRegisters(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_regs) { if (camera == NULL) return DC1394_FAILURE; @@ -128,7 +129,7 @@ SetCameraAdvControlRegister(dc1394camera return DC1394_FAILURE; } */ - return SetCameraROMValue(camera, camera->advanced_features_csr+offset, value); + return SetCameraROMValues(camera, camera->advanced_features_csr+offset, value, num_regs); } /********************************************************************************/ Index: libdc1394/dc1394/register.h =================================================================== --- libdc1394.orig/dc1394/register.h +++ libdc1394/dc1394/register.h @@ -30,28 +30,64 @@ extern "C" { #endif dc1394error_t -GetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t *value); +GetCameraROMValues(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_quads); + +static inline dc1394error_t +GetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t *value) +{ + return GetCameraROMValues(camera, offset, value, 1); +} dc1394error_t -SetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t value); +SetCameraROMValues(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_quads); + +static inline dc1394error_t +SetCameraROMValue(dc1394camera_t *camera, uint64_t offset, uint32_t value) +{ + return SetCameraROMValues(camera, offset, &value, 1); +} /********************************************************************************/ /* Get/Set Command Registers */ /********************************************************************************/ dc1394error_t -GetCameraControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t *value); +GetCameraControlRegisters(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_regs); + +static inline dc1394error_t +GetCameraControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t *value) +{ + return GetCameraControlRegisters(camera, offset, value, 1); +} dc1394error_t -SetCameraControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t value); +SetCameraControlRegisters(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_regs); + +static inline dc1394error_t +SetCameraControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t value) +{ + return SetCameraControlRegisters(camera, offset, &value, 1); +} /********************************************************************************/ /* Get/Set Advanced Features Registers */ /********************************************************************************/ dc1394error_t -GetCameraAdvControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t *value); +GetCameraAdvControlRegisters(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_regs); + +static inline dc1394error_t +GetCameraAdvControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t *value) +{ + return GetCameraAdvControlRegisters(camera, offset, value, 1); +} dc1394error_t -SetCameraAdvControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t value); +SetCameraAdvControlRegisters(dc1394camera_t *camera, uint64_t offset, uint32_t *value, uint32_t num_regs); + +static inline dc1394error_t +SetCameraAdvControlRegister(dc1394camera_t *camera, uint64_t offset, uint32_t value) +{ + return SetCameraAdvControlRegisters(camera, offset, &value, 1); +} /********************************************************************************/ /* Get/Set Format_7 Registers */