1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 Heikki Hannikainen
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
29 #include "debug_menu.h"
36 #include "powermgmt.h"
40 #include "mp3_playback.h"
43 #include "statusbar.h"
53 #include "lcd-remote.h"
65 #include "eeprom_24cxx.h"
66 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
69 #if (CONFIG_STORAGE & STORAGE_ATA)
78 #ifdef HAVE_LCD_BITMAP
79 #include "scrollbar.h"
80 #include "peakmeter.h"
83 #if CONFIG_CODEC == SWCODEC
85 #include "buffering.h"
87 #if defined(HAVE_SPDIF_OUT) || defined(HAVE_SPDIF_IN)
91 #ifdef IRIVER_H300_SERIES
92 #include "pcf50606.h" /* for pcf50606_read */
99 #if CONFIG_RTC == RTC_PCF50605
100 #include "pcf50605.h"
103 #if CONFIG_CPU == DM320 || CONFIG_CPU == S3C2440 || CONFIG_CPU == TCC7801 \
104 || CONFIG_CPU == IMX31L
105 #include "debug-target.h"
108 #if defined(SANSA_E200) || defined(PHILIPS_SA9200)
113 #if defined(HAVE_USBSTACK)
114 #include "usb_core.h"
117 #include "../firmware/usbstack/usb_storage.h"
120 /*---------------------------------------------------*/
121 /* SPECIAL DEBUG STUFF */
122 /*---------------------------------------------------*/
123 extern struct thread_entry threads
[MAXTHREADS
];
125 static char thread_status_char(unsigned status
)
127 static const char thread_status_chars
[THREAD_NUM_STATES
+1] =
129 [0 ... THREAD_NUM_STATES
] = '?',
130 [STATE_RUNNING
] = 'R',
131 [STATE_BLOCKED
] = 'B',
132 [STATE_SLEEPING
] = 'S',
133 [STATE_BLOCKED_W_TMO
] = 'T',
134 [STATE_FROZEN
] = 'F',
135 [STATE_KILLED
] = 'K',
138 if (status
> THREAD_NUM_STATES
)
139 status
= THREAD_NUM_STATES
;
141 return thread_status_chars
[status
];
144 static char* threads_getname(int selected_item
, void *data
,
145 char *buffer
, size_t buffer_len
)
148 struct thread_entry
*thread
;
152 if (selected_item
< (int)NUM_CORES
)
154 snprintf(buffer
, buffer_len
, "Idle (%d): %2d%%", selected_item
,
155 idle_stack_usage(selected_item
));
159 selected_item
-= NUM_CORES
;
162 thread
= &threads
[selected_item
];
164 if (thread
->state
== STATE_KILLED
)
166 snprintf(buffer
, buffer_len
, "%2d: ---", selected_item
);
170 thread_get_name(name
, 32, thread
);
172 snprintf(buffer
, buffer_len
,
173 "%2d: " IF_COP("(%d) ") "%c%c " IF_PRIO("%d %d ") "%2d%% %s",
175 IF_COP(thread
->core
,)
176 #ifdef HAVE_SCHEDULER_BOOSTCTRL
177 (thread
->cpu_boost
) ? '+' :
179 ((thread
->state
== STATE_RUNNING
) ? '*' : ' '),
180 thread_status_char(thread
->state
),
181 IF_PRIO(thread
->base_priority
, thread
->priority
, )
182 thread_stack_usage(thread
), name
);
186 static int dbg_threads_action_callback(int action
, struct gui_synclist
*lists
)
189 #ifdef ROCKBOX_HAS_LOGF
190 if (action
== ACTION_STD_OK
)
192 int selpos
= gui_synclist_get_sel_pos(lists
);
194 if (selpos
>= NUM_CORES
)
195 remove_thread(&threads
[selpos
- NUM_CORES
]);
197 remove_thread(&threads
[selpos
]);
199 return ACTION_REDRAW
;
201 #endif /* ROCKBOX_HAS_LOGF */
202 if (action
== ACTION_NONE
)
203 action
= ACTION_REDRAW
;
207 static bool dbg_os(void)
209 struct simplelist_info info
;
210 simplelist_info_init(&info
, IF_COP("Core and ") "Stack usage:",
214 MAXTHREADS
+NUM_CORES
,
217 #ifndef ROCKBOX_HAS_LOGF
218 info
.hide_selection
= true;
219 info
.scroll_all
= true;
221 info
.action_callback
= dbg_threads_action_callback
;
222 info
.get_name
= threads_getname
;
223 return simplelist_show_list(&info
);
226 #ifdef HAVE_LCD_BITMAP
227 #if CONFIG_CODEC != SWCODEC
229 static bool dbg_audio_thread(void)
232 struct audio_debug d
;
234 lcd_setfont(FONT_SYSFIXED
);
238 if (action_userabort(HZ
/5))
241 audio_get_debugdata(&d
);
245 snprintf(buf
, sizeof(buf
), "read: %x", d
.audiobuf_read
);
247 snprintf(buf
, sizeof(buf
), "write: %x", d
.audiobuf_write
);
249 snprintf(buf
, sizeof(buf
), "swap: %x", d
.audiobuf_swapwrite
);
251 snprintf(buf
, sizeof(buf
), "playing: %d", d
.playing
);
253 snprintf(buf
, sizeof(buf
), "playable: %x", d
.playable_space
);
255 snprintf(buf
, sizeof(buf
), "unswapped: %x", d
.unswapped_space
);
258 /* Playable space left */
259 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8, 112, 4, d
.audiobuflen
, 0,
260 d
.playable_space
, HORIZONTAL
);
262 /* Show the watermark limit */
263 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8+4, 112, 4, d
.audiobuflen
, 0,
264 d
.low_watermark_level
, HORIZONTAL
);
266 snprintf(buf
, sizeof(buf
), "wm: %x - %x",
267 d
.low_watermark_level
, d
.lowest_watermark_level
);
274 #endif /* !SIMULATOR */
275 #else /* CONFIG_CODEC == SWCODEC */
276 extern size_t filebuflen
;
277 /* This is a size_t, but call it a long so it puts a - when it's bad. */
279 static unsigned int ticks
, boost_ticks
, freq_sum
;
281 static void dbg_audio_task(void)
284 if(FREQ
> CPUFREQ_NORMAL
)
286 freq_sum
+= FREQ
/1000000; /* in MHz */
291 static bool dbg_buffering_thread(void)
298 size_t bufsize
= pcmbuf_get_bufsize();
299 int pcmbufdescs
= pcmbuf_descs();
300 struct buffering_debug d
;
302 ticks
= boost_ticks
= freq_sum
= 0;
304 tick_add_task(dbg_audio_task
);
306 lcd_setfont(FONT_SYSFIXED
);
309 button
= get_action(CONTEXT_STD
,HZ
/5);
312 case ACTION_STD_NEXT
:
315 case ACTION_STD_PREV
:
318 case ACTION_STD_CANCEL
:
323 buffering_get_debugdata(&d
);
328 bufused
= bufsize
- pcmbuf_free();
330 snprintf(buf
, sizeof(buf
), "pcm: %7ld/%7ld", (long) bufused
, (long) bufsize
);
331 lcd_puts(0, line
++, buf
);
333 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
334 bufsize
, 0, bufused
, HORIZONTAL
);
337 snprintf(buf
, sizeof(buf
), "alloc: %8ld/%8ld", audio_filebufused(),
339 lcd_puts(0, line
++, buf
);
342 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
343 filebuflen
, 0, audio_filebufused(), HORIZONTAL
);
346 snprintf(buf
, sizeof(buf
), "real: %8ld/%8ld", (long)d
.buffered_data
,
348 lcd_puts(0, line
++, buf
);
350 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
351 filebuflen
, 0, (long)d
.buffered_data
, HORIZONTAL
);
355 snprintf(buf
, sizeof(buf
), "usefl: %8ld/%8ld", (long)(d
.useful_data
),
357 lcd_puts(0, line
++, buf
);
360 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
361 filebuflen
, 0, d
.useful_data
, HORIZONTAL
);
365 snprintf(buf
, sizeof(buf
), "data_rem: %ld", (long)d
.data_rem
);
366 lcd_puts(0, line
++, buf
);
368 snprintf(buf
, sizeof(buf
), "track count: %2d", audio_track_count());
369 lcd_puts(0, line
++, buf
);
371 snprintf(buf
, sizeof(buf
), "handle count: %d", (int)d
.num_handles
);
372 lcd_puts(0, line
++, buf
);
375 snprintf(buf
, sizeof(buf
), "cpu freq: %3dMHz",
376 (int)((FREQ
+ 500000) / 1000000));
377 lcd_puts(0, line
++, buf
);
382 int boostquota
= boost_ticks
* 1000 / ticks
; /* in 0.1 % */
383 int avgclock
= freq_sum
* 10 / ticks
; /* in 100 kHz */
384 snprintf(buf
, sizeof(buf
), "boost ratio: %3d.%d%% (%2d.%dMHz)",
385 boostquota
/10, boostquota
%10, avgclock
/10, avgclock
%10);
386 lcd_puts(0, line
++, buf
);
389 snprintf(buf
, sizeof(buf
), "pcmbufdesc: %2d/%2d",
390 pcmbuf_used_descs(), pcmbufdescs
);
391 lcd_puts(0, line
++, buf
);
396 tick_remove_task(dbg_audio_task
);
400 #endif /* CONFIG_CODEC */
401 #endif /* HAVE_LCD_BITMAP */
404 #if (CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE))
405 /* Tool function to read the flash manufacturer and type, if available.
406 Only chips which could be reprogrammed in system will return values.
407 (The mode switch addresses vary between flash manufacturers, hence addr1/2) */
408 /* In IRAM to avoid problems when running directly from Flash */
409 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
410 unsigned addr1
, unsigned addr2
)
411 ICODE_ATTR
__attribute__((noinline
));
412 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
413 unsigned addr1
, unsigned addr2
)
416 unsigned not_manu
, not_id
; /* read values before switching to ID mode */
417 unsigned manu
, id
; /* read values when in ID mode */
419 #if CONFIG_CPU == SH7034
420 volatile unsigned char* flash
= (unsigned char*)0x2000000; /* flash mapping */
421 #elif defined(CPU_COLDFIRE)
422 volatile unsigned short* flash
= (unsigned short*)0; /* flash mapping */
424 int old_level
; /* saved interrupt level */
426 not_manu
= flash
[0]; /* read the normal content */
427 not_id
= flash
[1]; /* should be 'A' (0x41) and 'R' (0x52) from the "ARCH" marker */
429 /* disable interrupts, prevent any stray flash access */
430 old_level
= disable_irq_save();
432 flash
[addr1
] = 0xAA; /* enter command mode */
434 flash
[addr1
] = 0x90; /* ID command */
435 /* Atmel wants 20ms pause here */
436 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
438 manu
= flash
[0]; /* read the IDs */
441 flash
[0] = 0xF0; /* reset flash (back to normal read mode) */
442 /* Atmel wants 20ms pause here */
443 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
445 restore_irq(old_level
); /* enable interrupts again */
447 /* I assume success if the obtained values are different from
448 the normal flash content. This is not perfectly bulletproof, they
449 could theoretically be the same by chance, causing us to fail. */
450 if (not_manu
!= manu
|| not_id
!= id
) /* a value has changed */
452 *p_manufacturer
= manu
; /* return the results */
454 return true; /* success */
456 return false; /* fail */
458 #endif /* (CONFIG_CPU == SH7034 || CPU_COLDFIRE) */
462 static int perfcheck(void)
468 "orr r0, r2, #0xc0 \n" /* disable IRQ and FIQ */
471 "ldr r0, [%[timr]] \n"
472 "add r0, r0, %[tmo] \n"
474 "add %[res], %[res], #1 \n"
475 "ldr r1, [%[timr]] \n"
478 "msr CPSR_c, r2 \n" /* reset IRQ and FIQ state */
482 [timr
]"r"(&USEC_TIMER
),
484 #if CONFIG_CPU == PP5002
486 #else /* PP5020/5022/5024 */
497 #ifdef HAVE_LCD_BITMAP
498 static bool dbg_hw_info(void)
500 #if CONFIG_CPU == SH7034
502 int bitmask
= HW_MASK
;
503 int rom_version
= ROM_VERSION
;
504 unsigned manu
, id
; /* flash IDs */
505 bool got_id
; /* flag if we managed to get the flash IDs */
506 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
507 bool has_bootrom
; /* flag for boot ROM present */
508 int oldmode
; /* saved memory guard mode */
510 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
512 /* get flash ROM type */
513 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
515 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
517 /* check if the boot ROM area is a flash mirror */
518 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
519 if (has_bootrom
) /* if ROM and Flash different */
521 /* calculate CRC16 checksum of boot ROM */
522 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
525 system_memory_guard(oldmode
); /* re-enable memory guard */
527 lcd_setfont(FONT_SYSFIXED
);
530 lcd_puts(0, 0, "[Hardware info]");
532 snprintf(buf
, 32, "ROM: %d.%02d", rom_version
/100, rom_version
%100);
535 snprintf(buf
, 32, "Mask: 0x%04x", bitmask
);
539 snprintf(buf
, 32, "Flash: M=%02x D=%02x", manu
, id
);
541 snprintf(buf
, 32, "Flash: M=?? D=??"); /* unknown, sorry */
546 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
547 snprintf(buf
, 32, "Boot ROM: V1");
549 snprintf(buf
, 32, "ROMcrc: 0x%08x", rom_crc
);
553 snprintf(buf
, 32, "Boot ROM: none");
559 while (!(action_userabort(TIMEOUT_BLOCK
)));
561 #elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250
563 unsigned manu
, id
; /* flash IDs */
564 int got_id
; /* flag if we managed to get the flash IDs */
565 int oldmode
; /* saved memory guard mode */
568 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
570 /* get flash ROM type */
571 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
573 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
575 system_memory_guard(oldmode
); /* re-enable memory guard */
577 lcd_setfont(FONT_SYSFIXED
);
580 lcd_puts(0, line
++, "[Hardware info]");
583 snprintf(buf
, 32, "Flash: M=%04x D=%04x", manu
, id
);
585 snprintf(buf
, 32, "Flash: M=???? D=????"); /* unknown, sorry */
586 lcd_puts(0, line
++, buf
);
592 lcd_puts(0, ++line
, "Serial Number:");
594 got_id
= ds2411_read_id(&id
);
596 if (got_id
== DS2411_OK
)
598 snprintf(buf
, 32, " FC=%02x", (unsigned)id
.family_code
);
599 lcd_puts(0, ++line
, buf
);
600 snprintf(buf
, 32, " ID=%02X %02X %02X %02X %02X %02X",
601 (unsigned)id
.uid
[0], (unsigned)id
.uid
[1], (unsigned)id
.uid
[2],
602 (unsigned)id
.uid
[3], (unsigned)id
.uid
[4], (unsigned)id
.uid
[5]);
603 lcd_puts(0, ++line
, buf
);
604 snprintf(buf
, 32, " CRC=%02X", (unsigned)id
.crc
);
608 snprintf(buf
, 32, "READ ERR=%d", got_id
);
611 lcd_puts(0, ++line
, buf
);
617 while (!(action_userabort(TIMEOUT_BLOCK
)));
619 #elif defined(CPU_PP502x)
622 char pp_version
[] = { (PP_VER2
>> 24) & 0xff, (PP_VER2
>> 16) & 0xff,
623 (PP_VER2
>> 8) & 0xff, (PP_VER2
) & 0xff,
624 (PP_VER1
>> 24) & 0xff, (PP_VER1
>> 16) & 0xff,
625 (PP_VER1
>> 8) & 0xff, (PP_VER1
) & 0xff, '\0' };
627 lcd_setfont(FONT_SYSFIXED
);
630 lcd_puts(0, line
++, "[Hardware info]");
633 snprintf(buf
, sizeof(buf
), "HW rev: 0x%08lx", IPOD_HW_REVISION
);
634 lcd_puts(0, line
++, buf
);
638 extern int lcd_type
; /* Defined in lcd-colornano.c */
640 snprintf(buf
, sizeof(buf
), "LCD type: %d", lcd_type
);
641 lcd_puts(0, line
++, buf
);
644 snprintf(buf
, sizeof(buf
), "PP version: %s", pp_version
);
645 lcd_puts(0, line
++, buf
);
647 snprintf(buf
, sizeof(buf
), "Est. clock (kHz): %d", perfcheck());
648 lcd_puts(0, line
++, buf
);
652 while (!(action_userabort(TIMEOUT_BLOCK
)));
654 #elif CONFIG_CPU == PP5002
657 char pp_version
[] = { (PP_VER4
>> 8) & 0xff, PP_VER4
& 0xff,
658 (PP_VER3
>> 8) & 0xff, PP_VER3
& 0xff,
659 (PP_VER2
>> 8) & 0xff, PP_VER2
& 0xff,
660 (PP_VER1
>> 8) & 0xff, PP_VER1
& 0xff, '\0' };
663 lcd_setfont(FONT_SYSFIXED
);
666 lcd_puts(0, line
++, "[Hardware info]");
669 snprintf(buf
, sizeof(buf
), "HW rev: 0x%08lx", IPOD_HW_REVISION
);
670 lcd_puts(0, line
++, buf
);
673 snprintf(buf
, sizeof(buf
), "PP version: %s", pp_version
);
674 lcd_puts(0, line
++, buf
);
676 snprintf(buf
, sizeof(buf
), "Est. clock (kHz): %d", perfcheck());
677 lcd_puts(0, line
++, buf
);
681 while (!(action_userabort(TIMEOUT_BLOCK
)));
683 /* Define this function in your target tree */
684 return __dbg_hw_info();
685 #endif /* CONFIG_CPU */
688 #else /* !HAVE_LCD_BITMAP */
689 static bool dbg_hw_info(void)
694 int rom_version
= ROM_VERSION
;
695 unsigned manu
, id
; /* flash IDs */
696 bool got_id
; /* flag if we managed to get the flash IDs */
697 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
698 bool has_bootrom
; /* flag for boot ROM present */
699 int oldmode
; /* saved memory guard mode */
701 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
703 /* get flash ROM type */
704 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
706 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
708 /* check if the boot ROM area is a flash mirror */
709 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
710 if (has_bootrom
) /* if ROM and Flash different */
712 /* calculate CRC16 checksum of boot ROM */
713 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
716 system_memory_guard(oldmode
); /* re-enable memory guard */
720 lcd_puts(0, 0, "[HW Info]");
726 snprintf(buf
, 32, "ROM: %d.%02d",
727 rom_version
/100, rom_version
%100);
731 snprintf(buf
, 32, "Flash:%02x,%02x", manu
, id
);
733 snprintf(buf
, 32, "Flash:??,??"); /* unknown, sorry */
738 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
739 snprintf(buf
, 32, "BootROM: V1");
740 else if (rom_crc
== 0x358099E8)
741 snprintf(buf
, 32, "BootROM: V2");
742 /* alternative boot ROM found in one single player so far */
744 snprintf(buf
, 32, "R: %08x", rom_crc
);
747 snprintf(buf
, 32, "BootROM: no");
753 button
= get_action(CONTEXT_SETTINGS
,TIMEOUT_BLOCK
);
757 case ACTION_STD_CANCEL
:
760 case ACTION_SETTINGS_DEC
:
766 case ACTION_SETTINGS_INC
:
775 #endif /* !HAVE_LCD_BITMAP */
776 #endif /* !SIMULATOR */
779 static char* dbg_partitions_getname(int selected_item
, void *data
,
780 char *buffer
, size_t buffer_len
)
783 int partition
= selected_item
/2;
784 struct partinfo
* p
= disk_partinfo(partition
);
787 snprintf(buffer
, buffer_len
, " T:%x %ld MB", p
->type
, p
->size
/ 2048);
791 snprintf(buffer
, buffer_len
, "P%d: S:%lx", partition
, p
->start
);
796 bool dbg_partitions(void)
798 struct simplelist_info info
;
799 simplelist_info_init(&info
, "Partition Info", 4, NULL
);
800 info
.selection_size
= 2;
801 info
.hide_selection
= true;
802 info
.scroll_all
= true;
803 info
.get_name
= dbg_partitions_getname
;
804 return simplelist_show_list(&info
);
808 #if defined(CPU_COLDFIRE) && defined(HAVE_SPDIF_OUT)
809 static bool dbg_spdif(void)
813 unsigned int control
;
818 unsigned int interruptstat
;
819 bool valnogood
, symbolerr
, parityerr
;
822 int spdif_source
= spdif_get_output_source(&spdif_src_on
);
823 spdif_set_output_source(AUDIO_SRC_SPDIF
IF_SPDIF_POWER_(, true));
826 lcd_setfont(FONT_SYSFIXED
);
828 #ifdef HAVE_SPDIF_POWER
829 spdif_power_enable(true); /* We need SPDIF power for both sending & receiving */
836 control
= EBU1RCVCCHANNEL1
;
837 interruptstat
= INTERRUPTSTAT
;
838 INTERRUPTCLEAR
= 0x03c00000;
840 valnogood
= (interruptstat
& 0x01000000)?true:false;
841 symbolerr
= (interruptstat
& 0x00800000)?true:false;
842 parityerr
= (interruptstat
& 0x00400000)?true:false;
844 snprintf(buf
, sizeof(buf
), "Val: %s Sym: %s Par: %s",
847 parityerr
?"--":"OK");
848 lcd_puts(0, line
++, buf
);
850 snprintf(buf
, sizeof(buf
), "Status word: %08x", (int)control
);
851 lcd_puts(0, line
++, buf
);
856 snprintf(buf
, sizeof(buf
), "PRO: %d (%s)",
857 x
, x
?"Professional":"Consumer");
858 lcd_puts(0, line
++, buf
);
860 x
= (control
>> 30) & 1;
861 snprintf(buf
, sizeof(buf
), "Audio: %d (%s)",
862 x
, x
?"Non-PCM":"PCM");
863 lcd_puts(0, line
++, buf
);
865 x
= (control
>> 29) & 1;
866 snprintf(buf
, sizeof(buf
), "Copy: %d (%s)",
867 x
, x
?"Permitted":"Inhibited");
868 lcd_puts(0, line
++, buf
);
870 x
= (control
>> 27) & 7;
883 snprintf(buf
, sizeof(buf
), "Preemphasis: %d (%s)", x
, s
);
884 lcd_puts(0, line
++, buf
);
886 x
= (control
>> 24) & 3;
887 snprintf(buf
, sizeof(buf
), "Mode: %d", x
);
888 lcd_puts(0, line
++, buf
);
890 category
= (control
>> 17) & 127;
902 snprintf(buf
, sizeof(buf
), "Category: 0x%02x (%s)", category
, s
);
903 lcd_puts(0, line
++, buf
);
905 x
= (control
>> 16) & 1;
907 if(((category
& 0x70) == 0x10) ||
908 ((category
& 0x70) == 0x40) ||
909 ((category
& 0x78) == 0x38))
911 generation
= !generation
;
913 snprintf(buf
, sizeof(buf
), "Generation: %d (%s)",
914 x
, generation
?"Original":"No ind.");
915 lcd_puts(0, line
++, buf
);
917 x
= (control
>> 12) & 15;
918 snprintf(buf
, sizeof(buf
), "Source: %d", x
);
919 lcd_puts(0, line
++, buf
);
921 x
= (control
>> 8) & 15;
937 snprintf(buf
, sizeof(buf
), "Channel: %d (%s)", x
, s
);
938 lcd_puts(0, line
++, buf
);
940 x
= (control
>> 4) & 15;
953 snprintf(buf
, sizeof(buf
), "Frequency: %d (%s)", x
, s
);
954 lcd_puts(0, line
++, buf
);
956 x
= (control
>> 2) & 3;
957 snprintf(buf
, sizeof(buf
), "Clock accuracy: %d", x
);
958 lcd_puts(0, line
++, buf
);
962 snprintf(buf
, sizeof(buf
), "Measured freq: %ldHz",
963 spdif_measure_frequency());
964 lcd_puts(0, line
++, buf
);
969 if (action_userabort(HZ
/10))
973 spdif_set_output_source(spdif_source
IF_SPDIF_POWER_(, spdif_src_on
));
975 #ifdef HAVE_SPDIF_POWER
976 spdif_power_enable(global_settings
.spdif_enable
);
981 #endif /* CPU_COLDFIRE */
984 #ifdef HAVE_LCD_BITMAP
985 /* button definitions */
986 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
987 (CONFIG_KEYPAD == IRIVER_H300_PAD)
988 # define DEBUG_CANCEL BUTTON_OFF
990 #elif CONFIG_KEYPAD == RECORDER_PAD
991 # define DEBUG_CANCEL BUTTON_OFF
993 #elif CONFIG_KEYPAD == ONDIO_PAD
994 # define DEBUG_CANCEL BUTTON_MENU
996 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || \
997 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
998 (CONFIG_KEYPAD == IPOD_4G_PAD)
999 # define DEBUG_CANCEL BUTTON_MENU
1001 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
1002 # define DEBUG_CANCEL BUTTON_PLAY
1004 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
1005 # define DEBUG_CANCEL BUTTON_REC
1007 #elif (CONFIG_KEYPAD == IAUDIO_M3_PAD)
1008 # define DEBUG_CANCEL BUTTON_RC_REC
1010 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
1011 # define DEBUG_CANCEL BUTTON_REW
1013 #elif (CONFIG_KEYPAD == MROBE100_PAD)
1014 # define DEBUG_CANCEL BUTTON_MENU
1016 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
1017 (CONFIG_KEYPAD == SANSA_C200_PAD)
1018 # define DEBUG_CANCEL BUTTON_LEFT
1020 /* This is temporary until the SA9200 touchpad works */
1021 #elif (CONFIG_KEYPAD == PHILIPS_SA9200_PAD) || \
1022 (CONFIG_KEYPAD == PHILIPS_HDD1630_PAD)
1023 # define DEBUG_CANCEL BUTTON_POWER
1025 #endif /* key definitions */
1028 bool dbg_ports(void)
1030 #if CONFIG_CPU == SH7034
1032 int adc_battery_voltage
, adc_battery_level
;
1034 lcd_setfont(FONT_SYSFIXED
);
1035 lcd_clear_display();
1039 snprintf(buf
, 32, "PADR: %04x", (unsigned short)PADR
);
1040 lcd_puts(0, 0, buf
);
1041 snprintf(buf
, 32, "PBDR: %04x", (unsigned short)PBDR
);
1042 lcd_puts(0, 1, buf
);
1044 snprintf(buf
, 32, "AN0: %03x AN4: %03x", adc_read(0), adc_read(4));
1045 lcd_puts(0, 2, buf
);
1046 snprintf(buf
, 32, "AN1: %03x AN5: %03x", adc_read(1), adc_read(5));
1047 lcd_puts(0, 3, buf
);
1048 snprintf(buf
, 32, "AN2: %03x AN6: %03x", adc_read(2), adc_read(6));
1049 lcd_puts(0, 4, buf
);
1050 snprintf(buf
, 32, "AN3: %03x AN7: %03x", adc_read(3), adc_read(7));
1051 lcd_puts(0, 5, buf
);
1053 battery_read_info(&adc_battery_voltage
, &adc_battery_level
);
1054 snprintf(buf
, 32, "Batt: %d.%03dV %d%% ", adc_battery_voltage
/ 1000,
1055 adc_battery_voltage
% 1000, adc_battery_level
);
1056 lcd_puts(0, 6, buf
);
1059 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1062 #elif defined(CPU_COLDFIRE)
1063 unsigned int gpio_out
;
1064 unsigned int gpio1_out
;
1065 unsigned int gpio_read
;
1066 unsigned int gpio1_read
;
1067 unsigned int gpio_function
;
1068 unsigned int gpio1_function
;
1069 unsigned int gpio_enable
;
1070 unsigned int gpio1_enable
;
1071 int adc_buttons
, adc_remote
;
1072 int adc_battery_voltage
, adc_battery_level
;
1076 lcd_clear_display();
1077 lcd_setfont(FONT_SYSFIXED
);
1082 gpio_read
= GPIO_READ
;
1083 gpio1_read
= GPIO1_READ
;
1084 gpio_out
= GPIO_OUT
;
1085 gpio1_out
= GPIO1_OUT
;
1086 gpio_function
= GPIO_FUNCTION
;
1087 gpio1_function
= GPIO1_FUNCTION
;
1088 gpio_enable
= GPIO_ENABLE
;
1089 gpio1_enable
= GPIO1_ENABLE
;
1091 snprintf(buf
, sizeof(buf
), "GPIO_READ: %08x", gpio_read
);
1092 lcd_puts(0, line
++, buf
);
1093 snprintf(buf
, sizeof(buf
), "GPIO_OUT: %08x", gpio_out
);
1094 lcd_puts(0, line
++, buf
);
1095 snprintf(buf
, sizeof(buf
), "GPIO_FUNC: %08x", gpio_function
);
1096 lcd_puts(0, line
++, buf
);
1097 snprintf(buf
, sizeof(buf
), "GPIO_ENA: %08x", gpio_enable
);
1098 lcd_puts(0, line
++, buf
);
1100 snprintf(buf
, sizeof(buf
), "GPIO1_READ: %08x", gpio1_read
);
1101 lcd_puts(0, line
++, buf
);
1102 snprintf(buf
, sizeof(buf
), "GPIO1_OUT: %08x", gpio1_out
);
1103 lcd_puts(0, line
++, buf
);
1104 snprintf(buf
, sizeof(buf
), "GPIO1_FUNC: %08x", gpio1_function
);
1105 lcd_puts(0, line
++, buf
);
1106 snprintf(buf
, sizeof(buf
), "GPIO1_ENA: %08x", gpio1_enable
);
1107 lcd_puts(0, line
++, buf
);
1109 adc_buttons
= adc_read(ADC_BUTTONS
);
1110 adc_remote
= adc_read(ADC_REMOTE
);
1111 battery_read_info(&adc_battery_voltage
, &adc_battery_level
);
1112 #if defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IRIVER_H300_SERIES)
1113 snprintf(buf
, sizeof(buf
), "ADC_BUTTONS (%c): %02x",
1114 button_scan_enabled() ? '+' : '-', adc_buttons
);
1116 snprintf(buf
, sizeof(buf
), "ADC_BUTTONS: %02x", adc_buttons
);
1118 lcd_puts(0, line
++, buf
);
1119 #if defined(IAUDIO_X5) || defined(IAUDIO_M5)
1120 snprintf(buf
, sizeof(buf
), "ADC_REMOTE (%c): %02x",
1121 remote_detect() ? '+' : '-', adc_remote
);
1123 snprintf(buf
, sizeof(buf
), "ADC_REMOTE: %02x", adc_remote
);
1125 lcd_puts(0, line
++, buf
);
1126 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
1127 snprintf(buf
, sizeof(buf
), "ADC_REMOTEDETECT: %02x",
1128 adc_read(ADC_REMOTEDETECT
));
1129 lcd_puts(0, line
++, buf
);
1132 snprintf(buf
, 32, "Batt: %d.%03dV %d%% ", adc_battery_voltage
/ 1000,
1133 adc_battery_voltage
% 1000, adc_battery_level
);
1134 lcd_puts(0, line
++, buf
);
1136 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
1137 snprintf(buf
, sizeof(buf
), "remotetype: %d", remote_type());
1138 lcd_puts(0, line
++, buf
);
1142 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1146 #elif defined(CPU_PP502x)
1151 lcd_clear_display();
1152 lcd_setfont(FONT_SYSFIXED
);
1157 lcd_puts(0, line
++, "GPIO STATES:");
1158 snprintf(buf
, sizeof(buf
), "A: %02x E: %02x I: %02x",
1159 (unsigned int)GPIOA_INPUT_VAL
,
1160 (unsigned int)GPIOE_INPUT_VAL
,
1161 (unsigned int)GPIOI_INPUT_VAL
);
1162 lcd_puts(0, line
++, buf
);
1163 snprintf(buf
, sizeof(buf
), "B: %02x F: %02x J: %02x",
1164 (unsigned int)GPIOB_INPUT_VAL
,
1165 (unsigned int)GPIOF_INPUT_VAL
,
1166 (unsigned int)GPIOJ_INPUT_VAL
);
1167 lcd_puts(0, line
++, buf
);
1168 snprintf(buf
, sizeof(buf
), "C: %02x G: %02x K: %02x",
1169 (unsigned int)GPIOC_INPUT_VAL
,
1170 (unsigned int)GPIOG_INPUT_VAL
,
1171 (unsigned int)GPIOK_INPUT_VAL
);
1172 lcd_puts(0, line
++, buf
);
1173 snprintf(buf
, sizeof(buf
), "D: %02x H: %02x L: %02x",
1174 (unsigned int)GPIOD_INPUT_VAL
,
1175 (unsigned int)GPIOH_INPUT_VAL
,
1176 (unsigned int)GPIOL_INPUT_VAL
);
1177 lcd_puts(0, line
++, buf
);
1179 snprintf(buf
, sizeof(buf
), "GPO32_VAL: %08lx", GPO32_VAL
);
1180 lcd_puts(0, line
++, buf
);
1181 snprintf(buf
, sizeof(buf
), "GPO32_EN: %08lx", GPO32_ENABLE
);
1182 lcd_puts(0, line
++, buf
);
1183 snprintf(buf
, sizeof(buf
), "DEV_EN: %08lx", DEV_EN
);
1184 lcd_puts(0, line
++, buf
);
1185 snprintf(buf
, sizeof(buf
), "DEV_EN2: %08lx", DEV_EN2
);
1186 lcd_puts(0, line
++, buf
);
1187 snprintf(buf
, sizeof(buf
), "DEV_EN3: %08lx", inl(0x60006044));
1188 lcd_puts(0, line
++, buf
); /* to be verified */
1189 snprintf(buf
, sizeof(buf
), "DEV_INIT1: %08lx", DEV_INIT1
);
1190 lcd_puts(0, line
++, buf
);
1191 snprintf(buf
, sizeof(buf
), "DEV_INIT2: %08lx", DEV_INIT2
);
1192 lcd_puts(0, line
++, buf
);
1193 #ifdef ADC_ACCESSORY
1194 snprintf(buf
, sizeof(buf
), "ACCESSORY: %d", adc_read(ADC_ACCESSORY
));
1195 lcd_puts(0, line
++, buf
);
1198 #if defined(IRIVER_H10) || defined(IRIVER_H10_5GB)
1200 snprintf(buf
, sizeof(buf
), "BATT: %03x UNK1: %03x",
1201 adc_read(ADC_BATTERY
), adc_read(ADC_UNKNOWN_1
));
1202 lcd_puts(0, line
++, buf
);
1203 snprintf(buf
, sizeof(buf
), "REM: %03x PAD: %03x",
1204 adc_read(ADC_REMOTE
), adc_read(ADC_SCROLLPAD
));
1205 lcd_puts(0, line
++, buf
);
1206 #elif defined(SANSA_E200) || defined(PHILIPS_SA9200)
1207 snprintf(buf
, sizeof(buf
), "ADC_BVDD: %4d", adc_read(ADC_BVDD
));
1208 lcd_puts(0, line
++, buf
);
1209 snprintf(buf
, sizeof(buf
), "ADC_RTCSUP: %4d", adc_read(ADC_RTCSUP
));
1210 lcd_puts(0, line
++, buf
);
1211 snprintf(buf
, sizeof(buf
), "ADC_UVDD: %4d", adc_read(ADC_UVDD
));
1212 lcd_puts(0, line
++, buf
);
1213 snprintf(buf
, sizeof(buf
), "ADC_CHG_IN: %4d", adc_read(ADC_CHG_IN
));
1214 lcd_puts(0, line
++, buf
);
1215 snprintf(buf
, sizeof(buf
), "ADC_CVDD: %4d", adc_read(ADC_CVDD
));
1216 lcd_puts(0, line
++, buf
);
1217 snprintf(buf
, sizeof(buf
), "ADC_BATTEMP: %4d", adc_read(ADC_BATTEMP
));
1218 lcd_puts(0, line
++, buf
);
1219 snprintf(buf
, sizeof(buf
), "ADC_MICSUP1: %4d", adc_read(ADC_MICSUP1
));
1220 lcd_puts(0, line
++, buf
);
1221 snprintf(buf
, sizeof(buf
), "ADC_MICSUP2: %4d", adc_read(ADC_MICSUP2
));
1222 lcd_puts(0, line
++, buf
);
1223 snprintf(buf
, sizeof(buf
), "ADC_VBE1: %4d", adc_read(ADC_VBE1
));
1224 lcd_puts(0, line
++, buf
);
1225 snprintf(buf
, sizeof(buf
), "ADC_VBE2: %4d", adc_read(ADC_VBE2
));
1226 lcd_puts(0, line
++, buf
);
1227 snprintf(buf
, sizeof(buf
), "ADC_I_MICSUP1:%4d", adc_read(ADC_I_MICSUP1
));
1228 lcd_puts(0, line
++, buf
);
1229 #if !defined(PHILIPS_SA9200)
1230 snprintf(buf
, sizeof(buf
), "ADC_I_MICSUP2:%4d", adc_read(ADC_I_MICSUP2
));
1231 lcd_puts(0, line
++, buf
);
1232 snprintf(buf
, sizeof(buf
), "ADC_VBAT: %4d", adc_read(ADC_VBAT
));
1233 lcd_puts(0, line
++, buf
);
1234 snprintf(buf
, sizeof(buf
), "CHARGER: %02X/%02X",
1235 ascodec_read(AS3514_CHARGER
),
1236 ascodec_read(AS3514_IRQ_ENRD0
));
1237 lcd_puts(0, line
++, buf
);
1241 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1245 #elif CONFIG_CPU == PP5002
1249 lcd_clear_display();
1250 lcd_setfont(FONT_SYSFIXED
);
1255 snprintf(buf
, sizeof(buf
), "GPIO_A: %02x GPIO_B: %02x",
1256 (unsigned int)GPIOA_INPUT_VAL
, (unsigned int)GPIOB_INPUT_VAL
);
1257 lcd_puts(0, line
++, buf
);
1258 snprintf(buf
, sizeof(buf
), "GPIO_C: %02x GPIO_D: %02x",
1259 (unsigned int)GPIOC_INPUT_VAL
, (unsigned int)GPIOD_INPUT_VAL
);
1260 lcd_puts(0, line
++, buf
);
1262 snprintf(buf
, sizeof(buf
), "DEV_EN: %08lx", DEV_EN
);
1263 lcd_puts(0, line
++, buf
);
1264 snprintf(buf
, sizeof(buf
), "CLOCK_ENABLE: %08lx", CLOCK_ENABLE
);
1265 lcd_puts(0, line
++, buf
);
1266 snprintf(buf
, sizeof(buf
), "CLOCK_SOURCE: %08lx", CLOCK_SOURCE
);
1267 lcd_puts(0, line
++, buf
);
1268 snprintf(buf
, sizeof(buf
), "PLL_CONTROL: %08lx", PLL_CONTROL
);
1269 lcd_puts(0, line
++, buf
);
1270 snprintf(buf
, sizeof(buf
), "PLL_DIV: %08lx", PLL_DIV
);
1271 lcd_puts(0, line
++, buf
);
1272 snprintf(buf
, sizeof(buf
), "PLL_MULT: %08lx", PLL_MULT
);
1273 lcd_puts(0, line
++, buf
);
1274 snprintf(buf
, sizeof(buf
), "TIMING1_CTL: %08lx", TIMING1_CTL
);
1275 lcd_puts(0, line
++, buf
);
1276 snprintf(buf
, sizeof(buf
), "TIMING2_CTL: %08lx", TIMING2_CTL
);
1277 lcd_puts(0, line
++, buf
);
1280 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1284 return __dbg_ports();
1288 #else /* !HAVE_LCD_BITMAP */
1289 bool dbg_ports(void)
1293 int adc_battery_voltage
;
1296 lcd_clear_display();
1303 snprintf(buf
, 32, "PADR: %04x", (unsigned short)PADR
);
1306 snprintf(buf
, 32, "PBDR: %04x", (unsigned short)PBDR
);
1309 snprintf(buf
, 32, "AN0: %03x", adc_read(0));
1312 snprintf(buf
, 32, "AN1: %03x", adc_read(1));
1315 snprintf(buf
, 32, "AN2: %03x", adc_read(2));
1318 snprintf(buf
, 32, "AN3: %03x", adc_read(3));
1321 snprintf(buf
, 32, "AN4: %03x", adc_read(4));
1324 snprintf(buf
, 32, "AN5: %03x", adc_read(5));
1327 snprintf(buf
, 32, "AN6: %03x", adc_read(6));
1330 snprintf(buf
, 32, "AN7: %03x", adc_read(7));
1334 lcd_puts(0, 0, buf
);
1336 battery_read_info(&adc_battery_voltage
, NULL
);
1337 snprintf(buf
, 32, "Batt: %d.%03dV", adc_battery_voltage
/ 1000,
1338 adc_battery_voltage
% 1000);
1339 lcd_puts(0, 1, buf
);
1342 button
= get_action(CONTEXT_SETTINGS
,HZ
/5);
1346 case ACTION_STD_CANCEL
:
1349 case ACTION_SETTINGS_DEC
:
1355 case ACTION_SETTINGS_INC
:
1364 #endif /* !HAVE_LCD_BITMAP */
1365 #endif /* !SIMULATOR */
1367 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
1368 static bool dbg_pcf(void)
1373 #ifdef HAVE_LCD_BITMAP
1374 lcd_setfont(FONT_SYSFIXED
);
1376 lcd_clear_display();
1382 snprintf(buf
, sizeof(buf
), "DCDC1: %02x", pcf50605_read(0x1b));
1383 lcd_puts(0, line
++, buf
);
1384 snprintf(buf
, sizeof(buf
), "DCDC2: %02x", pcf50605_read(0x1c));
1385 lcd_puts(0, line
++, buf
);
1386 snprintf(buf
, sizeof(buf
), "DCDC3: %02x", pcf50605_read(0x1d));
1387 lcd_puts(0, line
++, buf
);
1388 snprintf(buf
, sizeof(buf
), "DCDC4: %02x", pcf50605_read(0x1e));
1389 lcd_puts(0, line
++, buf
);
1390 snprintf(buf
, sizeof(buf
), "DCDEC1: %02x", pcf50605_read(0x1f));
1391 lcd_puts(0, line
++, buf
);
1392 snprintf(buf
, sizeof(buf
), "DCDEC2: %02x", pcf50605_read(0x20));
1393 lcd_puts(0, line
++, buf
);
1394 snprintf(buf
, sizeof(buf
), "DCUDC1: %02x", pcf50605_read(0x21));
1395 lcd_puts(0, line
++, buf
);
1396 snprintf(buf
, sizeof(buf
), "DCUDC2: %02x", pcf50605_read(0x22));
1397 lcd_puts(0, line
++, buf
);
1398 snprintf(buf
, sizeof(buf
), "IOREGC: %02x", pcf50605_read(0x23));
1399 lcd_puts(0, line
++, buf
);
1400 snprintf(buf
, sizeof(buf
), "D1REGC: %02x", pcf50605_read(0x24));
1401 lcd_puts(0, line
++, buf
);
1402 snprintf(buf
, sizeof(buf
), "D2REGC: %02x", pcf50605_read(0x25));
1403 lcd_puts(0, line
++, buf
);
1404 snprintf(buf
, sizeof(buf
), "D3REGC: %02x", pcf50605_read(0x26));
1405 lcd_puts(0, line
++, buf
);
1406 snprintf(buf
, sizeof(buf
), "LPREG1: %02x", pcf50605_read(0x27));
1407 lcd_puts(0, line
++, buf
);
1410 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1420 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
1421 static bool dbg_cpufreq(void)
1427 #ifdef HAVE_LCD_BITMAP
1428 lcd_setfont(FONT_SYSFIXED
);
1430 lcd_clear_display();
1436 snprintf(buf
, sizeof(buf
), "Frequency: %ld", FREQ
);
1437 lcd_puts(0, line
++, buf
);
1439 snprintf(buf
, sizeof(buf
), "boost_counter: %d", get_cpu_boost_counter());
1440 lcd_puts(0, line
++, buf
);
1443 button
= get_action(CONTEXT_STD
,HZ
/10);
1447 case ACTION_STD_PREV
:
1451 case ACTION_STD_NEXT
:
1456 while (get_cpu_boost_counter() > 0)
1458 set_cpu_frequency(CPUFREQ_DEFAULT
);
1461 case ACTION_STD_CANCEL
:
1468 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
1470 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
1471 #include "tsc2100.h"
1472 static char *itob(int n
, int len
)
1474 static char binary
[64];
1476 for (i
=1, j
=0;i
<=len
;i
++)
1478 binary
[j
++] = n
&(1<<(len
-i
))?'1':'0';
1485 static char* tsc2100_debug_getname(int selected_item
, void * data
,
1486 char *buffer
, size_t buffer_len
)
1488 int *page
= (int*)data
;
1489 bool reserved
= false;
1493 if ((selected_item
> 0x0a) ||
1494 (selected_item
== 0x04) ||
1495 (selected_item
== 0x08))
1499 if ((selected_item
> 0x05) ||
1500 (selected_item
== 0x02))
1504 if (selected_item
> 0x1e)
1509 snprintf(buffer
, buffer_len
, "%02x: RESERVED", selected_item
);
1511 snprintf(buffer
, buffer_len
, "%02x: %s", selected_item
,
1512 itob(tsc2100_readreg(*page
, selected_item
)&0xffff,16));
1515 static int tsc2100debug_action_callback(int action
, struct gui_synclist
*lists
)
1517 int *page
= (int*)lists
->data
;
1518 if (action
== ACTION_STD_OK
)
1520 *page
= (*page
+1)%3;
1521 snprintf(lists
->title
, 32,
1522 "tsc2100 registers - Page %d", *page
);
1523 return ACTION_REDRAW
;
1527 static bool tsc2100_debug(void)
1530 char title
[32] = "tsc2100 registers - Page 0";
1531 struct simplelist_info info
;
1532 simplelist_info_init(&info
, title
, 32, &page
);
1533 info
.timeout
= HZ
/100;
1534 info
.get_name
= tsc2100_debug_getname
;
1535 info
.action_callback
= tsc2100debug_action_callback
;
1536 return simplelist_show_list(&info
);
1540 #ifdef HAVE_LCD_BITMAP
1542 * view_battery() shows a automatically scaled graph of the battery voltage
1543 * over time. Usable for estimating battery life / charging rate.
1544 * The power_history array is updated in power_thread of powermgmt.c.
1547 #define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN)
1548 #define BAT_YSPACE (LCD_HEIGHT - 20)
1550 static bool view_battery(void)
1554 unsigned short maxv
, minv
;
1557 lcd_setfont(FONT_SYSFIXED
);
1561 lcd_clear_display();
1563 case 0: /* voltage history graph */
1564 /* Find maximum and minimum voltage for scaling */
1565 minv
= power_history
[0];
1567 for (i
= 1; i
< BAT_LAST_VAL
&& power_history
[i
]; i
++) {
1568 if (power_history
[i
] > maxv
)
1569 maxv
= power_history
[i
];
1570 if (power_history
[i
] < minv
)
1571 minv
= power_history
[i
];
1574 snprintf(buf
, 30, "Battery %d.%03d", power_history
[0] / 1000,
1575 power_history
[0] % 1000);
1576 lcd_puts(0, 0, buf
);
1577 snprintf(buf
, 30, "scale %d.%03d-%d.%03dV",
1578 minv
/ 1000, minv
% 1000, maxv
/ 1000, maxv
% 1000);
1579 lcd_puts(0, 1, buf
);
1582 for (i
= BAT_LAST_VAL
- 1; i
>= 0; i
--) {
1583 y
= (power_history
[i
] - minv
) * BAT_YSPACE
/ (maxv
- minv
);
1584 lcd_set_drawmode(DRMODE_SOLID
|DRMODE_INVERSEVID
);
1585 lcd_vline(x
, LCD_HEIGHT
-1, 20);
1586 lcd_set_drawmode(DRMODE_SOLID
);
1587 lcd_vline(x
, LCD_HEIGHT
-1,
1588 MIN(MAX(LCD_HEIGHT
-1 - y
, 20), LCD_HEIGHT
-1));
1594 case 1: /* status: */
1595 lcd_puts(0, 0, "Power status:");
1597 battery_read_info(&y
, NULL
);
1598 snprintf(buf
, 30, "Battery: %d.%03d V", y
/ 1000, y
% 1000);
1599 lcd_puts(0, 1, buf
);
1600 #ifdef ADC_EXT_POWER
1601 y
= (adc_read(ADC_EXT_POWER
) * EXT_SCALE_FACTOR
) / 1000;
1602 snprintf(buf
, 30, "External: %d.%03d V", y
/ 1000, y
% 1000);
1603 lcd_puts(0, 2, buf
);
1606 #if CONFIG_CHARGING == CHARGING_CONTROL
1607 snprintf(buf
, 30, "Chgr: %s %s",
1608 charger_inserted() ? "present" : "absent",
1609 charger_enabled
? "on" : "off");
1610 lcd_puts(0, 3, buf
);
1611 snprintf(buf
, 30, "short delta: %d", short_delta
);
1612 lcd_puts(0, 5, buf
);
1613 snprintf(buf
, 30, "long delta: %d", long_delta
);
1614 lcd_puts(0, 6, buf
);
1615 lcd_puts(0, 7, power_message
);
1616 snprintf(buf
, 30, "USB Inserted: %s",
1617 usb_inserted() ? "yes" : "no");
1618 lcd_puts(0, 8, buf
);
1619 #if defined IRIVER_H300_SERIES
1620 snprintf(buf
, 30, "USB Charging Enabled: %s",
1621 usb_charging_enabled() ? "yes" : "no");
1622 lcd_puts(0, 9, buf
);
1624 #else /* CONFIG_CHARGING != CHARGING_CONTROL */
1625 #if defined IPOD_NANO || defined IPOD_VIDEO
1626 int usb_pwr
= (GPIOL_INPUT_VAL
& 0x10)?true:false;
1627 int ext_pwr
= (GPIOL_INPUT_VAL
& 0x08)?false:true;
1628 int dock
= (GPIOA_INPUT_VAL
& 0x10)?true:false;
1629 int charging
= (GPIOB_INPUT_VAL
& 0x01)?false:true;
1630 int headphone
= (GPIOA_INPUT_VAL
& 0x80)?true:false;
1632 snprintf(buf
, 30, "USB pwr: %s",
1633 usb_pwr
? "present" : "absent");
1634 lcd_puts(0, 3, buf
);
1635 snprintf(buf
, 30, "EXT pwr: %s",
1636 ext_pwr
? "present" : "absent");
1637 lcd_puts(0, 4, buf
);
1638 snprintf(buf
, 30, "Battery: %s",
1639 charging
? "charging" : (usb_pwr
||ext_pwr
) ? "charged" : "discharging");
1640 lcd_puts(0, 5, buf
);
1641 snprintf(buf
, 30, "Dock mode: %s",
1642 dock
? "enabled" : "disabled");
1643 lcd_puts(0, 6, buf
);
1644 snprintf(buf
, 30, "Headphone: %s",
1645 headphone
? "connected" : "disconnected");
1646 lcd_puts(0, 7, buf
);
1648 snprintf(buf
, 30, "Charger: %s",
1649 charger_inserted() ? "present" : "absent");
1650 lcd_puts(0, 3, buf
);
1651 #if defined TOSHIBA_GIGABEAT_S
1652 y
= battery_adc_charge_current();
1653 x
= y
< 0 ? '-' : ' ';
1655 snprintf(buf
, 30, "I Charge:%c%d.%03d A", (char)x
, y
/ 1000, y
% 1000);
1656 lcd_puts(0, 4, buf
);
1658 y
= battery_adc_temp();
1659 snprintf(buf
, 30, "T Battery: %dC (%dF)", y
, (9*y
+ 160) / 5);
1660 lcd_puts(0, 5, buf
);
1661 #endif /* defined TOSHIBA_GIGABEAT_S */
1662 #endif /* defined IPOD_NANO || defined IPOD_VIDEO */
1663 #endif /* CONFIG_CHARGING != CHARGING_CONTROL */
1664 #endif /* CONFIG_CHARGING */
1667 case 2: /* voltage deltas: */
1668 lcd_puts(0, 0, "Voltage deltas:");
1670 for (i
= 0; i
<= 6; i
++) {
1671 y
= power_history
[i
] - power_history
[i
+1];
1672 snprintf(buf
, 30, "-%d min: %s%d.%03d V", i
,
1673 (y
< 0) ? "-" : "", ((y
< 0) ? y
* -1 : y
) / 1000,
1674 ((y
< 0) ? y
* -1 : y
) % 1000);
1675 lcd_puts(0, i
+1, buf
);
1679 case 3: /* remaining time estimation: */
1681 #if CONFIG_CHARGING == CHARGING_CONTROL
1682 snprintf(buf
, 30, "charge_state: %d", charge_state
);
1683 lcd_puts(0, 0, buf
);
1685 snprintf(buf
, 30, "Cycle time: %d m", powermgmt_last_cycle_startstop_min
);
1686 lcd_puts(0, 1, buf
);
1688 snprintf(buf
, 30, "Lvl@cyc st: %d%%", powermgmt_last_cycle_level
);
1689 lcd_puts(0, 2, buf
);
1691 snprintf(buf
, 30, "P=%2d I=%2d", pid_p
, pid_i
);
1692 lcd_puts(0, 3, buf
);
1694 snprintf(buf
, 30, "Trickle sec: %d/60", trickle_sec
);
1695 lcd_puts(0, 4, buf
);
1696 #endif /* CONFIG_CHARGING == CHARGING_CONTROL */
1698 snprintf(buf
, 30, "Last PwrHist: %d.%03dV",
1699 power_history
[0] / 1000,
1700 power_history
[0] % 1000);
1701 lcd_puts(0, 5, buf
);
1703 snprintf(buf
, 30, "battery level: %d%%", battery_level());
1704 lcd_puts(0, 6, buf
);
1706 snprintf(buf
, 30, "Est. remain: %d m", battery_time());
1707 lcd_puts(0, 7, buf
);
1713 switch(get_action(CONTEXT_STD
,HZ
/2))
1715 case ACTION_STD_PREV
:
1720 case ACTION_STD_NEXT
:
1725 case ACTION_STD_CANCEL
:
1732 #endif /* HAVE_LCD_BITMAP */
1736 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1738 #if (CONFIG_STORAGE & STORAGE_MMC)
1739 #define CARDTYPE "MMC"
1740 #elif (CONFIG_STORAGE & STORAGE_SD)
1741 #define CARDTYPE "microSD"
1744 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1747 int *cardnum
= (int*)lists
->data
;
1748 unsigned char card_name
[7];
1749 unsigned char pbuf
[32];
1750 char *title
= lists
->title
;
1751 static const unsigned char i_vmin
[] = { 0, 1, 5, 10, 25, 35, 60, 100 };
1752 static const unsigned char i_vmax
[] = { 1, 5, 10, 25, 35, 45, 80, 200 };
1753 static const unsigned char *kbit_units
[] = { "kBit/s", "MBit/s", "GBit/s" };
1754 static const unsigned char *nsec_units
[] = { "ns", "µs", "ms" };
1755 static const char *spec_vers
[] = { "1.0-1.2", "1.4", "2.0-2.2",
1756 "3.1-3.31", "4.0" };
1757 if ((btn
== ACTION_STD_OK
) || (btn
== SYS_FS_CHANGED
) || (btn
== ACTION_REDRAW
))
1760 if (btn
== ACTION_STD_OK
)
1762 *cardnum
^= 0x1; /* change cards */
1766 simplelist_set_line_count(0);
1768 card
= card_get_info(*cardnum
);
1770 if (card
->initialized
> 0)
1772 card_name
[6] = '\0';
1773 strncpy(card_name
, ((unsigned char*)card
->cid
) + 3, 6);
1774 simplelist_addline(SIMPLELIST_ADD_LINE
,
1775 "%s Rev %d.%d", card_name
,
1776 (int) card_extract_bits(card
->cid
, 72, 4),
1777 (int) card_extract_bits(card
->cid
, 76, 4));
1778 simplelist_addline(SIMPLELIST_ADD_LINE
,
1780 (int) card_extract_bits(card
->cid
, 112, 4),
1781 (int) card_extract_bits(card
->cid
, 116, 4) + 1997);
1782 simplelist_addline(SIMPLELIST_ADD_LINE
,
1784 card_extract_bits(card
->cid
, 80, 32));
1785 simplelist_addline(SIMPLELIST_ADD_LINE
,
1787 (int) card_extract_bits(card
->cid
, 0, 8),
1788 (int) card_extract_bits(card
->cid
, 8, 16));
1789 int temp
= card_extract_bits(card
->csd
, 2, 4);
1790 simplelist_addline(SIMPLELIST_ADD_LINE
,
1791 CARDTYPE
" v%s", temp
< 5 ?
1792 spec_vers
[temp
] : "?.?");
1793 simplelist_addline(SIMPLELIST_ADD_LINE
,
1794 "Blocks: 0x%08lx", card
->numblocks
);
1795 output_dyn_value(pbuf
, sizeof pbuf
, card
->speed
/ 1000,
1797 simplelist_addline(SIMPLELIST_ADD_LINE
,
1799 output_dyn_value(pbuf
, sizeof pbuf
, card
->tsac
,
1801 simplelist_addline(SIMPLELIST_ADD_LINE
,
1803 simplelist_addline(SIMPLELIST_ADD_LINE
,
1804 "Nsac: %d clk", card
->nsac
);
1805 simplelist_addline(SIMPLELIST_ADD_LINE
,
1806 "R2W: *%d", card
->r2w_factor
);
1807 simplelist_addline(SIMPLELIST_ADD_LINE
,
1809 i_vmin
[card_extract_bits(card
->csd
, 66, 3)],
1810 i_vmax
[card_extract_bits(card
->csd
, 69, 3)]);
1811 simplelist_addline(SIMPLELIST_ADD_LINE
,
1813 i_vmin
[card_extract_bits(card
->csd
, 72, 3)],
1814 i_vmax
[card_extract_bits(card
->csd
, 75, 3)]);
1816 else if (card
->initialized
== 0)
1818 simplelist_addline(SIMPLELIST_ADD_LINE
, "Not Found!");
1820 #if (CONFIG_STORAGE & STORAGE_SD)
1821 else /* card->initialized < 0 */
1823 simplelist_addline(SIMPLELIST_ADD_LINE
, "Init Error! (%d)", card
->initialized
);
1826 snprintf(title
, 16, "[" CARDTYPE
" %d]", *cardnum
);
1827 gui_synclist_set_title(lists
, title
, Icon_NOICON
);
1828 gui_synclist_set_nb_items(lists
, simplelist_get_line_count());
1829 gui_synclist_select_item(lists
, 0);
1830 btn
= ACTION_REDRAW
;
1834 #elif (CONFIG_STORAGE & STORAGE_ATA)
1835 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1840 unsigned short* identify_info
= ata_get_identify();
1841 bool timing_info_present
= false;
1844 simplelist_set_line_count(0);
1846 for (i
=0; i
< 20; i
++)
1847 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+27]);
1849 /* kill trailing space */
1850 for (i
=39; i
&& buf
[i
]==' '; i
--)
1852 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", buf
);
1853 for (i
=0; i
< 4; i
++)
1854 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+23]);
1856 simplelist_addline(SIMPLELIST_ADD_LINE
,
1857 "Firmware: %s", buf
);
1858 snprintf(buf
, sizeof buf
, "%ld MB",
1859 ((unsigned long)identify_info
[61] << 16 |
1860 (unsigned long)identify_info
[60]) / 2048 );
1861 simplelist_addline(SIMPLELIST_ADD_LINE
,
1864 fat_size( IF_MV2(0,) NULL
, &free
);
1865 simplelist_addline(SIMPLELIST_ADD_LINE
,
1866 "Free: %ld MB", free
/ 1024);
1867 simplelist_addline(SIMPLELIST_ADD_LINE
,
1868 "Spinup time: %d ms", storage_spinup_time() * (1000/HZ
));
1869 i
= identify_info
[83] & (1<<3);
1870 simplelist_addline(SIMPLELIST_ADD_LINE
,
1871 "Power mgmt: %s", i
? "enabled" : "unsupported");
1872 i
= identify_info
[83] & (1<<9);
1873 simplelist_addline(SIMPLELIST_ADD_LINE
,
1874 "Noise mgmt: %s", i
? "enabled" : "unsupported");
1875 i
= identify_info
[82] & (1<<6);
1876 simplelist_addline(SIMPLELIST_ADD_LINE
,
1877 "Read-ahead: %s", i
? "enabled" : "unsupported");
1878 timing_info_present
= identify_info
[53] & (1<<1);
1879 if(timing_info_present
) {
1880 char pio3
[2], pio4
[2];pio3
[1] = 0;
1882 pio3
[0] = (identify_info
[64] & (1<<0)) ? '3' : 0;
1883 pio4
[0] = (identify_info
[64] & (1<<1)) ? '4' : 0;
1884 simplelist_addline(SIMPLELIST_ADD_LINE
,
1885 "PIO modes: 0 1 2 %s %s", pio3
, pio4
);
1888 simplelist_addline(SIMPLELIST_ADD_LINE
,
1889 "No PIO mode info");
1891 timing_info_present
= identify_info
[53] & (1<<1);
1892 if(timing_info_present
) {
1893 simplelist_addline(SIMPLELIST_ADD_LINE
,
1894 "Cycle times %dns/%dns",
1896 identify_info
[68] );
1898 simplelist_addline(SIMPLELIST_ADD_LINE
,
1901 #if defined (TOSHIBA_GIGABEAT_F) || defined (TOSHIBA_GIGABEAT_S)
1902 if (identify_info
[63] & (1<<0)) {
1903 char mdma0
[2], mdma1
[2], mdma2
[2];
1904 mdma0
[1] = mdma1
[1] = mdma2
[1] = 0;
1905 mdma0
[0] = (identify_info
[63] & (1<<0)) ? '0' : 0;
1906 mdma1
[0] = (identify_info
[63] & (1<<1)) ? '1' : 0;
1907 mdma2
[0] = (identify_info
[63] & (1<<2)) ? '2' : 0;
1908 simplelist_addline(SIMPLELIST_ADD_LINE
,
1909 "MDMA modes: %s %s %s", mdma0
, mdma1
, mdma2
);
1910 simplelist_addline(SIMPLELIST_ADD_LINE
,
1911 "MDMA Cycle times %dns/%dns",
1913 identify_info
[66] );
1916 simplelist_addline(SIMPLELIST_ADD_LINE
,
1917 "No MDMA mode info");
1919 if (identify_info
[88] & (1<<0)) {
1920 char udma0
[2], udma1
[2], udma2
[2], udma3
[2], udma4
[2], udma5
[2];
1921 udma0
[1] = udma1
[1] = udma2
[1] = udma3
[1] = udma4
[1] = udma5
[1] = 0;
1922 udma0
[0] = (identify_info
[88] & (1<<0)) ? '0' : 0;
1923 udma1
[0] = (identify_info
[88] & (1<<1)) ? '1' : 0;
1924 udma2
[0] = (identify_info
[88] & (1<<2)) ? '2' : 0;
1925 udma3
[0] = (identify_info
[88] & (1<<3)) ? '3' : 0;
1926 udma4
[0] = (identify_info
[88] & (1<<4)) ? '4' : 0;
1927 udma5
[0] = (identify_info
[88] & (1<<5)) ? '5' : 0;
1928 simplelist_addline(SIMPLELIST_ADD_LINE
,
1929 "UDMA modes: %s %s %s %s %s %s", udma0
, udma1
, udma2
,
1930 udma3
, udma4
, udma5
);
1933 simplelist_addline(SIMPLELIST_ADD_LINE
,
1934 "No UDMA mode info");
1936 #endif /* defined (TOSHIBA_GIGABEAT_F) || defined (TOSHIBA_GIGABEAT_S) */
1937 timing_info_present
= identify_info
[53] & (1<<1);
1938 if(timing_info_present
) {
1939 i
= identify_info
[49] & (1<<11);
1940 simplelist_addline(SIMPLELIST_ADD_LINE
,
1941 "IORDY support: %s", i
? "yes" : "no");
1942 i
= identify_info
[49] & (1<<10);
1943 simplelist_addline(SIMPLELIST_ADD_LINE
,
1944 "IORDY disable: %s", i
? "yes" : "no");
1946 simplelist_addline(SIMPLELIST_ADD_LINE
,
1949 simplelist_addline(SIMPLELIST_ADD_LINE
,
1950 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
1953 #else /* No SD, MMC or ATA */
1954 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1958 struct storage_info info
;
1959 storage_get_info(0,&info
);
1960 simplelist_addline(SIMPLELIST_ADD_LINE
, "Vendor: %s", info
.vendor
);
1961 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", info
.product
);
1962 simplelist_addline(SIMPLELIST_ADD_LINE
, "Firmware: %s", info
.revision
);
1963 simplelist_addline(SIMPLELIST_ADD_LINE
,
1964 "Size: %ld MB", info
.num_sectors
*(info
.sector_size
/512)/2024);
1966 fat_size( IF_MV2(0,) NULL
, &free
);
1967 simplelist_addline(SIMPLELIST_ADD_LINE
,
1968 "Free: %ld MB", free
/ 1024);
1969 simplelist_addline(SIMPLELIST_ADD_LINE
,
1970 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
1975 #if (CONFIG_STORAGE & STORAGE_ATA)
1976 static bool dbg_identify_info(void)
1978 int fd
= creat("/identify_info.bin");
1981 #ifdef ROCKBOX_LITTLE_ENDIAN
1982 ecwrite(fd
, ata_get_identify(), SECTOR_SIZE
/2, "s", true);
1984 write(fd
, ata_get_identify(), SECTOR_SIZE
);
1992 static bool dbg_disk_info(void)
1994 struct simplelist_info info
;
1995 simplelist_info_init(&info
, "Disk Info", 1, NULL
);
1996 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1999 info
.callback_data
= (void*)&card
;
2002 info
.action_callback
= disk_callback
;
2003 info
.hide_selection
= true;
2004 info
.scroll_all
= true;
2005 return simplelist_show_list(&info
);
2007 #endif /* !SIMULATOR */
2009 #ifdef HAVE_DIRCACHE
2010 static int dircache_callback(int btn
, struct gui_synclist
*lists
)
2012 (void)btn
; (void)lists
;
2013 simplelist_set_line_count(0);
2014 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache initialized: %s",
2015 dircache_is_enabled() ? "Yes" : "No");
2016 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache size: %d B",
2017 dircache_get_cache_size());
2018 simplelist_addline(SIMPLELIST_ADD_LINE
, "Last size: %d B",
2019 global_status
.dircache_size
);
2020 simplelist_addline(SIMPLELIST_ADD_LINE
, "Limit: %d B",
2022 simplelist_addline(SIMPLELIST_ADD_LINE
, "Reserve: %d/%d B",
2023 dircache_get_reserve_used(), DIRCACHE_RESERVE
);
2024 simplelist_addline(SIMPLELIST_ADD_LINE
, "Scanning took: %d s",
2025 dircache_get_build_ticks() / HZ
);
2026 simplelist_addline(SIMPLELIST_ADD_LINE
, "Entry count: %d",
2027 dircache_get_entry_count());
2031 static bool dbg_dircache_info(void)
2033 struct simplelist_info info
;
2034 simplelist_info_init(&info
, "Dircache Info", 7, NULL
);
2035 info
.action_callback
= dircache_callback
;
2036 info
.hide_selection
= true;
2037 info
.scroll_all
= true;
2038 return simplelist_show_list(&info
);
2041 #endif /* HAVE_DIRCACHE */
2043 #ifdef HAVE_TAGCACHE
2044 static int database_callback(int btn
, struct gui_synclist
*lists
)
2047 struct tagcache_stat
*stat
= tagcache_get_stat();
2048 static bool synced
= false;
2050 simplelist_set_line_count(0);
2052 simplelist_addline(SIMPLELIST_ADD_LINE
, "Initialized: %s",
2053 stat
->initialized
? "Yes" : "No");
2054 simplelist_addline(SIMPLELIST_ADD_LINE
, "DB Ready: %s",
2055 stat
->ready
? "Yes" : "No");
2056 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM Cache: %s",
2057 stat
->ramcache
? "Yes" : "No");
2058 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM: %d/%d B",
2059 stat
->ramcache_used
, stat
->ramcache_allocated
);
2060 simplelist_addline(SIMPLELIST_ADD_LINE
, "Progress: %d%% (%d entries)",
2061 stat
->progress
, stat
->processed_entries
);
2062 simplelist_addline(SIMPLELIST_ADD_LINE
, "Curfile: %s",
2063 stat
->curentry
? stat
->curentry
: "---");
2064 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit step: %d",
2066 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit delayed: %s",
2067 stat
->commit_delayed
? "Yes" : "No");
2069 simplelist_addline(SIMPLELIST_ADD_LINE
, "Queue length: %d",
2070 stat
->queue_length
);
2075 tagcache_screensync_event();
2078 if (!btn
&& stat
->curentry
)
2081 return ACTION_REDRAW
;
2084 if (btn
== ACTION_STD_CANCEL
)
2085 tagcache_screensync_enable(false);
2089 static bool dbg_tagcache_info(void)
2091 struct simplelist_info info
;
2092 simplelist_info_init(&info
, "Database Info", 8, NULL
);
2093 info
.action_callback
= database_callback
;
2094 info
.hide_selection
= true;
2095 info
.scroll_all
= true;
2097 /* Don't do nonblock here, must give enough processing time
2098 for tagcache thread. */
2099 /* info.timeout = TIMEOUT_NOBLOCK; */
2101 tagcache_screensync_enable(true);
2102 return simplelist_show_list(&info
);
2106 #if CONFIG_CPU == SH7034
2107 static bool dbg_save_roms(void)
2110 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
2112 fd
= creat("/internal_rom_0000-FFFF.bin");
2115 write(fd
, (void *)0, 0x10000);
2119 fd
= creat("/internal_rom_2000000-203FFFF.bin");
2122 write(fd
, (void *)0x2000000, 0x40000);
2126 system_memory_guard(oldmode
);
2129 #elif defined CPU_COLDFIRE
2130 static bool dbg_save_roms(void)
2133 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
2135 #if defined(IRIVER_H100_SERIES)
2136 fd
= creat("/internal_rom_000000-1FFFFF.bin");
2137 #elif defined(IRIVER_H300_SERIES)
2138 fd
= creat("/internal_rom_000000-3FFFFF.bin");
2139 #elif defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IAUDIO_M3)
2140 fd
= creat("/internal_rom_000000-3FFFFF.bin");
2144 write(fd
, (void *)0, FLASH_SIZE
);
2147 system_memory_guard(oldmode
);
2150 fd
= creat("/internal_eeprom.bin");
2154 char buf
[EEPROM_SIZE
];
2157 old_irq_level
= disable_irq_save();
2159 err
= eeprom_24cxx_read(0, buf
, sizeof buf
);
2161 restore_irq(old_irq_level
);
2164 splashf(HZ
*3, "Eeprom read failure (%d)", err
);
2167 write(fd
, buf
, sizeof buf
);
2176 #elif defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)
2177 static bool dbg_save_roms(void)
2181 fd
= creat("/internal_rom_000000-0FFFFF.bin");
2184 write(fd
, (void *)0x20000000, FLASH_SIZE
);
2194 static int radio_callback(int btn
, struct gui_synclist
*lists
)
2197 if (btn
== ACTION_STD_CANCEL
)
2199 simplelist_set_line_count(1);
2201 #if (CONFIG_TUNER & LV24020LP)
2202 simplelist_addline(SIMPLELIST_ADD_LINE
,
2203 "CTRL_STAT: %02X", lv24020lp_get(LV24020LP_CTRL_STAT
) );
2204 simplelist_addline(SIMPLELIST_ADD_LINE
,
2205 "RADIO_STAT: %02X", lv24020lp_get(LV24020LP_REG_STAT
) );
2206 simplelist_addline(SIMPLELIST_ADD_LINE
,
2207 "MSS_FM: %d kHz", lv24020lp_get(LV24020LP_MSS_FM
) );
2208 simplelist_addline(SIMPLELIST_ADD_LINE
,
2209 "MSS_IF: %d Hz", lv24020lp_get(LV24020LP_MSS_IF
) );
2210 simplelist_addline(SIMPLELIST_ADD_LINE
,
2211 "MSS_SD: %d Hz", lv24020lp_get(LV24020LP_MSS_SD
) );
2212 simplelist_addline(SIMPLELIST_ADD_LINE
,
2213 "if_set: %d Hz", lv24020lp_get(LV24020LP_IF_SET
) );
2214 simplelist_addline(SIMPLELIST_ADD_LINE
,
2215 "sd_set: %d Hz", lv24020lp_get(LV24020LP_SD_SET
) );
2217 #if (CONFIG_TUNER & S1A0903X01)
2218 simplelist_addline(SIMPLELIST_ADD_LINE
,
2219 "Samsung regs: %08X", s1a0903x01_get(RADIO_ALL
));
2220 /* This one doesn't return dynamic data atm */
2222 #if (CONFIG_TUNER & TEA5767)
2223 struct tea5767_dbg_info nfo
;
2224 tea5767_dbg_info(&nfo
);
2225 simplelist_addline(SIMPLELIST_ADD_LINE
, "Philips regs:");
2226 simplelist_addline(SIMPLELIST_ADD_LINE
,
2227 " Read: %02X %02X %02X %02X %02X",
2228 (unsigned)nfo
.read_regs
[0], (unsigned)nfo
.read_regs
[1],
2229 (unsigned)nfo
.read_regs
[2], (unsigned)nfo
.read_regs
[3],
2230 (unsigned)nfo
.read_regs
[4]);
2231 simplelist_addline(SIMPLELIST_ADD_LINE
,
2232 " Write: %02X %02X %02X %02X %02X",
2233 (unsigned)nfo
.write_regs
[0], (unsigned)nfo
.write_regs
[1],
2234 (unsigned)nfo
.write_regs
[2], (unsigned)nfo
.write_regs
[3],
2235 (unsigned)nfo
.write_regs
[4]);
2237 return ACTION_REDRAW
;
2239 static bool dbg_fm_radio(void)
2241 struct simplelist_info info
;
2242 info
.scroll_all
= true;
2243 simplelist_info_init(&info
, "FM Radio", 1, NULL
);
2244 simplelist_set_line_count(0);
2245 simplelist_addline(SIMPLELIST_ADD_LINE
, "HW detected: %s",
2246 radio_hardware_present() ? "yes" : "no");
2248 info
.action_callback
= radio_hardware_present()?radio_callback
: NULL
;
2249 info
.hide_selection
= true;
2250 return simplelist_show_list(&info
);
2252 #endif /* CONFIG_TUNER */
2253 #endif /* !SIMULATOR */
2255 #ifdef HAVE_LCD_BITMAP
2256 extern bool do_screendump_instead_of_usb
;
2258 static bool dbg_screendump(void)
2260 do_screendump_instead_of_usb
= !do_screendump_instead_of_usb
;
2261 splashf(HZ
, "Screendump %s",
2262 do_screendump_instead_of_usb
?"enabled":"disabled");
2265 #endif /* HAVE_LCD_BITMAP */
2267 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2268 static bool dbg_set_memory_guard(void)
2270 static const struct opt_items names
[MAXMEMGUARD
] = {
2272 { "Flash ROM writes", -1 },
2273 { "Zero area (all)", -1 }
2275 int mode
= system_memory_guard(MEMGUARD_KEEP
);
2277 set_option( "Catch mem accesses", &mode
, INT
, names
, MAXMEMGUARD
, NULL
);
2278 system_memory_guard(mode
);
2282 #endif /* CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) */
2284 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2285 static bool dbg_write_eeprom(void)
2290 char buf
[EEPROM_SIZE
];
2293 fd
= open("/internal_eeprom.bin", O_RDONLY
);
2297 rc
= read(fd
, buf
, EEPROM_SIZE
);
2299 if(rc
== EEPROM_SIZE
)
2301 old_irq_level
= disable_irq_save();
2303 err
= eeprom_24cxx_write(0, buf
, sizeof buf
);
2305 splashf(HZ
*3, "Eeprom write failure (%d)", err
);
2307 splash(HZ
*3, "Eeprom written successfully");
2309 restore_irq(old_irq_level
);
2313 splashf(HZ
*3, "File read error (%d)",rc
);
2319 splash(HZ
*3, "Failed to open 'internal_eeprom.bin'");
2324 #endif /* defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS) */
2325 #ifdef CPU_BOOST_LOGGING
2326 static bool cpu_boost_log(void)
2329 int count
= cpu_boost_log_getcount();
2330 int lines
= LCD_HEIGHT
/SYSFONT_HEIGHT
;
2333 lcd_setfont(FONT_SYSFIXED
);
2334 str
= cpu_boost_log_getlog_first();
2337 lcd_clear_display();
2338 for(j
=0; j
<lines
; j
++,i
++)
2341 str
= cpu_boost_log_getlog_next();
2352 switch(get_action(CONTEXT_STD
,TIMEOUT_BLOCK
))
2355 case ACTION_STD_PREV
:
2356 case ACTION_STD_NEXT
:
2359 case ACTION_STD_CANCEL
:
2366 get_action(CONTEXT_STD
,TIMEOUT_BLOCK
);
2367 lcd_setfont(FONT_UI
);
2372 #if (defined(HAVE_SCROLLWHEEL) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2373 extern bool wheel_is_touched
;
2374 extern int old_wheel_value
;
2375 extern int new_wheel_value
;
2376 extern int wheel_delta
;
2377 extern unsigned int accumulated_wheel_delta
;
2378 extern unsigned int wheel_velocity
;
2380 static bool dbg_scrollwheel(void)
2385 lcd_setfont(FONT_SYSFIXED
);
2389 if (action_userabort(HZ
/10))
2392 lcd_clear_display();
2394 /* show internal variables of scrollwheel driver */
2395 snprintf(buf
, sizeof(buf
), "wheel touched: %s", (wheel_is_touched
) ? "true" : "false");
2396 lcd_puts(0, 0, buf
);
2397 snprintf(buf
, sizeof(buf
), "new position: %2d", new_wheel_value
);
2398 lcd_puts(0, 1, buf
);
2399 snprintf(buf
, sizeof(buf
), "old position: %2d", old_wheel_value
);
2400 lcd_puts(0, 2, buf
);
2401 snprintf(buf
, sizeof(buf
), "wheel delta: %2d", wheel_delta
);
2402 lcd_puts(0, 3, buf
);
2403 snprintf(buf
, sizeof(buf
), "accumulated delta: %2d", accumulated_wheel_delta
);
2404 lcd_puts(0, 4, buf
);
2405 snprintf(buf
, sizeof(buf
), "velo [deg/s]: %4d", (int)wheel_velocity
);
2406 lcd_puts(0, 5, buf
);
2408 /* show effective accelerated scrollspeed */
2409 speed
= button_apply_acceleration( (1<<31)|(1<<24)|wheel_velocity
);
2410 snprintf(buf
, sizeof(buf
), "accel. speed: %4d", speed
);
2411 lcd_puts(0, 6, buf
);
2419 #if defined(HAVE_USBSTACK) && defined(ROCKBOX_HAS_LOGF) && defined(USB_SERIAL)
2420 static bool logf_usb_serial(void)
2422 bool serial_enabled
= !usb_core_driver_enabled(USB_DRIVER_SERIAL
);
2423 usb_core_enable_driver(USB_DRIVER_SERIAL
,serial_enabled
);
2424 splashf(HZ
, "USB logf %s",
2425 serial_enabled
?"enabled":"disabled");
2430 #if defined(HAVE_USBSTACK) && defined(USB_STORAGE)
2431 static bool usb_reconnect(void)
2433 splash(HZ
, "Reconnect mass storage");
2434 usb_storage_reconnect();
2439 #if CONFIG_USBOTG == USBOTG_ISP1583
2440 extern int dbg_usb_num_items(void);
2441 extern char* dbg_usb_item(int selected_item
, void *data
, char *buffer
, size_t buffer_len
);
2443 static int isp1583_action_callback(int action
, struct gui_synclist
*lists
)
2446 if (action
== ACTION_NONE
)
2447 action
= ACTION_REDRAW
;
2451 static bool dbg_isp1583(void)
2453 struct simplelist_info isp1583
;
2454 isp1583
.scroll_all
= true;
2455 simplelist_info_init(&isp1583
, "ISP1583", dbg_usb_num_items(), NULL
);
2456 isp1583
.timeout
= HZ
/100;
2457 isp1583
.hide_selection
= true;
2458 isp1583
.get_name
= dbg_usb_item
;
2459 isp1583
.action_callback
= isp1583_action_callback
;
2460 return simplelist_show_list(&isp1583
);
2464 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2465 extern int pic_dbg_num_items(void);
2466 extern char* pic_dbg_item(int selected_item
, void *data
, char *buffer
, size_t buffer_len
);
2468 static int pic_action_callback(int action
, struct gui_synclist
*lists
)
2471 if (action
== ACTION_NONE
)
2472 action
= ACTION_REDRAW
;
2476 static bool dbg_pic(void)
2478 struct simplelist_info pic
;
2479 pic
.scroll_all
= true;
2480 simplelist_info_init(&pic
, "PIC", pic_dbg_num_items(), NULL
);
2481 pic
.timeout
= HZ
/100;
2482 pic
.hide_selection
= true;
2483 pic
.get_name
= pic_dbg_item
;
2484 pic
.action_callback
= pic_action_callback
;
2485 return simplelist_show_list(&pic
);
2490 /****** The menu *********/
2491 struct the_menu_item
{
2492 unsigned char *desc
; /* string or ID */
2493 bool (*function
) (void); /* return true if USB was connected */
2495 static const struct the_menu_item menuitems
[] = {
2496 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || \
2497 (defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD))
2498 { "Dump ROM contents", dbg_save_roms
},
2500 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || defined(CPU_PP) \
2501 || CONFIG_CPU == S3C2440 || CONFIG_CPU == IMX31L
2502 { "View I/O ports", dbg_ports
},
2504 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
2505 { "View PCF registers", dbg_pcf
},
2507 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
2508 { "TSC2100 debug", tsc2100_debug
},
2510 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2511 { "CPU frequency", dbg_cpufreq
},
2513 #if defined(IRIVER_H100_SERIES) && !defined(SIMULATOR)
2514 { "S/PDIF analyzer", dbg_spdif
},
2516 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2517 { "Catch mem accesses", dbg_set_memory_guard
},
2519 { "View OS stacks", dbg_os
},
2520 #ifdef HAVE_LCD_BITMAP
2522 { "View battery", view_battery
},
2524 { "Screendump", dbg_screendump
},
2527 { "View HW info", dbg_hw_info
},
2530 { "View partitions", dbg_partitions
},
2533 { "View disk info", dbg_disk_info
},
2534 #if (CONFIG_STORAGE & STORAGE_ATA)
2535 { "Dump ATA identify info", dbg_identify_info
},
2538 #ifdef HAVE_DIRCACHE
2539 { "View dircache info", dbg_dircache_info
},
2541 #ifdef HAVE_TAGCACHE
2542 { "View database info", dbg_tagcache_info
},
2544 #ifdef HAVE_LCD_BITMAP
2545 #if CONFIG_CODEC == SWCODEC
2546 { "View buffering thread", dbg_buffering_thread
},
2547 #elif !defined(SIMULATOR)
2548 { "View audio thread", dbg_audio_thread
},
2551 { "pm histogram", peak_meter_histogram
},
2552 #endif /* PM_DEBUG */
2553 #endif /* HAVE_LCD_BITMAP */
2556 { "FM Radio", dbg_fm_radio
},
2559 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2560 { "Write back EEPROM", dbg_write_eeprom
},
2562 #if CONFIG_USBOTG == USBOTG_ISP1583
2563 { "View ISP1583 info", dbg_isp1583
},
2565 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2566 { "View PIC info", dbg_pic
},
2568 #ifdef ROCKBOX_HAS_LOGF
2569 {"logf", logfdisplay
},
2570 {"logfdump", logfdump
},
2572 #if defined(HAVE_USBSTACK) && defined(ROCKBOX_HAS_LOGF) && defined(USB_SERIAL)
2573 {"logf over usb",logf_usb_serial
},
2575 #if defined(HAVE_USBSTACK) && defined(USB_STORAGE)
2576 {"reconnect usb storage",usb_reconnect
},
2578 #ifdef CPU_BOOST_LOGGING
2579 {"cpu_boost log",cpu_boost_log
},
2581 #if (defined(HAVE_SCROLLWHEEL) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2582 {"Debug scrollwheel", dbg_scrollwheel
},
2585 static int menu_action_callback(int btn
, struct gui_synclist
*lists
)
2587 if (btn
== ACTION_STD_OK
)
2589 menuitems
[gui_synclist_get_sel_pos(lists
)].function();
2590 btn
= ACTION_REDRAW
;
2594 static char* dbg_menu_getname(int item
, void * data
,
2595 char *buffer
, size_t buffer_len
)
2597 (void)data
; (void)buffer
; (void)buffer_len
;
2598 return menuitems
[item
].desc
;
2600 bool debug_menu(void)
2602 struct simplelist_info info
;
2604 simplelist_info_init(&info
, "Debug Menu", ARRAYLEN(menuitems
), NULL
);
2605 info
.action_callback
= menu_action_callback
;
2606 info
.get_name
= dbg_menu_getname
;
2608 return simplelist_show_list(&info
);