[PATCH 2/3] [media] adv7842: Source Product Description (SPD) InfoFrame

2014-03-19 Thread Martin Bugge
Decode and display any received SPD InfoFrame in log-status.

Signed-off-by: Martin Bugge marbu...@cisco.com
---
 drivers/media/i2c/adv7842.c | 76 +
 1 file changed, 76 insertions(+)

diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c
index 5d79c57..805a117 100644
--- a/drivers/media/i2c/adv7842.c
+++ b/drivers/media/i2c/adv7842.c
@@ -2243,6 +2243,81 @@ static void print_avi_infoframe(struct v4l2_subdev *sd)
v4l2_info(sd, \t%s %s\n, y10_txt[avi.y10], q10_txt[avi.q10]);
 }
 
+static const char *sdi_txt(u8 code)
+{
+   switch (code) {
+   case 0x00: return unknown;
+   case 0x01: return Digital STB;
+   case 0x02: return DVD player;
+   case 0x03: return D-VHS;
+   case 0x04: return HDD Videorecorder;
+   case 0x05: return DVC;
+   case 0x06: return DSC;
+   case 0x07: return Video CD;
+   case 0x08: return Game;
+   case 0x09: return PC general;
+   case 0x0a: return Blu-Ray Disc (BD);
+   case 0x0b: return Super Audio CD;
+   }
+   return Reserved;
+}
+
+static void print_spd_info_frame(struct v4l2_subdev *sd)
+{
+   int i;
+   u8 spd_type;
+   u8 spd_ver;
+   u8 spd_len;
+   u8 spd_crc;
+   u8 buf[32];
+   u8 vn[8];
+   u8 pd[16];
+   u8 sdi;
+
+   if (!(hdmi_read(sd, 0x05)  0x80)) {
+   v4l2_info(sd, receive DVI-D signal (SDP infoframe not 
supported)\n);
+   return;
+   }
+   if (!(io_read(sd, 0x60)  0x04)) {
+   v4l2_info(sd, SDP infoframe not received\n);
+   return;
+   }
+
+   if (io_read(sd, 0x88)  0x40) {
+   v4l2_info(sd, SPD infoframe checksum error has occurred 
earlier\n);
+   io_write(sd, 0x8a, 0x40); /* clear SPD_INF_CKS_ERR_RAW */
+   if (io_read(sd, 0x88)  0x40) {
+   v4l2_info(sd, SPD infoframe checksum error still 
present\n);
+   io_write(sd, 0x8a, 0x40); /* clear SPD_INF_CKS_ERR_RAW 
*/
+   }
+   }
+
+   spd_type = infoframe_read(sd, 0xe6)  0x7f;
+   spd_ver = infoframe_read(sd, 0xe7);
+   spd_len = infoframe_read(sd, 0xe8);
+   spd_crc = infoframe_read(sd, 0x2a);
+
+   v4l2_info(sd, SPD infoframe type %d, version %d, crc 0x%x, len %d\n,
+ spd_type, spd_ver, spd_crc, spd_len);
+
+   if (spd_type != 0x03)
+   return;
+   if (spd_ver != 0x01)
+   return;
+
+   memset(buf, 0, sizeof(buf));
+   for (i = 0; i  25  i  spd_len; i++)
+   buf[i] = infoframe_read(sd, i + 0x2b);
+
+   snprintf(vn, 8, buf);
+   snprintf(pd, 16, buf + 8);
+   sdi = buf[24];
+
+   v4l2_info(sd, \tVendor Name: %s\n, vn);
+   v4l2_info(sd, \tProduct Description: %s\n, pd);
+   v4l2_info(sd, \tSource Device Information: %s (%d)\n, sdi_txt(sdi), 
sdi);
+}
+
 static const char * const prim_mode_txt[] = {
SDP,
Component,
@@ -2455,6 +2530,7 @@ static int adv7842_cp_log_status(struct v4l2_subdev *sd)
deep_color_mode_txt[hdmi_read(sd, 0x0b)  6]);
 
print_avi_infoframe(sd);
+   print_spd_info_frame(sd);
return 0;
 }
 
-- 
1.8.5.3

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/3] [media] adv7842: Source Product Description (SPD) InfoFrame

2014-03-19 Thread Hans Verkuil
Hi Martin,

On 03/19/14 10:43, Martin Bugge wrote:
 Decode and display any received SPD InfoFrame in log-status.

This is really quite standardized data. I looked around in the kernel
and I found this very nice header: include/linux/hdmi.h and source
drivers/video/hdmi.c.

I would suggest that the adv7842 driver fills the hdmi_spd_infoframe
struct and calls a function in v4l2_dv_timings.c to log the contents.

That way it can also be used by e.g. adv7604. We really should be using
this header for other frame types as well.

