24 #define DPRINTF(x...) printf(MODNAME ": " x)
29 extern int module_start(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi);
30 extern int module_stop(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi);
34 extern int dvr_df_devctl(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
35 extern int dvr_df_ioctl2(
iomanX_iop_file_t *f,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
36 extern int dvrioctl2_rec_start(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
37 extern int dvrioctl2_rec_pause(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
38 extern int dvrioctl2_rec_stop(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
39 extern int dvrioctl2_set_rec_end_time(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
40 extern int dvrioctl2_get_rec_info(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
41 extern int dvrioctl2_get_rec_time(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
42 extern int dvrioctl2_read_resfile(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
43 extern int dvrioctl2_clear_resfile_flag(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
44 extern int dvrioctl2_rec_prohibit(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
45 extern int dvrioctl2_get_status_register(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
46 extern int dvrioctl2_get_ifo_time_entry(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
47 extern int dvrioctl2_get_ifo_vobu_entry(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
48 extern int dvrioctl2_epg_test(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
49 extern int dvrioctl2_send_timer_event(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
50 extern int dvrioctl2_epg_cancel(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
51 extern int dvrioctl2_tevent_buf_clr(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
52 extern int dvrioctl2_tevent_buf_send(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
53 extern int dvrioctl2_tevent_buf_trans_dvrp(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
54 extern int dvrioctl2_start_hdd_test(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
55 extern int dvrioctl2_stop_hdd_test(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
56 extern int dvrioctl2_get_hdd_test_stat(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
57 extern int dvrioctl2_pre_update_a(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
58 extern int dvrioctl2_pre_update_b(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
59 extern int dvrioctl2_get_rec_vro_pckn(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
60 extern int dvrioctl2_enc_dec_test(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
61 extern int dvrioctl2_tevent_buf_recv_first(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
62 extern int dvrioctl2_tevent_buf_recv_next(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
63 extern int dvrioctl2_finish_auto_process(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
64 extern int dvrioctl2_make_menu(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
65 extern int dvrioctl2_re_enc_start(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
66 extern int dvrioctl2_rec_pictclip(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
67 extern int dvrpAuthEnc(u16 in_word);
70 unsigned char dvrpAuth_tbl[256] = {0x00};
75 int (*fn)(
iomanX_iop_file_t *f,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
78 {0x5663, &dvrioctl2_get_status_register},
79 {0x5638, &dvrioctl2_get_ifo_time_entry},
80 {0x5639, &dvrioctl2_get_ifo_vobu_entry},
81 {0x5632, &dvrioctl2_rec_start},
82 {0x5633, &dvrioctl2_rec_pause},
83 {0x5634, &dvrioctl2_rec_stop},
84 {0x5635, &dvrioctl2_set_rec_end_time},
85 {0x5636, &dvrioctl2_get_rec_info},
86 {0x5637, &dvrioctl2_get_rec_time},
87 {0x563A, &dvrioctl2_read_resfile},
88 {0x563B, &dvrioctl2_clear_resfile_flag},
89 {0x563F, &dvrioctl2_rec_prohibit},
90 {0x5640, &dvrioctl2_epg_test},
91 {0x5641, &dvrioctl2_send_timer_event},
92 {0x5642, &dvrioctl2_epg_cancel},
93 {0x565A, &dvrioctl2_tevent_buf_clr},
94 {0x565B, &dvrioctl2_tevent_buf_send},
95 {0x565C, &dvrioctl2_tevent_buf_trans_dvrp},
96 {0x5643, &dvrioctl2_start_hdd_test},
97 {0x5644, &dvrioctl2_stop_hdd_test},
98 {0x5645, &dvrioctl2_get_hdd_test_stat},
99 {0x5646, &dvrioctl2_pre_update_a},
100 {0x5647, &dvrioctl2_pre_update_b},
101 {0x5648, &dvrioctl2_get_rec_vro_pckn},
102 {0x5649, &dvrioctl2_enc_dec_test},
103 {0x565D, &dvrioctl2_tevent_buf_recv_first},
104 {0x565E, &dvrioctl2_tevent_buf_recv_next},
105 {0x5651, &dvrioctl2_finish_auto_process},
106 {0x564A, &dvrioctl2_make_menu},
107 {0x564B, &dvrioctl2_re_enc_start},
108 {0x5650, &dvrioctl2_rec_pictclip},
111 IOMANX_RETURN_VALUE_IMPL(
EUNSUP);
117 IOMANX_RETURN_VALUE(
EUNSUP),
118 IOMANX_RETURN_VALUE(
EUNSUP),
119 IOMANX_RETURN_VALUE(
EUNSUP),
120 IOMANX_RETURN_VALUE(
EUNSUP),
121 IOMANX_RETURN_VALUE(
EUNSUP),
122 IOMANX_RETURN_VALUE(
EUNSUP),
124 IOMANX_RETURN_VALUE(
EUNSUP),
125 IOMANX_RETURN_VALUE(
EUNSUP),
126 IOMANX_RETURN_VALUE(
EUNSUP),
127 IOMANX_RETURN_VALUE(
EUNSUP),
128 IOMANX_RETURN_VALUE(
EUNSUP),
129 IOMANX_RETURN_VALUE(
EUNSUP),
130 IOMANX_RETURN_VALUE(
EUNSUP),
131 IOMANX_RETURN_VALUE(
EUNSUP),
132 IOMANX_RETURN_VALUE(
EUNSUP),
133 IOMANX_RETURN_VALUE(
EUNSUP),
134 IOMANX_RETURN_VALUE(
EUNSUP),
135 IOMANX_RETURN_VALUE(
EUNSUP),
136 IOMANX_RETURN_VALUE(
EUNSUP),
137 IOMANX_RETURN_VALUE_S64(
EUNSUP),
139 IOMANX_RETURN_VALUE(
EUNSUP),
140 IOMANX_RETURN_VALUE(
EUNSUP),
143 char TEVENT_BUF[6144];
148 .desc =
"Digital Video Recorder DVR task",
156 IRX_ID(MODNAME, 1, 1);
158 int _start(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
161 return module_start(argc, argv, startaddr, mi);
163 return module_stop(argc, argv, startaddr, mi);
166 int module_start(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
174 for (i = 0; i < 30000; ++i) {
175 if (((*((vu32 *)0xB0004230)) & 0x10) != 0)
180 DPRINTF(
"DVR task of DVRP is not running...\n");
181 return MODULE_NO_RESIDENT_END;
183 if (iomanX_AddDrv(&DVR) != 0)
184 return MODULE_NO_RESIDENT_END;
187 return MODULE_REMOVABLE_END;
189 if (mi && ((mi->
newflags & 2) != 0))
191 return MODULE_RESIDENT_END;
195 int module_stop(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
202 if (iomanX_DelDrv(DVR.name) != 0)
203 return MODULE_REMOVABLE_END;
204 return MODULE_NO_RESIDENT_END;
218 v1 = CreateSema(&v3);
229 if (DeleteSema(sema_id) != 0)
262 while (DevctlCmdTbl[v13].cmd != cmd) {
264 if (v12 >=
sizeof(DevctlCmdTbl) /
sizeof(DevctlCmdTbl[0]))
267 v11 = DevctlCmdTbl[v13].fn(a1, name, cmd, arg, arglen, buf, buflen);
269 if (v12 ==
sizeof(DevctlCmdTbl) /
sizeof(DevctlCmdTbl[0]))
275 int dvr_df_ioctl2(
iomanX_iop_file_t *f,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
289 int dvrioctl2_rec_start(
303 drvdrv_exec_cmd_ack cmdack;
312 cmdack.command = 0x2101;
313 cmdack.input_word[0] = *((u16 *)arg + 1);
314 cmdack.input_word[1] = *(u16 *)arg;
315 cmdack.input_word[2] = *((u16 *)arg + 3);
316 cmdack.input_word[3] = *((u16 *)arg + 2);
317 cmdack.input_word[4] = *((u16 *)arg + 4);
318 cmdack.input_word[5] = *((u16 *)arg + 5);
319 cmdack.input_word[6] = *((u16 *)arg + 6);
321 while (busywait-- >= 0)
323 cmdack.input_word_count = 7;
324 cmdack.timeout = 5000000;
325 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
327 DPRINTF(
"dvrioctl2_rec_start -> Handshake error!,%d\n", cmdackerr);
331 err = cmdack.ack_status_ack;
333 if (!cmdack.ack_status_ack) {
334 if (!cmdack.comp_status)
337 err = cmdack.comp_status;
340 DPRINTF(
"dvrioctl2_rec_start -> Status error!,%04X\n", err);
344 int dvrioctl2_rec_pause(
354 drvdrv_exec_cmd_ack *p_cmdack;
356 drvdrv_exec_cmd_ack cmdack;
367 cmdack.command = 0x2102;
370 p_cmdack->input_word[0] = *(u16 *)arg;
371 arg = (
char *)arg + 2;
372 p_cmdack = (drvdrv_exec_cmd_ack *)((
char *)p_cmdack + 2);
374 cmdack.input_word_count = 1;
375 cmdackerr = DvrdrvExecCmdAck(&cmdack);
377 DPRINTF(
"dvrioctl2_rec_pause -> Handshake error!,%d\n", cmdackerr);
380 if (cmdack.ack_status_ack) {
381 DPRINTF(
"dvrioctl2_rec_pause -> Status error!,%04X\n", cmdack.ack_status_ack);
388 int dvrioctl2_rec_stop(
398 drvdrv_exec_cmd_ack cmdack;
408 cmdack.command = 0x2103;
409 cmdack.input_word_count = 0;
410 cmdack.timeout = 5000000;
411 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
413 DPRINTF(
"dvrioctl2_rec_stop -> Handshake error!,%d\n", cmdackerr);
416 if (cmdack.ack_status_ack) {
417 DPRINTF(
"dvrioctl2_rec_stop -> Status error!,%04X\n", cmdack.ack_status_ack);
419 if (!cmdack.comp_status)
421 DPRINTF(
"dvrioctl2_rec_start -> Status error!,%04X\n", cmdack.comp_status);
426 int dvrioctl2_set_rec_end_time(
436 drvdrv_exec_cmd_ack cmdack;
445 cmdack.command = 0x2104;
446 cmdack.input_word[0] = (*(u32 *)arg) >> 16;
447 cmdack.input_word_count = 2;
448 cmdack.input_word[1] = *(u16 *)arg;
449 cmdackerr = DvrdrvExecCmdAck(&cmdack);
451 DPRINTF(
"dvrioctl2_rec_end_time -> Handshake error!,%d\n", cmdackerr);
454 if (cmdack.ack_status_ack) {
455 DPRINTF(
"dvrioctl2_rec_end_time -> Status error!,%04X\n", cmdack.ack_status_ack);
462 int dvrioctl2_get_rec_info(
477 if (buflen >= 0x15) {
479 drvdrv_exec_cmd_ack cmdack;
480 cmdack.command = 0x2105;
481 cmdack.input_word_count = 0;
482 cmdackerr = DvrdrvExecCmdAck(&cmdack);
484 DPRINTF(
"dvrioctl2_get_rec_info -> Handshake error!,%d\n", cmdackerr);
489 if (cmdack.ack_status_ack) {
490 DPRINTF(
"dvrioctl2_get_rec_info -> Status error!,%04X\n", cmdack.ack_status_ack);
499 v11 = &cmdack.output_word[v9];
500 *((u8 *)buf + v10 + 3) = (*v11 & 0xFF00) >> 8;
501 *((u8 *)buf + v10 + 2) = (*v11 & 0x00FF);
504 *((u8 *)buf + 22) = 0;
509 DPRINTF(
"dvrioctl2_get_rec_info -> buflen is smaller than 21.\n");
514 int dvrioctl2_get_rec_time(
524 drvdrv_exec_cmd_ack cmdack;
533 cmdack.command = 0x2106;
534 cmdack.input_word_count = 0;
535 cmdackerr = DvrdrvExecCmdAck(&cmdack);
537 DPRINTF(
"dvrioctl2_get_rec_time -> Handshake error!,%d\n", cmdackerr);
540 if (cmdack.ack_status_ack) {
541 DPRINTF(
"dvrioctl2_get_rec_time -> Status error!,%04X\n", cmdack.ack_status_ack);
545 *((u32 *)buf + 1) = (cmdack.output_word[0] << 16) + cmdack.output_word[1];
551 int dvrioctl2_get_ifo_time_entry(
561 drvdrv_exec_cmd_ack cmdack;
570 cmdack.command = 0x2107;
571 cmdack.input_word_count = 0;
572 cmdackerr = DvrdrvExecCmdAck(&cmdack);
574 DPRINTF(
"dvrioctl2_get_ifo_time_entry -> Handshake error!,%d\n", cmdackerr);
576 }
else if (cmdack.ack_status_ack) {
577 DPRINTF(
"dvrioctl2_get_ifo_time_entry -> Status error!,%04X\n", cmdack.ack_status_ack);
581 *((u16 *)buf + 1) = cmdack.output_word[0];
582 *((u16 *)buf + 2) = cmdack.output_word[1];
583 *((u16 *)buf + 3) = cmdack.output_word[2];
584 *((u32 *)buf + 2) = (cmdack.output_word[3] << 16) + cmdack.output_word[4];
589 int dvrioctl2_get_ifo_vobu_entry(
599 drvdrv_exec_cmd_ack cmdack;
608 cmdack.command = 0x2108;
609 cmdack.input_word_count = 0;
610 cmdackerr = DvrdrvExecCmdAck(&cmdack);
612 DPRINTF(
"dvrioctl2_get_ifo_vobu_entry -> Handshake error!,%d\n", cmdackerr);
614 }
else if (cmdack.ack_status_ack) {
615 DPRINTF(
"dvrioctl2_get_ifo_vobu_entry -> Status error!,%04X\n", cmdack.ack_status_ack);
619 *((u16 *)buf + 1) = cmdack.output_word[0];
620 *((u16 *)buf + 2) = cmdack.output_word[1];
621 *((u16 *)buf + 3) = cmdack.output_word[2];
626 int dvrioctl2_read_resfile(
636 drvdrv_exec_cmd_ack cmdack;
646 cmdack.command = 0x2109;
647 cmdack.input_word_count = 0;
648 cmdackerr = DvrdrvExecCmdAck(&cmdack);
650 DPRINTF(
"dvrioctl2_read_resfile -> Handshake error!,%d\n", cmdackerr);
653 if (cmdack.ack_status_ack) {
654 DPRINTF(
"dvrioctl2_read_resfile -> Status error!,%04X\n", cmdack.ack_status_ack);
661 int dvrioctl2_clear_resfile_flag(
671 drvdrv_exec_cmd_ack cmdack;
681 cmdack.command = 0x210A;
682 cmdack.input_word_count = 0;
683 cmdackerr = DvrdrvExecCmdAck(&cmdack);
685 DPRINTF(
"dvrioctl2_clear_resfile_flag -> Handshake error!,%d\n", cmdackerr);
688 if (cmdack.ack_status_ack) {
689 DPRINTF(
"dvrioctl2_clear_resfile_flag -> Status error!,%04X\n", cmdack.ack_status_ack);
696 int dvrioctl2_rec_prohibit(
706 drvdrv_exec_cmd_ack cmdack;
715 cmdack.command = 0x210E;
716 cmdack.input_word_count = 1;
717 cmdack.input_word[0] = *(u16 *)arg;
718 cmdackerr = DvrdrvExecCmdAck(&cmdack);
720 DPRINTF(
"dvrioctl2_rec_prohibit -> Handshake error!,%d\n", cmdackerr);
723 if (cmdack.ack_status_ack) {
724 DPRINTF(
"dvrioctl2_rec_prohibit -> Status error!,%04X\n", cmdack.ack_status_ack);
731 int dvrioctl2_epg_test(
741 drvdrv_exec_cmd_ack cmdack;
750 cmdack.command = 0x210F;
751 cmdack.input_word_count = 1;
752 cmdack.input_word[0] = *(u16 *)arg;
753 cmdackerr = DvrdrvExecCmdAck(&cmdack);
755 DPRINTF(
"dvrioctl2_epg_test -> Handshake error!,%d\n", cmdackerr);
758 if (cmdack.ack_status_ack) {
759 DPRINTF(
"dvrioctl2_epg_test -> Status error!,%04X\n", cmdack.ack_status_ack);
766 int dvrioctl2_send_timer_event(
775 drvdrv_exec_cmd_ack cmdack;
783 cmdack.command = 0x2110;
784 cmdack.input_word_count = 0;
785 cmdack.input_buffer = arg;
786 cmdack.timeout = 10000000;
787 cmdack.input_buffer_length = arglen;
788 if (DvrdrvExecCmdAckDmaSendComp(&cmdack)) {
789 DPRINTF(
"dvrioctl2_send_timer_event -> IO error (phase %d)\n", cmdack.phase);
792 if (cmdack.comp_status) {
794 "dvrioctl2_send_timer_event -> Complete parameter (%04X) error (phase %d)\n",
803 int dvrioctl2_epg_cancel(
813 drvdrv_exec_cmd_ack cmdack;
822 cmdack.command = 0x2111;
823 cmdack.input_word_count = 0;
824 cmdack.input_word[0] = *(u16 *)arg;
825 cmdackerr = DvrdrvExecCmdAck(&cmdack);
827 DPRINTF(
"dvrioctl2_epg_cancel -> Handshake error!,%d\n", cmdackerr);
830 if (cmdack.ack_status_ack) {
831 DPRINTF(
"dvrioctl2_epg_cancel -> Status error!,%04X\n", cmdack.ack_status_ack);
838 int dvrioctl2_get_status_register(
854 *(u16 *)buf = (*((vu32 *)0xB0004230));
855 *((u16 *)buf + 1) = (*((vu32 *)0xB0004234));
856 *((u16 *)buf + 2) = (*((vu32 *)0xB0004238));
857 *((u16 *)buf + 3) = (*((vu32 *)0xB000423C));
861 int dvrioctl2_tevent_buf_clr(
882 v8 = &TEVENT_BUF[6143];
888 tevent_p = TEVENT_BUF;
893 int dvrioctl2_tevent_buf_send(
908 if ((
int)(tevent_data_sz + arglen) < 0x1801) {
910 for (i = 0; i < (int)arglen; arg = (
char *)arg + 1) {
912 *tevent_p = *(u8 *)arg;
915 tevent_data_sz += arglen;
920 int dvrioctl2_tevent_buf_trans_dvrp(
929 drvdrv_exec_cmd_ack cmdack;
939 cmdack.command = 0x2110;
940 cmdack.input_word_count = 0;
941 cmdack.input_buffer = TEVENT_BUF;
942 cmdack.timeout = 10000000;
943 cmdack.input_buffer_length = tevent_data_sz;
944 if (DvrdrvExecCmdAckDmaSendComp(&cmdack)) {
945 DPRINTF(
"dvrioctl2_tevent_buf_trans_dvrp -> IO error (phase %d)\n", cmdack.phase);
948 if (cmdack.comp_status) {
950 "dvrioctl2_tevent_buf_trans_dvrp -> Complete parameter (%04X) error (phase %d)\n",
959 int dvrioctl2_start_hdd_test(
972 drvdrv_exec_cmd_ack cmdack;
981 cmdack.command = 0x2112;
982 cmdack.input_word[0] = *(u16 *)arg;
983 cmdack.input_word[1] = *((u16 *)arg + 3);
984 cmdack.input_word[2] = *((u16 *)arg + 2);
985 cmdack.input_word[3] = *((u16 *)arg + 5);
986 cmdack.input_word[4] = *((u16 *)arg + 4);
987 cmdack.input_word[5] = *((u16 *)arg + 6);
988 cmdack.input_word[6] = *((u16 *)arg + 7);
989 cmdack.input_word[7] = *((u16 *)arg + 8);
990 cmdack.input_word_count = 8;
991 cmdack.timeout = 1000000 * (*((u16 *)arg + 8) + 30);
992 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
994 DPRINTF(
"dvrioctl2_start_hdd_test -> Handshake error!,%d\n", cmdackerr);
998 ack_status_ack = cmdack.ack_status_ack;
1000 if (!cmdack.ack_status_ack) {
1001 if (!cmdack.comp_status)
1004 ack_status_ack = cmdack.comp_status;
1007 DPRINTF(
"dvrioctl2_start_hdd_test -> Status error!,%04X\n", ack_status_ack);
1011 int dvrioctl2_stop_hdd_test(
1016 unsigned int arglen,
1018 unsigned int buflen)
1024 drvdrv_exec_cmd_ack cmdack;
1034 cmdack.command = 0x2113;
1035 cmdack.input_word_count = 0;
1036 cmdack.timeout = 30000000;
1037 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
1039 DPRINTF(
"dvrioctl2_stop_hdd_test -> Handshake error!,%d\n", cmdackerr);
1043 ack_status_ack = cmdack.ack_status_ack;
1045 if (!cmdack.ack_status_ack) {
1046 if (!cmdack.comp_status)
1049 ack_status_ack = cmdack.comp_status;
1053 DPRINTF(
"dvrioctl2_stop_hdd_test -> Status error!,%04X\n", ack_status_ack);
1058 int dvrioctl2_get_hdd_test_stat(
1063 unsigned int arglen,
1065 unsigned int buflen)
1068 drvdrv_exec_cmd_ack cmdack;
1077 cmdack.command = 0x2114;
1078 cmdack.input_word_count = 0;
1079 cmdackerr = DvrdrvExecCmdAck(&cmdack);
1081 DPRINTF(
"dvrioctl2_get_hdd_test_stat -> Handshake error!,%d\n", cmdackerr);
1083 }
else if (cmdack.ack_status_ack) {
1084 DPRINTF(
"dvrioctl2_get_hdd_test_stat -> Status error!,%04X\n", cmdack.ack_status_ack);
1087 *(u16 *)buf = cmdack.output_word[0];
1088 *((u32 *)buf + 1) = (cmdack.output_word[1] << 16) + cmdack.output_word[2];
1089 *((u32 *)buf + 2) = (cmdack.output_word[3] << 16) + cmdack.output_word[4];
1090 *((u16 *)buf + 6) = cmdack.output_word[5];
1091 *((u16 *)buf + 7) = cmdack.output_word[6];
1092 *((u16 *)buf + 8) = cmdack.output_word[7];
1097 int dvrioctl2_pre_update_a(
1102 unsigned int arglen,
1104 unsigned int buflen)
1107 drvdrv_exec_cmd_ack cmdack;
1115 if (arglen >=
sizeof(dvrpAuth_tbl)) {
1116 memcpy(&dvrpAuth_tbl, arg,
sizeof(dvrpAuth_tbl));
1118 cmdack.command = 0x2115;
1119 cmdack.input_word_count = 0;
1120 cmdackerr = DvrdrvExecCmdAck(&cmdack);
1122 DPRINTF(
"dvrioctl2_pre_update_a -> Handshake error!,%d\n", cmdackerr);
1124 }
else if (cmdack.ack_status_ack) {
1125 DPRINTF(
"dvrioctl2_pre_update_a -> Status error!,%04X\n", cmdack.ack_status_ack);
1128 *(u16 *)buf = dvrpAuthEnc(cmdack.output_word[0]);
1133 int dvrioctl2_pre_update_b(
1138 unsigned int arglen,
1140 unsigned int buflen)
1146 drvdrv_exec_cmd_ack cmdack;
1155 cmdack.command = 0x2116;
1156 cmdack.input_word_count = 1;
1157 cmdack.timeout = 10000000;
1158 cmdack.input_word[0] = *(u16 *)arg;
1159 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
1161 DPRINTF(
"dvrioctl2_pre_update_b -> Handshake error!,%d\n", cmdackerr);
1165 ack_status_ack = cmdack.ack_status_ack;
1167 if (!cmdack.ack_status_ack) {
1168 if (!cmdack.comp_status)
1171 ack_status_ack = cmdack.comp_status;
1175 DPRINTF(
"dvrioctl2_pre_update_b -> Status error!,%04X\n", ack_status_ack);
1180 int dvrioctl2_get_rec_vro_pckn(
1185 unsigned int arglen,
1187 unsigned int buflen)
1190 drvdrv_exec_cmd_ack cmdack;
1199 cmdack.command = 0x2117;
1200 cmdack.input_word_count = 0;
1201 cmdackerr = DvrdrvExecCmdAck(&cmdack);
1203 DPRINTF(
"dvrioctl2_get_rec_vro_pckn -> Handshake error!,%d\n", cmdackerr);
1206 if (cmdack.ack_status_ack == 0xFFFE) {
1207 DPRINTF(
"dvrioctl2_get_rec_vro_pckn -> Mode error!,%04X\n", 0xFFFE);
1209 if (!cmdack.ack_status_ack) {
1210 *(u32 *)buf = (cmdack.output_word[0] << 16) + cmdack.output_word[1];
1213 DPRINTF(
"dvrioctl2_get_rec_vro_pckn -> Status error!,%04X\n", cmdack.ack_status_ack);
1218 int dvrioctl2_enc_dec_test(
1223 unsigned int arglen,
1225 unsigned int buflen)
1228 drvdrv_exec_cmd_ack cmdack;
1237 cmdack.command = 0x2118;
1238 cmdack.input_word_count = 1;
1239 cmdack.timeout = 10000000;
1240 cmdack.input_word[0] = *(u16 *)arg;
1241 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
1243 DPRINTF(
"dvrioctl2_enc_dec_test -> ACK Handshake error!,%d\n", cmdackerr);
1246 if (cmdack.ack_status_ack) {
1247 DPRINTF(
"dvrioctl2_enc_dec_test -> ACK Status error!,%04X\n", cmdack.ack_status_ack);
1249 if (!cmdack.comp_status)
1251 DPRINTF(
"dvrioctl2_enc_dec_test -> COMP Status error!,%04X\n", cmdack.comp_status);
1256 int dvrioctl2_make_menu(
1261 unsigned int arglen,
1263 unsigned int buflen)
1275 drvdrv_exec_cmd_ack cmdack;
1283 cmdack.command = 0x2119;
1284 cmdack.input_word[0] = *((u16 *)arg + 1);
1285 cmdack.input_word[1] = *(u16 *)arg;
1286 cmdack.input_word[2] = *((u16 *)arg + 3);
1287 cmdack.input_word[3] = *((u16 *)arg + 2);
1288 cmdack.input_word[4] = *((u16 *)arg + 4);
1289 cmdack.input_word[5] = 0;
1293 v11 = &cmdack.input_word[5];
1297 v12 = (
char *)arg + v8;
1299 v13 = (
char *)arg + v9;
1302 v11[1] = v13[10] + ((u8)v12[10] << 8);
1305 cmdack.input_word_count = 16;
1306 cmdack.timeout = 30000000;
1307 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
1308 *(u16 *)buf = cmdack.comp_status;
1310 DPRINTF(
"dvrioctl2_make_menu -> ACK Handshake error!,%d\n", cmdackerr);
1313 if (cmdack.ack_status_ack) {
1314 DPRINTF(
"dvrioctl2_make_menu -> ACK Status error!,%04X\n", cmdack.ack_status_ack);
1318 if (cmdack.comp_status) {
1319 DPRINTF(
"dvrioctl2_make_menu -> COMP Status error!,%04X\n", cmdack.comp_status);
1323 input_word = cmdack.return_result_word;
1328 v20 = (
char *)buf + v17;
1329 v21 = (
char *)buf + v19;
1333 v21[2] = (*input_word & 0x00FF);
1334 v20[2] = (*input_word & 0xFF00) >> 8;
1337 *((u8 *)buf + 22) = 0;
1339 while (busywait-- >= 0)
1344 int dvrioctl2_re_enc_start(
1349 unsigned int arglen,
1351 unsigned int buflen)
1367 drvdrv_exec_cmd_ack cmdack;
1375 cmdack.command = 0x211A;
1376 cmdack.input_word[0] = *((u16 *)arg + 1);
1377 cmdack.input_word[1] = *(u16 *)arg;
1378 cmdack.input_word[2] = *((u16 *)arg + 3);
1379 cmdack.input_word[3] = *((u16 *)arg + 2);
1380 cmdack.input_word[4] = *((u16 *)arg + 4);
1381 cmdack.input_word[5] = *((u16 *)arg + 5);
1382 cmdack.input_word[6] = *((u16 *)arg + 6);
1386 v10 = &cmdack.input_word[6];
1390 v11 = (u8 *)arg + v8;
1391 v12 = (u8 *)arg + v9;
1392 v10[1] = v12[14] + ((u8)v11[14] << 8);
1398 cmdack.input_word[17] = 0;
1402 v16 = &cmdack.input_word[17];
1406 v17 = (u8 *)arg + v14;
1407 v18 = (u8 *)arg + v15;
1408 v16[1] = v18[35] + ((u8)v17[35] << 8);
1414 cmdack.input_word[26] = 0;
1415 cmdack.input_word[27] = 0;
1416 cmdack.input_word[28] = *((u16 *)arg + 28);
1417 cmdack.input_word[29] = *((u16 *)arg + 29);
1418 cmdack.input_word[30] = *((u16 *)arg + 30);
1419 cmdack.input_word[31] = *((u16 *)arg + 31);
1420 cmdack.input_word[32] = 0;
1422 while (busywait-- >= 0)
1424 cmdack.input_word_count = 33;
1425 cmdack.timeout = 30000000;
1426 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
1427 *(u16 *)buf = cmdack.comp_status;
1429 DPRINTF(
"dvrioctl2_re_enc_start -> ACK Handshake error!,%d\n", cmdackerr);
1432 if (cmdack.ack_status_ack) {
1433 DPRINTF(
"dvrioctl2_re_enc_start -> ACK Status error!,%04X\n", cmdack.ack_status_ack);
1437 if (cmdack.comp_status) {
1438 DPRINTF(
"dvrioctl2_re_enc_start -> COMP Status error!,%04X\n", cmdack.comp_status);
1442 v26 = &cmdack.input_word[1];
1447 v28 = (u8 *)buf + v25;
1448 v29 = (u8 *)buf + v27;
1449 v29[2] = *((u8 *)v26 + 274);
1450 v28[2] = v26[137] >> 8;
1456 *((u8 *)buf + 22) = 0;
1460 int dvrpAuthEnc(u16 in_word)
1462 return (u8)dvrpAuth_tbl[(u8)in_word] | ((u8)dvrpAuth_tbl[in_word >> 8] << 8);
1467 drvdrv_exec_cmd_ack cmdack;
1469 DPRINTF(
"------------------- 2 ------------------ dvr_recv_dma(io=%p, buf=%p, buflen=%d)\n", a1, buf, buflen);
1470 if (((u32)buf & 3) != 0) {
1471 DPRINTF(
"dvr_recv_dma : Address is not a multiple of 4.\n");
1476 int ack_status_ack2;
1479 if ((buflen & 0x7F) != 0)
1480 DPRINTF(
"buflen is not a multiple of 128.\n");
1481 buflen_tmp = buflen;
1482 while (buflen_tmp > 0) {
1483 cmdack.command = 0x211B;
1484 cmdack.input_word[0] = 0;
1485 cmdack.input_word[1] = 0;
1486 cmdack.input_word[2] = 0;
1487 cmdack.input_word[3] = 6144;
1488 cmdack.input_word_count = 4;
1489 cmdack.output_buffer = buf_tmp;
1490 cmdack.timeout = 0x10000;
1491 if (DvrdrvExecCmdAckDmaRecvComp(&cmdack)) {
1493 DPRINTF(
"dvr_recv_dma : IO error (phase %d)\n", cmdack.phase);
1496 if (cmdack.comp_status) {
1498 DPRINTF(
"dvr_recv_dma : Complete parameter error (phase %d), %04X\n", cmdack.phase, cmdack.comp_status);
1501 ack_status_ack2 = cmdack.ack_status_ack2;
1502 DPRINTF(
"rsize : %d / %d \n", cmdack.ack_status_ack2, 6144);
1503 if (ack_status_ack2 <= 0)
1505 buflen_tmp -= ack_status_ack2;
1506 if (ack_status_ack2 < 0x1801)
1508 buf_tmp += ack_status_ack2;
1510 err = cmdack.ack_status_ack2;
1512 DPRINTF(
"dvr_recv_dma: ret = %d\n", err);
1517 u8 TELTEXT_BUF[0x1800];
1518 unsigned int TELTEXT_ACTLEN;
1519 unsigned int TELTEXT_BUFOFFSET;
1521 int dvrioctl2_tevent_buf_recv_first(
1526 unsigned int arglen,
1528 unsigned int buflen)
1534 TELTEXT_BUFOFFSET = 0;
1536 DPRINTF(
"dvr_tevent_buf_recv_first(io=%p, cmd=%d buf=%p, nbyte=%u)\n", a1, cmd, buf, buflen);
1537 TELTEXT_ACTLEN = dvr_recv_dma(a1, TELTEXT_BUF,
sizeof(TELTEXT_BUF));
1538 if ((TELTEXT_ACTLEN & 0x80000000) == 0) {
1539 if (buflen == 1024) {
1540 memcpy(buf, (u8 *)TELTEXT_BUF + TELTEXT_BUFOFFSET, 1024);
1541 TELTEXT_BUFOFFSET += 1024;
1542 if (TELTEXT_ACTLEN <= 0x400) {
1543 DPRINTF(
"tevent_buf_recv_first: actlen:%u request-buflen:%d return 0 < DMA EOT >\n", TELTEXT_ACTLEN, 1024);
1546 DPRINTF(
"tevent_buf_recv_first: return <DMA_REMAIND>\n");
1550 DPRINTF(
"tevent_buf_recv_first: bufflen error! return 0 < EOT > .\n");
1554 DPRINTF(
"tevent_buf_recv_first: dma error! return 0 < EOT >.\n");
1559 int dvrioctl2_tevent_buf_recv_next(
1564 unsigned int arglen,
1566 unsigned int buflen)
1572 DPRINTF(
"dvr_tevent_buf_recv_next(io=%p, cmd=%d buf=%p, nbyte=%u)\n", a1, cmd, buf, buflen);
1573 if (buflen == 1024) {
1574 if (TELTEXT_BUFOFFSET + 1024 <
sizeof(TELTEXT_BUF)) {
1575 memcpy(buf, TELTEXT_BUF + TELTEXT_BUFOFFSET, 1024);
1576 TELTEXT_BUFOFFSET += 1024;
1577 if ((
int)TELTEXT_BUFOFFSET < (
int)TELTEXT_ACTLEN) {
1578 DPRINTF(
"tevent_buf_recv_next: return <DMA_REMAIND>\n");
1581 DPRINTF(
"tevent_buf_recv_next: return 0 < DMA EOT >!\n");
1583 DPRINTF(
"tevent_buf_recv_next: bufflen error!\n");
1586 DPRINTF(
"tevent_buf_recv_next: bufflen error!\n");
1591 int dvrioctl2_finish_auto_process(
1596 unsigned int arglen,
1598 unsigned int buflen)
1601 drvdrv_exec_cmd_ack cmdack;
1609 cmdack.command = 0x211C;
1610 cmdack.input_word_count = 1;
1611 cmdack.timeout = 5000000;
1612 cmdack.input_word[0] = *(u16 *)arg;
1613 cmdackerr = DvrdrvExecCmdAck(&cmdack);
1615 DPRINTF(
"dvrioctl2_finish_auto_process -> Handshake error!,%d\n", cmdackerr);
1618 if (cmdack.ack_status_ack == 0xFFFE) {
1619 DPRINTF(
"dvrioctl2_finish_auto_process -> Mode error!,%04X\n", 0xFFFE);
1621 if (!cmdack.ack_status_ack) {
1622 *(u32 *)buf = (cmdack.output_word[0] << 16) + cmdack.output_word[1];
1625 DPRINTF(
"dvrioctl2_finish_auto_process -> Status error!,%04X\n", cmdack.ack_status_ack);
1630 int dvrioctl2_rec_pictclip(
1635 unsigned int arglen,
1637 unsigned int buflen)
1641 drvdrv_exec_cmd_ack cmdack;
1650 cmdack.command = 0x211D;
1651 cmdack.input_word[0] = *((u16 *)arg + 1);
1652 cmdack.input_word[1] = *((u16 *)arg + 0);
1653 cmdack.input_word[2] = *((u16 *)arg + 3);
1654 cmdack.input_word[3] = *((u16 *)arg + 2);
1655 cmdack.input_word[4] = *((u16 *)arg + 4);
1656 cmdack.input_word[5] = *((u16 *)arg + 5);
1657 cmdack.input_word[6] = *((u16 *)arg + 6);
1659 while (busywait-- >= 0)
1661 cmdack.input_word_count = 7;
1662 cmdack.timeout = 30000000;
1663 cmdackerr = DvrdrvExecCmdAckComp(&cmdack);
1665 DPRINTF(
"dvrioctl2_re_enc_start -> ACK Handshake error!,%d\n", cmdackerr);
1668 if (cmdack.ack_status_ack) {
1669 DPRINTF(
"dvrioctl2_re_enc_start -> ACK Status error!,%04X\n", cmdack.ack_status_ack);
1671 if (!cmdack.comp_status)
1673 DPRINTF(
"dvrioctl2_re_enc_start -> COMP Status error!,%04X\n", cmdack.comp_status);