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"
35 #include "powermgmt.h"
39 #include "mp3_playback.h"
42 #include "statusbar.h"
53 #include "lcd-remote.h"
65 #include "eeprom_24cxx.h"
66 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
69 #if (CONFIG_STORAGE & STORAGE_ATA)
78 #ifdef HAVE_LCD_BITMAP
79 #include "scrollbar.h"
80 #include "peakmeter.h"
83 #if CONFIG_CODEC == SWCODEC
85 #include "buffering.h"
87 #if defined(HAVE_SPDIF_OUT) || defined(HAVE_SPDIF_IN)
91 #ifdef IRIVER_H300_SERIES
92 #include "pcf50606.h" /* for pcf50606_read */
99 #if CONFIG_RTC == RTC_PCF50605
100 #include "pcf50605.h"
102 #include "appevents.h"
104 #if CONFIG_CPU == DM320 || CONFIG_CPU == S3C2440 || CONFIG_CPU == TCC7801 \
105 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 || CONFIG_CPU == JZ4732 \
106 || defined(CPU_S5L870X) || CONFIG_CPU == AS3525v2
107 #include "debug-target.h"
110 #if defined(SANSA_E200) || defined(SANSA_C200) || defined(PHILIPS_SA9200) \
111 || (CONFIG_CPU == AS3525 && defined(CONFIG_CHARGING)) \
112 || CONFIG_CPU == AS3525v2
118 #include "pmu-target.h"
122 #include "usb_core.h"
125 /*---------------------------------------------------*/
126 /* SPECIAL DEBUG STUFF */
127 /*---------------------------------------------------*/
128 extern struct thread_entry threads
[MAXTHREADS
];
130 static char thread_status_char(unsigned status
)
132 static const char thread_status_chars
[THREAD_NUM_STATES
+1] =
134 [0 ... THREAD_NUM_STATES
] = '?',
135 [STATE_RUNNING
] = 'R',
136 [STATE_BLOCKED
] = 'B',
137 [STATE_SLEEPING
] = 'S',
138 [STATE_BLOCKED_W_TMO
] = 'T',
139 [STATE_FROZEN
] = 'F',
140 [STATE_KILLED
] = 'K',
143 if (status
> THREAD_NUM_STATES
)
144 status
= THREAD_NUM_STATES
;
146 return thread_status_chars
[status
];
149 static const char* threads_getname(int selected_item
, void *data
,
150 char *buffer
, size_t buffer_len
)
153 struct thread_entry
*thread
;
157 if (selected_item
< (int)NUM_CORES
)
159 snprintf(buffer
, buffer_len
, "Idle (%d): %2d%%", selected_item
,
160 idle_stack_usage(selected_item
));
164 selected_item
-= NUM_CORES
;
167 thread
= &threads
[selected_item
];
169 if (thread
->state
== STATE_KILLED
)
171 snprintf(buffer
, buffer_len
, "%2d: ---", selected_item
);
175 thread_get_name(name
, 32, thread
);
177 snprintf(buffer
, buffer_len
,
178 "%2d: " IF_COP("(%d) ") "%c%c " IF_PRIO("%d %d ") "%2d%% %s",
180 IF_COP(thread
->core
,)
181 #ifdef HAVE_SCHEDULER_BOOSTCTRL
182 (thread
->cpu_boost
) ? '+' :
184 ((thread
->state
== STATE_RUNNING
) ? '*' : ' '),
185 thread_status_char(thread
->state
),
186 IF_PRIO(thread
->base_priority
, thread
->priority
, )
187 thread_stack_usage(thread
), name
);
192 static int dbg_threads_action_callback(int action
, struct gui_synclist
*lists
)
195 #ifdef ROCKBOX_HAS_LOGF
196 if (action
== ACTION_STD_OK
)
198 int selpos
= gui_synclist_get_sel_pos(lists
);
200 if (selpos
>= NUM_CORES
)
201 remove_thread(threads
[selpos
- NUM_CORES
].id
);
203 remove_thread(threads
[selpos
].id
);
205 return ACTION_REDRAW
;
207 #endif /* ROCKBOX_HAS_LOGF */
208 if (action
== ACTION_NONE
)
209 action
= ACTION_REDRAW
;
213 static bool dbg_os(void)
215 struct simplelist_info info
;
216 simplelist_info_init(&info
, IF_COP("Core and ") "Stack usage:",
220 MAXTHREADS
+NUM_CORES
,
223 #ifndef ROCKBOX_HAS_LOGF
224 info
.hide_selection
= true;
225 info
.scroll_all
= true;
227 info
.action_callback
= dbg_threads_action_callback
;
228 info
.get_name
= threads_getname
;
229 return simplelist_show_list(&info
);
232 #ifdef HAVE_LCD_BITMAP
233 #if CONFIG_CODEC != SWCODEC
235 static bool dbg_audio_thread(void)
237 struct audio_debug d
;
239 lcd_setfont(FONT_SYSFIXED
);
243 if (action_userabort(HZ
/5))
246 audio_get_debugdata(&d
);
250 lcd_putsf(0, 0, "read: %x", d
.audiobuf_read
);
251 lcd_putsf(0, 1, "write: %x", d
.audiobuf_write
);
252 lcd_putsf(0, 2, "swap: %x", d
.audiobuf_swapwrite
);
253 lcd_putsf(0, 3, "playing: %d", d
.playing
);
254 lcd_putsf(0, 4, "playable: %x", d
.playable_space
);
255 lcd_putsf(0, 5, "unswapped: %x", d
.unswapped_space
);
257 /* Playable space left */
258 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8, 112, 4, d
.audiobuflen
, 0,
259 d
.playable_space
, HORIZONTAL
);
261 /* Show the watermark limit */
262 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8+4, 112, 4, d
.audiobuflen
, 0,
263 d
.low_watermark_level
, HORIZONTAL
);
265 lcd_putsf(0, 7, "wm: %x - %x",
266 d
.low_watermark_level
, d
.lowest_watermark_level
);
270 lcd_setfont(FONT_UI
);
273 #endif /* !SIMULATOR */
274 #else /* CONFIG_CODEC == SWCODEC */
275 static unsigned int ticks
, boost_ticks
, freq_sum
;
277 static void dbg_audio_task(void)
280 if(FREQ
> CPUFREQ_NORMAL
)
282 freq_sum
+= FREQ
/1000000; /* in MHz */
287 static bool dbg_buffering_thread(void)
293 size_t bufsize
= pcmbuf_get_bufsize();
294 int pcmbufdescs
= pcmbuf_descs();
295 struct buffering_debug d
;
296 size_t filebuflen
= audio_get_filebuflen();
297 /* This is a size_t, but call it a long so it puts a - when it's bad. */
299 ticks
= boost_ticks
= freq_sum
= 0;
301 tick_add_task(dbg_audio_task
);
304 screens
[i
].setfont(FONT_SYSFIXED
);
308 button
= get_action(CONTEXT_STD
,HZ
/5);
311 case ACTION_STD_NEXT
:
314 case ACTION_STD_PREV
:
317 case ACTION_STD_CANCEL
:
322 buffering_get_debugdata(&d
);
323 bufused
= bufsize
- pcmbuf_free();
328 screens
[i
].clear_display();
331 screens
[i
].putsf(0, line
++, "pcm: %6ld/%ld", (long) bufused
, (long) bufsize
);
333 gui_scrollbar_draw(&screens
[i
],0, line
*8, screens
[i
].lcdwidth
, 6,
334 bufsize
, 0, bufused
, HORIZONTAL
);
337 screens
[i
].putsf(0, line
++, "alloc: %6ld/%ld", audio_filebufused(),
340 #if LCD_HEIGHT > 80 || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_HEIGHT > 80)
341 if (screens
[i
].lcdheight
> 80)
343 gui_scrollbar_draw(&screens
[i
],0, line
*8, screens
[i
].lcdwidth
, 6,
344 filebuflen
, 0, audio_filebufused(), HORIZONTAL
);
347 screens
[i
].putsf(0, line
++, "real: %6ld/%ld", (long)d
.buffered_data
,
350 gui_scrollbar_draw(&screens
[i
],0, line
*8, screens
[i
].lcdwidth
, 6,
351 filebuflen
, 0, (long)d
.buffered_data
, HORIZONTAL
);
356 screens
[i
].putsf(0, line
++, "usefl: %6ld/%ld", (long)(d
.useful_data
),
359 #if LCD_HEIGHT > 80 || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_HEIGHT > 80)
360 if (screens
[i
].lcdheight
> 80)
362 gui_scrollbar_draw(&screens
[i
],0, line
*8, screens
[i
].lcdwidth
, 6,
363 filebuflen
, 0, d
.useful_data
, HORIZONTAL
);
368 screens
[i
].putsf(0, line
++, "data_rem: %ld", (long)d
.data_rem
);
370 screens
[i
].putsf(0, line
++, "track count: %2d", audio_track_count());
372 screens
[i
].putsf(0, line
++, "handle count: %d", (int)d
.num_handles
);
375 screens
[i
].putsf(0, line
++, "cpu freq: %3dMHz",
376 (int)((FREQ
+ 500000) / 1000000));
381 int boostquota
= boost_ticks
* 1000 / ticks
; /* in 0.1 % */
382 int avgclock
= freq_sum
* 10 / ticks
; /* in 100 kHz */
383 screens
[i
].putsf(0, line
++, "boost:%3d.%d%% (%d.%dMHz)",
384 boostquota
/10, boostquota
%10, avgclock
/10, avgclock
%10);
387 screens
[i
].putsf(0, line
++, "pcmbufdesc: %2d/%2d",
388 pcmbuf_used_descs(), pcmbufdescs
);
389 screens
[i
].putsf(0, line
++, "watermark: %6d",
396 tick_remove_task(dbg_audio_task
);
399 screens
[i
].setfont(FONT_UI
);
403 #endif /* CONFIG_CODEC */
404 #endif /* HAVE_LCD_BITMAP */
407 #if (CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE))
408 /* Tool function to read the flash manufacturer and type, if available.
409 Only chips which could be reprogrammed in system will return values.
410 (The mode switch addresses vary between flash manufacturers, hence addr1/2) */
411 /* In IRAM to avoid problems when running directly from Flash */
412 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
413 unsigned addr1
, unsigned addr2
)
414 ICODE_ATTR
__attribute__((noinline
));
415 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
416 unsigned addr1
, unsigned addr2
)
419 unsigned not_manu
, not_id
; /* read values before switching to ID mode */
420 unsigned manu
, id
; /* read values when in ID mode */
422 #if CONFIG_CPU == SH7034
423 volatile unsigned char* flash
= (unsigned char*)0x2000000; /* flash mapping */
424 #elif defined(CPU_COLDFIRE)
425 volatile unsigned short* flash
= (unsigned short*)0; /* flash mapping */
427 int old_level
; /* saved interrupt level */
429 not_manu
= flash
[0]; /* read the normal content */
430 not_id
= flash
[1]; /* should be 'A' (0x41) and 'R' (0x52) from the "ARCH" marker */
432 /* disable interrupts, prevent any stray flash access */
433 old_level
= disable_irq_save();
435 flash
[addr1
] = 0xAA; /* enter command mode */
437 flash
[addr1
] = 0x90; /* ID command */
438 /* Atmel wants 20ms pause here */
439 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
441 manu
= flash
[0]; /* read the IDs */
444 flash
[0] = 0xF0; /* reset flash (back to normal read mode) */
445 /* Atmel wants 20ms pause here */
446 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
448 restore_irq(old_level
); /* enable interrupts again */
450 /* I assume success if the obtained values are different from
451 the normal flash content. This is not perfectly bulletproof, they
452 could theoretically be the same by chance, causing us to fail. */
453 if (not_manu
!= manu
|| not_id
!= id
) /* a value has changed */
455 *p_manufacturer
= manu
; /* return the results */
457 return true; /* success */
459 return false; /* fail */
461 #endif /* (CONFIG_CPU == SH7034 || CPU_COLDFIRE) */
465 static int perfcheck(void)
471 "orr r0, r2, #0xc0 \n" /* disable IRQ and FIQ */
474 "ldr r0, [%[timr]] \n"
475 "add r0, r0, %[tmo] \n"
477 "add %[res], %[res], #1 \n"
478 "ldr r1, [%[timr]] \n"
481 "msr CPSR_c, r2 \n" /* reset IRQ and FIQ state */
485 [timr
]"r"(&USEC_TIMER
),
487 #if CONFIG_CPU == PP5002
489 #else /* PP5020/5022/5024 */
500 #ifdef HAVE_LCD_BITMAP
501 static bool dbg_hw_info(void)
503 #if CONFIG_CPU == SH7034
504 int bitmask
= HW_MASK
;
505 int rom_version
= ROM_VERSION
;
506 unsigned manu
, id
; /* flash IDs */
507 bool got_id
; /* flag if we managed to get the flash IDs */
508 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
509 bool has_bootrom
; /* flag for boot ROM present */
510 int oldmode
; /* saved memory guard mode */
512 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
514 /* get flash ROM type */
515 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
517 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
519 /* check if the boot ROM area is a flash mirror */
520 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
521 if (has_bootrom
) /* if ROM and Flash different */
523 /* calculate CRC16 checksum of boot ROM */
524 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
527 system_memory_guard(oldmode
); /* re-enable memory guard */
529 lcd_setfont(FONT_SYSFIXED
);
532 lcd_puts(0, 0, "[Hardware info]");
534 lcd_putsf(0, 1, "ROM: %d.%02d", rom_version
/100, rom_version
%100);
536 lcd_putsf(0, 2, "Mask: 0x%04x", bitmask
);
539 lcd_putsf(0, 3, "Flash: M=%02x D=%02x", manu
, id
);
541 lcd_puts(0, 3, "Flash: M=?? D=??"); /* unknown, sorry */
545 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
546 lcd_puts(0, 4, "Boot ROM: V1");
548 lcd_putsf(0, 4, "ROMcrc: 0x%08x", rom_crc
);
552 lcd_puts(0, 4, "Boot ROM: none");
557 while (!(action_userabort(TIMEOUT_BLOCK
)));
559 #elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250
560 unsigned manu
, id
; /* flash IDs */
561 int got_id
; /* flag if we managed to get the flash IDs */
562 int oldmode
; /* saved memory guard mode */
565 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
567 /* get flash ROM type */
568 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
570 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
572 system_memory_guard(oldmode
); /* re-enable memory guard */
574 lcd_setfont(FONT_SYSFIXED
);
577 lcd_puts(0, line
++, "[Hardware info]");
580 lcd_putsf(0, line
++, "Flash: M=%04x D=%04x", manu
, id
);
582 lcd_puts(0, line
++, "Flash: M=???? D=????"); /* unknown, sorry */
588 lcd_puts(0, ++line
, "Serial Number:");
590 got_id
= ds2411_read_id(&id
);
592 if (got_id
== DS2411_OK
)
594 lcd_putsf(0, ++line
, " FC=%02x", (unsigned)id
.family_code
);
595 lcd_putsf(0, ++line
, " ID=%02X %02X %02X %02X %02X %02X",
596 (unsigned)id
.uid
[0], (unsigned)id
.uid
[1], (unsigned)id
.uid
[2],
597 (unsigned)id
.uid
[3], (unsigned)id
.uid
[4], (unsigned)id
.uid
[5]);
598 lcd_putsf(0, ++line
, " CRC=%02X", (unsigned)id
.crc
);
602 lcd_putsf(0, ++line
, "READ ERR=%d", got_id
);
609 while (!(action_userabort(TIMEOUT_BLOCK
)));
611 #elif defined(CPU_PP502x)
613 char pp_version
[] = { (PP_VER2
>> 24) & 0xff, (PP_VER2
>> 16) & 0xff,
614 (PP_VER2
>> 8) & 0xff, (PP_VER2
) & 0xff,
615 (PP_VER1
>> 24) & 0xff, (PP_VER1
>> 16) & 0xff,
616 (PP_VER1
>> 8) & 0xff, (PP_VER1
) & 0xff, '\0' };
618 lcd_setfont(FONT_SYSFIXED
);
621 lcd_puts(0, line
++, "[Hardware info]");
624 lcd_putsf(0, line
++, "HW rev: 0x%08lx", IPOD_HW_REVISION
);
628 extern int lcd_type
; /* Defined in lcd-colornano.c */
630 lcd_putsf(0, line
++, "LCD type: %d", lcd_type
);
633 lcd_putsf(0, line
++, "PP version: %s", pp_version
);
635 lcd_putsf(0, line
++, "Est. clock (kHz): %d", perfcheck());
639 while (!(action_userabort(TIMEOUT_BLOCK
)));
641 #elif CONFIG_CPU == PP5002
643 char pp_version
[] = { (PP_VER4
>> 8) & 0xff, PP_VER4
& 0xff,
644 (PP_VER3
>> 8) & 0xff, PP_VER3
& 0xff,
645 (PP_VER2
>> 8) & 0xff, PP_VER2
& 0xff,
646 (PP_VER1
>> 8) & 0xff, PP_VER1
& 0xff, '\0' };
649 lcd_setfont(FONT_SYSFIXED
);
652 lcd_puts(0, line
++, "[Hardware info]");
655 lcd_putsf(0, line
++, "HW rev: 0x%08lx", IPOD_HW_REVISION
);
658 lcd_putsf(0, line
++, "PP version: %s", pp_version
);
660 lcd_putsf(0, line
++, "Est. clock (kHz): %d", perfcheck());
664 while (!(action_userabort(TIMEOUT_BLOCK
)));
667 /* Define this function in your target tree */
668 return __dbg_hw_info();
669 #endif /* CONFIG_CPU */
670 lcd_setfont(FONT_UI
);
673 #else /* !HAVE_LCD_BITMAP */
674 static bool dbg_hw_info(void)
678 int rom_version
= ROM_VERSION
;
679 unsigned manu
, id
; /* flash IDs */
680 bool got_id
; /* flag if we managed to get the flash IDs */
681 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
682 bool has_bootrom
; /* flag for boot ROM present */
683 int oldmode
; /* saved memory guard mode */
685 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
687 /* get flash ROM type */
688 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
690 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
692 /* check if the boot ROM area is a flash mirror */
693 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
694 if (has_bootrom
) /* if ROM and Flash different */
696 /* calculate CRC16 checksum of boot ROM */
697 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
700 system_memory_guard(oldmode
); /* re-enable memory guard */
704 lcd_puts(0, 0, "[HW Info]");
710 lcd_putsf(0, 1, "ROM: %d.%02d",
711 rom_version
/100, rom_version
%100);
715 lcd_putsf(0, 1, "Flash:%02x,%02x", manu
, id
);
717 lcd_puts(0, 1, "Flash:??,??"); /* unknown, sorry */
722 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
723 lcd_puts(0, 1, "BootROM: V1");
724 else if (rom_crc
== 0x358099E8)
725 lcd_puts(0, 1, "BootROM: V2");
726 /* alternative boot ROM found in one single player so far */
728 lcd_putsf(0, 1, "R: %08x", rom_crc
);
731 lcd_puts(0, 1, "BootROM: no");
736 button
= get_action(CONTEXT_SETTINGS
,TIMEOUT_BLOCK
);
740 case ACTION_STD_CANCEL
:
743 case ACTION_SETTINGS_DEC
:
749 case ACTION_SETTINGS_INC
:
758 #endif /* !HAVE_LCD_BITMAP */
759 #endif /* !SIMULATOR */
762 static const char* dbg_partitions_getname(int selected_item
, void *data
,
763 char *buffer
, size_t buffer_len
)
766 int partition
= selected_item
/2;
767 struct partinfo
* p
= disk_partinfo(partition
);
770 snprintf(buffer
, buffer_len
, " T:%x %ld MB", p
->type
, p
->size
/ ( 2048 / ( SECTOR_SIZE
/ 512 )));
774 snprintf(buffer
, buffer_len
, "P%d: S:%lx", partition
, p
->start
);
779 bool dbg_partitions(void)
781 struct simplelist_info info
;
782 simplelist_info_init(&info
, "Partition Info", 4, NULL
);
783 info
.selection_size
= 2;
784 info
.hide_selection
= true;
785 info
.scroll_all
= true;
786 info
.get_name
= dbg_partitions_getname
;
787 return simplelist_show_list(&info
);
791 #if defined(CPU_COLDFIRE) && defined(HAVE_SPDIF_OUT)
792 static bool dbg_spdif(void)
795 unsigned int control
;
800 unsigned int interruptstat
;
801 bool valnogood
, symbolerr
, parityerr
;
804 int spdif_source
= spdif_get_output_source(&spdif_src_on
);
805 spdif_set_output_source(AUDIO_SRC_SPDIF
IF_SPDIF_POWER_(, true));
808 lcd_setfont(FONT_SYSFIXED
);
810 #ifdef HAVE_SPDIF_POWER
811 spdif_power_enable(true); /* We need SPDIF power for both sending & receiving */
818 control
= EBU1RCVCCHANNEL1
;
819 interruptstat
= INTERRUPTSTAT
;
820 INTERRUPTCLEAR
= 0x03c00000;
822 valnogood
= (interruptstat
& 0x01000000)?true:false;
823 symbolerr
= (interruptstat
& 0x00800000)?true:false;
824 parityerr
= (interruptstat
& 0x00400000)?true:false;
826 lcd_putsf(0, line
++, "Val: %s Sym: %s Par: %s",
829 parityerr
?"--":"OK");
831 lcd_putsf(0, line
++, "Status word: %08x", (int)control
);
836 lcd_putsf(0, line
++, "PRO: %d (%s)",
837 x
, x
?"Professional":"Consumer");
839 x
= (control
>> 30) & 1;
840 lcd_putsf(0, line
++, "Audio: %d (%s)",
841 x
, x
?"Non-PCM":"PCM");
843 x
= (control
>> 29) & 1;
844 lcd_putsf(0, line
++, "Copy: %d (%s)",
845 x
, x
?"Permitted":"Inhibited");
847 x
= (control
>> 27) & 7;
860 lcd_putsf(0, line
++, "Preemphasis: %d (%s)", x
, s
);
862 x
= (control
>> 24) & 3;
863 lcd_putsf(0, line
++, "Mode: %d", x
);
865 category
= (control
>> 17) & 127;
877 lcd_putsf(0, line
++, "Category: 0x%02x (%s)", category
, s
);
879 x
= (control
>> 16) & 1;
881 if(((category
& 0x70) == 0x10) ||
882 ((category
& 0x70) == 0x40) ||
883 ((category
& 0x78) == 0x38))
885 generation
= !generation
;
887 lcd_putsf(0, line
++, "Generation: %d (%s)",
888 x
, generation
?"Original":"No ind.");
890 x
= (control
>> 12) & 15;
891 lcd_putsf(0, line
++, "Source: %d", x
);
894 x
= (control
>> 8) & 15;
910 lcd_putsf(0, line
++, "Channel: %d (%s)", x
, s
);
912 x
= (control
>> 4) & 15;
925 lcd_putsf(0, line
++, "Frequency: %d (%s)", x
, s
);
927 x
= (control
>> 2) & 3;
928 lcd_putsf(0, line
++, "Clock accuracy: %d", x
);
932 lcd_putsf(0, line
++, "Measured freq: %ldHz",
933 spdif_measure_frequency());
938 if (action_userabort(HZ
/10))
942 spdif_set_output_source(spdif_source
IF_SPDIF_POWER_(, spdif_src_on
));
944 #ifdef HAVE_SPDIF_POWER
945 spdif_power_enable(global_settings
.spdif_enable
);
948 lcd_setfont(FONT_UI
);
951 #endif /* CPU_COLDFIRE */
954 #ifdef HAVE_LCD_BITMAP
955 /* button definitions */
956 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
957 (CONFIG_KEYPAD == IRIVER_H300_PAD)
958 # define DEBUG_CANCEL BUTTON_OFF
960 #elif CONFIG_KEYPAD == RECORDER_PAD
961 # define DEBUG_CANCEL BUTTON_OFF
963 #elif CONFIG_KEYPAD == ONDIO_PAD
964 # define DEBUG_CANCEL BUTTON_MENU
966 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || \
967 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
968 (CONFIG_KEYPAD == IPOD_4G_PAD)
969 # define DEBUG_CANCEL BUTTON_MENU
971 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
972 # define DEBUG_CANCEL BUTTON_PLAY
974 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
975 # define DEBUG_CANCEL BUTTON_REC
977 #elif (CONFIG_KEYPAD == IAUDIO_M3_PAD)
978 # define DEBUG_CANCEL BUTTON_RC_REC
980 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
981 # define DEBUG_CANCEL BUTTON_REW
983 #elif (CONFIG_KEYPAD == MROBE100_PAD)
984 # define DEBUG_CANCEL BUTTON_MENU
986 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
987 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
988 (CONFIG_KEYPAD == SANSA_FUZE_PAD)
989 # define DEBUG_CANCEL BUTTON_LEFT
991 /* This is temporary until the SA9200 touchpad works */
992 #elif (CONFIG_KEYPAD == PHILIPS_SA9200_PAD) || \
993 (CONFIG_KEYPAD == PHILIPS_HDD1630_PAD) || \
994 (CONFIG_KEYPAD == PHILIPS_HDD6330_PAD)
995 # define DEBUG_CANCEL BUTTON_POWER
997 #elif (CONFIG_KEYPAD == SAMSUNG_YH_PAD)
998 # define DEBUG_CANCEL BUTTON_PLAY
1000 #elif (CONFIG_KEYPAD == PBELL_VIBE500_PAD)
1001 # define DEBUG_CANCEL BUTTON_CANCEL
1003 #elif (CONFIG_KEYPAD == MPIO_HD200_PAD)
1004 # define DEBUG_CANCEL BUTTON_REC
1006 #endif /* key definitions */
1009 bool dbg_ports(void)
1011 #if CONFIG_CPU == SH7034
1012 int adc_battery_voltage
, adc_battery_level
;
1014 lcd_setfont(FONT_SYSFIXED
);
1015 lcd_clear_display();
1019 lcd_putsf(0, 0, "PADR: %04x", (unsigned short)PADR
);
1020 lcd_putsf(0, 1, "PBDR: %04x", (unsigned short)PBDR
);
1022 lcd_putsf(0, 2, "AN0: %03x AN4: %03x", adc_read(0), adc_read(4));
1023 lcd_putsf(0, 3, "AN1: %03x AN5: %03x", adc_read(1), adc_read(5));
1024 lcd_putsf(0, 4, "AN2: %03x AN6: %03x", adc_read(2), adc_read(6));
1025 lcd_putsf(0, 5, "AN3: %03x AN7: %03x", adc_read(3), adc_read(7));
1027 battery_read_info(&adc_battery_voltage
, &adc_battery_level
);
1028 lcd_putsf(0, 6, "Batt: %d.%03dV %d%% ", adc_battery_voltage
/ 1000,
1029 adc_battery_voltage
% 1000, adc_battery_level
);
1032 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1034 lcd_setfont(FONT_UI
);
1038 #elif defined(CPU_COLDFIRE)
1039 unsigned int gpio_out
;
1040 unsigned int gpio1_out
;
1041 unsigned int gpio_read
;
1042 unsigned int gpio1_read
;
1043 unsigned int gpio_function
;
1044 unsigned int gpio1_function
;
1045 unsigned int gpio_enable
;
1046 unsigned int gpio1_enable
;
1047 int adc_buttons
, adc_remote
;
1048 int adc_battery_voltage
, adc_battery_level
;
1051 lcd_clear_display();
1052 lcd_setfont(FONT_SYSFIXED
);
1057 gpio_read
= GPIO_READ
;
1058 gpio1_read
= GPIO1_READ
;
1059 gpio_out
= GPIO_OUT
;
1060 gpio1_out
= GPIO1_OUT
;
1061 gpio_function
= GPIO_FUNCTION
;
1062 gpio1_function
= GPIO1_FUNCTION
;
1063 gpio_enable
= GPIO_ENABLE
;
1064 gpio1_enable
= GPIO1_ENABLE
;
1066 lcd_putsf(0, line
++, "GPIO_READ: %08x", gpio_read
);
1067 lcd_putsf(0, line
++, "GPIO_OUT: %08x", gpio_out
);
1068 lcd_putsf(0, line
++, "GPIO_FUNC: %08x", gpio_function
);
1069 lcd_putsf(0, line
++, "GPIO_ENA: %08x", gpio_enable
);
1071 lcd_putsf(0, line
++, "GPIO1_READ: %08x", gpio1_read
);
1072 lcd_putsf(0, line
++, "GPIO1_OUT: %08x", gpio1_out
);
1073 lcd_putsf(0, line
++, "GPIO1_FUNC: %08x", gpio1_function
);
1074 lcd_putsf(0, line
++, "GPIO1_ENA: %08x", gpio1_enable
);
1076 adc_buttons
= adc_read(ADC_BUTTONS
);
1077 adc_remote
= adc_read(ADC_REMOTE
);
1078 battery_read_info(&adc_battery_voltage
, &adc_battery_level
);
1079 #if defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IRIVER_H300_SERIES)
1080 lcd_putsf(0, line
++, "ADC_BUTTONS (%c): %02x",
1081 button_scan_enabled() ? '+' : '-', adc_buttons
);
1083 lcd_putsf(0, line
++, "ADC_BUTTONS: %02x", adc_buttons
);
1085 #if defined(IAUDIO_X5) || defined(IAUDIO_M5)
1086 lcd_putsf(0, line
++, "ADC_REMOTE (%c): %02x",
1087 remote_detect() ? '+' : '-', adc_remote
);
1089 lcd_putsf(0, line
++, "ADC_REMOTE: %02x", adc_remote
);
1091 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
1092 lcd_putsf(0, line
++, "ADC_REMOTEDETECT: %02x",
1093 adc_read(ADC_REMOTEDETECT
));
1096 lcd_putsf(0, line
++, "Batt: %d.%03dV %d%% ", adc_battery_voltage
/ 1000,
1097 adc_battery_voltage
% 1000, adc_battery_level
);
1099 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
1100 lcd_putsf(0, line
++, "remotetype: %d", remote_type());
1104 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1106 lcd_setfont(FONT_UI
);
1111 #elif defined(CPU_PP502x)
1114 lcd_clear_display();
1115 lcd_setfont(FONT_SYSFIXED
);
1120 #if (LCD_HEIGHT >= 176) /* Only for displays with appropriate height. */
1121 lcd_puts(0, line
++, "GPIO ENABLE: GPIO OUTPUT ENABLE:");
1122 lcd_putsf(0, line
++, "A: %02x E: %02x I: %02x A: %02x E: %02x I: %02x",
1123 (unsigned int)GPIOA_ENABLE
,
1124 (unsigned int)GPIOE_ENABLE
,
1125 (unsigned int)GPIOI_ENABLE
,
1126 (unsigned int)GPIOA_OUTPUT_EN
,
1127 (unsigned int)GPIOE_OUTPUT_EN
,
1128 (unsigned int)GPIOI_OUTPUT_EN
);
1129 lcd_putsf(0, line
++, "B: %02x F: %02x J: %02x B: %02x F: %02x J: %02x",
1130 (unsigned int)GPIOB_ENABLE
,
1131 (unsigned int)GPIOF_ENABLE
,
1132 (unsigned int)GPIOJ_ENABLE
,
1133 (unsigned int)GPIOB_OUTPUT_EN
,
1134 (unsigned int)GPIOF_OUTPUT_EN
,
1135 (unsigned int)GPIOJ_OUTPUT_EN
);
1136 lcd_putsf(0, line
++, "C: %02x G: %02x K: %02x C: %02x G: %02x K: %02x",
1137 (unsigned int)GPIOC_ENABLE
,
1138 (unsigned int)GPIOG_ENABLE
,
1139 (unsigned int)GPIOK_ENABLE
,
1140 (unsigned int)GPIOC_OUTPUT_EN
,
1141 (unsigned int)GPIOG_OUTPUT_EN
,
1142 (unsigned int)GPIOK_OUTPUT_EN
);
1143 lcd_putsf(0, line
++, "D: %02x H: %02x L: %02x D: %02x H: %02x L: %02x",
1144 (unsigned int)GPIOD_ENABLE
,
1145 (unsigned int)GPIOH_ENABLE
,
1146 (unsigned int)GPIOL_ENABLE
,
1147 (unsigned int)GPIOD_OUTPUT_EN
,
1148 (unsigned int)GPIOH_OUTPUT_EN
,
1149 (unsigned int)GPIOL_OUTPUT_EN
);
1152 lcd_puts(0, line
++, "GPIO INPUT VAL:");
1153 lcd_putsf(0, line
++, "A: %02x E: %02x I: %02x",
1154 (unsigned int)GPIOA_INPUT_VAL
,
1155 (unsigned int)GPIOE_INPUT_VAL
,
1156 (unsigned int)GPIOI_INPUT_VAL
);
1157 lcd_putsf(0, line
++, "B: %02x F: %02x J: %02x",
1158 (unsigned int)GPIOB_INPUT_VAL
,
1159 (unsigned int)GPIOF_INPUT_VAL
,
1160 (unsigned int)GPIOJ_INPUT_VAL
);
1161 lcd_putsf(0, line
++, "C: %02x G: %02x K: %02x",
1162 (unsigned int)GPIOC_INPUT_VAL
,
1163 (unsigned int)GPIOG_INPUT_VAL
,
1164 (unsigned int)GPIOK_INPUT_VAL
);
1165 lcd_putsf(0, line
++, "D: %02x H: %02x L: %02x",
1166 (unsigned int)GPIOD_INPUT_VAL
,
1167 (unsigned int)GPIOH_INPUT_VAL
,
1168 (unsigned int)GPIOL_INPUT_VAL
);
1170 lcd_putsf(0, line
++, "GPO32_VAL: %08lx", GPO32_VAL
);
1171 lcd_putsf(0, line
++, "GPO32_EN: %08lx", GPO32_ENABLE
);
1172 lcd_putsf(0, line
++, "DEV_EN: %08lx", DEV_EN
);
1173 lcd_putsf(0, line
++, "DEV_EN2: %08lx", DEV_EN2
);
1174 lcd_putsf(0, line
++, "DEV_EN3: %08lx", inl(0x60006044)); /* to be verified */
1175 lcd_putsf(0, line
++, "DEV_INIT1: %08lx", DEV_INIT1
);
1176 lcd_putsf(0, line
++, "DEV_INIT2: %08lx", DEV_INIT2
);
1177 #ifdef ADC_ACCESSORY
1178 lcd_putsf(0, line
++, "ACCESSORY: %d", adc_read(ADC_ACCESSORY
));
1181 lcd_putsf(0, line
++, "4066_ISTAT: %d", adc_read(ADC_4066_ISTAT
));
1184 #if defined(IPOD_ACCESSORY_PROTOCOL)
1185 extern unsigned char serbuf
[];
1186 lcd_putsf(0, line
++, "IAP PACKET: %02x %02x %02x %02x %02x %02x %02x %02x",
1187 serbuf
[0], serbuf
[1], serbuf
[2], serbuf
[3], serbuf
[4], serbuf
[5],
1188 serbuf
[6], serbuf
[7]);
1191 #if defined(IRIVER_H10) || defined(IRIVER_H10_5GB)
1193 lcd_putsf(0, line
++, "BATT: %03x UNK1: %03x",
1194 adc_read(ADC_BATTERY
), adc_read(ADC_UNKNOWN_1
));
1195 lcd_putsf(0, line
++, "REM: %03x PAD: %03x",
1196 adc_read(ADC_REMOTE
), adc_read(ADC_SCROLLPAD
));
1197 #elif defined(PHILIPS_HDD1630) || defined(PHILIPS_HDD6330)
1199 lcd_putsf(0, line
++, "BATT: %03x UNK1: %03x",
1200 adc_read(ADC_BATTERY
), adc_read(ADC_UNKNOWN_1
));
1201 #elif defined(SANSA_E200) || defined(PHILIPS_SA9200)
1202 lcd_putsf(0, line
++, "ADC_BVDD: %4d", adc_read(ADC_BVDD
));
1203 lcd_putsf(0, line
++, "ADC_RTCSUP: %4d", adc_read(ADC_RTCSUP
));
1204 lcd_putsf(0, line
++, "ADC_UVDD: %4d", adc_read(ADC_UVDD
));
1205 lcd_putsf(0, line
++, "ADC_CHG_IN: %4d", adc_read(ADC_CHG_IN
));
1206 lcd_putsf(0, line
++, "ADC_CVDD: %4d", adc_read(ADC_CVDD
));
1207 lcd_putsf(0, line
++, "ADC_BATTEMP: %4d", adc_read(ADC_BATTEMP
));
1208 lcd_putsf(0, line
++, "ADC_MICSUP1: %4d", adc_read(ADC_MICSUP1
));
1209 lcd_putsf(0, line
++, "ADC_MICSUP2: %4d", adc_read(ADC_MICSUP2
));
1210 lcd_putsf(0, line
++, "ADC_VBE1: %4d", adc_read(ADC_VBE1
));
1211 lcd_putsf(0, line
++, "ADC_VBE2: %4d", adc_read(ADC_VBE2
));
1212 lcd_putsf(0, line
++, "ADC_I_MICSUP1:%4d", adc_read(ADC_I_MICSUP1
));
1213 #if !defined(PHILIPS_SA9200)
1214 lcd_putsf(0, line
++, "ADC_I_MICSUP2:%4d", adc_read(ADC_I_MICSUP2
));
1215 lcd_putsf(0, line
++, "ADC_VBAT: %4d", adc_read(ADC_VBAT
));
1219 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1221 lcd_setfont(FONT_UI
);
1226 #elif CONFIG_CPU == PP5002
1229 lcd_clear_display();
1230 lcd_setfont(FONT_SYSFIXED
);
1235 lcd_putsf(0, line
++, "GPIO_A: %02x GPIO_B: %02x",
1236 (unsigned int)GPIOA_INPUT_VAL
, (unsigned int)GPIOB_INPUT_VAL
);
1237 lcd_putsf(0, line
++, "GPIO_C: %02x GPIO_D: %02x",
1238 (unsigned int)GPIOC_INPUT_VAL
, (unsigned int)GPIOD_INPUT_VAL
);
1240 lcd_putsf(0, line
++, "DEV_EN: %08lx", DEV_EN
);
1241 lcd_putsf(0, line
++, "CLOCK_ENABLE: %08lx", CLOCK_ENABLE
);
1242 lcd_putsf(0, line
++, "CLOCK_SOURCE: %08lx", CLOCK_SOURCE
);
1243 lcd_putsf(0, line
++, "PLL_CONTROL: %08lx", PLL_CONTROL
);
1244 lcd_putsf(0, line
++, "PLL_DIV: %08lx", PLL_DIV
);
1245 lcd_putsf(0, line
++, "PLL_MULT: %08lx", PLL_MULT
);
1246 lcd_putsf(0, line
++, "TIMING1_CTL: %08lx", TIMING1_CTL
);
1247 lcd_putsf(0, line
++, "TIMING2_CTL: %08lx", TIMING2_CTL
);
1250 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1252 lcd_setfont(FONT_UI
);
1256 lcd_setfont(FONT_UI
);
1258 return __dbg_ports();
1262 #else /* !HAVE_LCD_BITMAP */
1263 bool dbg_ports(void)
1267 int adc_battery_voltage
;
1270 lcd_clear_display();
1277 snprintf(buf
, 32, "PADR: %04x", (unsigned short)PADR
);
1280 snprintf(buf
, 32, "PBDR: %04x", (unsigned short)PBDR
);
1283 snprintf(buf
, 32, "AN0: %03x", adc_read(0));
1286 snprintf(buf
, 32, "AN1: %03x", adc_read(1));
1289 snprintf(buf
, 32, "AN2: %03x", adc_read(2));
1292 snprintf(buf
, 32, "AN3: %03x", adc_read(3));
1295 snprintf(buf
, 32, "AN4: %03x", adc_read(4));
1298 snprintf(buf
, 32, "AN5: %03x", adc_read(5));
1301 snprintf(buf
, 32, "AN6: %03x", adc_read(6));
1304 snprintf(buf
, 32, "AN7: %03x", adc_read(7));
1307 lcd_puts(0, 0, buf
);
1309 battery_read_info(&adc_battery_voltage
, NULL
);
1310 lcd_putsf(0, 1, "Batt: %d.%03dV", adc_battery_voltage
/ 1000,
1311 adc_battery_voltage
% 1000);
1314 button
= get_action(CONTEXT_SETTINGS
,HZ
/5);
1318 case ACTION_STD_CANCEL
:
1321 case ACTION_SETTINGS_DEC
:
1327 case ACTION_SETTINGS_INC
:
1336 #endif /* !HAVE_LCD_BITMAP */
1337 #endif /* !SIMULATOR */
1339 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
1340 static bool dbg_pcf(void)
1344 #ifdef HAVE_LCD_BITMAP
1345 lcd_setfont(FONT_SYSFIXED
);
1347 lcd_clear_display();
1353 lcd_putsf(0, line
++, "DCDC1: %02x", pcf50605_read(0x1b));
1354 lcd_putsf(0, line
++, "DCDC2: %02x", pcf50605_read(0x1c));
1355 lcd_putsf(0, line
++, "DCDC3: %02x", pcf50605_read(0x1d));
1356 lcd_putsf(0, line
++, "DCDC4: %02x", pcf50605_read(0x1e));
1357 lcd_putsf(0, line
++, "DCDEC1: %02x", pcf50605_read(0x1f));
1358 lcd_putsf(0, line
++, "DCDEC2: %02x", pcf50605_read(0x20));
1359 lcd_putsf(0, line
++, "DCUDC1: %02x", pcf50605_read(0x21));
1360 lcd_putsf(0, line
++, "DCUDC2: %02x", pcf50605_read(0x22));
1361 lcd_putsf(0, line
++, "IOREGC: %02x", pcf50605_read(0x23));
1362 lcd_putsf(0, line
++, "D1REGC: %02x", pcf50605_read(0x24));
1363 lcd_putsf(0, line
++, "D2REGC: %02x", pcf50605_read(0x25));
1364 lcd_putsf(0, line
++, "D3REGC: %02x", pcf50605_read(0x26));
1365 lcd_putsf(0, line
++, "LPREG1: %02x", pcf50605_read(0x27));
1367 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1369 lcd_setfont(FONT_UI
);
1374 lcd_setfont(FONT_UI
);
1379 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
1380 static bool dbg_cpufreq(void)
1385 #ifdef HAVE_LCD_BITMAP
1386 lcd_setfont(FONT_SYSFIXED
);
1388 lcd_clear_display();
1394 lcd_putsf(0, line
++, "Frequency: %ld", FREQ
);
1395 lcd_putsf(0, line
++, "boost_counter: %d", get_cpu_boost_counter());
1398 button
= get_action(CONTEXT_STD
,HZ
/10);
1402 case ACTION_STD_PREV
:
1406 case ACTION_STD_NEXT
:
1411 while (get_cpu_boost_counter() > 0)
1413 set_cpu_frequency(CPUFREQ_DEFAULT
);
1416 case ACTION_STD_CANCEL
:
1417 lcd_setfont(FONT_UI
);
1421 lcd_setfont(FONT_UI
);
1424 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
1426 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
1427 #include "tsc2100.h"
1428 static char *itob(int n
, int len
)
1430 static char binary
[64];
1432 for (i
=1, j
=0;i
<=len
;i
++)
1434 binary
[j
++] = n
&(1<<(len
-i
))?'1':'0';
1442 static const char* tsc2100_debug_getname(int selected_item
, void * data
,
1443 char *buffer
, size_t buffer_len
)
1445 int *page
= (int*)data
;
1446 bool reserved
= false;
1450 if ((selected_item
> 0x0a) ||
1451 (selected_item
== 0x04) ||
1452 (selected_item
== 0x08))
1456 if ((selected_item
> 0x05) ||
1457 (selected_item
== 0x02))
1461 if (selected_item
> 0x1e)
1466 snprintf(buffer
, buffer_len
, "%02x: RESERVED", selected_item
);
1468 snprintf(buffer
, buffer_len
, "%02x: %s", selected_item
,
1469 itob(tsc2100_readreg(*page
, selected_item
)&0xffff,16));
1472 static int tsc2100debug_action_callback(int action
, struct gui_synclist
*lists
)
1474 int *page
= (int*)lists
->data
;
1475 if (action
== ACTION_STD_OK
)
1477 *page
= (*page
+1)%3;
1478 snprintf(lists
->title
, 32,
1479 "tsc2100 registers - Page %d", *page
);
1480 return ACTION_REDRAW
;
1484 static bool tsc2100_debug(void)
1487 char title
[32] = "tsc2100 registers - Page 0";
1488 struct simplelist_info info
;
1489 simplelist_info_init(&info
, title
, 32, &page
);
1490 info
.timeout
= HZ
/100;
1491 info
.get_name
= tsc2100_debug_getname
;
1492 info
.action_callback
= tsc2100debug_action_callback
;
1493 return simplelist_show_list(&info
);
1497 #ifdef HAVE_LCD_BITMAP
1499 * view_battery() shows a automatically scaled graph of the battery voltage
1500 * over time. Usable for estimating battery life / charging rate.
1501 * The power_history array is updated in power_thread of powermgmt.c.
1504 #define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN)
1505 #define BAT_YSPACE (LCD_HEIGHT - 20)
1507 static bool view_battery(void)
1511 unsigned short maxv
, minv
;
1513 lcd_setfont(FONT_SYSFIXED
);
1517 lcd_clear_display();
1519 case 0: /* voltage history graph */
1520 /* Find maximum and minimum voltage for scaling */
1521 minv
= power_history
[0];
1523 for (i
= 1; i
< BAT_LAST_VAL
&& power_history
[i
]; i
++) {
1524 if (power_history
[i
] > maxv
)
1525 maxv
= power_history
[i
];
1526 if (power_history
[i
] < minv
)
1527 minv
= power_history
[i
];
1530 lcd_putsf(0, 0, "Battery %d.%03d", power_history
[0] / 1000,
1531 power_history
[0] % 1000);
1532 lcd_putsf(0, 1, "scale %d.%03d-%d.%03dV",
1533 minv
/ 1000, minv
% 1000, maxv
/ 1000, maxv
% 1000);
1536 for (i
= BAT_LAST_VAL
- 1; i
>= 0; i
--) {
1537 y
= (power_history
[i
] - minv
) * BAT_YSPACE
/ (maxv
- minv
);
1538 lcd_set_drawmode(DRMODE_SOLID
|DRMODE_INVERSEVID
);
1539 lcd_vline(x
, LCD_HEIGHT
-1, 20);
1540 lcd_set_drawmode(DRMODE_SOLID
);
1541 lcd_vline(x
, LCD_HEIGHT
-1,
1542 MIN(MAX(LCD_HEIGHT
-1 - y
, 20), LCD_HEIGHT
-1));
1548 case 1: /* status: */
1549 #if CONFIG_CHARGING >= CHARGING_MONITOR
1550 lcd_putsf(0, 0, "Pwr status: %s",
1551 charging_state() ? "charging" : "discharging");
1553 lcd_puts(0, 0, "Power status:");
1555 battery_read_info(&y
, NULL
);
1556 lcd_putsf(0, 1, "Battery: %d.%03d V", y
/ 1000, y
% 1000);
1557 #ifdef ADC_EXT_POWER
1558 y
= (adc_read(ADC_EXT_POWER
) * EXT_SCALE_FACTOR
) / 1000;
1559 lcd_putsf(0, 2, "External: %d.%03d V", y
/ 1000, y
% 1000);
1562 #if defined ARCHOS_RECORDER
1563 lcd_putsf(0, 3, "Chgr: %s %s",
1564 charger_inserted() ? "present" : "absent",
1565 charger_enabled() ? "on" : "off");
1566 lcd_putsf(0, 5, "short delta: %d", short_delta
);
1567 lcd_putsf(0, 6, "long delta: %d", long_delta
);
1568 lcd_puts(0, 7, power_message
);
1569 lcd_putsf(0, 8, "USB Inserted: %s",
1570 usb_inserted() ? "yes" : "no");
1571 #elif defined IPOD_NANO || defined IPOD_VIDEO
1572 int usb_pwr
= (GPIOL_INPUT_VAL
& 0x10)?true:false;
1573 int ext_pwr
= (GPIOL_INPUT_VAL
& 0x08)?false:true;
1574 int dock
= (GPIOA_INPUT_VAL
& 0x10)?true:false;
1575 int charging
= (GPIOB_INPUT_VAL
& 0x01)?false:true;
1576 int headphone
= (GPIOA_INPUT_VAL
& 0x80)?true:false;
1578 lcd_putsf(0, 3, "USB pwr: %s",
1579 usb_pwr
? "present" : "absent");
1580 lcd_putsf(0, 4, "EXT pwr: %s",
1581 ext_pwr
? "present" : "absent");
1582 lcd_putsf(0, 5, "Battery: %s",
1583 charging
? "charging" : (usb_pwr
||ext_pwr
) ? "charged" : "discharging");
1584 lcd_putsf(0, 6, "Dock mode: %s",
1585 dock
? "enabled" : "disabled");
1586 lcd_putsf(0, 7, "Headphone: %s",
1587 headphone
? "connected" : "disconnected");
1589 x
= (adc_read(ADC_4066_ISTAT
) * 2400) /
1595 lcd_putsf(0, 8, "Ibat: %d mA", x
);
1596 lcd_putsf(0, 9, "Vbat * Ibat: %d mW", x
* y
/ 1000);
1598 #elif defined TOSHIBA_GIGABEAT_S
1602 static const unsigned char * const chrgstate_strings
[] =
1613 lcd_putsf(0, line
++, "Charger: %s",
1614 charger_inserted() ? "present" : "absent");
1616 st
= power_input_status() &
1617 (POWER_INPUT_CHARGER
| POWER_INPUT_BATTERY
);
1618 lcd_putsf(0, line
++, "%s%s",
1619 (st
& POWER_INPUT_MAIN_CHARGER
) ? " Main" : "",
1620 (st
& POWER_INPUT_USB_CHARGER
) ? " USB" : "");
1622 y
= ARRAYLEN(chrgstate_strings
) - 1;
1624 switch (charge_state
)
1626 case CHARGE_STATE_DISABLED
: y
--;
1627 case CHARGE_STATE_ERROR
: y
--;
1628 case DISCHARGING
: y
--;
1635 lcd_putsf(0, line
++, "State: %s", chrgstate_strings
[y
]);
1637 lcd_putsf(0, line
++, "Battery Switch: %s",
1638 (st
& POWER_INPUT_BATTERY
) ? "On" : "Off");
1640 y
= chrgraw_adc_voltage();
1641 lcd_putsf(0, line
++, "CHRGRAW: %d.%03d V",
1642 y
/ 1000, y
% 1000);
1644 y
= application_supply_adc_voltage();
1645 lcd_putsf(0, line
++, "BP : %d.%03d V",
1646 y
/ 1000, y
% 1000);
1648 y
= battery_adc_charge_current();
1649 if (y
< 0) x
= '-', y
= -y
;
1651 lcd_putsf(0, line
++, "CHRGISN:%c%d mA", x
, y
);
1653 y
= cccv_regulator_dissipation();
1654 lcd_putsf(0, line
++, "P CCCV : %d mW", y
);
1656 y
= battery_charge_current();
1657 if (y
< 0) x
= '-', y
= -y
;
1659 lcd_putsf(0, line
++, "I Charge:%c%d mA", x
, y
);
1661 y
= battery_adc_temp();
1664 lcd_putsf(0, line
++, "T Battery: %dC (%dF)", y
,
1667 /* Conversion disabled */
1668 lcd_puts(0, line
++, "T Battery: ?");
1671 #elif defined(SANSA_E200) || defined(SANSA_C200) || CONFIG_CPU == AS3525 || \
1672 CONFIG_CPU == AS3525v2
1673 const int first
= CHARGE_STATE_DISABLED
;
1674 static const char * const chrgstate_strings
[] =
1676 [CHARGE_STATE_DISABLED
-first
] = "Disabled",
1677 [CHARGE_STATE_ERROR
-first
] = "Error",
1678 [DISCHARGING
-first
] = "Discharging",
1679 [CHARGING
-first
] = "Charging",
1681 const char *str
= NULL
;
1683 lcd_putsf(0, 3, "Charger: %s",
1684 charger_inserted() ? "present" : "absent");
1686 y
= charge_state
- first
;
1687 if ((unsigned)y
< ARRAYLEN(chrgstate_strings
))
1688 str
= chrgstate_strings
[y
];
1690 lcd_putsf(0, 4, "State: %s",
1691 str
? str
: "<unknown>");
1693 lcd_putsf(0, 5, "CHARGER: %02X", ascodec_read_charger());
1694 #elif defined(IPOD_NANO2G)
1695 y
= pmu_read_battery_voltage();
1696 lcd_putsf(17, 1, "RAW: %d.%03d V", y
/ 1000, y
% 1000);
1697 y
= pmu_read_battery_current();
1698 lcd_putsf(0, 2, "Battery current: %d mA", y
);
1699 lcd_putsf(0, 3, "PWRCON: %8x", PWRCON
);
1700 lcd_putsf(0, 4, "PWRCONEXT: %8x", PWRCONEXT
);
1701 x
= pmu_read(0x1b) & 0xf;
1702 y
= pmu_read(0x1a) * 25 + 625;
1703 lcd_putsf(0, 5, "AUTO: %x / %d mV", x
, y
);
1704 x
= pmu_read(0x1f) & 0xf;
1705 y
= pmu_read(0x1e) * 25 + 625;
1706 lcd_putsf(0, 6, "DOWN1: %x / %d mV", x
, y
);
1707 x
= pmu_read(0x23) & 0xf;
1708 y
= pmu_read(0x22) * 25 + 625;
1709 lcd_putsf(0, 7, "DOWN2: %x / %d mV", x
, y
);
1710 x
= pmu_read(0x27) & 0xf;
1711 y
= pmu_read(0x26) * 100 + 900;
1712 lcd_putsf(0, 8, "MEMLDO: %x / %d mV", x
, y
);
1713 for (i
= 0; i
< 6; i
++)
1715 x
= pmu_read(0x2e + (i
<< 1)) & 0xf;
1716 y
= pmu_read(0x2d + (i
<< 1)) * 100 + 900;
1717 lcd_putsf(0, 9 + i
, "LDO%d: %x / %d mV", i
+ 1, x
, y
);
1719 lcd_putsf(0, 15, "CLKCON: %8x", CLKCON
);
1720 lcd_putsf(17, 15, "PLL0: %6x", PLL0PMS
);
1722 lcd_putsf(0, 3, "Charger: %s",
1723 charger_inserted() ? "present" : "absent");
1724 #endif /* target type */
1725 #endif /* CONFIG_CHARGING */
1728 case 2: /* voltage deltas: */
1729 lcd_puts(0, 0, "Voltage deltas:");
1731 for (i
= 0; i
<= 6; i
++) {
1732 y
= power_history
[i
] - power_history
[i
+1];
1733 lcd_putsf(0, i
+1, "-%d min: %s%d.%03d V", i
,
1734 (y
< 0) ? "-" : "", ((y
< 0) ? y
* -1 : y
) / 1000,
1735 ((y
< 0) ? y
* -1 : y
) % 1000);
1739 case 3: /* remaining time estimation: */
1741 #ifdef ARCHOS_RECORDER
1742 lcd_putsf(0, 0, "charge_state: %d", charge_state
);
1744 lcd_putsf(0, 1, "Cycle time: %d m", powermgmt_last_cycle_startstop_min
);
1746 lcd_putsf(0, 2, "Lvl@cyc st: %d%%", powermgmt_last_cycle_level
);
1748 lcd_putsf(0, 3, "P=%2d I=%2d", pid_p
, pid_i
);
1750 lcd_putsf(0, 4, "Trickle sec: %d/60", trickle_sec
);
1751 #endif /* ARCHOS_RECORDER */
1753 lcd_putsf(0, 5, "Last PwrHist: %d.%03dV",
1754 power_history
[0] / 1000,
1755 power_history
[0] % 1000);
1757 lcd_putsf(0, 6, "battery level: %d%%", battery_level());
1759 lcd_putsf(0, 7, "Est. remain: %d m", battery_time());
1765 switch(get_action(CONTEXT_STD
,HZ
/2))
1767 case ACTION_STD_PREV
:
1772 case ACTION_STD_NEXT
:
1777 case ACTION_STD_CANCEL
:
1778 lcd_setfont(FONT_UI
);
1782 lcd_setfont(FONT_UI
);
1786 #endif /* HAVE_LCD_BITMAP */
1790 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1792 #if (CONFIG_STORAGE & STORAGE_MMC)
1793 #define CARDTYPE "MMC"
1794 #elif (CONFIG_STORAGE & STORAGE_SD)
1795 #define CARDTYPE "microSD"
1798 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1801 int *cardnum
= (int*)lists
->data
;
1802 unsigned char card_name
[6];
1803 unsigned char pbuf
[32];
1804 char *title
= lists
->title
;
1805 static const unsigned char i_vmin
[] = { 0, 1, 5, 10, 25, 35, 60, 100 };
1806 static const unsigned char i_vmax
[] = { 1, 5, 10, 25, 35, 45, 80, 200 };
1807 static const unsigned char * const kbit_units
[] = { "kBit/s", "MBit/s", "GBit/s" };
1808 static const unsigned char * const nsec_units
[] = { "ns", "µs", "ms" };
1809 #if (CONFIG_STORAGE & STORAGE_MMC)
1810 static const char * const mmc_spec_vers
[] = { "1.0-1.2", "1.4", "2.0-2.2",
1811 "3.1-3.31", "4.0" };
1814 if ((btn
== ACTION_STD_OK
) || (btn
== SYS_FS_CHANGED
) || (btn
== ACTION_REDRAW
))
1817 if (btn
== ACTION_STD_OK
)
1819 *cardnum
^= 0x1; /* change cards */
1823 simplelist_set_line_count(0);
1825 card
= card_get_info(*cardnum
);
1827 if (card
->initialized
> 0)
1830 for (i
=0; i
<sizeof(card_name
); i
++)
1832 card_name
[i
] = card_extract_bits(card
->cid
, (103-8*i
), 8);
1834 strlcpy(card_name
, card_name
, sizeof(card_name
));
1835 simplelist_addline(SIMPLELIST_ADD_LINE
,
1836 "%s Rev %d.%d", card_name
,
1837 (int) card_extract_bits(card
->cid
, 63, 4),
1838 (int) card_extract_bits(card
->cid
, 59, 4));
1839 simplelist_addline(SIMPLELIST_ADD_LINE
,
1841 #if (CONFIG_STORAGE & STORAGE_SD)
1842 (int) card_extract_bits(card
->cid
, 11, 4),
1843 (int) card_extract_bits(card
->cid
, 19, 8) + 2000
1844 #elif (CONFIG_STORAGE & STORAGE_MMC)
1845 (int) card_extract_bits(card
->cid
, 15, 4),
1846 (int) card_extract_bits(card
->cid
, 11, 4) + 1997
1849 simplelist_addline(SIMPLELIST_ADD_LINE
,
1850 #if (CONFIG_STORAGE & STORAGE_SD)
1852 card_extract_bits(card
->cid
, 55, 32)
1853 #elif (CONFIG_STORAGE & STORAGE_MMC)
1855 card_extract_bits(card
->cid
, 47, 16)
1859 simplelist_addline(SIMPLELIST_ADD_LINE
, "M=%02x, "
1860 #if (CONFIG_STORAGE & STORAGE_SD)
1862 (int) card_extract_bits(card
->cid
, 127, 8),
1863 card_extract_bits(card
->cid
, 119, 8),
1864 card_extract_bits(card
->cid
, 111, 8)
1865 #elif (CONFIG_STORAGE & STORAGE_MMC)
1867 (int) card_extract_bits(card
->cid
, 127, 8),
1868 (int) card_extract_bits(card
->cid
, 119, 16)
1872 #if (CONFIG_STORAGE & STORAGE_MMC)
1873 int temp
= card_extract_bits(card
->csd
, 125, 4);
1874 simplelist_addline(SIMPLELIST_ADD_LINE
,
1875 "MMC v%s", temp
< 5 ?
1876 mmc_spec_vers
[temp
] : "?.?");
1878 simplelist_addline(SIMPLELIST_ADD_LINE
,
1879 "Blocks: 0x%08lx", card
->numblocks
);
1880 output_dyn_value(pbuf
, sizeof pbuf
, card
->speed
/ 1000,
1882 simplelist_addline(SIMPLELIST_ADD_LINE
,
1884 output_dyn_value(pbuf
, sizeof pbuf
, card
->taac
,
1886 simplelist_addline(SIMPLELIST_ADD_LINE
,
1888 simplelist_addline(SIMPLELIST_ADD_LINE
,
1889 "Nsac: %d clk", card
->nsac
);
1890 simplelist_addline(SIMPLELIST_ADD_LINE
,
1891 "R2W: *%d", card
->r2w_factor
);
1892 simplelist_addline(SIMPLELIST_ADD_LINE
,
1894 i_vmin
[card_extract_bits(card
->csd
, 61, 3)],
1895 i_vmax
[card_extract_bits(card
->csd
, 58, 3)]);
1896 simplelist_addline(SIMPLELIST_ADD_LINE
,
1898 i_vmin
[card_extract_bits(card
->csd
, 55, 3)],
1899 i_vmax
[card_extract_bits(card
->csd
, 52, 3)]);
1901 else if (card
->initialized
== 0)
1903 simplelist_addline(SIMPLELIST_ADD_LINE
, "Not Found!");
1905 #if (CONFIG_STORAGE & STORAGE_SD)
1906 else /* card->initialized < 0 */
1908 simplelist_addline(SIMPLELIST_ADD_LINE
, "Init Error! (%d)", card
->initialized
);
1911 snprintf(title
, 16, "[" CARDTYPE
" %d]", *cardnum
);
1912 gui_synclist_set_title(lists
, title
, Icon_NOICON
);
1913 gui_synclist_set_nb_items(lists
, simplelist_get_line_count());
1914 gui_synclist_select_item(lists
, 0);
1915 btn
= ACTION_REDRAW
;
1919 #elif (CONFIG_STORAGE & STORAGE_ATA)
1920 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1925 unsigned short* identify_info
= ata_get_identify();
1926 bool timing_info_present
= false;
1929 simplelist_set_line_count(0);
1931 for (i
=0; i
< 20; i
++)
1932 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+27]);
1934 /* kill trailing space */
1935 for (i
=39; i
&& buf
[i
]==' '; i
--)
1937 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", buf
);
1938 for (i
=0; i
< 4; i
++)
1939 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+23]);
1941 simplelist_addline(SIMPLELIST_ADD_LINE
,
1942 "Firmware: %s", buf
);
1943 snprintf(buf
, sizeof buf
, "%ld MB",
1944 ((unsigned long)identify_info
[61] << 16 |
1945 (unsigned long)identify_info
[60]) / 2048 );
1946 simplelist_addline(SIMPLELIST_ADD_LINE
,
1949 fat_size( IF_MV2(0,) NULL
, &free
);
1950 simplelist_addline(SIMPLELIST_ADD_LINE
,
1951 "Free: %ld MB", free
/ 1024);
1952 simplelist_addline(SIMPLELIST_ADD_LINE
,
1953 "Spinup time: %d ms", storage_spinup_time() * (1000/HZ
));
1954 i
= identify_info
[83] & (1<<3);
1955 simplelist_addline(SIMPLELIST_ADD_LINE
,
1956 "Power mgmt: %s", i
? "enabled" : "unsupported");
1957 i
= identify_info
[83] & (1<<9);
1958 simplelist_addline(SIMPLELIST_ADD_LINE
,
1959 "Noise mgmt: %s", i
? "enabled" : "unsupported");
1960 i
= identify_info
[82] & (1<<6);
1961 simplelist_addline(SIMPLELIST_ADD_LINE
,
1962 "Read-ahead: %s", i
? "enabled" : "unsupported");
1963 timing_info_present
= identify_info
[53] & (1<<1);
1964 if(timing_info_present
) {
1965 char pio3
[2], pio4
[2];pio3
[1] = 0;
1967 pio3
[0] = (identify_info
[64] & (1<<0)) ? '3' : 0;
1968 pio4
[0] = (identify_info
[64] & (1<<1)) ? '4' : 0;
1969 simplelist_addline(SIMPLELIST_ADD_LINE
,
1970 "PIO modes: 0 1 2 %s %s", pio3
, pio4
);
1973 simplelist_addline(SIMPLELIST_ADD_LINE
,
1974 "No PIO mode info");
1976 timing_info_present
= identify_info
[53] & (1<<1);
1977 if(timing_info_present
) {
1978 simplelist_addline(SIMPLELIST_ADD_LINE
,
1979 "Cycle times %dns/%dns",
1981 identify_info
[68] );
1983 simplelist_addline(SIMPLELIST_ADD_LINE
,
1986 int sector_size
= 512;
1987 if((identify_info
[106] & 0xe000) == 0x6000)
1988 sector_size
*= BIT_N(identify_info
[106] & 0x000f);
1989 simplelist_addline(SIMPLELIST_ADD_LINE
,
1990 "Physical sector size: %d", sector_size
);
1992 if (identify_info
[63] & (1<<0)) {
1993 char mdma0
[2], mdma1
[2], mdma2
[2];
1994 mdma0
[1] = mdma1
[1] = mdma2
[1] = 0;
1995 mdma0
[0] = (identify_info
[63] & (1<<0)) ? '0' : 0;
1996 mdma1
[0] = (identify_info
[63] & (1<<1)) ? '1' : 0;
1997 mdma2
[0] = (identify_info
[63] & (1<<2)) ? '2' : 0;
1998 simplelist_addline(SIMPLELIST_ADD_LINE
,
1999 "MDMA modes: %s %s %s", mdma0
, mdma1
, mdma2
);
2000 simplelist_addline(SIMPLELIST_ADD_LINE
,
2001 "MDMA Cycle times %dns/%dns",
2003 identify_info
[66] );
2006 simplelist_addline(SIMPLELIST_ADD_LINE
,
2007 "No MDMA mode info");
2009 if (identify_info
[53] & (1<<2)) {
2010 char udma0
[2], udma1
[2], udma2
[2], udma3
[2], udma4
[2], udma5
[2], udma6
[2];
2011 udma0
[1] = udma1
[1] = udma2
[1] = udma3
[1] = udma4
[1] = udma5
[1] = udma6
[1] = 0;
2012 udma0
[0] = (identify_info
[88] & (1<<0)) ? '0' : 0;
2013 udma1
[0] = (identify_info
[88] & (1<<1)) ? '1' : 0;
2014 udma2
[0] = (identify_info
[88] & (1<<2)) ? '2' : 0;
2015 udma3
[0] = (identify_info
[88] & (1<<3)) ? '3' : 0;
2016 udma4
[0] = (identify_info
[88] & (1<<4)) ? '4' : 0;
2017 udma5
[0] = (identify_info
[88] & (1<<5)) ? '5' : 0;
2018 udma6
[0] = (identify_info
[88] & (1<<6)) ? '6' : 0;
2019 simplelist_addline(SIMPLELIST_ADD_LINE
,
2020 "UDMA modes: %s %s %s %s %s %s %s", udma0
, udma1
, udma2
,
2021 udma3
, udma4
, udma5
, udma6
);
2024 simplelist_addline(SIMPLELIST_ADD_LINE
,
2025 "No UDMA mode info");
2027 #endif /* HAVE_ATA_DMA */
2028 timing_info_present
= identify_info
[53] & (1<<1);
2029 if(timing_info_present
) {
2030 i
= identify_info
[49] & (1<<11);
2031 simplelist_addline(SIMPLELIST_ADD_LINE
,
2032 "IORDY support: %s", i
? "yes" : "no");
2033 i
= identify_info
[49] & (1<<10);
2034 simplelist_addline(SIMPLELIST_ADD_LINE
,
2035 "IORDY disable: %s", i
? "yes" : "no");
2037 simplelist_addline(SIMPLELIST_ADD_LINE
,
2040 simplelist_addline(SIMPLELIST_ADD_LINE
,
2041 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
2043 i
= ata_get_dma_mode();
2045 simplelist_addline(SIMPLELIST_ADD_LINE
,
2048 simplelist_addline(SIMPLELIST_ADD_LINE
,
2050 (i
& 0x40) ? "UDMA" : "MDMA",
2053 #endif /* HAVE_ATA_DMA */
2056 #else /* No SD, MMC or ATA */
2057 static int disk_callback(int btn
, struct gui_synclist
*lists
)
2061 struct storage_info info
;
2062 storage_get_info(0,&info
);
2063 simplelist_addline(SIMPLELIST_ADD_LINE
, "Vendor: %s", info
.vendor
);
2064 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", info
.product
);
2065 simplelist_addline(SIMPLELIST_ADD_LINE
, "Firmware: %s", info
.revision
);
2066 simplelist_addline(SIMPLELIST_ADD_LINE
,
2067 "Size: %ld MB", info
.num_sectors
*(info
.sector_size
/512)/2024);
2069 fat_size( IF_MV2(0,) NULL
, &free
);
2070 simplelist_addline(SIMPLELIST_ADD_LINE
,
2071 "Free: %ld MB", free
/ 1024);
2072 simplelist_addline(SIMPLELIST_ADD_LINE
,
2073 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
2078 #if (CONFIG_STORAGE & STORAGE_ATA)
2079 static bool dbg_identify_info(void)
2081 int fd
= creat("/identify_info.bin", 0666);
2084 #ifdef ROCKBOX_LITTLE_ENDIAN
2085 ecwrite(fd
, ata_get_identify(), SECTOR_SIZE
/2, "s", true);
2087 write(fd
, ata_get_identify(), SECTOR_SIZE
);
2095 static bool dbg_disk_info(void)
2097 struct simplelist_info info
;
2098 simplelist_info_init(&info
, "Disk Info", 1, NULL
);
2099 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
2102 info
.callback_data
= (void*)&card
;
2105 info
.action_callback
= disk_callback
;
2106 info
.hide_selection
= true;
2107 info
.scroll_all
= true;
2108 return simplelist_show_list(&info
);
2110 #endif /* !SIMULATOR */
2112 #ifdef HAVE_DIRCACHE
2113 static int dircache_callback(int btn
, struct gui_synclist
*lists
)
2115 (void)btn
; (void)lists
;
2116 simplelist_set_line_count(0);
2117 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache initialized: %s",
2118 dircache_is_enabled() ? "Yes" : "No");
2119 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache size: %d B",
2120 dircache_get_cache_size());
2121 simplelist_addline(SIMPLELIST_ADD_LINE
, "Last size: %d B",
2122 global_status
.dircache_size
);
2123 simplelist_addline(SIMPLELIST_ADD_LINE
, "Limit: %d B",
2125 simplelist_addline(SIMPLELIST_ADD_LINE
, "Reserve: %d/%d B",
2126 dircache_get_reserve_used(), DIRCACHE_RESERVE
);
2127 simplelist_addline(SIMPLELIST_ADD_LINE
, "Scanning took: %d s",
2128 dircache_get_build_ticks() / HZ
);
2129 simplelist_addline(SIMPLELIST_ADD_LINE
, "Entry count: %d",
2130 dircache_get_entry_count());
2134 static bool dbg_dircache_info(void)
2136 struct simplelist_info info
;
2137 simplelist_info_init(&info
, "Dircache Info", 7, NULL
);
2138 info
.action_callback
= dircache_callback
;
2139 info
.hide_selection
= true;
2140 info
.scroll_all
= true;
2141 return simplelist_show_list(&info
);
2144 #endif /* HAVE_DIRCACHE */
2146 #ifdef HAVE_TAGCACHE
2147 static int database_callback(int btn
, struct gui_synclist
*lists
)
2150 struct tagcache_stat
*stat
= tagcache_get_stat();
2151 static bool synced
= false;
2153 simplelist_set_line_count(0);
2155 simplelist_addline(SIMPLELIST_ADD_LINE
, "Initialized: %s",
2156 stat
->initialized
? "Yes" : "No");
2157 simplelist_addline(SIMPLELIST_ADD_LINE
, "DB Ready: %s",
2158 stat
->ready
? "Yes" : "No");
2159 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM Cache: %s",
2160 stat
->ramcache
? "Yes" : "No");
2161 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM: %d/%d B",
2162 stat
->ramcache_used
, stat
->ramcache_allocated
);
2163 simplelist_addline(SIMPLELIST_ADD_LINE
, "Progress: %d%% (%d entries)",
2164 stat
->progress
, stat
->processed_entries
);
2165 simplelist_addline(SIMPLELIST_ADD_LINE
, "Curfile: %s",
2166 stat
->curentry
? stat
->curentry
: "---");
2167 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit step: %d",
2169 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit delayed: %s",
2170 stat
->commit_delayed
? "Yes" : "No");
2172 simplelist_addline(SIMPLELIST_ADD_LINE
, "Queue length: %d",
2173 stat
->queue_length
);
2178 tagcache_screensync_event();
2181 if (!btn
&& stat
->curentry
)
2184 return ACTION_REDRAW
;
2187 if (btn
== ACTION_STD_CANCEL
)
2188 tagcache_screensync_enable(false);
2192 static bool dbg_tagcache_info(void)
2194 struct simplelist_info info
;
2195 simplelist_info_init(&info
, "Database Info", 8, NULL
);
2196 info
.action_callback
= database_callback
;
2197 info
.hide_selection
= true;
2198 info
.scroll_all
= true;
2200 /* Don't do nonblock here, must give enough processing time
2201 for tagcache thread. */
2202 /* info.timeout = TIMEOUT_NOBLOCK; */
2204 tagcache_screensync_enable(true);
2205 return simplelist_show_list(&info
);
2209 #if CONFIG_CPU == SH7034
2210 static bool dbg_save_roms(void)
2213 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
2215 fd
= creat("/internal_rom_0000-FFFF.bin", 0666);
2218 write(fd
, (void *)0, 0x10000);
2222 fd
= creat("/internal_rom_2000000-203FFFF.bin", 0666);
2225 write(fd
, (void *)0x2000000, 0x40000);
2229 system_memory_guard(oldmode
);
2232 #elif defined CPU_COLDFIRE
2233 static bool dbg_save_roms(void)
2236 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
2238 #if defined(IRIVER_H100_SERIES)
2239 fd
= creat("/internal_rom_000000-1FFFFF.bin", 0666);
2240 #elif defined(IRIVER_H300_SERIES)
2241 fd
= creat("/internal_rom_000000-3FFFFF.bin", 0666);
2242 #elif defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IAUDIO_M3)
2243 fd
= creat("/internal_rom_000000-3FFFFF.bin", 0666);
2244 #elif defined(MPIO_HD200)
2245 fd
= creat("/internal_rom_000000-1FFFFF.bin", 0666);
2249 write(fd
, (void *)0, FLASH_SIZE
);
2252 system_memory_guard(oldmode
);
2255 fd
= creat("/internal_eeprom.bin", 0666);
2259 char buf
[EEPROM_SIZE
];
2262 old_irq_level
= disable_irq_save();
2264 err
= eeprom_24cxx_read(0, buf
, sizeof buf
);
2266 restore_irq(old_irq_level
);
2269 splashf(HZ
*3, "Eeprom read failure (%d)", err
);
2272 write(fd
, buf
, sizeof buf
);
2281 #elif defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)
2282 static bool dbg_save_roms(void)
2286 fd
= creat("/internal_rom_000000-0FFFFF.bin", 0666);
2289 write(fd
, (void *)0x20000000, FLASH_SIZE
);
2295 #elif CONFIG_CPU == IMX31L
2296 static bool dbg_save_roms(void)
2300 fd
= creat("/flash_rom_A0000000-A01FFFFF.bin", 0666);
2303 write(fd
, (void*)0xa0000000, FLASH_SIZE
);
2309 #elif defined(CPU_TCC780X)
2310 static bool dbg_save_roms(void)
2314 fd
= creat("/eeprom_E0000000-E0001FFF.bin", 0666);
2317 write(fd
, (void*)0xe0000000, 0x2000);
2328 #ifdef CONFIG_TUNER_MULTI
2329 static int tuner_type
= 0;
2330 #define IF_TUNER_TYPE(type) if(tuner_type==type)
2332 #define IF_TUNER_TYPE(type)
2335 static int radio_callback(int btn
, struct gui_synclist
*lists
)
2338 if (btn
== ACTION_STD_CANCEL
)
2340 simplelist_set_line_count(1);
2342 #if (CONFIG_TUNER & LV24020LP)
2343 simplelist_addline(SIMPLELIST_ADD_LINE
,
2344 "CTRL_STAT: %02X", lv24020lp_get(LV24020LP_CTRL_STAT
) );
2345 simplelist_addline(SIMPLELIST_ADD_LINE
,
2346 "RADIO_STAT: %02X", lv24020lp_get(LV24020LP_REG_STAT
) );
2347 simplelist_addline(SIMPLELIST_ADD_LINE
,
2348 "MSS_FM: %d kHz", lv24020lp_get(LV24020LP_MSS_FM
) );
2349 simplelist_addline(SIMPLELIST_ADD_LINE
,
2350 "MSS_IF: %d Hz", lv24020lp_get(LV24020LP_MSS_IF
) );
2351 simplelist_addline(SIMPLELIST_ADD_LINE
,
2352 "MSS_SD: %d Hz", lv24020lp_get(LV24020LP_MSS_SD
) );
2353 simplelist_addline(SIMPLELIST_ADD_LINE
,
2354 "if_set: %d Hz", lv24020lp_get(LV24020LP_IF_SET
) );
2355 simplelist_addline(SIMPLELIST_ADD_LINE
,
2356 "sd_set: %d Hz", lv24020lp_get(LV24020LP_SD_SET
) );
2357 #endif /* LV24020LP */
2358 #if (CONFIG_TUNER & S1A0903X01)
2359 simplelist_addline(SIMPLELIST_ADD_LINE
,
2360 "Samsung regs: %08X", s1a0903x01_get(RADIO_ALL
));
2361 /* This one doesn't return dynamic data atm */
2362 #endif /* S1A0903X01 */
2363 #if (CONFIG_TUNER & TEA5767)
2364 struct tea5767_dbg_info nfo
;
2365 tea5767_dbg_info(&nfo
);
2366 simplelist_addline(SIMPLELIST_ADD_LINE
, "Philips regs:");
2367 simplelist_addline(SIMPLELIST_ADD_LINE
,
2368 " Read: %02X %02X %02X %02X %02X",
2369 (unsigned)nfo
.read_regs
[0], (unsigned)nfo
.read_regs
[1],
2370 (unsigned)nfo
.read_regs
[2], (unsigned)nfo
.read_regs
[3],
2371 (unsigned)nfo
.read_regs
[4]);
2372 simplelist_addline(SIMPLELIST_ADD_LINE
,
2373 " Write: %02X %02X %02X %02X %02X",
2374 (unsigned)nfo
.write_regs
[0], (unsigned)nfo
.write_regs
[1],
2375 (unsigned)nfo
.write_regs
[2], (unsigned)nfo
.write_regs
[3],
2376 (unsigned)nfo
.write_regs
[4]);
2377 #endif /* TEA5767 */
2378 #if (CONFIG_TUNER & SI4700)
2379 IF_TUNER_TYPE(SI4700
)
2381 struct si4700_dbg_info nfo
;
2383 si4700_dbg_info(&nfo
);
2384 simplelist_addline(SIMPLELIST_ADD_LINE
, "SI4700 regs:");
2385 for (i
= 0; i
< 16; i
+= 4) {
2386 simplelist_addline(SIMPLELIST_ADD_LINE
,"%02X: %04X %04X %04X %04X",
2387 i
, nfo
.regs
[i
], nfo
.regs
[i
+1], nfo
.regs
[i
+2], nfo
.regs
[i
+3]);
2391 #if (CONFIG_TUNER & RDA5802)
2392 IF_TUNER_TYPE(RDA5802
)
2394 struct rda5802_dbg_info nfo
;
2396 rda5802_dbg_info(&nfo
);
2397 simplelist_addline(SIMPLELIST_ADD_LINE
, "RDA5802 regs:");
2398 for (i
= 0; i
< 16; i
+= 4) {
2399 simplelist_addline(SIMPLELIST_ADD_LINE
,"%02X: %04X %04X %04X %04X",
2400 i
, nfo
.regs
[i
], nfo
.regs
[i
+1], nfo
.regs
[i
+2], nfo
.regs
[i
+3]);
2403 #endif /* RDA55802 */
2404 return ACTION_REDRAW
;
2406 static bool dbg_fm_radio(void)
2408 struct simplelist_info info
;
2409 #ifdef CONFIG_TUNER_MULTI
2410 tuner_type
= tuner_detect_type();
2412 info
.scroll_all
= true;
2413 simplelist_info_init(&info
, "FM Radio", 1, NULL
);
2414 simplelist_set_line_count(0);
2415 simplelist_addline(SIMPLELIST_ADD_LINE
, "HW detected: %s",
2416 radio_hardware_present() ? "yes" : "no");
2418 info
.action_callback
= radio_hardware_present()?radio_callback
: NULL
;
2419 info
.hide_selection
= true;
2420 return simplelist_show_list(&info
);
2422 #endif /* CONFIG_TUNER */
2423 #endif /* !SIMULATOR */
2425 #ifdef HAVE_LCD_BITMAP
2426 extern bool do_screendump_instead_of_usb
;
2428 static bool dbg_screendump(void)
2430 do_screendump_instead_of_usb
= !do_screendump_instead_of_usb
;
2431 splashf(HZ
, "Screendump %s",
2432 do_screendump_instead_of_usb
?"enabled":"disabled");
2435 #endif /* HAVE_LCD_BITMAP */
2437 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2438 static bool dbg_set_memory_guard(void)
2440 static const struct opt_items names
[MAXMEMGUARD
] = {
2442 { "Flash ROM writes", -1 },
2443 { "Zero area (all)", -1 }
2445 int mode
= system_memory_guard(MEMGUARD_KEEP
);
2447 set_option( "Catch mem accesses", &mode
, INT
, names
, MAXMEMGUARD
, NULL
);
2448 system_memory_guard(mode
);
2452 #endif /* CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) */
2454 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2455 static bool dbg_write_eeprom(void)
2460 char buf
[EEPROM_SIZE
];
2463 fd
= open("/internal_eeprom.bin", O_RDONLY
);
2467 rc
= read(fd
, buf
, EEPROM_SIZE
);
2469 if(rc
== EEPROM_SIZE
)
2471 old_irq_level
= disable_irq_save();
2473 err
= eeprom_24cxx_write(0, buf
, sizeof buf
);
2475 splashf(HZ
*3, "Eeprom write failure (%d)", err
);
2477 splash(HZ
*3, "Eeprom written successfully");
2479 restore_irq(old_irq_level
);
2483 splashf(HZ
*3, "File read error (%d)",rc
);
2489 splash(HZ
*3, "Failed to open 'internal_eeprom.bin'");
2494 #endif /* defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS) */
2495 #ifdef CPU_BOOST_LOGGING
2496 static bool cpu_boost_log(void)
2499 int count
= cpu_boost_log_getcount();
2500 int lines
= LCD_HEIGHT
/SYSFONT_HEIGHT
;
2503 lcd_setfont(FONT_SYSFIXED
);
2504 str
= cpu_boost_log_getlog_first();
2507 lcd_clear_display();
2508 for(j
=0; j
<lines
; j
++,i
++)
2511 str
= cpu_boost_log_getlog_next();
2514 if(strlen(str
) > LCD_WIDTH
/SYSFONT_WIDTH
)
2515 lcd_puts_scroll(0, j
, str
);
2525 switch(get_action(CONTEXT_STD
,TIMEOUT_BLOCK
))
2528 case ACTION_STD_PREV
:
2529 case ACTION_STD_NEXT
:
2532 case ACTION_STD_CANCEL
:
2540 get_action(CONTEXT_STD
,TIMEOUT_BLOCK
);
2541 lcd_setfont(FONT_UI
);
2546 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2547 extern bool wheel_is_touched
;
2548 extern int old_wheel_value
;
2549 extern int new_wheel_value
;
2550 extern int wheel_delta
;
2551 extern unsigned int accumulated_wheel_delta
;
2552 extern unsigned int wheel_velocity
;
2554 static bool dbg_scrollwheel(void)
2558 lcd_setfont(FONT_SYSFIXED
);
2562 if (action_userabort(HZ
/10))
2565 lcd_clear_display();
2567 /* show internal variables of scrollwheel driver */
2568 lcd_putsf(0, 0, "wheel touched: %s", (wheel_is_touched
) ? "true" : "false");
2569 lcd_putsf(0, 1, "new position: %2d", new_wheel_value
);
2570 lcd_putsf(0, 2, "old position: %2d", old_wheel_value
);
2571 lcd_putsf(0, 3, "wheel delta: %2d", wheel_delta
);
2572 lcd_putsf(0, 4, "accumulated delta: %2d", accumulated_wheel_delta
);
2573 lcd_putsf(0, 5, "velo [deg/s]: %4d", (int)wheel_velocity
);
2575 /* show effective accelerated scrollspeed */
2576 speed
= button_apply_acceleration( (1<<31)|(1<<24)|wheel_velocity
);
2577 lcd_putsf(0, 6, "accel. speed: %4d", speed
);
2581 lcd_setfont(FONT_UI
);
2586 #if defined (HAVE_USBSTACK)
2588 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2589 static bool toggle_usb_core_driver(int driver
, char *msg
)
2591 bool enabled
= !usb_core_driver_enabled(driver
);
2593 usb_core_enable_driver(driver
,enabled
);
2594 splashf(HZ
, "%s %s", msg
, enabled
?"enabled":"disabled");
2599 static bool toggle_usb_serial(void)
2601 return toggle_usb_core_driver(USB_DRIVER_SERIAL
,"USB Serial");
2607 #if CONFIG_USBOTG == USBOTG_ISP1583
2608 extern int dbg_usb_num_items(void);
2609 extern const char* dbg_usb_item(int selected_item
, void *data
,
2610 char *buffer
, size_t buffer_len
);
2612 static int isp1583_action_callback(int action
, struct gui_synclist
*lists
)
2615 if (action
== ACTION_NONE
)
2616 action
= ACTION_REDRAW
;
2620 static bool dbg_isp1583(void)
2622 struct simplelist_info isp1583
;
2623 isp1583
.scroll_all
= true;
2624 simplelist_info_init(&isp1583
, "ISP1583", dbg_usb_num_items(), NULL
);
2625 isp1583
.timeout
= HZ
/100;
2626 isp1583
.hide_selection
= true;
2627 isp1583
.get_name
= dbg_usb_item
;
2628 isp1583
.action_callback
= isp1583_action_callback
;
2629 return simplelist_show_list(&isp1583
);
2633 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2634 extern int pic_dbg_num_items(void);
2635 extern const char* pic_dbg_item(int selected_item
, void *data
,
2636 char *buffer
, size_t buffer_len
);
2638 static int pic_action_callback(int action
, struct gui_synclist
*lists
)
2641 if (action
== ACTION_NONE
)
2642 action
= ACTION_REDRAW
;
2646 static bool dbg_pic(void)
2648 struct simplelist_info pic
;
2649 pic
.scroll_all
= true;
2650 simplelist_info_init(&pic
, "PIC", pic_dbg_num_items(), NULL
);
2651 pic
.timeout
= HZ
/100;
2652 pic
.hide_selection
= true;
2653 pic
.get_name
= pic_dbg_item
;
2654 pic
.action_callback
= pic_action_callback
;
2655 return simplelist_show_list(&pic
);
2660 /****** The menu *********/
2661 struct the_menu_item
{
2662 unsigned char *desc
; /* string or ID */
2663 bool (*function
) (void); /* return true if USB was connected */
2665 static const struct the_menu_item menuitems
[] = {
2666 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || \
2667 (defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)) || \
2668 CONFIG_CPU == IMX31L || defined(CPU_TCC780X)
2669 { "Dump ROM contents", dbg_save_roms
},
2671 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || defined(CPU_PP) \
2672 || CONFIG_CPU == S3C2440 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 \
2673 || CONFIG_CPU == DM320 || defined(CPU_S5L870X) || CONFIG_CPU == AS3525v2
2674 { "View I/O ports", dbg_ports
},
2676 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
2677 { "View PCF registers", dbg_pcf
},
2679 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
2680 { "TSC2100 debug", tsc2100_debug
},
2682 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2683 { "CPU frequency", dbg_cpufreq
},
2685 #if defined(IRIVER_H100_SERIES) && !defined(SIMULATOR)
2686 { "S/PDIF analyzer", dbg_spdif
},
2688 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2689 { "Catch mem accesses", dbg_set_memory_guard
},
2691 { "View OS stacks", dbg_os
},
2692 #ifdef HAVE_LCD_BITMAP
2694 { "View battery", view_battery
},
2696 { "Screendump", dbg_screendump
},
2699 { "View HW info", dbg_hw_info
},
2702 { "View partitions", dbg_partitions
},
2705 { "View disk info", dbg_disk_info
},
2706 #if (CONFIG_STORAGE & STORAGE_ATA)
2707 { "Dump ATA identify info", dbg_identify_info
},
2710 #ifdef HAVE_DIRCACHE
2711 { "View dircache info", dbg_dircache_info
},
2713 #ifdef HAVE_TAGCACHE
2714 { "View database info", dbg_tagcache_info
},
2716 #ifdef HAVE_LCD_BITMAP
2717 #if CONFIG_CODEC == SWCODEC
2718 { "View buffering thread", dbg_buffering_thread
},
2719 #elif !defined(SIMULATOR)
2720 { "View audio thread", dbg_audio_thread
},
2723 { "pm histogram", peak_meter_histogram
},
2724 #endif /* PM_DEBUG */
2725 #endif /* HAVE_LCD_BITMAP */
2728 { "FM Radio", dbg_fm_radio
},
2731 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2732 { "Write back EEPROM", dbg_write_eeprom
},
2734 #if CONFIG_USBOTG == USBOTG_ISP1583
2735 { "View ISP1583 info", dbg_isp1583
},
2737 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2738 { "View PIC info", dbg_pic
},
2740 #ifdef ROCKBOX_HAS_LOGF
2741 {"Show Log File", logfdisplay
},
2742 {"Dump Log File", logfdump
},
2744 #if defined(HAVE_USBSTACK)
2745 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2746 {"USB Serial driver (logf)", toggle_usb_serial
},
2748 #endif /* HAVE_USBSTACK */
2749 #ifdef CPU_BOOST_LOGGING
2750 {"cpu_boost log",cpu_boost_log
},
2752 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2753 {"Debug scrollwheel", dbg_scrollwheel
},
2756 static int menu_action_callback(int btn
, struct gui_synclist
*lists
)
2759 if (btn
== ACTION_STD_OK
)
2762 viewportmanager_theme_enable(i
, false, NULL
);
2763 menuitems
[gui_synclist_get_sel_pos(lists
)].function();
2764 btn
= ACTION_REDRAW
;
2766 viewportmanager_theme_undo(i
, false);
2771 static const char* dbg_menu_getname(int item
, void * data
,
2772 char *buffer
, size_t buffer_len
)
2774 (void)data
; (void)buffer
; (void)buffer_len
;
2775 return menuitems
[item
].desc
;
2778 bool debug_menu(void)
2780 struct simplelist_info info
;
2782 simplelist_info_init(&info
, "Debug Menu", ARRAYLEN(menuitems
), NULL
);
2783 info
.action_callback
= menu_action_callback
;
2784 info
.get_name
= dbg_menu_getname
;
2785 return simplelist_show_list(&info
);