Actually, I think you should ask on the dri-devel mailinglist (with a
CC to the active maintainers of the hdmi.c source, see 'git log') whether
creating an hdmi_spd_infoframe_log function would be useful to add to
hdmi.c. If they don't like it, then we stick it in v4l2_dv_timings.c. If
they do like it, we can just add it to hdmi.c. It's something that is
primarily useful for receivers, and not so much for transmitters, so they
might not want it in the hdmi.c source.

 
 Signed-off-by: Martin Bugge marbu...@cisco.com
 ---
  drivers/media/i2c/adv7842.c | 76 
 +
  1 file changed, 76 insertions(+)
 
 diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c
 index 5d79c57..805a117 100644
 --- a/drivers/media/i2c/adv7842.c
 +++ b/drivers/media/i2c/adv7842.c
 @@ -2243,6 +2243,81 @@ static void print_avi_infoframe(struct v4l2_subdev *sd)
   v4l2_info(sd, \t%s %s\n, y10_txt[avi.y10], q10_txt[avi.q10]);
  }
  
 +static const char *sdi_txt(u8 code)
 +{
 + switch (code) {
 + case 0x00: return unknown;

unknown - Unknown

to be consistent with the others.

Regards,

Hans

 + case 0x01: return Digital STB;
 + case 0x02: return DVD player;
 + case 0x03: return D-VHS;
 + case 0x04: return HDD Videorecorder;
 + case 0x05: return DVC;
 + case 0x06: return DSC;
 + case 0x07: return Video CD;
 + case 0x08: return Game;
 + case 0x09: return PC general;
 + case 0x0a: return Blu-Ray Disc (BD);
 + case 0x0b: return Super Audio CD;
 + }
 + return Reserved;
 +}
 +
 +static void print_spd_info_frame(struct v4l2_subdev *sd)
 +{
 + int i;
 + u8 spd_type;
 + u8 spd_ver;
 + u8 spd_len;
 + u8 spd_crc;
 + u8 buf[32];
 + u8 vn[8];
 + u8 pd[16];
 + u8 sdi;
 +
 + if (!(hdmi_read(sd, 0x05)  0x80)) {
 + v4l2_info(sd, receive DVI-D signal (SDP infoframe not 
 supported)\n);
 + return;
 + }
 + if (!(io_read(sd, 0x60)  0x04)) {
 + v4l2_info(sd, SDP infoframe not received\n);
 + return;
 + }
 +
 + if (io_read(sd, 0x88)  0x40) {
 + v4l2_info(sd, SPD infoframe checksum error has occurred 
 earlier\n);
 + io_write(sd, 0x8a, 0x40); /* clear SPD_INF_CKS_ERR_RAW */
 + if (io_read(sd, 0x88)  0x40) {
 + v4l2_info(sd, SPD infoframe checksum error still 
 present\n);
 + io_write(sd, 0x8a, 0x40); /* clear SPD_INF_CKS_ERR_RAW 
 */
 + }
 + }
 +
 + spd_type = infoframe_read(sd, 0xe6)  0x7f;
 + spd_ver = infoframe_read(sd, 0xe7);
 + spd_len = infoframe_read(sd, 0xe8);
 + spd_crc = infoframe_read(sd, 0x2a);
 +
 + v4l2_info(sd, SPD infoframe type %d, version %d, crc 0x%x, len %d\n,
 +   spd_type, spd_ver, spd_crc, spd_len);
 +
 + if (spd_type != 0x03)
 + return;
 + if (spd_ver != 0x01)
 + return;
 +
 + memset(buf, 0, sizeof(buf));
 + for (i = 0; i  25  i  spd_len; i++)
 + buf[i] = infoframe_read(sd, i + 0x2b);
 +
 + snprintf(vn, 8, buf);
 + snprintf(pd, 16, buf + 8);
 + sdi = buf[24];
 +
 + v4l2_info(sd, \tVendor Name: %s\n, vn);
 + v4l2_info(sd, \tProduct Description: %s\n, pd);
 + v4l2_info(sd, \tSource Device Information: %s (%d)\n, sdi_txt(sdi), 
 sdi);
 +}
 +
  static const char * const prim_mode_txt[] = {
   SDP,
   Component,
 @@ -2455,6 +2530,7 @@ static int adv7842_cp_log_status(struct v4l2_subdev *sd)
   deep_color_mode_txt[hdmi_read(sd, 0x0b)  6]);
  
   print_avi_infoframe(sd);
 + print_spd_info_frame(sd);
   return 0;
  }
  
 

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/3] [media] adv7842: Source Product Description (SPD) InfoFrame

2014-03-19 Thread Martin Bugge (marbugge)

Thank you Hans

On 19/03/14 11:13, Hans Verkuil wrote:

Hi Martin,

On 03/19/14 10:43, Martin Bugge wrote:

Decode and display any received SPD InfoFrame in log-status.

This is really quite standardized data. I looked around in the kernel
and I found this very nice header: include/linux/hdmi.h and source
drivers/video/hdmi.c.

