|
@@ -1368,6 +1368,67 @@ static void pcxhr_proc_gpo_write(struct snd_info_entry *entry,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/* Access to the results of the CMD_GET_TIME_CODE RMH */
|
|
|
+#define TIME_CODE_VALID_MASK 0x00800000
|
|
|
+#define TIME_CODE_NEW_MASK 0x00400000
|
|
|
+#define TIME_CODE_BACK_MASK 0x00200000
|
|
|
+#define TIME_CODE_WAIT_MASK 0x00100000
|
|
|
+
|
|
|
+/* Values for the CMD_MANAGE_SIGNAL RMH */
|
|
|
+#define MANAGE_SIGNAL_TIME_CODE 0x01
|
|
|
+#define MANAGE_SIGNAL_MIDI 0x02
|
|
|
+
|
|
|
+/* linear time code read proc*/
|
|
|
+static void pcxhr_proc_ltc(struct snd_info_entry *entry,
|
|
|
+ struct snd_info_buffer *buffer)
|
|
|
+{
|
|
|
+ struct snd_pcxhr *chip = entry->private_data;
|
|
|
+ struct pcxhr_mgr *mgr = chip->mgr;
|
|
|
+ struct pcxhr_rmh rmh;
|
|
|
+ unsigned int ltcHrs, ltcMin, ltcSec, ltcFrm;
|
|
|
+ int err;
|
|
|
+ /* commands available when embedded DSP is running */
|
|
|
+ if (!(mgr->dsp_loaded & (1 << PCXHR_FIRMWARE_DSP_MAIN_INDEX))) {
|
|
|
+ snd_iprintf(buffer, "no firmware loaded\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!mgr->capture_ltc) {
|
|
|
+ pcxhr_init_rmh(&rmh, CMD_MANAGE_SIGNAL);
|
|
|
+ rmh.cmd[0] |= MANAGE_SIGNAL_TIME_CODE;
|
|
|
+ err = pcxhr_send_msg(mgr, &rmh);
|
|
|
+ if (err) {
|
|
|
+ snd_iprintf(buffer, "ltc not activated (%d)\n", err);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (mgr->is_hr_stereo)
|
|
|
+ hr222_manage_timecode(mgr, 1);
|
|
|
+ else
|
|
|
+ pcxhr_write_io_num_reg_cont(mgr, REG_CONT_VALSMPTE,
|
|
|
+ REG_CONT_VALSMPTE, NULL);
|
|
|
+ mgr->capture_ltc = 1;
|
|
|
+ }
|
|
|
+ pcxhr_init_rmh(&rmh, CMD_GET_TIME_CODE);
|
|
|
+ err = pcxhr_send_msg(mgr, &rmh);
|
|
|
+ if (err) {
|
|
|
+ snd_iprintf(buffer, "ltc read error (err=%d)\n", err);
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+ ltcHrs = 10*((rmh.stat[0] >> 8) & 0x3) + (rmh.stat[0] & 0xf);
|
|
|
+ ltcMin = 10*((rmh.stat[1] >> 16) & 0x7) + ((rmh.stat[1] >> 8) & 0xf);
|
|
|
+ ltcSec = 10*(rmh.stat[1] & 0x7) + ((rmh.stat[2] >> 16) & 0xf);
|
|
|
+ ltcFrm = 10*((rmh.stat[2] >> 8) & 0x3) + (rmh.stat[2] & 0xf);
|
|
|
+
|
|
|
+ snd_iprintf(buffer, "timecode: %02u:%02u:%02u-%02u\n",
|
|
|
+ ltcHrs, ltcMin, ltcSec, ltcFrm);
|
|
|
+ snd_iprintf(buffer, "raw: 0x%04x%06x%06x\n", rmh.stat[0] & 0x00ffff,
|
|
|
+ rmh.stat[1] & 0xffffff, rmh.stat[2] & 0xffffff);
|
|
|
+ /*snd_iprintf(buffer, "dsp ref time: 0x%06x%06x\n",
|
|
|
+ rmh.stat[3] & 0xffffff, rmh.stat[4] & 0xffffff);*/
|
|
|
+ if (!(rmh.stat[0] & TIME_CODE_VALID_MASK)) {
|
|
|
+ snd_iprintf(buffer, "warning: linear timecode not valid\n");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void __devinit pcxhr_proc_init(struct snd_pcxhr *chip)
|
|
|
{
|
|
|
struct snd_info_entry *entry;
|
|
@@ -1383,6 +1444,8 @@ static void __devinit pcxhr_proc_init(struct snd_pcxhr *chip)
|
|
|
entry->c.text.write = pcxhr_proc_gpo_write;
|
|
|
entry->mode |= S_IWUSR;
|
|
|
}
|
|
|
+ if (!snd_card_proc_new(chip->card, "ltc", &entry))
|
|
|
+ snd_info_set_text_ops(entry, chip, pcxhr_proc_ltc);
|
|
|
}
|
|
|
/* end of proc interface */
|
|
|
|