23#define MODNAME "DVRIPL"
25#define DPRINTF(x...) printf(MODNAME ": " x)
30extern int module_start(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi);
31extern int module_stop(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi);
35extern int dvripl_df_devctl(
iomanX_iop_file_t *a1,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
36extern int dvripl_df_ioctl2(
iomanX_iop_file_t *f,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
38extern void dvr_ready(
int a1,
void *a2);
40IOMANX_RETURN_VALUE_IMPL(
EUNSUP);
46 IOMANX_RETURN_VALUE(
EUNSUP),
47 IOMANX_RETURN_VALUE(
EUNSUP),
48 IOMANX_RETURN_VALUE(
EUNSUP),
49 IOMANX_RETURN_VALUE(
EUNSUP),
50 IOMANX_RETURN_VALUE(
EUNSUP),
51 IOMANX_RETURN_VALUE(
EUNSUP),
53 IOMANX_RETURN_VALUE(
EUNSUP),
54 IOMANX_RETURN_VALUE(
EUNSUP),
55 IOMANX_RETURN_VALUE(
EUNSUP),
56 IOMANX_RETURN_VALUE(
EUNSUP),
57 IOMANX_RETURN_VALUE(
EUNSUP),
58 IOMANX_RETURN_VALUE(
EUNSUP),
59 IOMANX_RETURN_VALUE(
EUNSUP),
60 IOMANX_RETURN_VALUE(
EUNSUP),
61 IOMANX_RETURN_VALUE(
EUNSUP),
62 IOMANX_RETURN_VALUE(
EUNSUP),
63 IOMANX_RETURN_VALUE(
EUNSUP),
64 IOMANX_RETURN_VALUE(
EUNSUP),
65 IOMANX_RETURN_VALUE(
EUNSUP),
66 IOMANX_RETURN_VALUE_S64(
EUNSUP),
68 IOMANX_RETURN_VALUE(
EUNSUP),
69 IOMANX_RETURN_VALUE(
EUNSUP),
75 .desc =
"Digital Video Recorder",
85int _start(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
88 return module_start(argc, argv, startaddr, mi);
90 return module_stop(argc, argv, startaddr, mi);
93int module_start(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
99 if (iomanX_AddDrv(&DVRMAN) != 0)
100 return MODULE_NO_RESIDENT_END;
102 return MODULE_REMOVABLE_END;
104 if (mi && ((mi->
newflags & 2) != 0))
106 return MODULE_RESIDENT_END;
110int module_stop(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
117 if (iomanX_DelDrv(DVRMAN.name) != 0)
118 return MODULE_REMOVABLE_END;
119 return MODULE_NO_RESIDENT_END;
129 DPRINTF(
"dvripl_df_init\n");
134 v1 = CreateSema(&v3);
145 DPRINTF(
"dvripl_df_exit\n");
146 if (DeleteSema(sema_id) != 0)
157 DPRINTF(
"dvripl_df_ioctl\n");
179 DPRINTF(
"dvripl_df_devctl\n");
183 v11 = iplioctl2_update(a1, 0x5602, arg);
188int dvripl_df_ioctl2(
iomanX_iop_file_t *f,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
197 DPRINTF(
"dvripl_df_ioctl2\n");
217 drvdrv_exec_cmd_ack cmdack;
225 DPRINTF(
"iplioctl2_update\n");
227 cmdack.command = 0x101;
228 cmdack.input_word_count = 0;
229 cmdackerr1 = DvrdrvExecCmdAck(&cmdack);
230 DPRINTF(
"dvrcmd.ack_p[0]:%x\n", cmdack.ack_status_ack);
233 if (cmdack.ack_status_ack) {
234 DPRINTF(
"NOP -> Status error!\n");
237 DPRINTF(
"VERSION\n");
238 cmdack.command = 0x102;
239 cmdack.input_word_count = 0;
240 cmdackerr2 = DvrdrvExecCmdAck(&cmdack);
241 DPRINTF(
"dvrcmd.ack_p[0]:%x\n", cmdack.ack_status_ack);
244 DPRINTF(
"NOP -> Handshake error!\n");
247 if (cmdack.ack_status_ack) {
248 DPRINTF(
"NOP -> Status error!\n");
251 DPRINTF(
"major : %04x\n", cmdack.output_word[0]);
252 DPRINTF(
"minor : %04x\n", cmdack.output_word[1]);
254 cmdack.command = 0x106;
255 cmdack.input_word[0] = 1;
256 cmdack.input_word[1] = 6;
257 cmdack.input_word[2] = 0x1000;
258 cmdack.input_word[3] = 0x8968;
259 cmdack.input_word[4] = 0x115A;
260 cmdack.input_word[5] = 0x6048;
261 cmdack.input_word[6] = 0xF;
262 cmdack.input_word[7] = 0x5353;
263 cmdack.input_word_count = 8;
264 cmdackerr3 = DvrdrvExecCmdAck(&cmdack);
265 DPRINTF(
"dvrcmd.ack_p[0]:%x\n", cmdack.ack_status_ack);
267 DPRINTF(
"CONFIG -> Handshake error!(%d)\n", cmdackerr3);
270 if (cmdack.ack_status_ack) {
271 DPRINTF(
"CONFIG -> Status error!\n");
274 update_fd = iomanX_open((
const char *)arg, 1, 0x124);
275 if (update_fd >= 0) {
277 chunk_offset = 0x10000000;
278 DPRINTF(
"Opened \"%s\"\n", (
const char *)arg);
279 DPRINTF(
"Downloading \"%s\"\n", (
const char *)arg);
281 hard_timer = AllocHardTimer(1, 32, 1);
282 SetupHardTimer(hard_timer, 1, 0, 1);
283 StartHardTimer(hard_timer);
290 DPRINTF(
"%08X\n", chunk_offset);
291 read_size = iomanX_read(update_fd, SBUF, 0x8000);
292 chunk_size = read_size;
295 DPRINTF(
"Cannot read \"%s\"\n", (
const char *)arg);
298 read_buf = (
int *)SBUF;
302 while (read_buf_offs++ < chunk_size / 4) {
303 unsigned int read_buf_tmp;
304 read_buf_tmp = *read_buf++;
305 csum += (read_buf_tmp << 24) + ((read_buf_tmp & 0xFF00) << 8) + ((read_buf_tmp & 0xFF0000) >> 8) + ((read_buf_tmp & 0xff000000) >> 24);
307 cmdack.command = 0x103;
308 cmdack.input_word[0] = chunk_offset >> 16;
309 cmdack.input_word[1] = chunk_offset;
310 cmdack.input_word_count = 2;
311 cmdack.input_buffer = SBUF;
312 cmdack.input_buffer_length = chunk_size;
313 if (DvrdrvExecCmdAckDmaSendComp(&cmdack)) {
315 DPRINTF(
"Handshake error! (phase:%d)\n", cmdack.phase);
318 chunk_offset += chunk_size;
319 if (cmdack.ack_status_ack)
321 total_size += chunk_size;
324 system_clock = GetTimerCounter(hard_timer);
325 DPRINTF(
"System Clock : %ld\n", system_clock);
326 StopHardTimer(hard_timer);
327 FreeHardTimer(hard_timer);
329 DPRINTF(
"CHECK SUM\n");
330 DPRINTF(
"total_size:%d\n", total_size);
331 DPRINTF(
"csum : %x\n", csum);
332 cmdack.command = 0x105;
333 cmdack.input_word[0] = 0x1000;
334 cmdack.input_word[2] = total_size >> 16;
335 cmdack.input_word[4] = csum >> 16;
336 cmdack.input_word[1] = 0;
337 cmdack.input_word[3] = total_size;
338 cmdack.input_word[5] = csum;
339 cmdack.input_word_count = 6;
340 cmdackerr4 = DvrdrvExecCmdAck(&cmdack);
341 DPRINTF(
"result: %d\n", cmdackerr4);
342 DPRINTF(
"dvrcmd.ack_p[0]:%x\n", cmdack.ack_status_ack);
343 DPRINTF(
"dvrcmd.ack_p[1]:%x\n", cmdack.output_word[0]);
344 DPRINTF(
"dvrcmd.ack_p[2]:%x\n", cmdack.output_word[1]);
349 if (cmdack.ack_status_ack)
356 iomanX_close(update_fd);
357 DvrdrvUnregisterIntrHandler(dvr_ready);
362void dvr_ready(
int a1,
void *a2)
366 Kprintf(
"DVRRDY INTERRUPT\n");
368 iWakeupThread(*(u32 *)a2);