Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F162287637
D58092.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D58092.diff
View Options
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
@@ -406,6 +406,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);
@@ -863,13 +897,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
Details
Attached
Mime Type
text/plain
Expires
Sun, Jul 12, 5:38 PM (12 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34878148
Default Alt Text
D58092.diff (2 KB)
Attached To
Mode
D58092: fwcam: write video mode registers before enabling ISO streaming
Attached
Detach File
Event Timeline
Log In to Comment