I would suggest that the adv7842 driver fills the hdmi_spd_infoframe
struct and calls a function in v4l2_dv_timings.c to log the contents.

That way it can also be used by e.g. adv7604. We really should be using
this header for other frame types as well.

Actually, I think you should ask on the dri-devel mailinglist (with a
CC to the active maintainers of the hdmi.c source, see 'git log') whether
creating an hdmi_spd_infoframe_log function would be useful to add to
hdmi.c. If they don't like it, then we stick it in v4l2_dv_timings.c. If
they do like it, we can just add it to hdmi.c. It's something that is
primarily useful for receivers, and not so much for transmitters, so they
might not want it in the hdmi.c source.
Yes you are right, it could be nice to have decoding of these Packets in 
a common place.
I have added the same code to adv7604 as well so its already duplicated. 
I will look into it.

I think the two other patches should apply ok. They are bug fixes.

Regards,
Martin




Signed-off-by: Martin Bugge marbu...@cisco.com
---
  drivers/media/i2c/adv7842.c | 76 +
  1 file changed, 76 insertions(+)

diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c
index 5d79c57..805a117 100644
--- a/drivers/media/i2c/adv7842.c
+++ b/drivers/media/i2c/adv7842.c
@@ -2243,6 +2243,81 @@ static void print_avi_infoframe(struct v4l2_subdev *sd)
v4l2_info(sd, \t%s %s\n, y10_txt[avi.y10], q10_txt[avi.q10]);
  }
  
+static const char *sdi_txt(u8 code)

+{
+   switch (code) {
+   case 0x00: return unknown;

unknown - Unknown

to be consistent with the others.

Regards,

Hans


+   case 0x01: return Digital STB;
+   case 0x02: return DVD player;
+   case 0x03: return D-VHS;
+   case 0x04: return HDD Videorecorder;
+   case 0x05: return DVC;
+   case 0x06: return DSC;
+   case 0x07: return Video CD;
+   case 0x08: return Game;
+   case 0x09: return PC general;
+   case 0x0a: return Blu-Ray Disc (BD);
+   case 0x0b: return Super Audio CD;
+   }
+   return Reserved;
+}
+
+static void print_spd_info_frame(struct v4l2_subdev *sd)
+{
+   int i;
+   u8 spd_type;
+   u8 spd_ver;
+   u8 spd_len;
+   u8 spd_crc;
+   u8 buf[32];
+   u8 vn[8];
+   u8 pd[16];
+   u8 sdi;
+
+   if (!(hdmi_read(sd, 0x05)  0x80)) {
+   v4l2_info(sd, receive DVI-D signal (SDP infoframe not 
supported)\n);
+   return;
+   }
+   if (!(io_read(sd, 0x60)  0x04)) {
+   v4l2_info(sd, SDP infoframe not received\n);
+   return;
+   }
+
+   if (io_read(sd, 0x88)  0x40) {
+   v4l2_info(sd, SPD infoframe checksum error has occurred 
earlier\n);
+   io_write(sd, 0x8a, 0x40); /* clear SPD_INF_CKS_ERR_RAW */
+   if (io_read(sd, 0x88)  0x40) {
+   v4l2_info(sd, SPD infoframe checksum error still 
present\n);
+   io_write(sd, 0x8a, 0x40); /* clear SPD_INF_CKS_ERR_RAW 
*/
+   }
+   }
+
+   spd_type = infoframe_read(sd, 0xe6)  0x7f;
+   spd_ver = infoframe_read(sd, 0xe7);
+   spd_len = infoframe_read(sd, 0xe8);
+   spd_crc = infoframe_read(sd, 0x2a);
+
+   v4l2_info(sd, SPD infoframe type %d, version %d, crc 0x%x, len %d\n,
+ spd_type, spd_ver, spd_crc, spd_len);
+
+   if (spd_type != 0x03)
+   return;
+   if (spd_ver != 0x01)
+   return;
+
+   memset(buf, 0, sizeof(buf));
+   for (i = 0; i  25  i  spd_len; i++)
+   buf[i] = infoframe_read(sd, i + 0x2b);
+
+   snprintf(vn, 8, buf);
+   snprintf(pd, 16, buf + 8);
+   sdi = buf[24];
+
+   v4l2_info(sd, \tVendor Name: %s\n, vn);
+   v4l2_info(sd, \tProduct Description: %s\n, pd);
+   v4l2_info(sd, \tSource Device Information: %s (%d)\n, sdi_txt(sdi), 
sdi);
+}
+
  static const char * const prim_mode_txt[] = {
SDP,
Component,
@@ -2455,6 +2530,7 @@ static int adv7842_cp_log_status(struct v4l2_subdev *sd)
deep_color_mode_txt[hdmi_read(sd, 0x0b)  6]);
  
  	print_avi_infoframe(sd);

+   print_spd_info_frame(sd);
return 0;
  }
  



--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html