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"
103 #include "appevents.h"
105 #if CONFIG_CPU == DM320 || CONFIG_CPU == S3C2440 || CONFIG_CPU == TCC7801 \
106 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 || CONFIG_CPU == JZ4732
107 #include "debug-target.h"
110 #if defined(SANSA_E200) || defined(SANSA_C200) || defined(PHILIPS_SA9200) \
111 || defined(SANSA_CLIP) || defined(SANSA_FUZE)
117 #include "usb_core.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 const 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
);
187 static int dbg_threads_action_callback(int action
, struct gui_synclist
*lists
)
190 #ifdef ROCKBOX_HAS_LOGF
191 if (action
== ACTION_STD_OK
)
193 int selpos
= gui_synclist_get_sel_pos(lists
);
195 if (selpos
>= NUM_CORES
)
196 remove_thread(threads
[selpos
- NUM_CORES
].id
);
198 remove_thread(threads
[selpos
].id
);
200 return ACTION_REDRAW
;
202 #endif /* ROCKBOX_HAS_LOGF */
203 if (action
== ACTION_NONE
)
204 action
= ACTION_REDRAW
;
208 static bool dbg_os(void)
210 struct simplelist_info info
;
211 simplelist_info_init(&info
, IF_COP("Core and ") "Stack usage:",
215 MAXTHREADS
+NUM_CORES
,
218 #ifndef ROCKBOX_HAS_LOGF
219 info
.hide_selection
= true;
220 info
.scroll_all
= true;
222 info
.action_callback
= dbg_threads_action_callback
;
223 info
.get_name
= threads_getname
;
224 return simplelist_show_list(&info
);
227 #ifdef HAVE_LCD_BITMAP
228 #if CONFIG_CODEC != SWCODEC
230 static bool dbg_audio_thread(void)
233 struct audio_debug d
;
235 lcd_setfont(FONT_SYSFIXED
);
239 if (action_userabort(HZ
/5))
242 audio_get_debugdata(&d
);
246 snprintf(buf
, sizeof(buf
), "read: %x", d
.audiobuf_read
);
248 snprintf(buf
, sizeof(buf
), "write: %x", d
.audiobuf_write
);
250 snprintf(buf
, sizeof(buf
), "swap: %x", d
.audiobuf_swapwrite
);
252 snprintf(buf
, sizeof(buf
), "playing: %d", d
.playing
);
254 snprintf(buf
, sizeof(buf
), "playable: %x", d
.playable_space
);
256 snprintf(buf
, sizeof(buf
), "unswapped: %x", d
.unswapped_space
);
259 /* Playable space left */
260 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8, 112, 4, d
.audiobuflen
, 0,
261 d
.playable_space
, HORIZONTAL
);
263 /* Show the watermark limit */
264 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8+4, 112, 4, d
.audiobuflen
, 0,
265 d
.low_watermark_level
, HORIZONTAL
);
267 snprintf(buf
, sizeof(buf
), "wm: %x - %x",
268 d
.low_watermark_level
, d
.lowest_watermark_level
);
273 lcd_setfont(FONT_UI
);
276 #endif /* !SIMULATOR */
277 #else /* CONFIG_CODEC == SWCODEC */
278 extern size_t filebuflen
;
279 /* This is a size_t, but call it a long so it puts a - when it's bad. */
281 static unsigned int ticks
, boost_ticks
, freq_sum
;
283 static void dbg_audio_task(void)
286 if(FREQ
> CPUFREQ_NORMAL
)
288 freq_sum
+= FREQ
/1000000; /* in MHz */
293 static bool dbg_buffering_thread(void)
300 size_t bufsize
= pcmbuf_get_bufsize();
301 int pcmbufdescs
= pcmbuf_descs();
302 struct buffering_debug d
;
304 ticks
= boost_ticks
= freq_sum
= 0;
306 tick_add_task(dbg_audio_task
);
308 lcd_setfont(FONT_SYSFIXED
);
311 button
= get_action(CONTEXT_STD
,HZ
/5);
314 case ACTION_STD_NEXT
:
317 case ACTION_STD_PREV
:
320 case ACTION_STD_CANCEL
:
325 buffering_get_debugdata(&d
);
330 bufused
= bufsize
- pcmbuf_free();
332 snprintf(buf
, sizeof(buf
), "pcm: %6ld/%ld", (long) bufused
, (long) bufsize
);
333 lcd_puts(0, line
++, buf
);
335 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
336 bufsize
, 0, bufused
, HORIZONTAL
);
339 snprintf(buf
, sizeof(buf
), "alloc: %6ld/%ld", audio_filebufused(),
341 lcd_puts(0, line
++, buf
);
344 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
345 filebuflen
, 0, audio_filebufused(), HORIZONTAL
);
348 snprintf(buf
, sizeof(buf
), "real: %6ld/%ld", (long)d
.buffered_data
,
350 lcd_puts(0, line
++, buf
);
352 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
353 filebuflen
, 0, (long)d
.buffered_data
, HORIZONTAL
);
357 snprintf(buf
, sizeof(buf
), "usefl: %6ld/%ld", (long)(d
.useful_data
),
359 lcd_puts(0, line
++, buf
);
362 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
363 filebuflen
, 0, d
.useful_data
, HORIZONTAL
);
367 snprintf(buf
, sizeof(buf
), "data_rem: %ld", (long)d
.data_rem
);
368 lcd_puts(0, line
++, buf
);
370 snprintf(buf
, sizeof(buf
), "track count: %2d", audio_track_count());
371 lcd_puts(0, line
++, buf
);
373 snprintf(buf
, sizeof(buf
), "handle count: %d", (int)d
.num_handles
);
374 lcd_puts(0, line
++, buf
);
377 snprintf(buf
, sizeof(buf
), "cpu freq: %3dMHz",
378 (int)((FREQ
+ 500000) / 1000000));
379 lcd_puts(0, line
++, buf
);
384 int boostquota
= boost_ticks
* 1000 / ticks
; /* in 0.1 % */
385 int avgclock
= freq_sum
* 10 / ticks
; /* in 100 kHz */
386 snprintf(buf
, sizeof(buf
), "boost:%3d.%d%% (%d.%dMHz)",
387 boostquota
/10, boostquota
%10, avgclock
/10, avgclock
%10);
388 lcd_puts(0, line
++, buf
);
391 snprintf(buf
, sizeof(buf
), "pcmbufdesc: %2d/%2d",
392 pcmbuf_used_descs(), pcmbufdescs
);
393 lcd_puts(0, line
++, buf
);
394 snprintf(buf
, sizeof(buf
), "watermark: %6d",
396 lcd_puts(0, line
++, buf
);
401 tick_remove_task(dbg_audio_task
);
402 lcd_setfont(FONT_UI
);
406 #endif /* CONFIG_CODEC */
407 #endif /* HAVE_LCD_BITMAP */
410 #if (CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE))
411 /* Tool function to read the flash manufacturer and type, if available.
412 Only chips which could be reprogrammed in system will return values.
413 (The mode switch addresses vary between flash manufacturers, hence addr1/2) */
414 /* In IRAM to avoid problems when running directly from Flash */
415 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
416 unsigned addr1
, unsigned addr2
)
417 ICODE_ATTR
__attribute__((noinline
));
418 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
419 unsigned addr1
, unsigned addr2
)
422 unsigned not_manu
, not_id
; /* read values before switching to ID mode */
423 unsigned manu
, id
; /* read values when in ID mode */
425 #if CONFIG_CPU == SH7034
426 volatile unsigned char* flash
= (unsigned char*)0x2000000; /* flash mapping */
427 #elif defined(CPU_COLDFIRE)
428 volatile unsigned short* flash
= (unsigned short*)0; /* flash mapping */
430 int old_level
; /* saved interrupt level */
432 not_manu
= flash
[0]; /* read the normal content */
433 not_id
= flash
[1]; /* should be 'A' (0x41) and 'R' (0x52) from the "ARCH" marker */
435 /* disable interrupts, prevent any stray flash access */
436 old_level
= disable_irq_save();
438 flash
[addr1
] = 0xAA; /* enter command mode */
440 flash
[addr1
] = 0x90; /* ID command */
441 /* Atmel wants 20ms pause here */
442 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
444 manu
= flash
[0]; /* read the IDs */
447 flash
[0] = 0xF0; /* reset flash (back to normal read mode) */
448 /* Atmel wants 20ms pause here */
449 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
451 restore_irq(old_level
); /* enable interrupts again */
453 /* I assume success if the obtained values are different from
454 the normal flash content. This is not perfectly bulletproof, they
455 could theoretically be the same by chance, causing us to fail. */
456 if (not_manu
!= manu
|| not_id
!= id
) /* a value has changed */
458 *p_manufacturer
= manu
; /* return the results */
460 return true; /* success */
462 return false; /* fail */
464 #endif /* (CONFIG_CPU == SH7034 || CPU_COLDFIRE) */
468 static int perfcheck(void)
474 "orr r0, r2, #0xc0 \n" /* disable IRQ and FIQ */
477 "ldr r0, [%[timr]] \n"
478 "add r0, r0, %[tmo] \n"
480 "add %[res], %[res], #1 \n"
481 "ldr r1, [%[timr]] \n"
484 "msr CPSR_c, r2 \n" /* reset IRQ and FIQ state */
488 [timr
]"r"(&USEC_TIMER
),
490 #if CONFIG_CPU == PP5002
492 #else /* PP5020/5022/5024 */
503 #ifdef HAVE_LCD_BITMAP
504 static bool dbg_hw_info(void)
506 #if CONFIG_CPU == SH7034
508 int bitmask
= HW_MASK
;
509 int rom_version
= ROM_VERSION
;
510 unsigned manu
, id
; /* flash IDs */
511 bool got_id
; /* flag if we managed to get the flash IDs */
512 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
513 bool has_bootrom
; /* flag for boot ROM present */
514 int oldmode
; /* saved memory guard mode */
516 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
518 /* get flash ROM type */
519 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
521 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
523 /* check if the boot ROM area is a flash mirror */
524 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
525 if (has_bootrom
) /* if ROM and Flash different */
527 /* calculate CRC16 checksum of boot ROM */
528 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
531 system_memory_guard(oldmode
); /* re-enable memory guard */
533 lcd_setfont(FONT_SYSFIXED
);
536 lcd_puts(0, 0, "[Hardware info]");
538 snprintf(buf
, 32, "ROM: %d.%02d", rom_version
/100, rom_version
%100);
541 snprintf(buf
, 32, "Mask: 0x%04x", bitmask
);
545 snprintf(buf
, 32, "Flash: M=%02x D=%02x", manu
, id
);
547 snprintf(buf
, 32, "Flash: M=?? D=??"); /* unknown, sorry */
552 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
553 snprintf(buf
, 32, "Boot ROM: V1");
555 snprintf(buf
, 32, "ROMcrc: 0x%08x", rom_crc
);
559 snprintf(buf
, 32, "Boot ROM: none");
565 while (!(action_userabort(TIMEOUT_BLOCK
)));
567 #elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250
569 unsigned manu
, id
; /* flash IDs */
570 int got_id
; /* flag if we managed to get the flash IDs */
571 int oldmode
; /* saved memory guard mode */
574 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
576 /* get flash ROM type */
577 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
579 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
581 system_memory_guard(oldmode
); /* re-enable memory guard */
583 lcd_setfont(FONT_SYSFIXED
);
586 lcd_puts(0, line
++, "[Hardware info]");
589 snprintf(buf
, 32, "Flash: M=%04x D=%04x", manu
, id
);
591 snprintf(buf
, 32, "Flash: M=???? D=????"); /* unknown, sorry */
592 lcd_puts(0, line
++, buf
);
598 lcd_puts(0, ++line
, "Serial Number:");
600 got_id
= ds2411_read_id(&id
);
602 if (got_id
== DS2411_OK
)
604 snprintf(buf
, 32, " FC=%02x", (unsigned)id
.family_code
);
605 lcd_puts(0, ++line
, buf
);
606 snprintf(buf
, 32, " ID=%02X %02X %02X %02X %02X %02X",
607 (unsigned)id
.uid
[0], (unsigned)id
.uid
[1], (unsigned)id
.uid
[2],
608 (unsigned)id
.uid
[3], (unsigned)id
.uid
[4], (unsigned)id
.uid
[5]);
609 lcd_puts(0, ++line
, buf
);
610 snprintf(buf
, 32, " CRC=%02X", (unsigned)id
.crc
);
614 snprintf(buf
, 32, "READ ERR=%d", got_id
);
617 lcd_puts(0, ++line
, buf
);
623 while (!(action_userabort(TIMEOUT_BLOCK
)));
625 #elif defined(CPU_PP502x)
628 char pp_version
[] = { (PP_VER2
>> 24) & 0xff, (PP_VER2
>> 16) & 0xff,
629 (PP_VER2
>> 8) & 0xff, (PP_VER2
) & 0xff,
630 (PP_VER1
>> 24) & 0xff, (PP_VER1
>> 16) & 0xff,
631 (PP_VER1
>> 8) & 0xff, (PP_VER1
) & 0xff, '\0' };
633 lcd_setfont(FONT_SYSFIXED
);
636 lcd_puts(0, line
++, "[Hardware info]");
639 snprintf(buf
, sizeof(buf
), "HW rev: 0x%08lx", IPOD_HW_REVISION
);
640 lcd_puts(0, line
++, buf
);
644 extern int lcd_type
; /* Defined in lcd-colornano.c */
646 snprintf(buf
, sizeof(buf
), "LCD type: %d", lcd_type
);
647 lcd_puts(0, line
++, buf
);
650 snprintf(buf
, sizeof(buf
), "PP version: %s", pp_version
);
651 lcd_puts(0, line
++, buf
);
653 snprintf(buf
, sizeof(buf
), "Est. clock (kHz): %d", perfcheck());
654 lcd_puts(0, line
++, buf
);
658 while (!(action_userabort(TIMEOUT_BLOCK
)));
660 #elif CONFIG_CPU == PP5002
663 char pp_version
[] = { (PP_VER4
>> 8) & 0xff, PP_VER4
& 0xff,
664 (PP_VER3
>> 8) & 0xff, PP_VER3
& 0xff,
665 (PP_VER2
>> 8) & 0xff, PP_VER2
& 0xff,
666 (PP_VER1
>> 8) & 0xff, PP_VER1
& 0xff, '\0' };
669 lcd_setfont(FONT_SYSFIXED
);
672 lcd_puts(0, line
++, "[Hardware info]");
675 snprintf(buf
, sizeof(buf
), "HW rev: 0x%08lx", IPOD_HW_REVISION
);
676 lcd_puts(0, line
++, buf
);
679 snprintf(buf
, sizeof(buf
), "PP version: %s", pp_version
);
680 lcd_puts(0, line
++, buf
);
682 snprintf(buf
, sizeof(buf
), "Est. clock (kHz): %d", perfcheck());
683 lcd_puts(0, line
++, buf
);
687 while (!(action_userabort(TIMEOUT_BLOCK
)));
690 /* Define this function in your target tree */
691 return __dbg_hw_info();
692 #endif /* CONFIG_CPU */
693 lcd_setfont(FONT_UI
);
696 #else /* !HAVE_LCD_BITMAP */
697 static bool dbg_hw_info(void)
702 int rom_version
= ROM_VERSION
;
703 unsigned manu
, id
; /* flash IDs */
704 bool got_id
; /* flag if we managed to get the flash IDs */
705 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
706 bool has_bootrom
; /* flag for boot ROM present */
707 int oldmode
; /* saved memory guard mode */
709 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
711 /* get flash ROM type */
712 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
714 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
716 /* check if the boot ROM area is a flash mirror */
717 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
718 if (has_bootrom
) /* if ROM and Flash different */
720 /* calculate CRC16 checksum of boot ROM */
721 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
724 system_memory_guard(oldmode
); /* re-enable memory guard */
728 lcd_puts(0, 0, "[HW Info]");
734 snprintf(buf
, 32, "ROM: %d.%02d",
735 rom_version
/100, rom_version
%100);
739 snprintf(buf
, 32, "Flash:%02x,%02x", manu
, id
);
741 snprintf(buf
, 32, "Flash:??,??"); /* unknown, sorry */
746 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
747 snprintf(buf
, 32, "BootROM: V1");
748 else if (rom_crc
== 0x358099E8)
749 snprintf(buf
, 32, "BootROM: V2");
750 /* alternative boot ROM found in one single player so far */
752 snprintf(buf
, 32, "R: %08x", rom_crc
);
755 snprintf(buf
, 32, "BootROM: no");
761 button
= get_action(CONTEXT_SETTINGS
,TIMEOUT_BLOCK
);
765 case ACTION_STD_CANCEL
:
768 case ACTION_SETTINGS_DEC
:
774 case ACTION_SETTINGS_INC
:
783 #endif /* !HAVE_LCD_BITMAP */
784 #endif /* !SIMULATOR */
787 static const char* dbg_partitions_getname(int selected_item
, void *data
,
788 char *buffer
, size_t buffer_len
)
791 int partition
= selected_item
/2;
792 struct partinfo
* p
= disk_partinfo(partition
);
795 snprintf(buffer
, buffer_len
, " T:%x %ld MB", p
->type
, p
->size
/ 2048);
799 snprintf(buffer
, buffer_len
, "P%d: S:%lx", partition
, p
->start
);
804 bool dbg_partitions(void)
806 struct simplelist_info info
;
807 simplelist_info_init(&info
, "Partition Info", 4, NULL
);
808 info
.selection_size
= 2;
809 info
.hide_selection
= true;
810 info
.scroll_all
= true;
811 info
.get_name
= dbg_partitions_getname
;
812 return simplelist_show_list(&info
);
816 #if defined(CPU_COLDFIRE) && defined(HAVE_SPDIF_OUT)
817 static bool dbg_spdif(void)
821 unsigned int control
;
826 unsigned int interruptstat
;
827 bool valnogood
, symbolerr
, parityerr
;
830 int spdif_source
= spdif_get_output_source(&spdif_src_on
);
831 spdif_set_output_source(AUDIO_SRC_SPDIF
IF_SPDIF_POWER_(, true));
834 lcd_setfont(FONT_SYSFIXED
);
836 #ifdef HAVE_SPDIF_POWER
837 spdif_power_enable(true); /* We need SPDIF power for both sending & receiving */
844 control
= EBU1RCVCCHANNEL1
;
845 interruptstat
= INTERRUPTSTAT
;
846 INTERRUPTCLEAR
= 0x03c00000;
848 valnogood
= (interruptstat
& 0x01000000)?true:false;
849 symbolerr
= (interruptstat
& 0x00800000)?true:false;
850 parityerr
= (interruptstat
& 0x00400000)?true:false;
852 snprintf(buf
, sizeof(buf
), "Val: %s Sym: %s Par: %s",
855 parityerr
?"--":"OK");
856 lcd_puts(0, line
++, buf
);
858 snprintf(buf
, sizeof(buf
), "Status word: %08x", (int)control
);
859 lcd_puts(0, line
++, buf
);
864 snprintf(buf
, sizeof(buf
), "PRO: %d (%s)",
865 x
, x
?"Professional":"Consumer");
866 lcd_puts(0, line
++, buf
);
868 x
= (control
>> 30) & 1;
869 snprintf(buf
, sizeof(buf
), "Audio: %d (%s)",
870 x
, x
?"Non-PCM":"PCM");
871 lcd_puts(0, line
++, buf
);
873 x
= (control
>> 29) & 1;
874 snprintf(buf
, sizeof(buf
), "Copy: %d (%s)",
875 x
, x
?"Permitted":"Inhibited");
876 lcd_puts(0, line
++, buf
);
878 x
= (control
>> 27) & 7;
891 snprintf(buf
, sizeof(buf
), "Preemphasis: %d (%s)", x
, s
);
892 lcd_puts(0, line
++, buf
);
894 x
= (control
>> 24) & 3;
895 snprintf(buf
, sizeof(buf
), "Mode: %d", x
);
896 lcd_puts(0, line
++, buf
);
898 category
= (control
>> 17) & 127;
910 snprintf(buf
, sizeof(buf
), "Category: 0x%02x (%s)", category
, s
);
911 lcd_puts(0, line
++, buf
);
913 x
= (control
>> 16) & 1;
915 if(((category
& 0x70) == 0x10) ||
916 ((category
& 0x70) == 0x40) ||
917 ((category
& 0x78) == 0x38))
919 generation
= !generation
;
921 snprintf(buf
, sizeof(buf
), "Generation: %d (%s)",
922 x
, generation
?"Original":"No ind.");
923 lcd_puts(0, line
++, buf
);
925 x
= (control
>> 12) & 15;
926 snprintf(buf
, sizeof(buf
), "Source: %d", x
);
927 lcd_puts(0, line
++, buf
);
929 x
= (control
>> 8) & 15;
945 snprintf(buf
, sizeof(buf
), "Channel: %d (%s)", x
, s
);
946 lcd_puts(0, line
++, buf
);
948 x
= (control
>> 4) & 15;
961 snprintf(buf
, sizeof(buf
), "Frequency: %d (%s)", x
, s
);
962 lcd_puts(0, line
++, buf
);
964 x
= (control
>> 2) & 3;
965 snprintf(buf
, sizeof(buf
), "Clock accuracy: %d", x
);
966 lcd_puts(0, line
++, buf
);
970 snprintf(buf
, sizeof(buf
), "Measured freq: %ldHz",
971 spdif_measure_frequency());
972 lcd_puts(0, line
++, buf
);
977 if (action_userabort(HZ
/10))
981 spdif_set_output_source(spdif_source
IF_SPDIF_POWER_(, spdif_src_on
));
983 #ifdef HAVE_SPDIF_POWER
984 spdif_power_enable(global_settings
.spdif_enable
);
987 lcd_setfont(FONT_UI
);
990 #endif /* CPU_COLDFIRE */
993 #ifdef HAVE_LCD_BITMAP
994 /* button definitions */
995 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
996 (CONFIG_KEYPAD == IRIVER_H300_PAD)
997 # define DEBUG_CANCEL BUTTON_OFF
999 #elif CONFIG_KEYPAD == RECORDER_PAD
1000 # define DEBUG_CANCEL BUTTON_OFF
1002 #elif CONFIG_KEYPAD == ONDIO_PAD
1003 # define DEBUG_CANCEL BUTTON_MENU
1005 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || \
1006 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
1007 (CONFIG_KEYPAD == IPOD_4G_PAD)
1008 # define DEBUG_CANCEL BUTTON_MENU
1010 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
1011 # define DEBUG_CANCEL BUTTON_PLAY
1013 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
1014 # define DEBUG_CANCEL BUTTON_REC
1016 #elif (CONFIG_KEYPAD == IAUDIO_M3_PAD)
1017 # define DEBUG_CANCEL BUTTON_RC_REC
1019 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
1020 # define DEBUG_CANCEL BUTTON_REW
1022 #elif (CONFIG_KEYPAD == MROBE100_PAD)
1023 # define DEBUG_CANCEL BUTTON_MENU
1025 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
1026 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
1027 (CONFIG_KEYPAD == SANSA_FUZE_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';
1523 static const char* tsc2100_debug_getname(int selected_item
, void * data
,
1524 char *buffer
, size_t buffer_len
)
1526 int *page
= (int*)data
;
1527 bool reserved
= false;
1531 if ((selected_item
> 0x0a) ||
1532 (selected_item
== 0x04) ||
1533 (selected_item
== 0x08))
1537 if ((selected_item
> 0x05) ||
1538 (selected_item
== 0x02))
1542 if (selected_item
> 0x1e)
1547 snprintf(buffer
, buffer_len
, "%02x: RESERVED", selected_item
);
1549 snprintf(buffer
, buffer_len
, "%02x: %s", selected_item
,
1550 itob(tsc2100_readreg(*page
, selected_item
)&0xffff,16));
1553 static int tsc2100debug_action_callback(int action
, struct gui_synclist
*lists
)
1555 int *page
= (int*)lists
->data
;
1556 if (action
== ACTION_STD_OK
)
1558 *page
= (*page
+1)%3;
1559 snprintf(lists
->title
, 32,
1560 "tsc2100 registers - Page %d", *page
);
1561 return ACTION_REDRAW
;
1565 static bool tsc2100_debug(void)
1568 char title
[32] = "tsc2100 registers - Page 0";
1569 struct simplelist_info info
;
1570 simplelist_info_init(&info
, title
, 32, &page
);
1571 info
.timeout
= HZ
/100;
1572 info
.get_name
= tsc2100_debug_getname
;
1573 info
.action_callback
= tsc2100debug_action_callback
;
1574 return simplelist_show_list(&info
);
1578 #ifdef HAVE_LCD_BITMAP
1580 * view_battery() shows a automatically scaled graph of the battery voltage
1581 * over time. Usable for estimating battery life / charging rate.
1582 * The power_history array is updated in power_thread of powermgmt.c.
1585 #define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN)
1586 #define BAT_YSPACE (LCD_HEIGHT - 20)
1588 static bool view_battery(void)
1592 unsigned short maxv
, minv
;
1595 lcd_setfont(FONT_SYSFIXED
);
1599 lcd_clear_display();
1601 case 0: /* voltage history graph */
1602 /* Find maximum and minimum voltage for scaling */
1603 minv
= power_history
[0];
1605 for (i
= 1; i
< BAT_LAST_VAL
&& power_history
[i
]; i
++) {
1606 if (power_history
[i
] > maxv
)
1607 maxv
= power_history
[i
];
1608 if (power_history
[i
] < minv
)
1609 minv
= power_history
[i
];
1612 snprintf(buf
, 30, "Battery %d.%03d", power_history
[0] / 1000,
1613 power_history
[0] % 1000);
1614 lcd_puts(0, 0, buf
);
1615 snprintf(buf
, 30, "scale %d.%03d-%d.%03dV",
1616 minv
/ 1000, minv
% 1000, maxv
/ 1000, maxv
% 1000);
1617 lcd_puts(0, 1, buf
);
1620 for (i
= BAT_LAST_VAL
- 1; i
>= 0; i
--) {
1621 y
= (power_history
[i
] - minv
) * BAT_YSPACE
/ (maxv
- minv
);
1622 lcd_set_drawmode(DRMODE_SOLID
|DRMODE_INVERSEVID
);
1623 lcd_vline(x
, LCD_HEIGHT
-1, 20);
1624 lcd_set_drawmode(DRMODE_SOLID
);
1625 lcd_vline(x
, LCD_HEIGHT
-1,
1626 MIN(MAX(LCD_HEIGHT
-1 - y
, 20), LCD_HEIGHT
-1));
1632 case 1: /* status: */
1633 lcd_puts(0, 0, "Power status:");
1635 battery_read_info(&y
, NULL
);
1636 snprintf(buf
, 30, "Battery: %d.%03d V", y
/ 1000, y
% 1000);
1637 lcd_puts(0, 1, buf
);
1638 #ifdef ADC_EXT_POWER
1639 y
= (adc_read(ADC_EXT_POWER
) * EXT_SCALE_FACTOR
) / 1000;
1640 snprintf(buf
, 30, "External: %d.%03d V", y
/ 1000, y
% 1000);
1641 lcd_puts(0, 2, buf
);
1644 #if defined ARCHOS_RECORDER
1645 snprintf(buf
, 30, "Chgr: %s %s",
1646 charger_inserted() ? "present" : "absent",
1647 charger_enabled() ? "on" : "off");
1648 lcd_puts(0, 3, buf
);
1649 snprintf(buf
, 30, "short delta: %d", short_delta
);
1650 lcd_puts(0, 5, buf
);
1651 snprintf(buf
, 30, "long delta: %d", long_delta
);
1652 lcd_puts(0, 6, buf
);
1653 lcd_puts(0, 7, power_message
);
1654 snprintf(buf
, 30, "USB Inserted: %s",
1655 usb_inserted() ? "yes" : "no");
1656 lcd_puts(0, 8, buf
);
1657 #elif defined IRIVER_H300_SERIES
1658 snprintf(buf
, 30, "USB Charging Enabled: %s",
1659 usb_charging_enabled() ? "yes" : "no");
1660 lcd_puts(0, 9, buf
);
1661 #elif defined IPOD_NANO || defined IPOD_VIDEO
1662 int usb_pwr
= (GPIOL_INPUT_VAL
& 0x10)?true:false;
1663 int ext_pwr
= (GPIOL_INPUT_VAL
& 0x08)?false:true;
1664 int dock
= (GPIOA_INPUT_VAL
& 0x10)?true:false;
1665 int charging
= (GPIOB_INPUT_VAL
& 0x01)?false:true;
1666 int headphone
= (GPIOA_INPUT_VAL
& 0x80)?true:false;
1668 snprintf(buf
, 30, "USB pwr: %s",
1669 usb_pwr
? "present" : "absent");
1670 lcd_puts(0, 3, buf
);
1671 snprintf(buf
, 30, "EXT pwr: %s",
1672 ext_pwr
? "present" : "absent");
1673 lcd_puts(0, 4, buf
);
1674 snprintf(buf
, 30, "Battery: %s",
1675 charging
? "charging" : (usb_pwr
||ext_pwr
) ? "charged" : "discharging");
1676 lcd_puts(0, 5, buf
);
1677 snprintf(buf
, 30, "Dock mode: %s",
1678 dock
? "enabled" : "disabled");
1679 lcd_puts(0, 6, buf
);
1680 snprintf(buf
, 30, "Headphone: %s",
1681 headphone
? "connected" : "disconnected");
1682 lcd_puts(0, 7, buf
);
1683 #elif defined TOSHIBA_GIGABEAT_S
1687 static const unsigned char * const chrgstate_strings
[] =
1698 snprintf(buf
, 30, "Charger: %s",
1699 charger_inserted() ? "present" : "absent");
1700 lcd_puts(0, line
++, buf
);
1702 st
= power_input_status() &
1703 (POWER_INPUT_CHARGER
| POWER_INPUT_BATTERY
);
1704 snprintf(buf
, 30, "%s%s",
1705 (st
& POWER_INPUT_MAIN_CHARGER
) ? " Main" : "",
1706 (st
& POWER_INPUT_USB_CHARGER
) ? " USB" : "");
1707 lcd_puts(0, line
++, buf
);
1709 snprintf(buf
, 30, "IUSB Max: %d", usb_allowed_current());
1710 lcd_puts(0, line
++, buf
);
1712 y
= ARRAYLEN(chrgstate_strings
) - 1;
1714 switch (charge_state
)
1716 case CHARGE_STATE_DISABLED
: y
--;
1717 case CHARGE_STATE_ERROR
: y
--;
1718 case DISCHARGING
: y
--;
1725 snprintf(buf
, 30, "State: %s", chrgstate_strings
[y
]);
1726 lcd_puts(0, line
++, buf
);
1728 snprintf(buf
, 30, "Battery Switch: %s",
1729 (st
& POWER_INPUT_BATTERY
) ? "On" : "Off");
1730 lcd_puts(0, line
++, buf
);
1732 y
= chrgraw_adc_voltage();
1733 snprintf(buf
, 30, "CHRGRAW: %d.%03d V",
1734 y
/ 1000, y
% 1000);
1735 lcd_puts(0, line
++, buf
);
1737 y
= application_supply_adc_voltage();
1738 snprintf(buf
, 30, "BP : %d.%03d V",
1739 y
/ 1000, y
% 1000);
1740 lcd_puts(0, line
++, buf
);
1742 y
= battery_adc_charge_current();
1743 if (y
< 0) x
= '-', y
= -y
;
1745 snprintf(buf
, 30, "CHRGISN:%c%d mA", x
, y
);
1746 lcd_puts(0, line
++, buf
);
1748 y
= cccv_regulator_dissipation();
1749 snprintf(buf
, 30, "P CCCV : %d mW", y
);
1750 lcd_puts(0, line
++, buf
);
1752 y
= battery_charge_current();
1753 if (y
< 0) x
= '-', y
= -y
;
1755 snprintf(buf
, 30, "I Charge:%c%d mA", x
, y
);
1756 lcd_puts(0, line
++, buf
);
1758 y
= battery_adc_temp();
1761 snprintf(buf
, 30, "T Battery: %dC (%dF)", y
,
1764 /* Conversion disabled */
1765 snprintf(buf
, 30, "T Battery: ?");
1768 lcd_puts(0, line
++, buf
);
1769 #elif defined(SANSA_E200) || defined(SANSA_C200) || defined(SANSA_CLIP) || defined(SANSA_FUZE)
1770 const int first
= CHARGE_STATE_DISABLED
;
1771 static const char * const chrgstate_strings
[] =
1773 [CHARGE_STATE_DISABLED
-first
] = "Disabled",
1774 [CHARGE_STATE_ERROR
-first
] = "Error",
1775 [DISCHARGING
-first
] = "Discharging",
1776 [CHARGING
-first
] = "Charging",
1778 const char *str
= NULL
;
1780 snprintf(buf
, 30, "Charger: %s",
1781 charger_inserted() ? "present" : "absent");
1782 lcd_puts(0, 3, buf
);
1784 y
= charge_state
- first
;
1785 if ((unsigned)y
< ARRAYLEN(chrgstate_strings
))
1786 str
= chrgstate_strings
[y
];
1788 snprintf(buf
, sizeof(buf
), "State: %s",
1789 str
? str
: "<unknown>");
1790 lcd_puts(0, 4, buf
);
1792 snprintf(buf
, sizeof(buf
), "CHARGER: %02X",
1793 ascodec_read(AS3514_CHARGER
));
1794 lcd_puts(0, 5, buf
);
1796 snprintf(buf
, 30, "Charger: %s",
1797 charger_inserted() ? "present" : "absent");
1798 lcd_puts(0, 3, buf
);
1799 #endif /* target type */
1800 #endif /* CONFIG_CHARGING */
1803 case 2: /* voltage deltas: */
1804 lcd_puts(0, 0, "Voltage deltas:");
1806 for (i
= 0; i
<= 6; i
++) {
1807 y
= power_history
[i
] - power_history
[i
+1];
1808 snprintf(buf
, 30, "-%d min: %s%d.%03d V", i
,
1809 (y
< 0) ? "-" : "", ((y
< 0) ? y
* -1 : y
) / 1000,
1810 ((y
< 0) ? y
* -1 : y
) % 1000);
1811 lcd_puts(0, i
+1, buf
);
1815 case 3: /* remaining time estimation: */
1817 #ifdef ARCHOS_RECORDER
1818 snprintf(buf
, 30, "charge_state: %d", charge_state
);
1819 lcd_puts(0, 0, buf
);
1821 snprintf(buf
, 30, "Cycle time: %d m", powermgmt_last_cycle_startstop_min
);
1822 lcd_puts(0, 1, buf
);
1824 snprintf(buf
, 30, "Lvl@cyc st: %d%%", powermgmt_last_cycle_level
);
1825 lcd_puts(0, 2, buf
);
1827 snprintf(buf
, 30, "P=%2d I=%2d", pid_p
, pid_i
);
1828 lcd_puts(0, 3, buf
);
1830 snprintf(buf
, 30, "Trickle sec: %d/60", trickle_sec
);
1831 lcd_puts(0, 4, buf
);
1832 #endif /* ARCHOS_RECORDER */
1834 snprintf(buf
, 30, "Last PwrHist: %d.%03dV",
1835 power_history
[0] / 1000,
1836 power_history
[0] % 1000);
1837 lcd_puts(0, 5, buf
);
1839 snprintf(buf
, 30, "battery level: %d%%", battery_level());
1840 lcd_puts(0, 6, buf
);
1842 snprintf(buf
, 30, "Est. remain: %d m", battery_time());
1843 lcd_puts(0, 7, buf
);
1849 switch(get_action(CONTEXT_STD
,HZ
/2))
1851 case ACTION_STD_PREV
:
1856 case ACTION_STD_NEXT
:
1861 case ACTION_STD_CANCEL
:
1862 lcd_setfont(FONT_UI
);
1866 lcd_setfont(FONT_UI
);
1870 #endif /* HAVE_LCD_BITMAP */
1874 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1876 #if (CONFIG_STORAGE & STORAGE_MMC)
1877 #define CARDTYPE "MMC"
1878 #elif (CONFIG_STORAGE & STORAGE_SD)
1879 #define CARDTYPE "microSD"
1882 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1885 int *cardnum
= (int*)lists
->data
;
1886 unsigned char card_name
[7];
1887 unsigned char pbuf
[32];
1888 char *title
= lists
->title
;
1889 static const unsigned char i_vmin
[] = { 0, 1, 5, 10, 25, 35, 60, 100 };
1890 static const unsigned char i_vmax
[] = { 1, 5, 10, 25, 35, 45, 80, 200 };
1891 static const unsigned char *kbit_units
[] = { "kBit/s", "MBit/s", "GBit/s" };
1892 static const unsigned char *nsec_units
[] = { "ns", "µs", "ms" };
1893 #if (CONFIG_STORAGE & STORAGE_MMC)
1894 static const char *mmc_spec_vers
[] = { "1.0-1.2", "1.4", "2.0-2.2",
1895 "3.1-3.31", "4.0" };
1898 if ((btn
== ACTION_STD_OK
) || (btn
== SYS_FS_CHANGED
) || (btn
== ACTION_REDRAW
))
1901 if (btn
== ACTION_STD_OK
)
1903 *cardnum
^= 0x1; /* change cards */
1907 simplelist_set_line_count(0);
1909 card
= card_get_info(*cardnum
);
1911 if (card
->initialized
> 0)
1913 strlcpy(card_name
, ((unsigned char*)card
->cid
) + 3, sizeof(card_name
));
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();
2543 if(strlen(str
) > LCD_WIDTH
/SYSFONT_WIDTH
)
2544 lcd_puts_scroll(0, j
, str
);
2554 switch(get_action(CONTEXT_STD
,TIMEOUT_BLOCK
))
2557 case ACTION_STD_PREV
:
2558 case ACTION_STD_NEXT
:
2561 case ACTION_STD_CANCEL
:
2568 get_action(CONTEXT_STD
,TIMEOUT_BLOCK
);
2569 lcd_setfont(FONT_UI
);
2574 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2575 extern bool wheel_is_touched
;
2576 extern int old_wheel_value
;
2577 extern int new_wheel_value
;
2578 extern int wheel_delta
;
2579 extern unsigned int accumulated_wheel_delta
;
2580 extern unsigned int wheel_velocity
;
2582 static bool dbg_scrollwheel(void)
2587 lcd_setfont(FONT_SYSFIXED
);
2591 if (action_userabort(HZ
/10))
2594 lcd_clear_display();
2596 /* show internal variables of scrollwheel driver */
2597 snprintf(buf
, sizeof(buf
), "wheel touched: %s", (wheel_is_touched
) ? "true" : "false");
2598 lcd_puts(0, 0, buf
);
2599 snprintf(buf
, sizeof(buf
), "new position: %2d", new_wheel_value
);
2600 lcd_puts(0, 1, buf
);
2601 snprintf(buf
, sizeof(buf
), "old position: %2d", old_wheel_value
);
2602 lcd_puts(0, 2, buf
);
2603 snprintf(buf
, sizeof(buf
), "wheel delta: %2d", wheel_delta
);
2604 lcd_puts(0, 3, buf
);
2605 snprintf(buf
, sizeof(buf
), "accumulated delta: %2d", accumulated_wheel_delta
);
2606 lcd_puts(0, 4, buf
);
2607 snprintf(buf
, sizeof(buf
), "velo [deg/s]: %4d", (int)wheel_velocity
);
2608 lcd_puts(0, 5, buf
);
2610 /* show effective accelerated scrollspeed */
2611 speed
= button_apply_acceleration( (1<<31)|(1<<24)|wheel_velocity
);
2612 snprintf(buf
, sizeof(buf
), "accel. speed: %4d", speed
);
2613 lcd_puts(0, 6, buf
);
2617 lcd_setfont(FONT_UI
);
2622 #if defined (HAVE_USBSTACK)
2624 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2625 static bool toggle_usb_core_driver(int driver
, char *msg
)
2627 bool enabled
= !usb_core_driver_enabled(driver
);
2629 usb_core_enable_driver(driver
,enabled
);
2630 splashf(HZ
, "%s %s", msg
, enabled
?"enabled":"disabled");
2635 static bool toggle_usb_serial(void)
2637 return toggle_usb_core_driver(USB_DRIVER_SERIAL
,"USB Serial");
2643 #if CONFIG_USBOTG == USBOTG_ISP1583
2644 extern int dbg_usb_num_items(void);
2645 extern const char* dbg_usb_item(int selected_item
, void *data
,
2646 char *buffer
, size_t buffer_len
);
2648 static int isp1583_action_callback(int action
, struct gui_synclist
*lists
)
2651 if (action
== ACTION_NONE
)
2652 action
= ACTION_REDRAW
;
2656 static bool dbg_isp1583(void)
2658 struct simplelist_info isp1583
;
2659 isp1583
.scroll_all
= true;
2660 simplelist_info_init(&isp1583
, "ISP1583", dbg_usb_num_items(), NULL
);
2661 isp1583
.timeout
= HZ
/100;
2662 isp1583
.hide_selection
= true;
2663 isp1583
.get_name
= dbg_usb_item
;
2664 isp1583
.action_callback
= isp1583_action_callback
;
2665 return simplelist_show_list(&isp1583
);
2669 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2670 extern int pic_dbg_num_items(void);
2671 extern const char* pic_dbg_item(int selected_item
, void *data
,
2672 char *buffer
, size_t buffer_len
);
2674 static int pic_action_callback(int action
, struct gui_synclist
*lists
)
2677 if (action
== ACTION_NONE
)
2678 action
= ACTION_REDRAW
;
2682 static bool dbg_pic(void)
2684 struct simplelist_info pic
;
2685 pic
.scroll_all
= true;
2686 simplelist_info_init(&pic
, "PIC", pic_dbg_num_items(), NULL
);
2687 pic
.timeout
= HZ
/100;
2688 pic
.hide_selection
= true;
2689 pic
.get_name
= pic_dbg_item
;
2690 pic
.action_callback
= pic_action_callback
;
2691 return simplelist_show_list(&pic
);
2696 /****** The menu *********/
2697 struct the_menu_item
{
2698 unsigned char *desc
; /* string or ID */
2699 bool (*function
) (void); /* return true if USB was connected */
2701 static const struct the_menu_item menuitems
[] = {
2702 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || \
2703 (defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD))
2704 { "Dump ROM contents", dbg_save_roms
},
2706 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || defined(CPU_PP) \
2707 || CONFIG_CPU == S3C2440 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 \
2708 || CONFIG_CPU == DM320
2709 { "View I/O ports", dbg_ports
},
2711 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
2712 { "View PCF registers", dbg_pcf
},
2714 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
2715 { "TSC2100 debug", tsc2100_debug
},
2717 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2718 { "CPU frequency", dbg_cpufreq
},
2720 #if defined(IRIVER_H100_SERIES) && !defined(SIMULATOR)
2721 { "S/PDIF analyzer", dbg_spdif
},
2723 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2724 { "Catch mem accesses", dbg_set_memory_guard
},
2726 { "View OS stacks", dbg_os
},
2727 #ifdef HAVE_LCD_BITMAP
2729 { "View battery", view_battery
},
2731 { "Screendump", dbg_screendump
},
2734 { "View HW info", dbg_hw_info
},
2737 { "View partitions", dbg_partitions
},
2740 { "View disk info", dbg_disk_info
},
2741 #if (CONFIG_STORAGE & STORAGE_ATA)
2742 { "Dump ATA identify info", dbg_identify_info
},
2745 #ifdef HAVE_DIRCACHE
2746 { "View dircache info", dbg_dircache_info
},
2748 #ifdef HAVE_TAGCACHE
2749 { "View database info", dbg_tagcache_info
},
2751 #ifdef HAVE_LCD_BITMAP
2752 #if CONFIG_CODEC == SWCODEC
2753 { "View buffering thread", dbg_buffering_thread
},
2754 #elif !defined(SIMULATOR)
2755 { "View audio thread", dbg_audio_thread
},
2758 { "pm histogram", peak_meter_histogram
},
2759 #endif /* PM_DEBUG */
2760 #endif /* HAVE_LCD_BITMAP */
2763 { "FM Radio", dbg_fm_radio
},
2766 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2767 { "Write back EEPROM", dbg_write_eeprom
},
2769 #if CONFIG_USBOTG == USBOTG_ISP1583
2770 { "View ISP1583 info", dbg_isp1583
},
2772 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2773 { "View PIC info", dbg_pic
},
2775 #ifdef ROCKBOX_HAS_LOGF
2776 {"logf", logfdisplay
},
2777 {"logfdump", logfdump
},
2779 #if defined(HAVE_USBSTACK)
2780 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2781 {"USB Serial driver (logf)", toggle_usb_serial
},
2783 #endif /* HAVE_USBSTACK */
2784 #ifdef CPU_BOOST_LOGGING
2785 {"cpu_boost log",cpu_boost_log
},
2787 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2788 {"Debug scrollwheel", dbg_scrollwheel
},
2791 static int menu_action_callback(int btn
, struct gui_synclist
*lists
)
2793 if (btn
== ACTION_STD_OK
)
2795 int oldbars
= viewportmanager_set_statusbar(VP_SB_HIDE_ALL
);
2796 menuitems
[gui_synclist_get_sel_pos(lists
)].function();
2797 btn
= ACTION_REDRAW
;
2798 send_event(GUI_EVENT_REFRESH
, NULL
);
2799 viewportmanager_set_statusbar(oldbars
);
2804 static const char* dbg_menu_getname(int item
, void * data
,
2805 char *buffer
, size_t buffer_len
)
2807 (void)data
; (void)buffer
; (void)buffer_len
;
2808 return menuitems
[item
].desc
;
2811 bool debug_menu(void)
2813 struct simplelist_info info
;
2815 simplelist_info_init(&info
, "Debug Menu", ARRAYLEN(menuitems
), NULL
);
2816 info
.action_callback
= menu_action_callback
;
2817 info
.get_name
= dbg_menu_getname
;
2818 return simplelist_show_list(&info
);