Page MenuHomeFreeBSD

D58092.id181490.diff
No OneTemporary

D58092.id181490.diff

diff --git a/sys/dev/firewire/fwcam.h b/sys/dev/firewire/fwcam.h
--- a/sys/dev/firewire/fwcam.h
+++ b/sys/dev/firewire/fwcam.h
@@ -53,6 +53,13 @@
#define IIDC_ONE_SHOT 0x61C
#define IIDC_MEM_SAVE_CH 0x620
#define IIDC_CUR_MEM_CH 0x624
+#define IIDC_VMODE_ERR_STATUS 0x628
+
+/* Cur_V_Format / Cur_V_Mode / Cur_V_Frm_Rate register fields */
+#define IIDC_CUR_V_SHIFT 29 /* bits [0..2] */
+
+/* Vmode_Error_Status register */
+#define IIDC_VMODE_ERROR (1 << 31) /* bit [0]: mode error */
/* Section 1.7 - Status and control register for features */
#define IIDC_BRIGHTNESS 0x800
diff --git a/sys/dev/firewire/fwcam.c b/sys/dev/firewire/fwcam.c
--- a/sys/dev/firewire/fwcam.c
+++ b/sys/dev/firewire/fwcam.c
@@ -382,6 +382,40 @@
sc->frame_ready = 0;
sc->frame_dropped = 0;
+ /* IIDC spec s3.1: set video mode registers before ISO enable */
+ err = fwcam_write_quadlet(sc, IIDC_CUR_V_FORMAT,
+ (uint32_t)sc->cur_format << IIDC_CUR_V_SHIFT);
+ if (err) {
+ device_printf(sc->fd.dev,
+ "failed to set CUR_V_FORMAT: %d\n", err);
+ goto fail;
+ }
+ err = fwcam_write_quadlet(sc, IIDC_CUR_V_MODE,
+ (uint32_t)sc->cur_mode << IIDC_CUR_V_SHIFT);
+ if (err) {
+ device_printf(sc->fd.dev,
+ "failed to set CUR_V_MODE: %d\n", err);
+ goto fail;
+ }
+ err = fwcam_write_quadlet(sc, IIDC_CUR_V_FRM_RATE,
+ (uint32_t)sc->cur_framerate << IIDC_CUR_V_SHIFT);
+ if (err) {
+ device_printf(sc->fd.dev,
+ "failed to set CUR_V_FRM_RATE: %d\n", err);
+ goto fail;
+ }
+
+ /* Check Vmode_Error_Status - camera rejects ISO_EN on error */
+ err = fwcam_read_quadlet(sc, IIDC_VMODE_ERR_STATUS, &val);
+ if (err == 0 && (val & IIDC_VMODE_ERROR)) {
+ device_printf(sc->fd.dev,
+ "Vmode_Error_Status set: format=%d mode=%d rate=%d "
+ "speed=%d\n", sc->cur_format, sc->cur_mode,
+ sc->cur_framerate, sc->iso_speed);
+ err = EINVAL;
+ goto fail;
+ }
+
val = ((uint32_t)sc->iso_channel << IIDC_ISO_CH_SHIFT) |
((uint32_t)sc->iso_speed << IIDC_ISO_SPEED_SHIFT);
err = fwcam_write_quadlet(sc, IIDC_ISO_CHANNEL, val);
@@ -836,13 +870,13 @@
FWCAM_UNLOCK(sc);
err = fwcam_write_quadlet(sc, IIDC_CUR_V_FORMAT,
- (uint32_t)mode->format << 29);
+ (uint32_t)mode->format << IIDC_CUR_V_SHIFT);
if (err == 0)
err = fwcam_write_quadlet(sc, IIDC_CUR_V_MODE,
- (uint32_t)mode->mode << 29);
+ (uint32_t)mode->mode << IIDC_CUR_V_SHIFT);
if (err == 0)
err = fwcam_write_quadlet(sc, IIDC_CUR_V_FRM_RATE,
- (uint32_t)mode->framerate << 29);
+ (uint32_t)mode->framerate << IIDC_CUR_V_SHIFT);
if (err == 0) {
sc->cur_format = mode->format;

File Metadata

Mime Type
text/plain
Expires
Mon, Jul 13, 1:58 AM (20 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34861332
Default Alt Text
D58092.id181490.diff (2 KB)

Event Timeline