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"
54 #include "lcd-remote.h"
66 #include "eeprom_24cxx.h"
67 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
70 #if (CONFIG_STORAGE & STORAGE_ATA)
79 #ifdef HAVE_LCD_BITMAP
80 #include "scrollbar.h"
81 #include "peakmeter.h"
84 #if CONFIG_CODEC == SWCODEC
86 #include "buffering.h"
88 #if defined(HAVE_SPDIF_OUT) || defined(HAVE_SPDIF_IN)
92 #ifdef IRIVER_H300_SERIES
93 #include "pcf50606.h" /* for pcf50606_read */
100 #if CONFIG_RTC == RTC_PCF50605
101 #include "pcf50605.h"
104 #if CONFIG_CPU == DM320 || CONFIG_CPU == S3C2440 || CONFIG_CPU == TCC7801 \
105 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 || CONFIG_CPU == JZ4732
106 #include "debug-target.h"
109 #if defined(SANSA_E200) || defined(SANSA_C200) || defined(PHILIPS_SA9200) \
110 || defined(SANSA_CLIP) || defined(SANSA_FUZE)
116 #include "usb_core.h"
117 #ifdef USB_ENABLE_HID
118 #include "usbstack/usb_hid.h"
122 /*---------------------------------------------------*/
123 /* SPECIAL DEBUG STUFF */
124 /*---------------------------------------------------*/
125 extern struct thread_entry threads
[MAXTHREADS
];
127 static char thread_status_char(unsigned status
)
129 static const char thread_status_chars
[THREAD_NUM_STATES
+1] =
131 [0 ... THREAD_NUM_STATES
] = '?',
132 [STATE_RUNNING
] = 'R',
133 [STATE_BLOCKED
] = 'B',
134 [STATE_SLEEPING
] = 'S',
135 [STATE_BLOCKED_W_TMO
] = 'T',
136 [STATE_FROZEN
] = 'F',
137 [STATE_KILLED
] = 'K',
140 if (status
> THREAD_NUM_STATES
)
141 status
= THREAD_NUM_STATES
;
143 return thread_status_chars
[status
];
146 static char* threads_getname(int selected_item
, void *data
,
147 char *buffer
, size_t buffer_len
)
150 struct thread_entry
*thread
;
154 if (selected_item
< (int)NUM_CORES
)
156 snprintf(buffer
, buffer_len
, "Idle (%d): %2d%%", selected_item
,
157 idle_stack_usage(selected_item
));
161 selected_item
-= NUM_CORES
;
164 thread
= &threads
[selected_item
];
166 if (thread
->state
== STATE_KILLED
)
168 snprintf(buffer
, buffer_len
, "%2d: ---", selected_item
);
172 thread_get_name(name
, 32, thread
);
174 snprintf(buffer
, buffer_len
,
175 "%2d: " IF_COP("(%d) ") "%c%c " IF_PRIO("%d %d ") "%2d%% %s",
177 IF_COP(thread
->core
,)
178 #ifdef HAVE_SCHEDULER_BOOSTCTRL
179 (thread
->cpu_boost
) ? '+' :
181 ((thread
->state
== STATE_RUNNING
) ? '*' : ' '),
182 thread_status_char(thread
->state
),
183 IF_PRIO(thread
->base_priority
, thread
->priority
, )
184 thread_stack_usage(thread
), name
);
188 static int dbg_threads_action_callback(int action
, struct gui_synclist
*lists
)
191 #ifdef ROCKBOX_HAS_LOGF
192 if (action
== ACTION_STD_OK
)
194 int selpos
= gui_synclist_get_sel_pos(lists
);
196 if (selpos
>= NUM_CORES
)
197 remove_thread(threads
[selpos
- NUM_CORES
].id
);
199 remove_thread(&threads
[selpos
]);
201 return ACTION_REDRAW
;
203 #endif /* ROCKBOX_HAS_LOGF */
204 if (action
== ACTION_NONE
)
205 action
= ACTION_REDRAW
;
209 static bool dbg_os(void)
211 struct simplelist_info info
;
212 simplelist_info_init(&info
, IF_COP("Core and ") "Stack usage:",
216 MAXTHREADS
+NUM_CORES
,
219 #ifndef ROCKBOX_HAS_LOGF
220 info
.hide_selection
= true;
221 info
.scroll_all
= true;
223 info
.action_callback
= dbg_threads_action_callback
;
224 info
.get_name
= threads_getname
;
225 return simplelist_show_list(&info
);
228 #ifdef HAVE_LCD_BITMAP
229 #if CONFIG_CODEC != SWCODEC
231 static bool dbg_audio_thread(void)
234 struct audio_debug d
;
236 lcd_setfont(FONT_SYSFIXED
);
240 if (action_userabort(HZ
/5))
243 audio_get_debugdata(&d
);
247 snprintf(buf
, sizeof(buf
), "read: %x", d
.audiobuf_read
);
249 snprintf(buf
, sizeof(buf
), "write: %x", d
.audiobuf_write
);
251 snprintf(buf
, sizeof(buf
), "swap: %x", d
.audiobuf_swapwrite
);
253 snprintf(buf
, sizeof(buf
), "playing: %d", d
.playing
);
255 snprintf(buf
, sizeof(buf
), "playable: %x", d
.playable_space
);
257 snprintf(buf
, sizeof(buf
), "unswapped: %x", d
.unswapped_space
);
260 /* Playable space left */
261 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8, 112, 4, d
.audiobuflen
, 0,
262 d
.playable_space
, HORIZONTAL
);
264 /* Show the watermark limit */
265 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8+4, 112, 4, d
.audiobuflen
, 0,
266 d
.low_watermark_level
, HORIZONTAL
);
268 snprintf(buf
, sizeof(buf
), "wm: %x - %x",
269 d
.low_watermark_level
, d
.lowest_watermark_level
);
274 lcd_setfont(FONT_UI
);
277 #endif /* !SIMULATOR */
278 #else /* CONFIG_CODEC == SWCODEC */
279 extern size_t filebuflen
;
280 /* This is a size_t, but call it a long so it puts a - when it's bad. */
282 static unsigned int ticks
, boost_ticks
, freq_sum
;
284 static void dbg_audio_task(void)
287 if(FREQ
> CPUFREQ_NORMAL
)
289 freq_sum
+= FREQ
/1000000; /* in MHz */
294 static bool dbg_buffering_thread(void)
301 size_t bufsize
= pcmbuf_get_bufsize();
302 int pcmbufdescs
= pcmbuf_descs();
303 struct buffering_debug d
;
305 ticks
= boost_ticks
= freq_sum
= 0;
307 tick_add_task(dbg_audio_task
);
309 lcd_setfont(FONT_SYSFIXED
);
312 button
= get_action(CONTEXT_STD
,HZ
/5);
315 case ACTION_STD_NEXT
:
318 case ACTION_STD_PREV
:
321 case ACTION_STD_CANCEL
:
326 buffering_get_debugdata(&d
);
331 bufused
= bufsize
- pcmbuf_free();
333 snprintf(buf
, sizeof(buf
), "pcm: %6ld/%ld", (long) bufused
, (long) bufsize
);
334 lcd_puts(0, line
++, buf
);
336 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
337 bufsize
, 0, bufused
, HORIZONTAL
);
340 snprintf(buf
, sizeof(buf
), "alloc: %6ld/%ld", audio_filebufused(),
342 lcd_puts(0, line
++, buf
);
345 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
346 filebuflen
, 0, audio_filebufused(), HORIZONTAL
);
349 snprintf(buf
, sizeof(buf
), "real: %6ld/%ld", (long)d
.buffered_data
,
351 lcd_puts(0, line
++, buf
);
353 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
354 filebuflen
, 0, (long)d
.buffered_data
, HORIZONTAL
);
358 snprintf(buf
, sizeof(buf
), "usefl: %6ld/%ld", (long)(d
.useful_data
),
360 lcd_puts(0, line
++, buf
);
363 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
364 filebuflen
, 0, d
.useful_data
, HORIZONTAL
);
368 snprintf(buf
, sizeof(buf
), "data_rem: %ld", (long)d
.data_rem
);
369 lcd_puts(0, line
++, buf
);
371 snprintf(buf
, sizeof(buf
), "track count: %2d", audio_track_count());
372 lcd_puts(0, line
++, buf
);
374 snprintf(buf
, sizeof(buf
), "handle count: %d", (int)d
.num_handles
);
375 lcd_puts(0, line
++, buf
);
378 snprintf(buf
, sizeof(buf
), "cpu freq: %3dMHz",
379 (int)((FREQ
+ 500000) / 1000000));
380 lcd_puts(0, line
++, buf
);
385 int boostquota
= boost_ticks
* 1000 / ticks
; /* in 0.1 % */
386 int avgclock
= freq_sum
* 10 / ticks
; /* in 100 kHz */
387 snprintf(buf
, sizeof(buf
), "boost:%3d.%d%% (%d.%dMHz)",
388 boostquota
/10, boostquota
%10, avgclock
/10, avgclock
%10);
389 lcd_puts(0, line
++, buf
);
392 snprintf(buf
, sizeof(buf
), "pcmbufdesc: %2d/%2d",
393 pcmbuf_used_descs(), pcmbufdescs
);
394 lcd_puts(0, line
++, buf
);
395 snprintf(buf
, sizeof(buf
), "watermark: %6d",
397 lcd_puts(0, line
++, buf
);
402 tick_remove_task(dbg_audio_task
);
403 lcd_setfont(FONT_UI
);
407 #endif /* CONFIG_CODEC */
408 #endif /* HAVE_LCD_BITMAP */
411 #if (CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE))
412 /* Tool function to read the flash manufacturer and type, if available.
413 Only chips which could be reprogrammed in system will return values.
414 (The mode switch addresses vary between flash manufacturers, hence addr1/2) */
415 /* In IRAM to avoid problems when running directly from Flash */
416 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
417 unsigned addr1
, unsigned addr2
)
418 ICODE_ATTR
__attribute__((noinline
));
419 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
420 unsigned addr1
, unsigned addr2
)
423 unsigned not_manu
, not_id
; /* read values before switching to ID mode */
424 unsigned manu
, id
; /* read values when in ID mode */
426 #if CONFIG_CPU == SH7034
427 volatile unsigned char* flash
= (unsigned char*)0x2000000; /* flash mapping */
428 #elif defined(CPU_COLDFIRE)
429 volatile unsigned short* flash
= (unsigned short*)0; /* flash mapping */
431 int old_level
; /* saved interrupt level */
433 not_manu
= flash
[0]; /* read the normal content */
434 not_id
= flash
[1]; /* should be 'A' (0x41) and 'R' (0x52) from the "ARCH" marker */
436 /* disable interrupts, prevent any stray flash access */
437 old_level
= disable_irq_save();
439 flash
[addr1
] = 0xAA; /* enter command mode */
441 flash
[addr1
] = 0x90; /* ID command */
442 /* Atmel wants 20ms pause here */
443 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
445 manu
= flash
[0]; /* read the IDs */
448 flash
[0] = 0xF0; /* reset flash (back to normal read mode) */
449 /* Atmel wants 20ms pause here */
450 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
452 restore_irq(old_level
); /* enable interrupts again */
454 /* I assume success if the obtained values are different from
455 the normal flash content. This is not perfectly bulletproof, they
456 could theoretically be the same by chance, causing us to fail. */
457 if (not_manu
!= manu
|| not_id
!= id
) /* a value has changed */
459 *p_manufacturer
= manu
; /* return the results */
461 return true; /* success */
463 return false; /* fail */
465 #endif /* (CONFIG_CPU == SH7034 || CPU_COLDFIRE) */
469 static int perfcheck(void)
475 "orr r0, r2, #0xc0 \n" /* disable IRQ and FIQ */
478 "ldr r0, [%[timr]] \n"
479 "add r0, r0, %[tmo] \n"
481 "add %[res], %[res], #1 \n"
482 "ldr r1, [%[timr]] \n"
485 "msr CPSR_c, r2 \n" /* reset IRQ and FIQ state */
489 [timr
]"r"(&USEC_TIMER
),
491 #if CONFIG_CPU == PP5002
493 #else /* PP5020/5022/5024 */
504 #ifdef HAVE_LCD_BITMAP
505 static bool dbg_hw_info(void)
507 #if CONFIG_CPU == SH7034
509 int bitmask
= HW_MASK
;
510 int rom_version
= ROM_VERSION
;
511 unsigned manu
, id
; /* flash IDs */
512 bool got_id
; /* flag if we managed to get the flash IDs */
513 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
514 bool has_bootrom
; /* flag for boot ROM present */
515 int oldmode
; /* saved memory guard mode */
517 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
519 /* get flash ROM type */
520 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
522 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
524 /* check if the boot ROM area is a flash mirror */
525 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
526 if (has_bootrom
) /* if ROM and Flash different */
528 /* calculate CRC16 checksum of boot ROM */
529 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
532 system_memory_guard(oldmode
); /* re-enable memory guard */
534 lcd_setfont(FONT_SYSFIXED
);
537 lcd_puts(0, 0, "[Hardware info]");
539 snprintf(buf
, 32, "ROM: %d.%02d", rom_version
/100, rom_version
%100);
542 snprintf(buf
, 32, "Mask: 0x%04x", bitmask
);
546 snprintf(buf
, 32, "Flash: M=%02x D=%02x", manu
, id
);
548 snprintf(buf
, 32, "Flash: M=?? D=??"); /* unknown, sorry */
553 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
554 snprintf(buf
, 32, "Boot ROM: V1");
556 snprintf(buf
, 32, "ROMcrc: 0x%08x", rom_crc
);
560 snprintf(buf
, 32, "Boot ROM: none");
566 while (!(action_userabort(TIMEOUT_BLOCK
)));
568 #elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250
570 unsigned manu
, id
; /* flash IDs */
571 int got_id
; /* flag if we managed to get the flash IDs */
572 int oldmode
; /* saved memory guard mode */
575 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
577 /* get flash ROM type */
578 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
580 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
582 system_memory_guard(oldmode
); /* re-enable memory guard */
584 lcd_setfont(FONT_SYSFIXED
);
587 lcd_puts(0, line
++, "[Hardware info]");
590 snprintf(buf
, 32, "Flash: M=%04x D=%04x", manu
, id
);
592 snprintf(buf
, 32, "Flash: M=???? D=????"); /* unknown, sorry */
593 lcd_puts(0, line
++, buf
);
599 lcd_puts(0, ++line
, "Serial Number:");
601 got_id
= ds2411_read_id(&id
);
603 if (got_id
== DS2411_OK
)
605 snprintf(buf
, 32, " FC=%02x", (unsigned)id
.family_code
);
606 lcd_puts(0, ++line
, buf
);
607 snprintf(buf
, 32, " ID=%02X %02X %02X %02X %02X %02X",
608 (unsigned)id
.uid
[0], (unsigned)id
.uid
[1], (unsigned)id
.uid
[2],
609 (unsigned)id
.uid
[3], (unsigned)id
.uid
[4], (unsigned)id
.uid
[5]);
610 lcd_puts(0, ++line
, buf
);
611 snprintf(buf
, 32, " CRC=%02X", (unsigned)id
.crc
);
615 snprintf(buf
, 32, "READ ERR=%d", got_id
);
618 lcd_puts(0, ++line
, buf
);
624 while (!(action_userabort(TIMEOUT_BLOCK
)));
626 #elif defined(CPU_PP502x)
629 char pp_version
[] = { (PP_VER2
>> 24) & 0xff, (PP_VER2
>> 16) & 0xff,
630 (PP_VER2
>> 8) & 0xff, (PP_VER2
) & 0xff,
631 (PP_VER1
>> 24) & 0xff, (PP_VER1
>> 16) & 0xff,
632 (PP_VER1
>> 8) & 0xff, (PP_VER1
) & 0xff, '\0' };
634 lcd_setfont(FONT_SYSFIXED
);
637 lcd_puts(0, line
++, "[Hardware info]");
640 snprintf(buf
, sizeof(buf
), "HW rev: 0x%08lx", IPOD_HW_REVISION
);
641 lcd_puts(0, line
++, buf
);
645 extern int lcd_type
; /* Defined in lcd-colornano.c */
647 snprintf(buf
, sizeof(buf
), "LCD type: %d", lcd_type
);
648 lcd_puts(0, line
++, buf
);
651 snprintf(buf
, sizeof(buf
), "PP version: %s", pp_version
);
652 lcd_puts(0, line
++, buf
);
654 snprintf(buf
, sizeof(buf
), "Est. clock (kHz): %d", perfcheck());
655 lcd_puts(0, line
++, buf
);
659 while (!(action_userabort(TIMEOUT_BLOCK
)));
661 #elif CONFIG_CPU == PP5002
664 char pp_version
[] = { (PP_VER4
>> 8) & 0xff, PP_VER4
& 0xff,
665 (PP_VER3
>> 8) & 0xff, PP_VER3
& 0xff,
666 (PP_VER2
>> 8) & 0xff, PP_VER2
& 0xff,
667 (PP_VER1
>> 8) & 0xff, PP_VER1
& 0xff, '\0' };
670 lcd_setfont(FONT_SYSFIXED
);
673 lcd_puts(0, line
++, "[Hardware info]");
676 snprintf(buf
, sizeof(buf
), "HW rev: 0x%08lx", IPOD_HW_REVISION
);
677 lcd_puts(0, line
++, buf
);
680 snprintf(buf
, sizeof(buf
), "PP version: %s", pp_version
);
681 lcd_puts(0, line
++, buf
);
683 snprintf(buf
, sizeof(buf
), "Est. clock (kHz): %d", perfcheck());
684 lcd_puts(0, line
++, buf
);
688 while (!(action_userabort(TIMEOUT_BLOCK
)));
691 /* Define this function in your target tree */
692 return __dbg_hw_info();
693 #endif /* CONFIG_CPU */
694 lcd_setfont(FONT_UI
);
697 #else /* !HAVE_LCD_BITMAP */
698 static bool dbg_hw_info(void)
703 int rom_version
= ROM_VERSION
;
704 unsigned manu
, id
; /* flash IDs */
705 bool got_id
; /* flag if we managed to get the flash IDs */
706 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
707 bool has_bootrom
; /* flag for boot ROM present */
708 int oldmode
; /* saved memory guard mode */
710 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
712 /* get flash ROM type */
713 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
715 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
717 /* check if the boot ROM area is a flash mirror */
718 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
719 if (has_bootrom
) /* if ROM and Flash different */
721 /* calculate CRC16 checksum of boot ROM */
722 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
725 system_memory_guard(oldmode
); /* re-enable memory guard */
729 lcd_puts(0, 0, "[HW Info]");
735 snprintf(buf
, 32, "ROM: %d.%02d",
736 rom_version
/100, rom_version
%100);
740 snprintf(buf
, 32, "Flash:%02x,%02x", manu
, id
);
742 snprintf(buf
, 32, "Flash:??,??"); /* unknown, sorry */
747 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
748 snprintf(buf
, 32, "BootROM: V1");
749 else if (rom_crc
== 0x358099E8)
750 snprintf(buf
, 32, "BootROM: V2");
751 /* alternative boot ROM found in one single player so far */
753 snprintf(buf
, 32, "R: %08x", rom_crc
);
756 snprintf(buf
, 32, "BootROM: no");
762 button
= get_action(CONTEXT_SETTINGS
,TIMEOUT_BLOCK
);
766 case ACTION_STD_CANCEL
:
769 case ACTION_SETTINGS_DEC
:
775 case ACTION_SETTINGS_INC
:
784 #endif /* !HAVE_LCD_BITMAP */
785 #endif /* !SIMULATOR */
788 static char* dbg_partitions_getname(int selected_item
, void *data
,
789 char *buffer
, size_t buffer_len
)
792 int partition
= selected_item
/2;
793 struct partinfo
* p
= disk_partinfo(partition
);
796 snprintf(buffer
, buffer_len
, " T:%x %ld MB", p
->type
, p
->size
/ 2048);
800 snprintf(buffer
, buffer_len
, "P%d: S:%lx", partition
, p
->start
);
805 bool dbg_partitions(void)
807 struct simplelist_info info
;
808 simplelist_info_init(&info
, "Partition Info", 4, NULL
);
809 info
.selection_size
= 2;
810 info
.hide_selection
= true;
811 info
.scroll_all
= true;
812 info
.get_name
= dbg_partitions_getname
;
813 return simplelist_show_list(&info
);
817 #if defined(CPU_COLDFIRE) && defined(HAVE_SPDIF_OUT)
818 static bool dbg_spdif(void)
822 unsigned int control
;
827 unsigned int interruptstat
;
828 bool valnogood
, symbolerr
, parityerr
;
831 int spdif_source
= spdif_get_output_source(&spdif_src_on
);
832 spdif_set_output_source(AUDIO_SRC_SPDIF
IF_SPDIF_POWER_(, true));
835 lcd_setfont(FONT_SYSFIXED
);
837 #ifdef HAVE_SPDIF_POWER
838 spdif_power_enable(true); /* We need SPDIF power for both sending & receiving */
845 control
= EBU1RCVCCHANNEL1
;
846 interruptstat
= INTERRUPTSTAT
;
847 INTERRUPTCLEAR
= 0x03c00000;
849 valnogood
= (interruptstat
& 0x01000000)?true:false;
850 symbolerr
= (interruptstat
& 0x00800000)?true:false;
851 parityerr
= (interruptstat
& 0x00400000)?true:false;
853 snprintf(buf
, sizeof(buf
), "Val: %s Sym: %s Par: %s",
856 parityerr
?"--":"OK");
857 lcd_puts(0, line
++, buf
);
859 snprintf(buf
, sizeof(buf
), "Status word: %08x", (int)control
);
860 lcd_puts(0, line
++, buf
);
865 snprintf(buf
, sizeof(buf
), "PRO: %d (%s)",
866 x
, x
?"Professional":"Consumer");
867 lcd_puts(0, line
++, buf
);
869 x
= (control
>> 30) & 1;
870 snprintf(buf
, sizeof(buf
), "Audio: %d (%s)",
871 x
, x
?"Non-PCM":"PCM");
872 lcd_puts(0, line
++, buf
);
874 x
= (control
>> 29) & 1;
875 snprintf(buf
, sizeof(buf
), "Copy: %d (%s)",
876 x
, x
?"Permitted":"Inhibited");
877 lcd_puts(0, line
++, buf
);
879 x
= (control
>> 27) & 7;
892 snprintf(buf
, sizeof(buf
), "Preemphasis: %d (%s)", x
, s
);
893 lcd_puts(0, line
++, buf
);
895 x
= (control
>> 24) & 3;
896 snprintf(buf
, sizeof(buf
), "Mode: %d", x
);
897 lcd_puts(0, line
++, buf
);
899 category
= (control
>> 17) & 127;
911 snprintf(buf
, sizeof(buf
), "Category: 0x%02x (%s)", category
, s
);
912 lcd_puts(0, line
++, buf
);
914 x
= (control
>> 16) & 1;
916 if(((category
& 0x70) == 0x10) ||
917 ((category
& 0x70) == 0x40) ||
918 ((category
& 0x78) == 0x38))
920 generation
= !generation
;
922 snprintf(buf
, sizeof(buf
), "Generation: %d (%s)",
923 x
, generation
?"Original":"No ind.");
924 lcd_puts(0, line
++, buf
);
926 x
= (control
>> 12) & 15;
927 snprintf(buf
, sizeof(buf
), "Source: %d", x
);
928 lcd_puts(0, line
++, buf
);
930 x
= (control
>> 8) & 15;
946 snprintf(buf
, sizeof(buf
), "Channel: %d (%s)", x
, s
);
947 lcd_puts(0, line
++, buf
);
949 x
= (control
>> 4) & 15;
962 snprintf(buf
, sizeof(buf
), "Frequency: %d (%s)", x
, s
);
963 lcd_puts(0, line
++, buf
);
965 x
= (control
>> 2) & 3;
966 snprintf(buf
, sizeof(buf
), "Clock accuracy: %d", x
);
967 lcd_puts(0, line
++, buf
);
971 snprintf(buf
, sizeof(buf
), "Measured freq: %ldHz",
972 spdif_measure_frequency());
973 lcd_puts(0, line
++, buf
);
978 if (action_userabort(HZ
/10))
982 spdif_set_output_source(spdif_source
IF_SPDIF_POWER_(, spdif_src_on
));
984 #ifdef HAVE_SPDIF_POWER
985 spdif_power_enable(global_settings
.spdif_enable
);
988 lcd_setfont(FONT_UI
);
991 #endif /* CPU_COLDFIRE */
994 #ifdef HAVE_LCD_BITMAP
995 /* button definitions */
996 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
997 (CONFIG_KEYPAD == IRIVER_H300_PAD)
998 # define DEBUG_CANCEL BUTTON_OFF
1000 #elif CONFIG_KEYPAD == RECORDER_PAD
1001 # define DEBUG_CANCEL BUTTON_OFF
1003 #elif CONFIG_KEYPAD == ONDIO_PAD
1004 # define DEBUG_CANCEL BUTTON_MENU
1006 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || \
1007 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
1008 (CONFIG_KEYPAD == IPOD_4G_PAD)
1009 # define DEBUG_CANCEL BUTTON_MENU
1011 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
1012 # define DEBUG_CANCEL BUTTON_PLAY
1014 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
1015 # define DEBUG_CANCEL BUTTON_REC
1017 #elif (CONFIG_KEYPAD == IAUDIO_M3_PAD)
1018 # define DEBUG_CANCEL BUTTON_RC_REC
1020 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
1021 # define DEBUG_CANCEL BUTTON_REW
1023 #elif (CONFIG_KEYPAD == MROBE100_PAD)
1024 # define DEBUG_CANCEL BUTTON_MENU
1026 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
1027 (CONFIG_KEYPAD == SANSA_C200_PAD)
1028 # define DEBUG_CANCEL BUTTON_LEFT
1030 /* This is temporary until the SA9200 touchpad works */
1031 #elif (CONFIG_KEYPAD == PHILIPS_SA9200_PAD) || \
1032 (CONFIG_KEYPAD == PHILIPS_HDD1630_PAD)
1033 # define DEBUG_CANCEL BUTTON_POWER
1035 #elif (CONFIG_KEYPAD == SAMSUNG_YH_PAD)
1036 # define DEBUG_CANCEL BUTTON_PLAY
1038 #endif /* key definitions */
1041 bool dbg_ports(void)
1043 #if CONFIG_CPU == SH7034
1045 int adc_battery_voltage
, adc_battery_level
;
1047 lcd_setfont(FONT_SYSFIXED
);
1048 lcd_clear_display();
1052 snprintf(buf
, 32, "PADR: %04x", (unsigned short)PADR
);
1053 lcd_puts(0, 0, buf
);
1054 snprintf(buf
, 32, "PBDR: %04x", (unsigned short)PBDR
);
1055 lcd_puts(0, 1, buf
);
1057 snprintf(buf
, 32, "AN0: %03x AN4: %03x", adc_read(0), adc_read(4));
1058 lcd_puts(0, 2, buf
);
1059 snprintf(buf
, 32, "AN1: %03x AN5: %03x", adc_read(1), adc_read(5));
1060 lcd_puts(0, 3, buf
);
1061 snprintf(buf
, 32, "AN2: %03x AN6: %03x", adc_read(2), adc_read(6));
1062 lcd_puts(0, 4, buf
);
1063 snprintf(buf
, 32, "AN3: %03x AN7: %03x", adc_read(3), adc_read(7));
1064 lcd_puts(0, 5, buf
);
1066 battery_read_info(&adc_battery_voltage
, &adc_battery_level
);
1067 snprintf(buf
, 32, "Batt: %d.%03dV %d%% ", adc_battery_voltage
/ 1000,
1068 adc_battery_voltage
% 1000, adc_battery_level
);
1069 lcd_puts(0, 6, buf
);
1072 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1074 lcd_setfont(FONT_UI
);
1078 #elif defined(CPU_COLDFIRE)
1079 unsigned int gpio_out
;
1080 unsigned int gpio1_out
;
1081 unsigned int gpio_read
;
1082 unsigned int gpio1_read
;
1083 unsigned int gpio_function
;
1084 unsigned int gpio1_function
;
1085 unsigned int gpio_enable
;
1086 unsigned int gpio1_enable
;
1087 int adc_buttons
, adc_remote
;
1088 int adc_battery_voltage
, adc_battery_level
;
1092 lcd_clear_display();
1093 lcd_setfont(FONT_SYSFIXED
);
1098 gpio_read
= GPIO_READ
;
1099 gpio1_read
= GPIO1_READ
;
1100 gpio_out
= GPIO_OUT
;
1101 gpio1_out
= GPIO1_OUT
;
1102 gpio_function
= GPIO_FUNCTION
;
1103 gpio1_function
= GPIO1_FUNCTION
;
1104 gpio_enable
= GPIO_ENABLE
;
1105 gpio1_enable
= GPIO1_ENABLE
;
1107 snprintf(buf
, sizeof(buf
), "GPIO_READ: %08x", gpio_read
);
1108 lcd_puts(0, line
++, buf
);
1109 snprintf(buf
, sizeof(buf
), "GPIO_OUT: %08x", gpio_out
);
1110 lcd_puts(0, line
++, buf
);
1111 snprintf(buf
, sizeof(buf
), "GPIO_FUNC: %08x", gpio_function
);
1112 lcd_puts(0, line
++, buf
);
1113 snprintf(buf
, sizeof(buf
), "GPIO_ENA: %08x", gpio_enable
);
1114 lcd_puts(0, line
++, buf
);
1116 snprintf(buf
, sizeof(buf
), "GPIO1_READ: %08x", gpio1_read
);
1117 lcd_puts(0, line
++, buf
);
1118 snprintf(buf
, sizeof(buf
), "GPIO1_OUT: %08x", gpio1_out
);
1119 lcd_puts(0, line
++, buf
);
1120 snprintf(buf
, sizeof(buf
), "GPIO1_FUNC: %08x", gpio1_function
);
1121 lcd_puts(0, line
++, buf
);
1122 snprintf(buf
, sizeof(buf
), "GPIO1_ENA: %08x", gpio1_enable
);
1123 lcd_puts(0, line
++, buf
);
1125 adc_buttons
= adc_read(ADC_BUTTONS
);
1126 adc_remote
= adc_read(ADC_REMOTE
);
1127 battery_read_info(&adc_battery_voltage
, &adc_battery_level
);
1128 #if defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IRIVER_H300_SERIES)
1129 snprintf(buf
, sizeof(buf
), "ADC_BUTTONS (%c): %02x",
1130 button_scan_enabled() ? '+' : '-', adc_buttons
);
1132 snprintf(buf
, sizeof(buf
), "ADC_BUTTONS: %02x", adc_buttons
);
1134 lcd_puts(0, line
++, buf
);
1135 #if defined(IAUDIO_X5) || defined(IAUDIO_M5)
1136 snprintf(buf
, sizeof(buf
), "ADC_REMOTE (%c): %02x",
1137 remote_detect() ? '+' : '-', adc_remote
);
1139 snprintf(buf
, sizeof(buf
), "ADC_REMOTE: %02x", adc_remote
);
1141 lcd_puts(0, line
++, buf
);
1142 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
1143 snprintf(buf
, sizeof(buf
), "ADC_REMOTEDETECT: %02x",
1144 adc_read(ADC_REMOTEDETECT
));
1145 lcd_puts(0, line
++, buf
);
1148 snprintf(buf
, 32, "Batt: %d.%03dV %d%% ", adc_battery_voltage
/ 1000,
1149 adc_battery_voltage
% 1000, adc_battery_level
);
1150 lcd_puts(0, line
++, buf
);
1152 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
1153 snprintf(buf
, sizeof(buf
), "remotetype: %d", remote_type());
1154 lcd_puts(0, line
++, buf
);
1158 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1160 lcd_setfont(FONT_UI
);
1165 #elif defined(CPU_PP502x)
1170 lcd_clear_display();
1171 lcd_setfont(FONT_SYSFIXED
);
1176 lcd_puts(0, line
++, "GPIO STATES:");
1177 snprintf(buf
, sizeof(buf
), "A: %02x E: %02x I: %02x",
1178 (unsigned int)GPIOA_INPUT_VAL
,
1179 (unsigned int)GPIOE_INPUT_VAL
,
1180 (unsigned int)GPIOI_INPUT_VAL
);
1181 lcd_puts(0, line
++, buf
);
1182 snprintf(buf
, sizeof(buf
), "B: %02x F: %02x J: %02x",
1183 (unsigned int)GPIOB_INPUT_VAL
,
1184 (unsigned int)GPIOF_INPUT_VAL
,
1185 (unsigned int)GPIOJ_INPUT_VAL
);
1186 lcd_puts(0, line
++, buf
);
1187 snprintf(buf
, sizeof(buf
), "C: %02x G: %02x K: %02x",
1188 (unsigned int)GPIOC_INPUT_VAL
,
1189 (unsigned int)GPIOG_INPUT_VAL
,
1190 (unsigned int)GPIOK_INPUT_VAL
);
1191 lcd_puts(0, line
++, buf
);
1192 snprintf(buf
, sizeof(buf
), "D: %02x H: %02x L: %02x",
1193 (unsigned int)GPIOD_INPUT_VAL
,
1194 (unsigned int)GPIOH_INPUT_VAL
,
1195 (unsigned int)GPIOL_INPUT_VAL
);
1196 lcd_puts(0, line
++, buf
);
1198 snprintf(buf
, sizeof(buf
), "GPO32_VAL: %08lx", GPO32_VAL
);
1199 lcd_puts(0, line
++, buf
);
1200 snprintf(buf
, sizeof(buf
), "GPO32_EN: %08lx", GPO32_ENABLE
);
1201 lcd_puts(0, line
++, buf
);
1202 snprintf(buf
, sizeof(buf
), "DEV_EN: %08lx", DEV_EN
);
1203 lcd_puts(0, line
++, buf
);
1204 snprintf(buf
, sizeof(buf
), "DEV_EN2: %08lx", DEV_EN2
);
1205 lcd_puts(0, line
++, buf
);
1206 snprintf(buf
, sizeof(buf
), "DEV_EN3: %08lx", inl(0x60006044));
1207 lcd_puts(0, line
++, buf
); /* to be verified */
1208 snprintf(buf
, sizeof(buf
), "DEV_INIT1: %08lx", DEV_INIT1
);
1209 lcd_puts(0, line
++, buf
);
1210 snprintf(buf
, sizeof(buf
), "DEV_INIT2: %08lx", DEV_INIT2
);
1211 lcd_puts(0, line
++, buf
);
1212 #ifdef ADC_ACCESSORY
1213 snprintf(buf
, sizeof(buf
), "ACCESSORY: %d", adc_read(ADC_ACCESSORY
));
1214 lcd_puts(0, line
++, buf
);
1217 #if defined(IPOD_ACCESSORY_PROTOCOL)
1218 extern unsigned char serbuf
[];
1219 snprintf(buf
, sizeof(buf
), "IAP PACKET: %02x %02x %02x %02x %02x %02x %02x %02x",
1220 serbuf
[0], serbuf
[1], serbuf
[2], serbuf
[3], serbuf
[4], serbuf
[5],
1221 serbuf
[6], serbuf
[7]);
1222 lcd_puts(0, line
++, buf
);
1225 #if defined(IRIVER_H10) || defined(IRIVER_H10_5GB)
1227 snprintf(buf
, sizeof(buf
), "BATT: %03x UNK1: %03x",
1228 adc_read(ADC_BATTERY
), adc_read(ADC_UNKNOWN_1
));
1229 lcd_puts(0, line
++, buf
);
1230 snprintf(buf
, sizeof(buf
), "REM: %03x PAD: %03x",
1231 adc_read(ADC_REMOTE
), adc_read(ADC_SCROLLPAD
));
1232 lcd_puts(0, line
++, buf
);
1233 #elif defined(PHILIPS_HDD1630)
1235 snprintf(buf
, sizeof(buf
), "BATT: %03x UNK1: %03x",
1236 adc_read(ADC_BATTERY
), adc_read(ADC_UNKNOWN_1
));
1237 lcd_puts(0, line
++, buf
);
1238 #elif defined(SANSA_E200) || defined(PHILIPS_SA9200)
1239 snprintf(buf
, sizeof(buf
), "ADC_BVDD: %4d", adc_read(ADC_BVDD
));
1240 lcd_puts(0, line
++, buf
);
1241 snprintf(buf
, sizeof(buf
), "ADC_RTCSUP: %4d", adc_read(ADC_RTCSUP
));
1242 lcd_puts(0, line
++, buf
);
1243 snprintf(buf
, sizeof(buf
), "ADC_UVDD: %4d", adc_read(ADC_UVDD
));
1244 lcd_puts(0, line
++, buf
);
1245 snprintf(buf
, sizeof(buf
), "ADC_CHG_IN: %4d", adc_read(ADC_CHG_IN
));
1246 lcd_puts(0, line
++, buf
);
1247 snprintf(buf
, sizeof(buf
), "ADC_CVDD: %4d", adc_read(ADC_CVDD
));
1248 lcd_puts(0, line
++, buf
);
1249 snprintf(buf
, sizeof(buf
), "ADC_BATTEMP: %4d", adc_read(ADC_BATTEMP
));
1250 lcd_puts(0, line
++, buf
);
1251 snprintf(buf
, sizeof(buf
), "ADC_MICSUP1: %4d", adc_read(ADC_MICSUP1
));
1252 lcd_puts(0, line
++, buf
);
1253 snprintf(buf
, sizeof(buf
), "ADC_MICSUP2: %4d", adc_read(ADC_MICSUP2
));
1254 lcd_puts(0, line
++, buf
);
1255 snprintf(buf
, sizeof(buf
), "ADC_VBE1: %4d", adc_read(ADC_VBE1
));
1256 lcd_puts(0, line
++, buf
);
1257 snprintf(buf
, sizeof(buf
), "ADC_VBE2: %4d", adc_read(ADC_VBE2
));
1258 lcd_puts(0, line
++, buf
);
1259 snprintf(buf
, sizeof(buf
), "ADC_I_MICSUP1:%4d", adc_read(ADC_I_MICSUP1
));
1260 lcd_puts(0, line
++, buf
);
1261 #if !defined(PHILIPS_SA9200)
1262 snprintf(buf
, sizeof(buf
), "ADC_I_MICSUP2:%4d", adc_read(ADC_I_MICSUP2
));
1263 lcd_puts(0, line
++, buf
);
1264 snprintf(buf
, sizeof(buf
), "ADC_VBAT: %4d", adc_read(ADC_VBAT
));
1265 lcd_puts(0, line
++, buf
);
1269 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1271 lcd_setfont(FONT_UI
);
1276 #elif CONFIG_CPU == PP5002
1280 lcd_clear_display();
1281 lcd_setfont(FONT_SYSFIXED
);
1286 snprintf(buf
, sizeof(buf
), "GPIO_A: %02x GPIO_B: %02x",
1287 (unsigned int)GPIOA_INPUT_VAL
, (unsigned int)GPIOB_INPUT_VAL
);
1288 lcd_puts(0, line
++, buf
);
1289 snprintf(buf
, sizeof(buf
), "GPIO_C: %02x GPIO_D: %02x",
1290 (unsigned int)GPIOC_INPUT_VAL
, (unsigned int)GPIOD_INPUT_VAL
);
1291 lcd_puts(0, line
++, buf
);
1293 snprintf(buf
, sizeof(buf
), "DEV_EN: %08lx", DEV_EN
);
1294 lcd_puts(0, line
++, buf
);
1295 snprintf(buf
, sizeof(buf
), "CLOCK_ENABLE: %08lx", CLOCK_ENABLE
);
1296 lcd_puts(0, line
++, buf
);
1297 snprintf(buf
, sizeof(buf
), "CLOCK_SOURCE: %08lx", CLOCK_SOURCE
);
1298 lcd_puts(0, line
++, buf
);
1299 snprintf(buf
, sizeof(buf
), "PLL_CONTROL: %08lx", PLL_CONTROL
);
1300 lcd_puts(0, line
++, buf
);
1301 snprintf(buf
, sizeof(buf
), "PLL_DIV: %08lx", PLL_DIV
);
1302 lcd_puts(0, line
++, buf
);
1303 snprintf(buf
, sizeof(buf
), "PLL_MULT: %08lx", PLL_MULT
);
1304 lcd_puts(0, line
++, buf
);
1305 snprintf(buf
, sizeof(buf
), "TIMING1_CTL: %08lx", TIMING1_CTL
);
1306 lcd_puts(0, line
++, buf
);
1307 snprintf(buf
, sizeof(buf
), "TIMING2_CTL: %08lx", TIMING2_CTL
);
1308 lcd_puts(0, line
++, buf
);
1311 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1313 lcd_setfont(FONT_UI
);
1317 lcd_setfont(FONT_UI
);
1319 return __dbg_ports();
1323 #else /* !HAVE_LCD_BITMAP */
1324 bool dbg_ports(void)
1328 int adc_battery_voltage
;
1331 lcd_clear_display();
1338 snprintf(buf
, 32, "PADR: %04x", (unsigned short)PADR
);
1341 snprintf(buf
, 32, "PBDR: %04x", (unsigned short)PBDR
);
1344 snprintf(buf
, 32, "AN0: %03x", adc_read(0));
1347 snprintf(buf
, 32, "AN1: %03x", adc_read(1));
1350 snprintf(buf
, 32, "AN2: %03x", adc_read(2));
1353 snprintf(buf
, 32, "AN3: %03x", adc_read(3));
1356 snprintf(buf
, 32, "AN4: %03x", adc_read(4));
1359 snprintf(buf
, 32, "AN5: %03x", adc_read(5));
1362 snprintf(buf
, 32, "AN6: %03x", adc_read(6));
1365 snprintf(buf
, 32, "AN7: %03x", adc_read(7));
1368 lcd_puts(0, 0, buf
);
1370 battery_read_info(&adc_battery_voltage
, NULL
);
1371 snprintf(buf
, 32, "Batt: %d.%03dV", adc_battery_voltage
/ 1000,
1372 adc_battery_voltage
% 1000);
1373 lcd_puts(0, 1, buf
);
1376 button
= get_action(CONTEXT_SETTINGS
,HZ
/5);
1380 case ACTION_STD_CANCEL
:
1383 case ACTION_SETTINGS_DEC
:
1389 case ACTION_SETTINGS_INC
:
1398 #endif /* !HAVE_LCD_BITMAP */
1399 #endif /* !SIMULATOR */
1401 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
1402 static bool dbg_pcf(void)
1407 #ifdef HAVE_LCD_BITMAP
1408 lcd_setfont(FONT_SYSFIXED
);
1410 lcd_clear_display();
1416 snprintf(buf
, sizeof(buf
), "DCDC1: %02x", pcf50605_read(0x1b));
1417 lcd_puts(0, line
++, buf
);
1418 snprintf(buf
, sizeof(buf
), "DCDC2: %02x", pcf50605_read(0x1c));
1419 lcd_puts(0, line
++, buf
);
1420 snprintf(buf
, sizeof(buf
), "DCDC3: %02x", pcf50605_read(0x1d));
1421 lcd_puts(0, line
++, buf
);
1422 snprintf(buf
, sizeof(buf
), "DCDC4: %02x", pcf50605_read(0x1e));
1423 lcd_puts(0, line
++, buf
);
1424 snprintf(buf
, sizeof(buf
), "DCDEC1: %02x", pcf50605_read(0x1f));
1425 lcd_puts(0, line
++, buf
);
1426 snprintf(buf
, sizeof(buf
), "DCDEC2: %02x", pcf50605_read(0x20));
1427 lcd_puts(0, line
++, buf
);
1428 snprintf(buf
, sizeof(buf
), "DCUDC1: %02x", pcf50605_read(0x21));
1429 lcd_puts(0, line
++, buf
);
1430 snprintf(buf
, sizeof(buf
), "DCUDC2: %02x", pcf50605_read(0x22));
1431 lcd_puts(0, line
++, buf
);
1432 snprintf(buf
, sizeof(buf
), "IOREGC: %02x", pcf50605_read(0x23));
1433 lcd_puts(0, line
++, buf
);
1434 snprintf(buf
, sizeof(buf
), "D1REGC: %02x", pcf50605_read(0x24));
1435 lcd_puts(0, line
++, buf
);
1436 snprintf(buf
, sizeof(buf
), "D2REGC: %02x", pcf50605_read(0x25));
1437 lcd_puts(0, line
++, buf
);
1438 snprintf(buf
, sizeof(buf
), "D3REGC: %02x", pcf50605_read(0x26));
1439 lcd_puts(0, line
++, buf
);
1440 snprintf(buf
, sizeof(buf
), "LPREG1: %02x", pcf50605_read(0x27));
1441 lcd_puts(0, line
++, buf
);
1444 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1446 lcd_setfont(FONT_UI
);
1451 lcd_setfont(FONT_UI
);
1456 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
1457 static bool dbg_cpufreq(void)
1463 #ifdef HAVE_LCD_BITMAP
1464 lcd_setfont(FONT_SYSFIXED
);
1466 lcd_clear_display();
1472 snprintf(buf
, sizeof(buf
), "Frequency: %ld", FREQ
);
1473 lcd_puts(0, line
++, buf
);
1475 snprintf(buf
, sizeof(buf
), "boost_counter: %d", get_cpu_boost_counter());
1476 lcd_puts(0, line
++, buf
);
1479 button
= get_action(CONTEXT_STD
,HZ
/10);
1483 case ACTION_STD_PREV
:
1487 case ACTION_STD_NEXT
:
1492 while (get_cpu_boost_counter() > 0)
1494 set_cpu_frequency(CPUFREQ_DEFAULT
);
1497 case ACTION_STD_CANCEL
:
1498 lcd_setfont(FONT_UI
);
1502 lcd_setfont(FONT_UI
);
1505 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
1507 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
1508 #include "tsc2100.h"
1509 static char *itob(int n
, int len
)
1511 static char binary
[64];
1513 for (i
=1, j
=0;i
<=len
;i
++)
1515 binary
[j
++] = n
&(1<<(len
-i
))?'1':'0';
1522 static char* tsc2100_debug_getname(int selected_item
, void * data
,
1523 char *buffer
, size_t buffer_len
)
1525 int *page
= (int*)data
;
1526 bool reserved
= false;
1530 if ((selected_item
> 0x0a) ||
1531 (selected_item
== 0x04) ||
1532 (selected_item
== 0x08))
1536 if ((selected_item
> 0x05) ||
1537 (selected_item
== 0x02))
1541 if (selected_item
> 0x1e)
1546 snprintf(buffer
, buffer_len
, "%02x: RESERVED", selected_item
);
1548 snprintf(buffer
, buffer_len
, "%02x: %s", selected_item
,
1549 itob(tsc2100_readreg(*page
, selected_item
)&0xffff,16));
1552 static int tsc2100debug_action_callback(int action
, struct gui_synclist
*lists
)
1554 int *page
= (int*)lists
->data
;
1555 if (action
== ACTION_STD_OK
)
1557 *page
= (*page
+1)%3;
1558 snprintf(lists
->title
, 32,
1559 "tsc2100 registers - Page %d", *page
);
1560 return ACTION_REDRAW
;
1564 static bool tsc2100_debug(void)
1567 char title
[32] = "tsc2100 registers - Page 0";
1568 struct simplelist_info info
;
1569 simplelist_info_init(&info
, title
, 32, &page
);
1570 info
.timeout
= HZ
/100;
1571 info
.get_name
= tsc2100_debug_getname
;
1572 info
.action_callback
= tsc2100debug_action_callback
;
1573 return simplelist_show_list(&info
);
1577 #ifdef HAVE_LCD_BITMAP
1579 * view_battery() shows a automatically scaled graph of the battery voltage
1580 * over time. Usable for estimating battery life / charging rate.
1581 * The power_history array is updated in power_thread of powermgmt.c.
1584 #define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN)
1585 #define BAT_YSPACE (LCD_HEIGHT - 20)
1587 static bool view_battery(void)
1591 unsigned short maxv
, minv
;
1594 lcd_setfont(FONT_SYSFIXED
);
1598 lcd_clear_display();
1600 case 0: /* voltage history graph */
1601 /* Find maximum and minimum voltage for scaling */
1602 minv
= power_history
[0];
1604 for (i
= 1; i
< BAT_LAST_VAL
&& power_history
[i
]; i
++) {
1605 if (power_history
[i
] > maxv
)
1606 maxv
= power_history
[i
];
1607 if (power_history
[i
] < minv
)
1608 minv
= power_history
[i
];
1611 snprintf(buf
, 30, "Battery %d.%03d", power_history
[0] / 1000,
1612 power_history
[0] % 1000);
1613 lcd_puts(0, 0, buf
);
1614 snprintf(buf
, 30, "scale %d.%03d-%d.%03dV",
1615 minv
/ 1000, minv
% 1000, maxv
/ 1000, maxv
% 1000);
1616 lcd_puts(0, 1, buf
);
1619 for (i
= BAT_LAST_VAL
- 1; i
>= 0; i
--) {
1620 y
= (power_history
[i
] - minv
) * BAT_YSPACE
/ (maxv
- minv
);
1621 lcd_set_drawmode(DRMODE_SOLID
|DRMODE_INVERSEVID
);
1622 lcd_vline(x
, LCD_HEIGHT
-1, 20);
1623 lcd_set_drawmode(DRMODE_SOLID
);
1624 lcd_vline(x
, LCD_HEIGHT
-1,
1625 MIN(MAX(LCD_HEIGHT
-1 - y
, 20), LCD_HEIGHT
-1));
1631 case 1: /* status: */
1632 lcd_puts(0, 0, "Power status:");
1634 battery_read_info(&y
, NULL
);
1635 snprintf(buf
, 30, "Battery: %d.%03d V", y
/ 1000, y
% 1000);
1636 lcd_puts(0, 1, buf
);
1637 #ifdef ADC_EXT_POWER
1638 y
= (adc_read(ADC_EXT_POWER
) * EXT_SCALE_FACTOR
) / 1000;
1639 snprintf(buf
, 30, "External: %d.%03d V", y
/ 1000, y
% 1000);
1640 lcd_puts(0, 2, buf
);
1643 #if defined ARCHOS_RECORDER
1644 snprintf(buf
, 30, "Chgr: %s %s",
1645 charger_inserted() ? "present" : "absent",
1646 charger_enabled() ? "on" : "off");
1647 lcd_puts(0, 3, buf
);
1648 snprintf(buf
, 30, "short delta: %d", short_delta
);
1649 lcd_puts(0, 5, buf
);
1650 snprintf(buf
, 30, "long delta: %d", long_delta
);
1651 lcd_puts(0, 6, buf
);
1652 lcd_puts(0, 7, power_message
);
1653 snprintf(buf
, 30, "USB Inserted: %s",
1654 usb_inserted() ? "yes" : "no");
1655 lcd_puts(0, 8, buf
);
1656 #elif defined IRIVER_H300_SERIES
1657 snprintf(buf
, 30, "USB Charging Enabled: %s",
1658 usb_charging_enabled() ? "yes" : "no");
1659 lcd_puts(0, 9, buf
);
1660 #elif defined IPOD_NANO || defined IPOD_VIDEO
1661 int usb_pwr
= (GPIOL_INPUT_VAL
& 0x10)?true:false;
1662 int ext_pwr
= (GPIOL_INPUT_VAL
& 0x08)?false:true;
1663 int dock
= (GPIOA_INPUT_VAL
& 0x10)?true:false;
1664 int charging
= (GPIOB_INPUT_VAL
& 0x01)?false:true;
1665 int headphone
= (GPIOA_INPUT_VAL
& 0x80)?true:false;
1667 snprintf(buf
, 30, "USB pwr: %s",
1668 usb_pwr
? "present" : "absent");
1669 lcd_puts(0, 3, buf
);
1670 snprintf(buf
, 30, "EXT pwr: %s",
1671 ext_pwr
? "present" : "absent");
1672 lcd_puts(0, 4, buf
);
1673 snprintf(buf
, 30, "Battery: %s",
1674 charging
? "charging" : (usb_pwr
||ext_pwr
) ? "charged" : "discharging");
1675 lcd_puts(0, 5, buf
);
1676 snprintf(buf
, 30, "Dock mode: %s",
1677 dock
? "enabled" : "disabled");
1678 lcd_puts(0, 6, buf
);
1679 snprintf(buf
, 30, "Headphone: %s",
1680 headphone
? "connected" : "disconnected");
1681 lcd_puts(0, 7, buf
);
1682 #elif defined TOSHIBA_GIGABEAT_S
1686 static const unsigned char * const chrgstate_strings
[] =
1697 snprintf(buf
, 30, "Charger: %s",
1698 charger_inserted() ? "present" : "absent");
1699 lcd_puts(0, line
++, buf
);
1701 st
= power_input_status() &
1702 (POWER_INPUT_CHARGER
| POWER_INPUT_BATTERY
);
1703 snprintf(buf
, 30, "%s%s",
1704 (st
& POWER_INPUT_MAIN_CHARGER
) ? " Main" : "",
1705 (st
& POWER_INPUT_USB_CHARGER
) ? " USB" : "");
1706 lcd_puts(0, line
++, buf
);
1708 snprintf(buf
, 30, "IUSB Max: %d", usb_allowed_current());
1709 lcd_puts(0, line
++, buf
);
1711 y
= ARRAYLEN(chrgstate_strings
) - 1;
1713 switch (charge_state
)
1715 case CHARGE_STATE_DISABLED
: y
--;
1716 case CHARGE_STATE_ERROR
: y
--;
1717 case DISCHARGING
: y
--;
1724 snprintf(buf
, 30, "State: %s", chrgstate_strings
[y
]);
1725 lcd_puts(0, line
++, buf
);
1727 snprintf(buf
, 30, "Battery Switch: %s",
1728 (st
& POWER_INPUT_BATTERY
) ? "On" : "Off");
1729 lcd_puts(0, line
++, buf
);
1731 y
= chrgraw_adc_voltage();
1732 snprintf(buf
, 30, "CHRGRAW: %d.%03d V",
1733 y
/ 1000, y
% 1000);
1734 lcd_puts(0, line
++, buf
);
1736 y
= application_supply_adc_voltage();
1737 snprintf(buf
, 30, "BP : %d.%03d V",
1738 y
/ 1000, y
% 1000);
1739 lcd_puts(0, line
++, buf
);
1741 y
= battery_adc_charge_current();
1742 if (y
< 0) x
= '-', y
= -y
;
1744 snprintf(buf
, 30, "CHRGISN:%c%d mA", x
, y
);
1745 lcd_puts(0, line
++, buf
);
1747 y
= cccv_regulator_dissipation();
1748 snprintf(buf
, 30, "P CCCV : %d mW", y
);
1749 lcd_puts(0, line
++, buf
);
1751 y
= battery_charge_current();
1752 if (y
< 0) x
= '-', y
= -y
;
1754 snprintf(buf
, 30, "I Charge:%c%d mA", x
, y
);
1755 lcd_puts(0, line
++, buf
);
1757 y
= battery_adc_temp();
1760 snprintf(buf
, 30, "T Battery: %dC (%dF)", y
,
1763 /* Conversion disabled */
1764 snprintf(buf
, 30, "T Battery: ?");
1767 lcd_puts(0, line
++, buf
);
1768 #elif defined(SANSA_E200) || defined(SANSA_C200) || defined(SANSA_CLIP) || defined(SANSA_FUZE)
1769 const int first
= CHARGE_STATE_DISABLED
;
1770 static const char * const chrgstate_strings
[] =
1772 [CHARGE_STATE_DISABLED
-first
] = "Disabled",
1773 [CHARGE_STATE_ERROR
-first
] = "Error",
1774 [DISCHARGING
-first
] = "Discharging",
1775 [CHARGING
-first
] = "Charging",
1777 const char *str
= NULL
;
1779 snprintf(buf
, 30, "Charger: %s",
1780 charger_inserted() ? "present" : "absent");
1781 lcd_puts(0, 3, buf
);
1783 y
= charge_state
- first
;
1784 if ((unsigned)y
< ARRAYLEN(chrgstate_strings
))
1785 str
= chrgstate_strings
[y
];
1787 snprintf(buf
, sizeof(buf
), "State: %s",
1788 str
? str
: "<unknown>");
1789 lcd_puts(0, 4, buf
);
1791 snprintf(buf
, sizeof(buf
), "CHARGER: %02X",
1792 ascodec_read(AS3514_CHARGER
));
1793 lcd_puts(0, 5, buf
);
1795 snprintf(buf
, 30, "Charger: %s",
1796 charger_inserted() ? "present" : "absent");
1797 lcd_puts(0, 3, buf
);
1798 #endif /* target type */
1799 #endif /* CONFIG_CHARGING */
1802 case 2: /* voltage deltas: */
1803 lcd_puts(0, 0, "Voltage deltas:");
1805 for (i
= 0; i
<= 6; i
++) {
1806 y
= power_history
[i
] - power_history
[i
+1];
1807 snprintf(buf
, 30, "-%d min: %s%d.%03d V", i
,
1808 (y
< 0) ? "-" : "", ((y
< 0) ? y
* -1 : y
) / 1000,
1809 ((y
< 0) ? y
* -1 : y
) % 1000);
1810 lcd_puts(0, i
+1, buf
);
1814 case 3: /* remaining time estimation: */
1816 #ifdef ARCHOS_RECORDER
1817 snprintf(buf
, 30, "charge_state: %d", charge_state
);
1818 lcd_puts(0, 0, buf
);
1820 snprintf(buf
, 30, "Cycle time: %d m", powermgmt_last_cycle_startstop_min
);
1821 lcd_puts(0, 1, buf
);
1823 snprintf(buf
, 30, "Lvl@cyc st: %d%%", powermgmt_last_cycle_level
);
1824 lcd_puts(0, 2, buf
);
1826 snprintf(buf
, 30, "P=%2d I=%2d", pid_p
, pid_i
);
1827 lcd_puts(0, 3, buf
);
1829 snprintf(buf
, 30, "Trickle sec: %d/60", trickle_sec
);
1830 lcd_puts(0, 4, buf
);
1831 #endif /* ARCHOS_RECORDER */
1833 snprintf(buf
, 30, "Last PwrHist: %d.%03dV",
1834 power_history
[0] / 1000,
1835 power_history
[0] % 1000);
1836 lcd_puts(0, 5, buf
);
1838 snprintf(buf
, 30, "battery level: %d%%", battery_level());
1839 lcd_puts(0, 6, buf
);
1841 snprintf(buf
, 30, "Est. remain: %d m", battery_time());
1842 lcd_puts(0, 7, buf
);
1848 switch(get_action(CONTEXT_STD
,HZ
/2))
1850 case ACTION_STD_PREV
:
1855 case ACTION_STD_NEXT
:
1860 case ACTION_STD_CANCEL
:
1861 lcd_setfont(FONT_UI
);
1865 lcd_setfont(FONT_UI
);
1869 #endif /* HAVE_LCD_BITMAP */
1873 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1875 #if (CONFIG_STORAGE & STORAGE_MMC)
1876 #define CARDTYPE "MMC"
1877 #elif (CONFIG_STORAGE & STORAGE_SD)
1878 #define CARDTYPE "microSD"
1881 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1884 int *cardnum
= (int*)lists
->data
;
1885 unsigned char card_name
[7];
1886 unsigned char pbuf
[32];
1887 char *title
= lists
->title
;
1888 static const unsigned char i_vmin
[] = { 0, 1, 5, 10, 25, 35, 60, 100 };
1889 static const unsigned char i_vmax
[] = { 1, 5, 10, 25, 35, 45, 80, 200 };
1890 static const unsigned char *kbit_units
[] = { "kBit/s", "MBit/s", "GBit/s" };
1891 static const unsigned char *nsec_units
[] = { "ns", "µs", "ms" };
1892 #if (CONFIG_STORAGE & STORAGE_MMC)
1893 static const char *mmc_spec_vers
[] = { "1.0-1.2", "1.4", "2.0-2.2",
1894 "3.1-3.31", "4.0" };
1897 if ((btn
== ACTION_STD_OK
) || (btn
== SYS_FS_CHANGED
) || (btn
== ACTION_REDRAW
))
1900 if (btn
== ACTION_STD_OK
)
1902 *cardnum
^= 0x1; /* change cards */
1906 simplelist_set_line_count(0);
1908 card
= card_get_info(*cardnum
);
1910 if (card
->initialized
> 0)
1912 card_name
[6] = '\0';
1913 strncpy(card_name
, ((unsigned char*)card
->cid
) + 3, 6);
1914 simplelist_addline(SIMPLELIST_ADD_LINE
,
1915 "%s Rev %d.%d", card_name
,
1916 (int) card_extract_bits(card
->cid
, 55, 4),
1917 (int) card_extract_bits(card
->cid
, 51, 4));
1918 simplelist_addline(SIMPLELIST_ADD_LINE
,
1920 #if (CONFIG_STORAGE & STORAGE_SD)
1921 (int) card_extract_bits(card
->cid
, 11, 3),
1922 (int) card_extract_bits(card
->cid
, 19, 8) + 2000
1923 #elif (CONFIG_STORAGE & STORAGE_MMC)
1924 (int) card_extract_bits(card
->cid
, 15, 4),
1925 (int) card_extract_bits(card
->cid
, 11, 4) + 1997
1928 simplelist_addline(SIMPLELIST_ADD_LINE
,
1929 #if (CONFIG_STORAGE & STORAGE_SD)
1931 card_extract_bits(card
->cid
, 55, 32)
1932 #elif (CONFIG_STORAGE & STORAGE_MMC)
1934 card_extract_bits(card
->cid
, 47, 16)
1938 simplelist_addline(SIMPLELIST_ADD_LINE
, "M=%02x, "
1939 #if (CONFIG_STORAGE & STORAGE_SD)
1941 (int) card_extract_bits(card
->cid
, 127, 8),
1942 card_extract_bits(card
->cid
, 119, 8),
1943 card_extract_bits(card
->cid
, 111, 8)
1944 #elif (CONFIG_STORAGE & STORAGE_MMC)
1946 (int) card_extract_bits(card
->cid
, 127, 8),
1947 (int) card_extract_bits(card
->cid
, 119, 16)
1951 #if (CONFIG_STORAGE & STORAGE_MMC)
1952 int temp
= card_extract_bits(card
->csd
, 125, 4);
1953 simplelist_addline(SIMPLELIST_ADD_LINE
,
1954 "MMC v%s", temp
< 5 ?
1955 mmc_spec_vers
[temp
] : "?.?");
1957 simplelist_addline(SIMPLELIST_ADD_LINE
,
1958 "Blocks: 0x%08lx", card
->numblocks
);
1959 output_dyn_value(pbuf
, sizeof pbuf
, card
->speed
/ 1000,
1961 simplelist_addline(SIMPLELIST_ADD_LINE
,
1963 output_dyn_value(pbuf
, sizeof pbuf
, card
->taac
,
1965 simplelist_addline(SIMPLELIST_ADD_LINE
,
1967 simplelist_addline(SIMPLELIST_ADD_LINE
,
1968 "Nsac: %d clk", card
->nsac
);
1969 simplelist_addline(SIMPLELIST_ADD_LINE
,
1970 "R2W: *%d", card
->r2w_factor
);
1971 simplelist_addline(SIMPLELIST_ADD_LINE
,
1973 i_vmin
[card_extract_bits(card
->csd
, 61, 3)],
1974 i_vmax
[card_extract_bits(card
->csd
, 58, 3)]);
1975 simplelist_addline(SIMPLELIST_ADD_LINE
,
1977 i_vmin
[card_extract_bits(card
->csd
, 55, 3)],
1978 i_vmax
[card_extract_bits(card
->csd
, 52, 3)]);
1980 else if (card
->initialized
== 0)
1982 simplelist_addline(SIMPLELIST_ADD_LINE
, "Not Found!");
1984 #if (CONFIG_STORAGE & STORAGE_SD)
1985 else /* card->initialized < 0 */
1987 simplelist_addline(SIMPLELIST_ADD_LINE
, "Init Error! (%d)", card
->initialized
);
1990 snprintf(title
, 16, "[" CARDTYPE
" %d]", *cardnum
);
1991 gui_synclist_set_title(lists
, title
, Icon_NOICON
);
1992 gui_synclist_set_nb_items(lists
, simplelist_get_line_count());
1993 gui_synclist_select_item(lists
, 0);
1994 btn
= ACTION_REDRAW
;
1998 #elif (CONFIG_STORAGE & STORAGE_ATA)
1999 static int disk_callback(int btn
, struct gui_synclist
*lists
)
2004 unsigned short* identify_info
= ata_get_identify();
2005 bool timing_info_present
= false;
2008 simplelist_set_line_count(0);
2010 for (i
=0; i
< 20; i
++)
2011 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+27]);
2013 /* kill trailing space */
2014 for (i
=39; i
&& buf
[i
]==' '; i
--)
2016 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", buf
);
2017 for (i
=0; i
< 4; i
++)
2018 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+23]);
2020 simplelist_addline(SIMPLELIST_ADD_LINE
,
2021 "Firmware: %s", buf
);
2022 snprintf(buf
, sizeof buf
, "%ld MB",
2023 ((unsigned long)identify_info
[61] << 16 |
2024 (unsigned long)identify_info
[60]) / 2048 );
2025 simplelist_addline(SIMPLELIST_ADD_LINE
,
2028 fat_size( IF_MV2(0,) NULL
, &free
);
2029 simplelist_addline(SIMPLELIST_ADD_LINE
,
2030 "Free: %ld MB", free
/ 1024);
2031 simplelist_addline(SIMPLELIST_ADD_LINE
,
2032 "Spinup time: %d ms", storage_spinup_time() * (1000/HZ
));
2033 i
= identify_info
[83] & (1<<3);
2034 simplelist_addline(SIMPLELIST_ADD_LINE
,
2035 "Power mgmt: %s", i
? "enabled" : "unsupported");
2036 i
= identify_info
[83] & (1<<9);
2037 simplelist_addline(SIMPLELIST_ADD_LINE
,
2038 "Noise mgmt: %s", i
? "enabled" : "unsupported");
2039 i
= identify_info
[82] & (1<<6);
2040 simplelist_addline(SIMPLELIST_ADD_LINE
,
2041 "Read-ahead: %s", i
? "enabled" : "unsupported");
2042 timing_info_present
= identify_info
[53] & (1<<1);
2043 if(timing_info_present
) {
2044 char pio3
[2], pio4
[2];pio3
[1] = 0;
2046 pio3
[0] = (identify_info
[64] & (1<<0)) ? '3' : 0;
2047 pio4
[0] = (identify_info
[64] & (1<<1)) ? '4' : 0;
2048 simplelist_addline(SIMPLELIST_ADD_LINE
,
2049 "PIO modes: 0 1 2 %s %s", pio3
, pio4
);
2052 simplelist_addline(SIMPLELIST_ADD_LINE
,
2053 "No PIO mode info");
2055 timing_info_present
= identify_info
[53] & (1<<1);
2056 if(timing_info_present
) {
2057 simplelist_addline(SIMPLELIST_ADD_LINE
,
2058 "Cycle times %dns/%dns",
2060 identify_info
[68] );
2062 simplelist_addline(SIMPLELIST_ADD_LINE
,
2066 if (identify_info
[63] & (1<<0)) {
2067 char mdma0
[2], mdma1
[2], mdma2
[2];
2068 mdma0
[1] = mdma1
[1] = mdma2
[1] = 0;
2069 mdma0
[0] = (identify_info
[63] & (1<<0)) ? '0' : 0;
2070 mdma1
[0] = (identify_info
[63] & (1<<1)) ? '1' : 0;
2071 mdma2
[0] = (identify_info
[63] & (1<<2)) ? '2' : 0;
2072 simplelist_addline(SIMPLELIST_ADD_LINE
,
2073 "MDMA modes: %s %s %s", mdma0
, mdma1
, mdma2
);
2074 simplelist_addline(SIMPLELIST_ADD_LINE
,
2075 "MDMA Cycle times %dns/%dns",
2077 identify_info
[66] );
2080 simplelist_addline(SIMPLELIST_ADD_LINE
,
2081 "No MDMA mode info");
2083 if (identify_info
[53] & (1<<2)) {
2084 char udma0
[2], udma1
[2], udma2
[2], udma3
[2], udma4
[2], udma5
[2], udma6
[2];
2085 udma0
[1] = udma1
[1] = udma2
[1] = udma3
[1] = udma4
[1] = udma5
[1] = udma6
[1] = 0;
2086 udma0
[0] = (identify_info
[88] & (1<<0)) ? '0' : 0;
2087 udma1
[0] = (identify_info
[88] & (1<<1)) ? '1' : 0;
2088 udma2
[0] = (identify_info
[88] & (1<<2)) ? '2' : 0;
2089 udma3
[0] = (identify_info
[88] & (1<<3)) ? '3' : 0;
2090 udma4
[0] = (identify_info
[88] & (1<<4)) ? '4' : 0;
2091 udma5
[0] = (identify_info
[88] & (1<<5)) ? '5' : 0;
2092 udma6
[0] = (identify_info
[88] & (1<<6)) ? '6' : 0;
2093 simplelist_addline(SIMPLELIST_ADD_LINE
,
2094 "UDMA modes: %s %s %s %s %s %s %s", udma0
, udma1
, udma2
,
2095 udma3
, udma4
, udma5
, udma6
);
2098 simplelist_addline(SIMPLELIST_ADD_LINE
,
2099 "No UDMA mode info");
2101 #endif /* HAVE_ATA_DMA */
2102 timing_info_present
= identify_info
[53] & (1<<1);
2103 if(timing_info_present
) {
2104 i
= identify_info
[49] & (1<<11);
2105 simplelist_addline(SIMPLELIST_ADD_LINE
,
2106 "IORDY support: %s", i
? "yes" : "no");
2107 i
= identify_info
[49] & (1<<10);
2108 simplelist_addline(SIMPLELIST_ADD_LINE
,
2109 "IORDY disable: %s", i
? "yes" : "no");
2111 simplelist_addline(SIMPLELIST_ADD_LINE
,
2114 simplelist_addline(SIMPLELIST_ADD_LINE
,
2115 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
2117 i
= ata_get_dma_mode();
2119 simplelist_addline(SIMPLELIST_ADD_LINE
,
2122 simplelist_addline(SIMPLELIST_ADD_LINE
,
2124 (i
& 0x40) ? "UDMA" : "MDMA",
2127 #endif /* HAVE_ATA_DMA */
2130 #else /* No SD, MMC or ATA */
2131 static int disk_callback(int btn
, struct gui_synclist
*lists
)
2135 struct storage_info info
;
2136 storage_get_info(0,&info
);
2137 simplelist_addline(SIMPLELIST_ADD_LINE
, "Vendor: %s", info
.vendor
);
2138 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", info
.product
);
2139 simplelist_addline(SIMPLELIST_ADD_LINE
, "Firmware: %s", info
.revision
);
2140 simplelist_addline(SIMPLELIST_ADD_LINE
,
2141 "Size: %ld MB", info
.num_sectors
*(info
.sector_size
/512)/2024);
2143 fat_size( IF_MV2(0,) NULL
, &free
);
2144 simplelist_addline(SIMPLELIST_ADD_LINE
,
2145 "Free: %ld MB", free
/ 1024);
2146 simplelist_addline(SIMPLELIST_ADD_LINE
,
2147 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
2152 #if (CONFIG_STORAGE & STORAGE_ATA)
2153 static bool dbg_identify_info(void)
2155 int fd
= creat("/identify_info.bin");
2158 #ifdef ROCKBOX_LITTLE_ENDIAN
2159 ecwrite(fd
, ata_get_identify(), SECTOR_SIZE
/2, "s", true);
2161 write(fd
, ata_get_identify(), SECTOR_SIZE
);
2169 static bool dbg_disk_info(void)
2171 struct simplelist_info info
;
2172 simplelist_info_init(&info
, "Disk Info", 1, NULL
);
2173 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
2176 info
.callback_data
= (void*)&card
;
2179 info
.action_callback
= disk_callback
;
2180 info
.hide_selection
= true;
2181 info
.scroll_all
= true;
2182 return simplelist_show_list(&info
);
2184 #endif /* !SIMULATOR */
2186 #ifdef HAVE_DIRCACHE
2187 static int dircache_callback(int btn
, struct gui_synclist
*lists
)
2189 (void)btn
; (void)lists
;
2190 simplelist_set_line_count(0);
2191 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache initialized: %s",
2192 dircache_is_enabled() ? "Yes" : "No");
2193 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache size: %d B",
2194 dircache_get_cache_size());
2195 simplelist_addline(SIMPLELIST_ADD_LINE
, "Last size: %d B",
2196 global_status
.dircache_size
);
2197 simplelist_addline(SIMPLELIST_ADD_LINE
, "Limit: %d B",
2199 simplelist_addline(SIMPLELIST_ADD_LINE
, "Reserve: %d/%d B",
2200 dircache_get_reserve_used(), DIRCACHE_RESERVE
);
2201 simplelist_addline(SIMPLELIST_ADD_LINE
, "Scanning took: %d s",
2202 dircache_get_build_ticks() / HZ
);
2203 simplelist_addline(SIMPLELIST_ADD_LINE
, "Entry count: %d",
2204 dircache_get_entry_count());
2208 static bool dbg_dircache_info(void)
2210 struct simplelist_info info
;
2211 simplelist_info_init(&info
, "Dircache Info", 7, NULL
);
2212 info
.action_callback
= dircache_callback
;
2213 info
.hide_selection
= true;
2214 info
.scroll_all
= true;
2215 return simplelist_show_list(&info
);
2218 #endif /* HAVE_DIRCACHE */
2220 #ifdef HAVE_TAGCACHE
2221 static int database_callback(int btn
, struct gui_synclist
*lists
)
2224 struct tagcache_stat
*stat
= tagcache_get_stat();
2225 static bool synced
= false;
2227 simplelist_set_line_count(0);
2229 simplelist_addline(SIMPLELIST_ADD_LINE
, "Initialized: %s",
2230 stat
->initialized
? "Yes" : "No");
2231 simplelist_addline(SIMPLELIST_ADD_LINE
, "DB Ready: %s",
2232 stat
->ready
? "Yes" : "No");
2233 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM Cache: %s",
2234 stat
->ramcache
? "Yes" : "No");
2235 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM: %d/%d B",
2236 stat
->ramcache_used
, stat
->ramcache_allocated
);
2237 simplelist_addline(SIMPLELIST_ADD_LINE
, "Progress: %d%% (%d entries)",
2238 stat
->progress
, stat
->processed_entries
);
2239 simplelist_addline(SIMPLELIST_ADD_LINE
, "Curfile: %s",
2240 stat
->curentry
? stat
->curentry
: "---");
2241 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit step: %d",
2243 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit delayed: %s",
2244 stat
->commit_delayed
? "Yes" : "No");
2246 simplelist_addline(SIMPLELIST_ADD_LINE
, "Queue length: %d",
2247 stat
->queue_length
);
2252 tagcache_screensync_event();
2255 if (!btn
&& stat
->curentry
)
2258 return ACTION_REDRAW
;
2261 if (btn
== ACTION_STD_CANCEL
)
2262 tagcache_screensync_enable(false);
2266 static bool dbg_tagcache_info(void)
2268 struct simplelist_info info
;
2269 simplelist_info_init(&info
, "Database Info", 8, NULL
);
2270 info
.action_callback
= database_callback
;
2271 info
.hide_selection
= true;
2272 info
.scroll_all
= true;
2274 /* Don't do nonblock here, must give enough processing time
2275 for tagcache thread. */
2276 /* info.timeout = TIMEOUT_NOBLOCK; */
2278 tagcache_screensync_enable(true);
2279 return simplelist_show_list(&info
);
2283 #if CONFIG_CPU == SH7034
2284 static bool dbg_save_roms(void)
2287 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
2289 fd
= creat("/internal_rom_0000-FFFF.bin");
2292 write(fd
, (void *)0, 0x10000);
2296 fd
= creat("/internal_rom_2000000-203FFFF.bin");
2299 write(fd
, (void *)0x2000000, 0x40000);
2303 system_memory_guard(oldmode
);
2306 #elif defined CPU_COLDFIRE
2307 static bool dbg_save_roms(void)
2310 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
2312 #if defined(IRIVER_H100_SERIES)
2313 fd
= creat("/internal_rom_000000-1FFFFF.bin");
2314 #elif defined(IRIVER_H300_SERIES)
2315 fd
= creat("/internal_rom_000000-3FFFFF.bin");
2316 #elif defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IAUDIO_M3)
2317 fd
= creat("/internal_rom_000000-3FFFFF.bin");
2321 write(fd
, (void *)0, FLASH_SIZE
);
2324 system_memory_guard(oldmode
);
2327 fd
= creat("/internal_eeprom.bin");
2331 char buf
[EEPROM_SIZE
];
2334 old_irq_level
= disable_irq_save();
2336 err
= eeprom_24cxx_read(0, buf
, sizeof buf
);
2338 restore_irq(old_irq_level
);
2341 splashf(HZ
*3, "Eeprom read failure (%d)", err
);
2344 write(fd
, buf
, sizeof buf
);
2353 #elif defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)
2354 static bool dbg_save_roms(void)
2358 fd
= creat("/internal_rom_000000-0FFFFF.bin");
2361 write(fd
, (void *)0x20000000, FLASH_SIZE
);
2371 static int radio_callback(int btn
, struct gui_synclist
*lists
)
2374 if (btn
== ACTION_STD_CANCEL
)
2376 simplelist_set_line_count(1);
2378 #if (CONFIG_TUNER & LV24020LP)
2379 simplelist_addline(SIMPLELIST_ADD_LINE
,
2380 "CTRL_STAT: %02X", lv24020lp_get(LV24020LP_CTRL_STAT
) );
2381 simplelist_addline(SIMPLELIST_ADD_LINE
,
2382 "RADIO_STAT: %02X", lv24020lp_get(LV24020LP_REG_STAT
) );
2383 simplelist_addline(SIMPLELIST_ADD_LINE
,
2384 "MSS_FM: %d kHz", lv24020lp_get(LV24020LP_MSS_FM
) );
2385 simplelist_addline(SIMPLELIST_ADD_LINE
,
2386 "MSS_IF: %d Hz", lv24020lp_get(LV24020LP_MSS_IF
) );
2387 simplelist_addline(SIMPLELIST_ADD_LINE
,
2388 "MSS_SD: %d Hz", lv24020lp_get(LV24020LP_MSS_SD
) );
2389 simplelist_addline(SIMPLELIST_ADD_LINE
,
2390 "if_set: %d Hz", lv24020lp_get(LV24020LP_IF_SET
) );
2391 simplelist_addline(SIMPLELIST_ADD_LINE
,
2392 "sd_set: %d Hz", lv24020lp_get(LV24020LP_SD_SET
) );
2393 #endif /* LV24020LP */
2394 #if (CONFIG_TUNER & S1A0903X01)
2395 simplelist_addline(SIMPLELIST_ADD_LINE
,
2396 "Samsung regs: %08X", s1a0903x01_get(RADIO_ALL
));
2397 /* This one doesn't return dynamic data atm */
2398 #endif /* S1A0903X01 */
2399 #if (CONFIG_TUNER & TEA5767)
2400 struct tea5767_dbg_info nfo
;
2401 tea5767_dbg_info(&nfo
);
2402 simplelist_addline(SIMPLELIST_ADD_LINE
, "Philips regs:");
2403 simplelist_addline(SIMPLELIST_ADD_LINE
,
2404 " Read: %02X %02X %02X %02X %02X",
2405 (unsigned)nfo
.read_regs
[0], (unsigned)nfo
.read_regs
[1],
2406 (unsigned)nfo
.read_regs
[2], (unsigned)nfo
.read_regs
[3],
2407 (unsigned)nfo
.read_regs
[4]);
2408 simplelist_addline(SIMPLELIST_ADD_LINE
,
2409 " Write: %02X %02X %02X %02X %02X",
2410 (unsigned)nfo
.write_regs
[0], (unsigned)nfo
.write_regs
[1],
2411 (unsigned)nfo
.write_regs
[2], (unsigned)nfo
.write_regs
[3],
2412 (unsigned)nfo
.write_regs
[4]);
2413 #endif /* TEA5767 */
2414 #if (CONFIG_TUNER & SI4700)
2415 struct si4700_dbg_info nfo
;
2416 si4700_dbg_info(&nfo
);
2417 simplelist_addline(SIMPLELIST_ADD_LINE
, "SI4700 regs:");
2419 simplelist_addline(SIMPLELIST_ADD_LINE
,
2420 "%04X %04X %04X %04X",
2421 (unsigned)nfo
.regs
[0], (unsigned)nfo
.regs
[1],
2422 (unsigned)nfo
.regs
[2], (unsigned)nfo
.regs
[3]);
2423 simplelist_addline(SIMPLELIST_ADD_LINE
,
2424 "%04X %04X %04X %04X",
2425 (unsigned)nfo
.regs
[4], (unsigned)nfo
.regs
[5],
2426 (unsigned)nfo
.regs
[6], (unsigned)nfo
.regs
[7]);
2427 simplelist_addline(SIMPLELIST_ADD_LINE
,
2428 "%04X %04X %04X %04X",
2429 (unsigned)nfo
.regs
[8], (unsigned)nfo
.regs
[9],
2430 (unsigned)nfo
.regs
[10], (unsigned)nfo
.regs
[11]);
2431 simplelist_addline(SIMPLELIST_ADD_LINE
,
2432 "%04X %04X %04X %04X",
2433 (unsigned)nfo
.regs
[12], (unsigned)nfo
.regs
[13],
2434 (unsigned)nfo
.regs
[14], (unsigned)nfo
.regs
[15]);
2436 return ACTION_REDRAW
;
2438 static bool dbg_fm_radio(void)
2440 struct simplelist_info info
;
2441 info
.scroll_all
= true;
2442 simplelist_info_init(&info
, "FM Radio", 1, NULL
);
2443 simplelist_set_line_count(0);
2444 simplelist_addline(SIMPLELIST_ADD_LINE
, "HW detected: %s",
2445 radio_hardware_present() ? "yes" : "no");
2447 info
.action_callback
= radio_hardware_present()?radio_callback
: NULL
;
2448 info
.hide_selection
= true;
2449 return simplelist_show_list(&info
);
2451 #endif /* CONFIG_TUNER */
2452 #endif /* !SIMULATOR */
2454 #ifdef HAVE_LCD_BITMAP
2455 extern bool do_screendump_instead_of_usb
;
2457 static bool dbg_screendump(void)
2459 do_screendump_instead_of_usb
= !do_screendump_instead_of_usb
;
2460 splashf(HZ
, "Screendump %s",
2461 do_screendump_instead_of_usb
?"enabled":"disabled");
2464 #endif /* HAVE_LCD_BITMAP */
2466 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2467 static bool dbg_set_memory_guard(void)
2469 static const struct opt_items names
[MAXMEMGUARD
] = {
2471 { "Flash ROM writes", -1 },
2472 { "Zero area (all)", -1 }
2474 int mode
= system_memory_guard(MEMGUARD_KEEP
);
2476 set_option( "Catch mem accesses", &mode
, INT
, names
, MAXMEMGUARD
, NULL
);
2477 system_memory_guard(mode
);
2481 #endif /* CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) */
2483 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2484 static bool dbg_write_eeprom(void)
2489 char buf
[EEPROM_SIZE
];
2492 fd
= open("/internal_eeprom.bin", O_RDONLY
);
2496 rc
= read(fd
, buf
, EEPROM_SIZE
);
2498 if(rc
== EEPROM_SIZE
)
2500 old_irq_level
= disable_irq_save();
2502 err
= eeprom_24cxx_write(0, buf
, sizeof buf
);
2504 splashf(HZ
*3, "Eeprom write failure (%d)", err
);
2506 splash(HZ
*3, "Eeprom written successfully");
2508 restore_irq(old_irq_level
);
2512 splashf(HZ
*3, "File read error (%d)",rc
);
2518 splash(HZ
*3, "Failed to open 'internal_eeprom.bin'");
2523 #endif /* defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS) */
2524 #ifdef CPU_BOOST_LOGGING
2525 static bool cpu_boost_log(void)
2528 int count
= cpu_boost_log_getcount();
2529 int lines
= LCD_HEIGHT
/SYSFONT_HEIGHT
;
2532 lcd_setfont(FONT_SYSFIXED
);
2533 str
= cpu_boost_log_getlog_first();
2536 lcd_clear_display();
2537 for(j
=0; j
<lines
; j
++,i
++)
2540 str
= cpu_boost_log_getlog_next();
2551 switch(get_action(CONTEXT_STD
,TIMEOUT_BLOCK
))
2554 case ACTION_STD_PREV
:
2555 case ACTION_STD_NEXT
:
2558 case ACTION_STD_CANCEL
:
2565 get_action(CONTEXT_STD
,TIMEOUT_BLOCK
);
2566 lcd_setfont(FONT_UI
);
2571 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2572 extern bool wheel_is_touched
;
2573 extern int old_wheel_value
;
2574 extern int new_wheel_value
;
2575 extern int wheel_delta
;
2576 extern unsigned int accumulated_wheel_delta
;
2577 extern unsigned int wheel_velocity
;
2579 static bool dbg_scrollwheel(void)
2584 lcd_setfont(FONT_SYSFIXED
);
2588 if (action_userabort(HZ
/10))
2591 lcd_clear_display();
2593 /* show internal variables of scrollwheel driver */
2594 snprintf(buf
, sizeof(buf
), "wheel touched: %s", (wheel_is_touched
) ? "true" : "false");
2595 lcd_puts(0, 0, buf
);
2596 snprintf(buf
, sizeof(buf
), "new position: %2d", new_wheel_value
);
2597 lcd_puts(0, 1, buf
);
2598 snprintf(buf
, sizeof(buf
), "old position: %2d", old_wheel_value
);
2599 lcd_puts(0, 2, buf
);
2600 snprintf(buf
, sizeof(buf
), "wheel delta: %2d", wheel_delta
);
2601 lcd_puts(0, 3, buf
);
2602 snprintf(buf
, sizeof(buf
), "accumulated delta: %2d", accumulated_wheel_delta
);
2603 lcd_puts(0, 4, buf
);
2604 snprintf(buf
, sizeof(buf
), "velo [deg/s]: %4d", (int)wheel_velocity
);
2605 lcd_puts(0, 5, buf
);
2607 /* show effective accelerated scrollspeed */
2608 speed
= button_apply_acceleration( (1<<31)|(1<<24)|wheel_velocity
);
2609 snprintf(buf
, sizeof(buf
), "accel. speed: %4d", speed
);
2610 lcd_puts(0, 6, buf
);
2614 lcd_setfont(FONT_UI
);
2619 #if defined (HAVE_USBSTACK)
2621 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2622 static bool toggle_usb_core_driver(int driver
, char *msg
)
2624 bool enabled
= !usb_core_driver_enabled(driver
);
2626 usb_core_enable_driver(driver
,enabled
);
2627 splashf(HZ
, "%s %s", msg
, enabled
?"enabled":"disabled");
2632 static bool toggle_usb_serial(void)
2634 return toggle_usb_core_driver(USB_DRIVER_SERIAL
,"USB Serial");
2638 #ifdef USB_ENABLE_HID
2639 static bool hid_send_cmd(consumer_usage_page_t cmd
, char *msg
)
2643 if (!usb_core_driver_enabled(USB_DRIVER_HID
)) {
2644 splashf(HZ
, "Send failed. Driver is disabled");
2648 usb_hid_send_consumer_usage(cmd
);
2649 logf("Sent %s command", msg
);
2653 static bool usb_hid_send_play_pause(void)
2655 return hid_send_cmd(PLAY_PAUSE
, "Play/Pause");
2657 static bool usb_hid_send_stop(void)
2659 return hid_send_cmd(STOP
, "Stop");
2661 static bool usb_hid_send_scan_previous_track(void)
2663 return hid_send_cmd(SCAN_PREVIOUS_TRACK
, "Scan previous track");
2665 static bool usb_hid_send_scan_next_track(void)
2667 return hid_send_cmd(SCAN_NEXT_TRACK
, "Scan next track");
2669 static bool usb_hid_send_mute(void)
2671 return hid_send_cmd(MUTE
, "Mute");
2673 static bool usb_hid_send_volume_decrement(void)
2675 return hid_send_cmd(VOLUME_DECREMENT
, "Vol Down");
2677 static bool usb_hid_send_volume_increment(void)
2679 return hid_send_cmd(VOLUME_INCREMENT
, "Vol Up");
2684 #if CONFIG_USBOTG == USBOTG_ISP1583
2685 extern int dbg_usb_num_items(void);
2686 extern char* dbg_usb_item(int selected_item
, void *data
, char *buffer
, size_t buffer_len
);
2688 static int isp1583_action_callback(int action
, struct gui_synclist
*lists
)
2691 if (action
== ACTION_NONE
)
2692 action
= ACTION_REDRAW
;
2696 static bool dbg_isp1583(void)
2698 struct simplelist_info isp1583
;
2699 isp1583
.scroll_all
= true;
2700 simplelist_info_init(&isp1583
, "ISP1583", dbg_usb_num_items(), NULL
);
2701 isp1583
.timeout
= HZ
/100;
2702 isp1583
.hide_selection
= true;
2703 isp1583
.get_name
= dbg_usb_item
;
2704 isp1583
.action_callback
= isp1583_action_callback
;
2705 return simplelist_show_list(&isp1583
);
2709 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2710 extern int pic_dbg_num_items(void);
2711 extern char* pic_dbg_item(int selected_item
, void *data
, char *buffer
, size_t buffer_len
);
2713 static int pic_action_callback(int action
, struct gui_synclist
*lists
)
2716 if (action
== ACTION_NONE
)
2717 action
= ACTION_REDRAW
;
2721 static bool dbg_pic(void)
2723 struct simplelist_info pic
;
2724 pic
.scroll_all
= true;
2725 simplelist_info_init(&pic
, "PIC", pic_dbg_num_items(), NULL
);
2726 pic
.timeout
= HZ
/100;
2727 pic
.hide_selection
= true;
2728 pic
.get_name
= pic_dbg_item
;
2729 pic
.action_callback
= pic_action_callback
;
2730 return simplelist_show_list(&pic
);
2735 /****** The menu *********/
2736 struct the_menu_item
{
2737 unsigned char *desc
; /* string or ID */
2738 bool (*function
) (void); /* return true if USB was connected */
2740 static const struct the_menu_item menuitems
[] = {
2741 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || \
2742 (defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD))
2743 { "Dump ROM contents", dbg_save_roms
},
2745 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || defined(CPU_PP) \
2746 || CONFIG_CPU == S3C2440 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 \
2747 || CONFIG_CPU == DM320
2748 { "View I/O ports", dbg_ports
},
2750 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
2751 { "View PCF registers", dbg_pcf
},
2753 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
2754 { "TSC2100 debug", tsc2100_debug
},
2756 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2757 { "CPU frequency", dbg_cpufreq
},
2759 #if defined(IRIVER_H100_SERIES) && !defined(SIMULATOR)
2760 { "S/PDIF analyzer", dbg_spdif
},
2762 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2763 { "Catch mem accesses", dbg_set_memory_guard
},
2765 { "View OS stacks", dbg_os
},
2766 #ifdef HAVE_LCD_BITMAP
2768 { "View battery", view_battery
},
2770 { "Screendump", dbg_screendump
},
2773 { "View HW info", dbg_hw_info
},
2776 { "View partitions", dbg_partitions
},
2779 { "View disk info", dbg_disk_info
},
2780 #if (CONFIG_STORAGE & STORAGE_ATA)
2781 { "Dump ATA identify info", dbg_identify_info
},
2784 #ifdef HAVE_DIRCACHE
2785 { "View dircache info", dbg_dircache_info
},
2787 #ifdef HAVE_TAGCACHE
2788 { "View database info", dbg_tagcache_info
},
2790 #ifdef HAVE_LCD_BITMAP
2791 #if CONFIG_CODEC == SWCODEC
2792 { "View buffering thread", dbg_buffering_thread
},
2793 #elif !defined(SIMULATOR)
2794 { "View audio thread", dbg_audio_thread
},
2797 { "pm histogram", peak_meter_histogram
},
2798 #endif /* PM_DEBUG */
2799 #endif /* HAVE_LCD_BITMAP */
2802 { "FM Radio", dbg_fm_radio
},
2805 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2806 { "Write back EEPROM", dbg_write_eeprom
},
2808 #if CONFIG_USBOTG == USBOTG_ISP1583
2809 { "View ISP1583 info", dbg_isp1583
},
2811 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2812 { "View PIC info", dbg_pic
},
2814 #ifdef ROCKBOX_HAS_LOGF
2815 {"logf", logfdisplay
},
2816 {"logfdump", logfdump
},
2818 #if defined(HAVE_USBSTACK)
2819 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2820 {"USB Serial driver (logf)", toggle_usb_serial
},
2822 #if defined(USB_ENABLE_HID)
2823 {"USB HID play/pause", usb_hid_send_play_pause
},
2824 {"USB HID stop", usb_hid_send_stop
},
2825 {"USB HID prev track", usb_hid_send_scan_previous_track
},
2826 {"USB HID next track", usb_hid_send_scan_next_track
},
2827 {"USB HID mute", usb_hid_send_mute
},
2828 {"USB HID vol down", usb_hid_send_volume_decrement
},
2829 {"USB HID vol up", usb_hid_send_volume_increment
},
2831 #endif /* HAVE_USBSTACK */
2832 #ifdef CPU_BOOST_LOGGING
2833 {"cpu_boost log",cpu_boost_log
},
2835 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2836 {"Debug scrollwheel", dbg_scrollwheel
},
2839 static int menu_action_callback(int btn
, struct gui_synclist
*lists
)
2841 if (btn
== ACTION_STD_OK
)
2843 int oldbars
= viewportmanager_set_statusbar(VP_SB_HIDE_ALL
);
2844 menuitems
[gui_synclist_get_sel_pos(lists
)].function();
2845 btn
= ACTION_REDRAW
;
2846 viewportmanager_set_statusbar(oldbars
);
2850 static char* dbg_menu_getname(int item
, void * data
,
2851 char *buffer
, size_t buffer_len
)
2853 (void)data
; (void)buffer
; (void)buffer_len
;
2854 return menuitems
[item
].desc
;
2856 bool debug_menu(void)
2858 struct simplelist_info info
;
2860 simplelist_info_init(&info
, "Debug Menu", ARRAYLEN(menuitems
), NULL
);
2861 info
.action_callback
= menu_action_callback
;
2862 info
.get_name
= dbg_menu_getname
;
2863 return simplelist_show_list(&info
);