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"
56 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
64 #include "eeprom_24cxx.h"
65 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
68 #if (CONFIG_STORAGE & STORAGE_ATA)
77 #ifdef HAVE_LCD_BITMAP
78 #include "scrollbar.h"
79 #include "peakmeter.h"
82 #if CONFIG_CODEC == SWCODEC
84 #include "buffering.h"
86 #if defined(HAVE_SPDIF_OUT) || defined(HAVE_SPDIF_IN)
90 #ifdef IRIVER_H300_SERIES
91 #include "pcf50606.h" /* for pcf50606_read */
98 #if CONFIG_RTC == RTC_PCF50605
101 #include "appevents.h"
102 #include "debug-target.h"
104 #if defined(SANSA_E200) || defined(SANSA_C200) || defined(PHILIPS_SA9200) \
105 || (CONFIG_CPU == AS3525 && defined(CONFIG_CHARGING)) \
106 || CONFIG_CPU == AS3525v2
112 #include "pmu-target.h"
116 #include "usb_core.h"
119 #if defined(IPOD_ACCESSORY_PROTOCOL)
123 /*---------------------------------------------------*/
124 /* SPECIAL DEBUG STUFF */
125 /*---------------------------------------------------*/
126 extern struct thread_entry threads
[MAXTHREADS
];
128 static char thread_status_char(unsigned status
)
130 static const char thread_status_chars
[THREAD_NUM_STATES
+1] =
132 [0 ... THREAD_NUM_STATES
] = '?',
133 [STATE_RUNNING
] = 'R',
134 [STATE_BLOCKED
] = 'B',
135 [STATE_SLEEPING
] = 'S',
136 [STATE_BLOCKED_W_TMO
] = 'T',
137 [STATE_FROZEN
] = 'F',
138 [STATE_KILLED
] = 'K',
141 if (status
> THREAD_NUM_STATES
)
142 status
= THREAD_NUM_STATES
;
144 return thread_status_chars
[status
];
147 static const char* threads_getname(int selected_item
, void *data
,
148 char *buffer
, size_t buffer_len
)
151 struct thread_entry
*thread
;
155 if (selected_item
< (int)NUM_CORES
)
157 snprintf(buffer
, buffer_len
, "Idle (%d): %2d%%", selected_item
,
158 idle_stack_usage(selected_item
));
162 selected_item
-= NUM_CORES
;
165 thread
= &threads
[selected_item
];
167 if (thread
->state
== STATE_KILLED
)
169 snprintf(buffer
, buffer_len
, "%2d: ---", selected_item
);
173 thread_get_name(name
, 32, thread
);
175 snprintf(buffer
, buffer_len
,
176 "%2d: " IF_COP("(%d) ") "%c%c " IF_PRIO("%d %d ") "%2d%% %s",
178 IF_COP(thread
->core
,)
179 #ifdef HAVE_SCHEDULER_BOOSTCTRL
180 (thread
->cpu_boost
) ? '+' :
182 ((thread
->state
== STATE_RUNNING
) ? '*' : ' '),
183 thread_status_char(thread
->state
),
184 IF_PRIO(thread
->base_priority
, thread
->priority
, )
185 thread_stack_usage(thread
), name
);
190 static int dbg_threads_action_callback(int action
, struct gui_synclist
*lists
)
193 #ifdef ROCKBOX_HAS_LOGF
194 if (action
== ACTION_STD_OK
)
196 int selpos
= gui_synclist_get_sel_pos(lists
);
198 if (selpos
>= NUM_CORES
)
199 remove_thread(threads
[selpos
- NUM_CORES
].id
);
201 remove_thread(threads
[selpos
].id
);
203 return ACTION_REDRAW
;
205 #endif /* ROCKBOX_HAS_LOGF */
206 if (action
== ACTION_NONE
)
207 action
= ACTION_REDRAW
;
211 static bool dbg_os(void)
213 struct simplelist_info info
;
214 simplelist_info_init(&info
, IF_COP("Core and ") "Stack usage:",
218 MAXTHREADS
+NUM_CORES
,
221 #ifndef ROCKBOX_HAS_LOGF
222 info
.hide_selection
= true;
223 info
.scroll_all
= true;
225 info
.action_callback
= dbg_threads_action_callback
;
226 info
.get_name
= threads_getname
;
227 return simplelist_show_list(&info
);
230 #ifdef HAVE_LCD_BITMAP
231 #if CONFIG_CODEC != SWCODEC
233 static bool dbg_audio_thread(void)
235 struct audio_debug d
;
237 lcd_setfont(FONT_SYSFIXED
);
241 if (action_userabort(HZ
/5))
244 audio_get_debugdata(&d
);
248 lcd_putsf(0, 0, "read: %x", d
.audiobuf_read
);
249 lcd_putsf(0, 1, "write: %x", d
.audiobuf_write
);
250 lcd_putsf(0, 2, "swap: %x", d
.audiobuf_swapwrite
);
251 lcd_putsf(0, 3, "playing: %d", d
.playing
);
252 lcd_putsf(0, 4, "playable: %x", d
.playable_space
);
253 lcd_putsf(0, 5, "unswapped: %x", d
.unswapped_space
);
255 /* Playable space left */
256 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8, 112, 4, d
.audiobuflen
, 0,
257 d
.playable_space
, HORIZONTAL
);
259 /* Show the watermark limit */
260 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8+4, 112, 4, d
.audiobuflen
, 0,
261 d
.low_watermark_level
, HORIZONTAL
);
263 lcd_putsf(0, 7, "wm: %x - %x",
264 d
.low_watermark_level
, d
.lowest_watermark_level
);
268 lcd_setfont(FONT_UI
);
271 #endif /* !SIMULATOR */
272 #else /* CONFIG_CODEC == SWCODEC */
273 static unsigned int ticks
, boost_ticks
, freq_sum
;
275 static void dbg_audio_task(void)
277 #ifdef CPUFREQ_NORMAL
278 if(FREQ
> CPUFREQ_NORMAL
)
280 freq_sum
+= FREQ
/1000000; /* in MHz */
285 static bool dbg_buffering_thread(void)
291 size_t bufsize
= pcmbuf_get_bufsize();
292 int pcmbufdescs
= pcmbuf_descs();
293 struct buffering_debug d
;
294 size_t filebuflen
= audio_get_filebuflen();
295 /* This is a size_t, but call it a long so it puts a - when it's bad. */
297 ticks
= boost_ticks
= freq_sum
= 0;
299 tick_add_task(dbg_audio_task
);
302 screens
[i
].setfont(FONT_SYSFIXED
);
306 button
= get_action(CONTEXT_STD
,HZ
/5);
309 case ACTION_STD_NEXT
:
312 case ACTION_STD_PREV
:
315 case ACTION_STD_CANCEL
:
320 buffering_get_debugdata(&d
);
321 bufused
= bufsize
- pcmbuf_free();
326 screens
[i
].clear_display();
329 screens
[i
].putsf(0, line
++, "pcm: %6ld/%ld", (long) bufused
, (long) bufsize
);
331 gui_scrollbar_draw(&screens
[i
],0, line
*8, screens
[i
].lcdwidth
, 6,
332 bufsize
, 0, bufused
, HORIZONTAL
);
335 screens
[i
].putsf(0, line
++, "alloc: %6ld/%ld", audio_filebufused(),
338 #if LCD_HEIGHT > 80 || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_HEIGHT > 80)
339 if (screens
[i
].lcdheight
> 80)
341 gui_scrollbar_draw(&screens
[i
],0, line
*8, screens
[i
].lcdwidth
, 6,
342 filebuflen
, 0, audio_filebufused(), HORIZONTAL
);
345 screens
[i
].putsf(0, line
++, "real: %6ld/%ld", (long)d
.buffered_data
,
348 gui_scrollbar_draw(&screens
[i
],0, line
*8, screens
[i
].lcdwidth
, 6,
349 filebuflen
, 0, (long)d
.buffered_data
, HORIZONTAL
);
354 screens
[i
].putsf(0, line
++, "usefl: %6ld/%ld", (long)(d
.useful_data
),
357 #if LCD_HEIGHT > 80 || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_HEIGHT > 80)
358 if (screens
[i
].lcdheight
> 80)
360 gui_scrollbar_draw(&screens
[i
],0, line
*8, screens
[i
].lcdwidth
, 6,
361 filebuflen
, 0, d
.useful_data
, HORIZONTAL
);
366 screens
[i
].putsf(0, line
++, "data_rem: %ld", (long)d
.data_rem
);
368 screens
[i
].putsf(0, line
++, "track count: %2d", audio_track_count());
370 screens
[i
].putsf(0, line
++, "handle count: %d", (int)d
.num_handles
);
372 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
373 screens
[i
].putsf(0, line
++, "cpu freq: %3dMHz",
374 (int)((FREQ
+ 500000) / 1000000));
379 int boostquota
= boost_ticks
* 1000 / ticks
; /* in 0.1 % */
380 int avgclock
= freq_sum
* 10 / ticks
; /* in 100 kHz */
381 screens
[i
].putsf(0, line
++, "boost:%3d.%d%% (%d.%dMHz)",
382 boostquota
/10, boostquota
%10, avgclock
/10, avgclock
%10);
385 screens
[i
].putsf(0, line
++, "pcmbufdesc: %2d/%2d",
386 pcmbuf_used_descs(), pcmbufdescs
);
387 screens
[i
].putsf(0, line
++, "watermark: %6d",
394 tick_remove_task(dbg_audio_task
);
397 screens
[i
].setfont(FONT_UI
);
401 #endif /* CONFIG_CODEC */
402 #endif /* HAVE_LCD_BITMAP */
405 #if (CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE))
406 /* Tool function to read the flash manufacturer and type, if available.
407 Only chips which could be reprogrammed in system will return values.
408 (The mode switch addresses vary between flash manufacturers, hence addr1/2) */
409 /* In IRAM to avoid problems when running directly from Flash */
410 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
411 unsigned addr1
, unsigned addr2
)
412 ICODE_ATTR
__attribute__((noinline
));
413 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
414 unsigned addr1
, unsigned addr2
)
417 unsigned not_manu
, not_id
; /* read values before switching to ID mode */
418 unsigned manu
, id
; /* read values when in ID mode */
420 #if CONFIG_CPU == SH7034
421 volatile unsigned char* flash
= (unsigned char*)0x2000000; /* flash mapping */
422 #elif defined(CPU_COLDFIRE)
423 volatile unsigned short* flash
= (unsigned short*)0; /* flash mapping */
425 int old_level
; /* saved interrupt level */
427 not_manu
= flash
[0]; /* read the normal content */
428 not_id
= flash
[1]; /* should be 'A' (0x41) and 'R' (0x52) from the "ARCH" marker */
430 /* disable interrupts, prevent any stray flash access */
431 old_level
= disable_irq_save();
433 flash
[addr1
] = 0xAA; /* enter command mode */
435 flash
[addr1
] = 0x90; /* ID command */
436 /* Atmel wants 20ms pause here */
437 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
439 manu
= flash
[0]; /* read the IDs */
442 flash
[0] = 0xF0; /* reset flash (back to normal read mode) */
443 /* Atmel wants 20ms pause here */
444 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
446 restore_irq(old_level
); /* enable interrupts again */
448 /* I assume success if the obtained values are different from
449 the normal flash content. This is not perfectly bulletproof, they
450 could theoretically be the same by chance, causing us to fail. */
451 if (not_manu
!= manu
|| not_id
!= id
) /* a value has changed */
453 *p_manufacturer
= manu
; /* return the results */
455 return true; /* success */
457 return false; /* fail */
459 #endif /* (CONFIG_CPU == SH7034 || CPU_COLDFIRE) */
461 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
463 static int perfcheck(void)
469 "orr r0, r2, #0xc0 \n" /* disable IRQ and FIQ */
472 "ldr r0, [%[timr]] \n"
473 "add r0, r0, %[tmo] \n"
475 "add %[res], %[res], #1 \n"
476 "ldr r1, [%[timr]] \n"
479 "msr CPSR_c, r2 \n" /* reset IRQ and FIQ state */
483 [timr
]"r"(&USEC_TIMER
),
485 #if CONFIG_CPU == PP5002
487 #else /* PP5020/5022/5024 */
498 #ifdef HAVE_LCD_BITMAP
499 static bool dbg_hw_info(void)
501 #if CONFIG_CPU == SH7034
502 int bitmask
= HW_MASK
;
503 int rom_version
= ROM_VERSION
;
504 unsigned manu
, id
; /* flash IDs */
505 bool got_id
; /* flag if we managed to get the flash IDs */
506 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
507 bool has_bootrom
; /* flag for boot ROM present */
508 int oldmode
; /* saved memory guard mode */
510 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
512 /* get flash ROM type */
513 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
515 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
517 /* check if the boot ROM area is a flash mirror */
518 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
519 if (has_bootrom
) /* if ROM and Flash different */
521 /* calculate CRC16 checksum of boot ROM */
522 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
525 system_memory_guard(oldmode
); /* re-enable memory guard */
527 lcd_setfont(FONT_SYSFIXED
);
530 lcd_puts(0, 0, "[Hardware info]");
532 lcd_putsf(0, 1, "ROM: %d.%02d", rom_version
/100, rom_version
%100);
534 lcd_putsf(0, 2, "Mask: 0x%04x", bitmask
);
537 lcd_putsf(0, 3, "Flash: M=%02x D=%02x", manu
, id
);
539 lcd_puts(0, 3, "Flash: M=?? D=??"); /* unknown, sorry */
543 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
544 lcd_puts(0, 4, "Boot ROM: V1");
546 lcd_putsf(0, 4, "ROMcrc: 0x%08x", rom_crc
);
550 lcd_puts(0, 4, "Boot ROM: none");
555 while (!(action_userabort(TIMEOUT_BLOCK
)));
557 #elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250
558 unsigned manu
, id
; /* flash IDs */
559 int got_id
; /* flag if we managed to get the flash IDs */
560 int oldmode
; /* saved memory guard mode */
563 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
565 /* get flash ROM type */
566 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
568 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
570 system_memory_guard(oldmode
); /* re-enable memory guard */
572 lcd_setfont(FONT_SYSFIXED
);
575 lcd_puts(0, line
++, "[Hardware info]");
578 lcd_putsf(0, line
++, "Flash: M=%04x D=%04x", manu
, id
);
580 lcd_puts(0, line
++, "Flash: M=???? D=????"); /* unknown, sorry */
586 lcd_puts(0, ++line
, "Serial Number:");
588 got_id
= ds2411_read_id(&id
);
590 if (got_id
== DS2411_OK
)
592 lcd_putsf(0, ++line
, " FC=%02x", (unsigned)id
.family_code
);
593 lcd_putsf(0, ++line
, " ID=%02X %02X %02X %02X %02X %02X",
594 (unsigned)id
.uid
[0], (unsigned)id
.uid
[1], (unsigned)id
.uid
[2],
595 (unsigned)id
.uid
[3], (unsigned)id
.uid
[4], (unsigned)id
.uid
[5]);
596 lcd_putsf(0, ++line
, " CRC=%02X", (unsigned)id
.crc
);
600 lcd_putsf(0, ++line
, "READ ERR=%d", got_id
);
607 while (!(action_userabort(TIMEOUT_BLOCK
)));
609 #elif defined(CPU_PP502x)
611 char pp_version
[] = { (PP_VER2
>> 24) & 0xff, (PP_VER2
>> 16) & 0xff,
612 (PP_VER2
>> 8) & 0xff, (PP_VER2
) & 0xff,
613 (PP_VER1
>> 24) & 0xff, (PP_VER1
>> 16) & 0xff,
614 (PP_VER1
>> 8) & 0xff, (PP_VER1
) & 0xff, '\0' };
616 lcd_setfont(FONT_SYSFIXED
);
619 lcd_puts(0, line
++, "[Hardware info]");
622 lcd_putsf(0, line
++, "HW rev: 0x%08lx", IPOD_HW_REVISION
);
626 extern int lcd_type
; /* Defined in lcd-colornano.c */
628 lcd_putsf(0, line
++, "LCD type: %d", lcd_type
);
631 lcd_putsf(0, line
++, "PP version: %s", pp_version
);
633 lcd_putsf(0, line
++, "Est. clock (kHz): %d", perfcheck());
637 while (!(action_userabort(TIMEOUT_BLOCK
)));
639 #elif CONFIG_CPU == PP5002
641 char pp_version
[] = { (PP_VER4
>> 8) & 0xff, PP_VER4
& 0xff,
642 (PP_VER3
>> 8) & 0xff, PP_VER3
& 0xff,
643 (PP_VER2
>> 8) & 0xff, PP_VER2
& 0xff,
644 (PP_VER1
>> 8) & 0xff, PP_VER1
& 0xff, '\0' };
647 lcd_setfont(FONT_SYSFIXED
);
650 lcd_puts(0, line
++, "[Hardware info]");
653 lcd_putsf(0, line
++, "HW rev: 0x%08lx", IPOD_HW_REVISION
);
656 lcd_putsf(0, line
++, "PP version: %s", pp_version
);
658 lcd_putsf(0, line
++, "Est. clock (kHz): %d", perfcheck());
662 while (!(action_userabort(TIMEOUT_BLOCK
)));
665 /* Define this function in your target tree */
666 return __dbg_hw_info();
667 #endif /* CONFIG_CPU */
668 lcd_setfont(FONT_UI
);
671 #else /* !HAVE_LCD_BITMAP */
672 static bool dbg_hw_info(void)
676 int rom_version
= ROM_VERSION
;
677 unsigned manu
, id
; /* flash IDs */
678 bool got_id
; /* flag if we managed to get the flash IDs */
679 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
680 bool has_bootrom
; /* flag for boot ROM present */
681 int oldmode
; /* saved memory guard mode */
683 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
685 /* get flash ROM type */
686 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
688 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
690 /* check if the boot ROM area is a flash mirror */
691 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
692 if (has_bootrom
) /* if ROM and Flash different */
694 /* calculate CRC16 checksum of boot ROM */
695 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
698 system_memory_guard(oldmode
); /* re-enable memory guard */
702 lcd_puts(0, 0, "[HW Info]");
708 lcd_putsf(0, 1, "ROM: %d.%02d",
709 rom_version
/100, rom_version
%100);
713 lcd_putsf(0, 1, "Flash:%02x,%02x", manu
, id
);
715 lcd_puts(0, 1, "Flash:??,??"); /* unknown, sorry */
720 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
721 lcd_puts(0, 1, "BootROM: V1");
722 else if (rom_crc
== 0x358099E8)
723 lcd_puts(0, 1, "BootROM: V2");
724 /* alternative boot ROM found in one single player so far */
726 lcd_putsf(0, 1, "R: %08x", rom_crc
);
729 lcd_puts(0, 1, "BootROM: no");
734 button
= get_action(CONTEXT_SETTINGS
,TIMEOUT_BLOCK
);
738 case ACTION_STD_CANCEL
:
741 case ACTION_SETTINGS_DEC
:
747 case ACTION_SETTINGS_INC
:
756 #endif /* !HAVE_LCD_BITMAP */
757 #endif /* PLATFORM_NATIVE */
759 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
760 static const char* dbg_partitions_getname(int selected_item
, void *data
,
761 char *buffer
, size_t buffer_len
)
764 int partition
= selected_item
/2;
765 struct partinfo
* p
= disk_partinfo(partition
);
768 snprintf(buffer
, buffer_len
, " T:%x %ld MB", p
->type
, p
->size
/ ( 2048 / ( SECTOR_SIZE
/ 512 )));
772 snprintf(buffer
, buffer_len
, "P%d: S:%lx", partition
, p
->start
);
777 bool dbg_partitions(void)
779 struct simplelist_info info
;
780 simplelist_info_init(&info
, "Partition Info", 4, NULL
);
781 info
.selection_size
= 2;
782 info
.hide_selection
= true;
783 info
.scroll_all
= true;
784 info
.get_name
= dbg_partitions_getname
;
785 return simplelist_show_list(&info
);
787 #endif /* PLATFORM_NATIVE */
789 #if defined(CPU_COLDFIRE) && defined(HAVE_SPDIF_OUT)
790 static bool dbg_spdif(void)
793 unsigned int control
;
798 unsigned int interruptstat
;
799 bool valnogood
, symbolerr
, parityerr
;
802 int spdif_source
= spdif_get_output_source(&spdif_src_on
);
803 spdif_set_output_source(AUDIO_SRC_SPDIF
IF_SPDIF_POWER_(, true));
806 lcd_setfont(FONT_SYSFIXED
);
808 #ifdef HAVE_SPDIF_POWER
809 spdif_power_enable(true); /* We need SPDIF power for both sending & receiving */
816 control
= EBU1RCVCCHANNEL1
;
817 interruptstat
= INTERRUPTSTAT
;
818 INTERRUPTCLEAR
= 0x03c00000;
820 valnogood
= (interruptstat
& 0x01000000)?true:false;
821 symbolerr
= (interruptstat
& 0x00800000)?true:false;
822 parityerr
= (interruptstat
& 0x00400000)?true:false;
824 lcd_putsf(0, line
++, "Val: %s Sym: %s Par: %s",
827 parityerr
?"--":"OK");
829 lcd_putsf(0, line
++, "Status word: %08x", (int)control
);
834 lcd_putsf(0, line
++, "PRO: %d (%s)",
835 x
, x
?"Professional":"Consumer");
837 x
= (control
>> 30) & 1;
838 lcd_putsf(0, line
++, "Audio: %d (%s)",
839 x
, x
?"Non-PCM":"PCM");
841 x
= (control
>> 29) & 1;
842 lcd_putsf(0, line
++, "Copy: %d (%s)",
843 x
, x
?"Permitted":"Inhibited");
845 x
= (control
>> 27) & 7;
858 lcd_putsf(0, line
++, "Preemphasis: %d (%s)", x
, s
);
860 x
= (control
>> 24) & 3;
861 lcd_putsf(0, line
++, "Mode: %d", x
);
863 category
= (control
>> 17) & 127;
875 lcd_putsf(0, line
++, "Category: 0x%02x (%s)", category
, s
);
877 x
= (control
>> 16) & 1;
879 if(((category
& 0x70) == 0x10) ||
880 ((category
& 0x70) == 0x40) ||
881 ((category
& 0x78) == 0x38))
883 generation
= !generation
;
885 lcd_putsf(0, line
++, "Generation: %d (%s)",
886 x
, generation
?"Original":"No ind.");
888 x
= (control
>> 12) & 15;
889 lcd_putsf(0, line
++, "Source: %d", x
);
892 x
= (control
>> 8) & 15;
908 lcd_putsf(0, line
++, "Channel: %d (%s)", x
, s
);
910 x
= (control
>> 4) & 15;
923 lcd_putsf(0, line
++, "Frequency: %d (%s)", x
, s
);
925 x
= (control
>> 2) & 3;
926 lcd_putsf(0, line
++, "Clock accuracy: %d", x
);
929 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
930 lcd_putsf(0, line
++, "Measured freq: %ldHz",
931 spdif_measure_frequency());
936 if (action_userabort(HZ
/10))
940 spdif_set_output_source(spdif_source
IF_SPDIF_POWER_(, spdif_src_on
));
942 #ifdef HAVE_SPDIF_POWER
943 spdif_power_enable(global_settings
.spdif_enable
);
946 lcd_setfont(FONT_UI
);
949 #endif /* CPU_COLDFIRE */
951 #if (CONFIG_RTC == RTC_PCF50605) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
952 static bool dbg_pcf(void)
956 #ifdef HAVE_LCD_BITMAP
957 lcd_setfont(FONT_SYSFIXED
);
965 lcd_putsf(0, line
++, "DCDC1: %02x", pcf50605_read(0x1b));
966 lcd_putsf(0, line
++, "DCDC2: %02x", pcf50605_read(0x1c));
967 lcd_putsf(0, line
++, "DCDC3: %02x", pcf50605_read(0x1d));
968 lcd_putsf(0, line
++, "DCDC4: %02x", pcf50605_read(0x1e));
969 lcd_putsf(0, line
++, "DCDEC1: %02x", pcf50605_read(0x1f));
970 lcd_putsf(0, line
++, "DCDEC2: %02x", pcf50605_read(0x20));
971 lcd_putsf(0, line
++, "DCUDC1: %02x", pcf50605_read(0x21));
972 lcd_putsf(0, line
++, "DCUDC2: %02x", pcf50605_read(0x22));
973 lcd_putsf(0, line
++, "IOREGC: %02x", pcf50605_read(0x23));
974 lcd_putsf(0, line
++, "D1REGC: %02x", pcf50605_read(0x24));
975 lcd_putsf(0, line
++, "D2REGC: %02x", pcf50605_read(0x25));
976 lcd_putsf(0, line
++, "D3REGC: %02x", pcf50605_read(0x26));
977 lcd_putsf(0, line
++, "LPREG1: %02x", pcf50605_read(0x27));
979 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
981 lcd_setfont(FONT_UI
);
986 lcd_setfont(FONT_UI
);
991 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
992 static bool dbg_cpufreq(void)
997 #ifdef HAVE_LCD_BITMAP
998 lcd_setfont(FONT_SYSFIXED
);
1000 lcd_clear_display();
1006 lcd_putsf(0, line
++, "Frequency: %ld", FREQ
);
1007 lcd_putsf(0, line
++, "boost_counter: %d", get_cpu_boost_counter());
1010 button
= get_action(CONTEXT_STD
,HZ
/10);
1014 case ACTION_STD_PREV
:
1018 case ACTION_STD_NEXT
:
1023 while (get_cpu_boost_counter() > 0)
1025 set_cpu_frequency(CPUFREQ_DEFAULT
);
1028 case ACTION_STD_CANCEL
:
1029 lcd_setfont(FONT_UI
);
1033 lcd_setfont(FONT_UI
);
1036 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
1038 #if defined(HAVE_TSC2100) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
1039 #include "tsc2100.h"
1040 static char *itob(int n
, int len
)
1042 static char binary
[64];
1044 for (i
=1, j
=0;i
<=len
;i
++)
1046 binary
[j
++] = n
&(1<<(len
-i
))?'1':'0';
1054 static const char* tsc2100_debug_getname(int selected_item
, void * data
,
1055 char *buffer
, size_t buffer_len
)
1057 int *page
= (int*)data
;
1058 bool reserved
= false;
1062 if ((selected_item
> 0x0a) ||
1063 (selected_item
== 0x04) ||
1064 (selected_item
== 0x08))
1068 if ((selected_item
> 0x05) ||
1069 (selected_item
== 0x02))
1073 if (selected_item
> 0x1e)
1078 snprintf(buffer
, buffer_len
, "%02x: RESERVED", selected_item
);
1080 snprintf(buffer
, buffer_len
, "%02x: %s", selected_item
,
1081 itob(tsc2100_readreg(*page
, selected_item
)&0xffff,16));
1084 static int tsc2100debug_action_callback(int action
, struct gui_synclist
*lists
)
1086 int *page
= (int*)lists
->data
;
1087 if (action
== ACTION_STD_OK
)
1089 *page
= (*page
+1)%3;
1090 snprintf(lists
->title
, 32,
1091 "tsc2100 registers - Page %d", *page
);
1092 return ACTION_REDRAW
;
1096 static bool tsc2100_debug(void)
1099 char title
[32] = "tsc2100 registers - Page 0";
1100 struct simplelist_info info
;
1101 simplelist_info_init(&info
, title
, 32, &page
);
1102 info
.timeout
= HZ
/100;
1103 info
.get_name
= tsc2100_debug_getname
;
1104 info
.action_callback
= tsc2100debug_action_callback
;
1105 return simplelist_show_list(&info
);
1108 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
1109 #ifdef HAVE_LCD_BITMAP
1111 * view_battery() shows a automatically scaled graph of the battery voltage
1112 * over time. Usable for estimating battery life / charging rate.
1113 * The power_history array is updated in power_thread of powermgmt.c.
1116 #define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN)
1117 #define BAT_YSPACE (LCD_HEIGHT - 20)
1120 static bool view_battery(void)
1123 int i
, x
, y
, y1
, y2
, grid
, graph
;
1124 unsigned short maxv
, minv
;
1126 lcd_setfont(FONT_SYSFIXED
);
1130 lcd_clear_display();
1132 case 0: /* voltage history graph */
1133 /* Find maximum and minimum voltage for scaling */
1134 minv
= power_history
[0];
1136 for (i
= 1; i
< BAT_LAST_VAL
&& power_history
[i
]; i
++) {
1137 if (power_history
[i
] > maxv
)
1138 maxv
= power_history
[i
];
1139 if (power_history
[i
] < minv
)
1140 minv
= power_history
[i
];
1143 /* adjust grid scale */
1144 if ((maxv
- minv
) > 50)
1150 lcd_putsf(0, 0, "battery %d.%03dV", power_history
[0] / 1000,
1151 power_history
[0] % 1000);
1152 lcd_putsf(0, 1, "%d.%03d-%d.%03dV (%2dmV)",
1153 minv
/ 1000, minv
% 1000, maxv
/ 1000, maxv
% 1000,
1157 while ((y
= (minv
- (minv
% grid
)+i
*grid
)) < maxv
)
1159 graph
= ((y
-minv
)*BAT_YSPACE
)/(maxv
-minv
);
1160 graph
= LCD_HEIGHT
-1 - graph
;
1162 /* draw dotted horizontal grid line */
1163 for (x
=0; x
<LCD_WIDTH
;x
=x
+2)
1164 lcd_drawpixel(x
,graph
);
1170 /* draw plot of power history
1171 * skip empty entries
1173 for (i
= BAT_LAST_VAL
- 1; i
> 0; i
--)
1175 if (power_history
[i
] && power_history
[i
-1])
1177 y1
= (power_history
[i
] - minv
) * BAT_YSPACE
/
1179 y1
= MIN(MAX(LCD_HEIGHT
-1 - y1
, 20),
1181 y2
= (power_history
[i
-1] - minv
) * BAT_YSPACE
/
1183 y2
= MIN(MAX(LCD_HEIGHT
-1 - y2
, 20),
1186 lcd_set_drawmode(DRMODE_SOLID
);
1188 /* make line thicker */
1189 lcd_drawline(((x
*LCD_WIDTH
)/(BAT_LAST_VAL
)),
1191 (((x
+1)*LCD_WIDTH
)/(BAT_LAST_VAL
)),
1193 lcd_drawline(((x
*LCD_WIDTH
)/(BAT_LAST_VAL
))+1,
1195 (((x
+1)*LCD_WIDTH
)/(BAT_LAST_VAL
))+1,
1202 case 1: /* status: */
1203 #if CONFIG_CHARGING >= CHARGING_MONITOR
1204 lcd_putsf(0, 0, "Pwr status: %s",
1205 charging_state() ? "charging" : "discharging");
1207 lcd_puts(0, 0, "Power status:");
1209 battery_read_info(&y
, NULL
);
1210 lcd_putsf(0, 1, "Battery: %d.%03d V", y
/ 1000, y
% 1000);
1211 #ifdef ADC_EXT_POWER
1212 y
= (adc_read(ADC_EXT_POWER
) * EXT_SCALE_FACTOR
) / 1000;
1213 lcd_putsf(0, 2, "External: %d.%03d V", y
/ 1000, y
% 1000);
1216 #if defined ARCHOS_RECORDER
1217 lcd_putsf(0, 3, "Chgr: %s %s",
1218 charger_inserted() ? "present" : "absent",
1219 charger_enabled() ? "on" : "off");
1220 lcd_putsf(0, 5, "short delta: %d", short_delta
);
1221 lcd_putsf(0, 6, "long delta: %d", long_delta
);
1222 lcd_puts(0, 7, power_message
);
1223 lcd_putsf(0, 8, "USB Inserted: %s",
1224 usb_inserted() ? "yes" : "no");
1225 #elif defined IPOD_NANO || defined IPOD_VIDEO
1226 int usb_pwr
= (GPIOL_INPUT_VAL
& 0x10)?true:false;
1227 int ext_pwr
= (GPIOL_INPUT_VAL
& 0x08)?false:true;
1228 int dock
= (GPIOA_INPUT_VAL
& 0x10)?true:false;
1229 int charging
= (GPIOB_INPUT_VAL
& 0x01)?false:true;
1230 int headphone
= (GPIOA_INPUT_VAL
& 0x80)?true:false;
1232 lcd_putsf(0, 3, "USB pwr: %s",
1233 usb_pwr
? "present" : "absent");
1234 lcd_putsf(0, 4, "EXT pwr: %s",
1235 ext_pwr
? "present" : "absent");
1236 lcd_putsf(0, 5, "Battery: %s",
1237 charging
? "charging" : (usb_pwr
||ext_pwr
) ? "charged" : "discharging");
1238 lcd_putsf(0, 6, "Dock mode: %s",
1239 dock
? "enabled" : "disabled");
1240 lcd_putsf(0, 7, "Headphone: %s",
1241 headphone
? "connected" : "disconnected");
1243 if(probed_ramsize
== 64)
1244 x
= (adc_read(ADC_4066_ISTAT
) * 2400) / (1024 * 2);
1246 x
= (adc_read(ADC_4066_ISTAT
) * 2400) / (1024 * 3);
1247 lcd_putsf(0, 8, "Ibat: %d mA", x
);
1248 lcd_putsf(0, 9, "Vbat * Ibat: %d mW", x
* y
/ 1000);
1250 #elif defined TOSHIBA_GIGABEAT_S
1254 static const unsigned char * const chrgstate_strings
[] =
1265 lcd_putsf(0, line
++, "Charger: %s",
1266 charger_inserted() ? "present" : "absent");
1268 st
= power_input_status() &
1269 (POWER_INPUT_CHARGER
| POWER_INPUT_BATTERY
);
1270 lcd_putsf(0, line
++, "%s%s",
1271 (st
& POWER_INPUT_MAIN_CHARGER
) ? " Main" : "",
1272 (st
& POWER_INPUT_USB_CHARGER
) ? " USB" : "");
1274 y
= ARRAYLEN(chrgstate_strings
) - 1;
1276 switch (charge_state
)
1278 case CHARGE_STATE_DISABLED
: y
--;
1279 case CHARGE_STATE_ERROR
: y
--;
1280 case DISCHARGING
: y
--;
1287 lcd_putsf(0, line
++, "State: %s", chrgstate_strings
[y
]);
1289 lcd_putsf(0, line
++, "Battery Switch: %s",
1290 (st
& POWER_INPUT_BATTERY
) ? "On" : "Off");
1292 y
= chrgraw_adc_voltage();
1293 lcd_putsf(0, line
++, "CHRGRAW: %d.%03d V",
1294 y
/ 1000, y
% 1000);
1296 y
= application_supply_adc_voltage();
1297 lcd_putsf(0, line
++, "BP : %d.%03d V",
1298 y
/ 1000, y
% 1000);
1300 y
= battery_adc_charge_current();
1301 if (y
< 0) x
= '-', y
= -y
;
1303 lcd_putsf(0, line
++, "CHRGISN:%c%d mA", x
, y
);
1305 y
= cccv_regulator_dissipation();
1306 lcd_putsf(0, line
++, "P CCCV : %d mW", y
);
1308 y
= battery_charge_current();
1309 if (y
< 0) x
= '-', y
= -y
;
1311 lcd_putsf(0, line
++, "I Charge:%c%d mA", x
, y
);
1313 y
= battery_adc_temp();
1316 lcd_putsf(0, line
++, "T Battery: %dC (%dF)", y
,
1319 /* Conversion disabled */
1320 lcd_puts(0, line
++, "T Battery: ?");
1323 #elif defined(SANSA_E200) || defined(SANSA_C200) || CONFIG_CPU == AS3525 || \
1324 CONFIG_CPU == AS3525v2
1325 static const char * const chrgstate_strings
[] =
1327 [CHARGE_STATE_DISABLED
- CHARGE_STATE_DISABLED
]= "Disabled",
1328 [CHARGE_STATE_ERROR
- CHARGE_STATE_DISABLED
] = "Error",
1329 [DISCHARGING
- CHARGE_STATE_DISABLED
] = "Discharging",
1330 [CHARGING
- CHARGE_STATE_DISABLED
] = "Charging",
1332 const char *str
= NULL
;
1334 lcd_putsf(0, 3, "Charger: %s",
1335 charger_inserted() ? "present" : "absent");
1337 y
= charge_state
- CHARGE_STATE_DISABLED
;
1338 if ((unsigned)y
< ARRAYLEN(chrgstate_strings
))
1339 str
= chrgstate_strings
[y
];
1341 lcd_putsf(0, 4, "State: %s",
1342 str
? str
: "<unknown>");
1344 lcd_putsf(0, 5, "CHARGER: %02X", ascodec_read_charger());
1345 #elif defined(IPOD_NANO2G)
1346 y
= pmu_read_battery_voltage();
1347 lcd_putsf(17, 1, "RAW: %d.%03d V", y
/ 1000, y
% 1000);
1348 y
= pmu_read_battery_current();
1349 lcd_putsf(0, 2, "Battery current: %d mA", y
);
1350 lcd_putsf(0, 3, "PWRCON: %8x", PWRCON
);
1351 lcd_putsf(0, 4, "PWRCONEXT: %8x", PWRCONEXT
);
1352 x
= pmu_read(0x1b) & 0xf;
1353 y
= pmu_read(0x1a) * 25 + 625;
1354 lcd_putsf(0, 5, "AUTO: %x / %d mV", x
, y
);
1355 x
= pmu_read(0x1f) & 0xf;
1356 y
= pmu_read(0x1e) * 25 + 625;
1357 lcd_putsf(0, 6, "DOWN1: %x / %d mV", x
, y
);
1358 x
= pmu_read(0x23) & 0xf;
1359 y
= pmu_read(0x22) * 25 + 625;
1360 lcd_putsf(0, 7, "DOWN2: %x / %d mV", x
, y
);
1361 x
= pmu_read(0x27) & 0xf;
1362 y
= pmu_read(0x26) * 100 + 900;
1363 lcd_putsf(0, 8, "MEMLDO: %x / %d mV", x
, y
);
1364 for (i
= 0; i
< 6; i
++)
1366 x
= pmu_read(0x2e + (i
<< 1)) & 0xf;
1367 y
= pmu_read(0x2d + (i
<< 1)) * 100 + 900;
1368 lcd_putsf(0, 9 + i
, "LDO%d: %x / %d mV", i
+ 1, x
, y
);
1370 lcd_putsf(0, 15, "CLKCON: %8x", CLKCON
);
1371 lcd_putsf(17, 15, "PLL0: %6x", PLL0PMS
);
1373 lcd_putsf(0, 3, "Charger: %s",
1374 charger_inserted() ? "present" : "absent");
1375 #endif /* target type */
1376 #endif /* CONFIG_CHARGING */
1379 case 2: /* voltage deltas: */
1380 lcd_puts(0, 0, "Voltage deltas:");
1382 for (i
= 0; i
<= 6; i
++) {
1383 y
= power_history
[i
] - power_history
[i
+1];
1384 lcd_putsf(0, i
+1, "-%d min: %s%d.%03d V", i
,
1385 (y
< 0) ? "-" : "", ((y
< 0) ? y
* -1 : y
) / 1000,
1386 ((y
< 0) ? y
* -1 : y
) % 1000);
1390 case 3: /* remaining time estimation: */
1392 #ifdef ARCHOS_RECORDER
1393 lcd_putsf(0, 0, "charge_state: %d", charge_state
);
1395 lcd_putsf(0, 1, "Cycle time: %d m", powermgmt_last_cycle_startstop_min
);
1397 lcd_putsf(0, 2, "Lvl@cyc st: %d%%", powermgmt_last_cycle_level
);
1399 lcd_putsf(0, 3, "P=%2d I=%2d", pid_p
, pid_i
);
1401 lcd_putsf(0, 4, "Trickle sec: %d/60", trickle_sec
);
1402 #endif /* ARCHOS_RECORDER */
1404 lcd_putsf(0, 5, "Last PwrHist: %d.%03dV",
1405 power_history
[0] / 1000,
1406 power_history
[0] % 1000);
1408 lcd_putsf(0, 6, "battery level: %d%%", battery_level());
1410 lcd_putsf(0, 7, "Est. remain: %d m", battery_time());
1416 switch(get_action(CONTEXT_STD
,HZ
/2))
1418 case ACTION_STD_PREV
:
1423 case ACTION_STD_NEXT
:
1428 case ACTION_STD_CANCEL
:
1429 lcd_setfont(FONT_UI
);
1433 lcd_setfont(FONT_UI
);
1437 #endif /* HAVE_LCD_BITMAP */
1440 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
1441 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1443 #if (CONFIG_STORAGE & STORAGE_MMC)
1444 #define CARDTYPE "MMC"
1445 #elif (CONFIG_STORAGE & STORAGE_SD)
1446 #define CARDTYPE "microSD"
1449 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1452 int *cardnum
= (int*)lists
->data
;
1453 unsigned char card_name
[6];
1454 unsigned char pbuf
[32];
1455 char *title
= lists
->title
;
1456 static const unsigned char i_vmin
[] = { 0, 1, 5, 10, 25, 35, 60, 100 };
1457 static const unsigned char i_vmax
[] = { 1, 5, 10, 25, 35, 45, 80, 200 };
1458 static const unsigned char * const kbit_units
[] = { "kBit/s", "MBit/s", "GBit/s" };
1459 static const unsigned char * const nsec_units
[] = { "ns", "µs", "ms" };
1460 #if (CONFIG_STORAGE & STORAGE_MMC)
1461 static const char * const mmc_spec_vers
[] = { "1.0-1.2", "1.4", "2.0-2.2",
1462 "3.1-3.31", "4.0" };
1465 if ((btn
== ACTION_STD_OK
) || (btn
== SYS_FS_CHANGED
) || (btn
== ACTION_REDRAW
))
1468 if (btn
== ACTION_STD_OK
)
1470 *cardnum
^= 0x1; /* change cards */
1474 simplelist_set_line_count(0);
1476 card
= card_get_info(*cardnum
);
1478 if (card
->initialized
> 0)
1481 for (i
=0; i
<sizeof(card_name
); i
++)
1483 card_name
[i
] = card_extract_bits(card
->cid
, (103-8*i
), 8);
1485 strlcpy(card_name
, card_name
, sizeof(card_name
));
1486 simplelist_addline(SIMPLELIST_ADD_LINE
,
1487 "%s Rev %d.%d", card_name
,
1488 (int) card_extract_bits(card
->cid
, 63, 4),
1489 (int) card_extract_bits(card
->cid
, 59, 4));
1490 simplelist_addline(SIMPLELIST_ADD_LINE
,
1492 #if (CONFIG_STORAGE & STORAGE_SD)
1493 (int) card_extract_bits(card
->cid
, 11, 4),
1494 (int) card_extract_bits(card
->cid
, 19, 8) + 2000
1495 #elif (CONFIG_STORAGE & STORAGE_MMC)
1496 (int) card_extract_bits(card
->cid
, 15, 4),
1497 (int) card_extract_bits(card
->cid
, 11, 4) + 1997
1500 simplelist_addline(SIMPLELIST_ADD_LINE
,
1501 #if (CONFIG_STORAGE & STORAGE_SD)
1503 card_extract_bits(card
->cid
, 55, 32)
1504 #elif (CONFIG_STORAGE & STORAGE_MMC)
1506 card_extract_bits(card
->cid
, 47, 16)
1510 simplelist_addline(SIMPLELIST_ADD_LINE
, "M=%02x, "
1511 #if (CONFIG_STORAGE & STORAGE_SD)
1513 (int) card_extract_bits(card
->cid
, 127, 8),
1514 card_extract_bits(card
->cid
, 119, 8),
1515 card_extract_bits(card
->cid
, 111, 8)
1516 #elif (CONFIG_STORAGE & STORAGE_MMC)
1518 (int) card_extract_bits(card
->cid
, 127, 8),
1519 (int) card_extract_bits(card
->cid
, 119, 16)
1523 #if (CONFIG_STORAGE & STORAGE_MMC)
1524 int temp
= card_extract_bits(card
->csd
, 125, 4);
1525 simplelist_addline(SIMPLELIST_ADD_LINE
,
1526 "MMC v%s", temp
< 5 ?
1527 mmc_spec_vers
[temp
] : "?.?");
1529 simplelist_addline(SIMPLELIST_ADD_LINE
,
1530 "Blocks: 0x%08lx", card
->numblocks
);
1531 output_dyn_value(pbuf
, sizeof pbuf
, card
->speed
/ 1000,
1533 simplelist_addline(SIMPLELIST_ADD_LINE
,
1535 output_dyn_value(pbuf
, sizeof pbuf
, card
->taac
,
1537 simplelist_addline(SIMPLELIST_ADD_LINE
,
1539 simplelist_addline(SIMPLELIST_ADD_LINE
,
1540 "Nsac: %d clk", card
->nsac
);
1541 simplelist_addline(SIMPLELIST_ADD_LINE
,
1542 "R2W: *%d", card
->r2w_factor
);
1543 simplelist_addline(SIMPLELIST_ADD_LINE
,
1545 i_vmin
[card_extract_bits(card
->csd
, 61, 3)],
1546 i_vmax
[card_extract_bits(card
->csd
, 58, 3)]);
1547 simplelist_addline(SIMPLELIST_ADD_LINE
,
1549 i_vmin
[card_extract_bits(card
->csd
, 55, 3)],
1550 i_vmax
[card_extract_bits(card
->csd
, 52, 3)]);
1552 else if (card
->initialized
== 0)
1554 simplelist_addline(SIMPLELIST_ADD_LINE
, "Not Found!");
1556 #if (CONFIG_STORAGE & STORAGE_SD)
1557 else /* card->initialized < 0 */
1559 simplelist_addline(SIMPLELIST_ADD_LINE
, "Init Error! (%d)", card
->initialized
);
1562 snprintf(title
, 16, "[" CARDTYPE
" %d]", *cardnum
);
1563 gui_synclist_set_title(lists
, title
, Icon_NOICON
);
1564 gui_synclist_set_nb_items(lists
, simplelist_get_line_count());
1565 gui_synclist_select_item(lists
, 0);
1566 btn
= ACTION_REDRAW
;
1570 #elif (CONFIG_STORAGE & STORAGE_ATA)
1571 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1576 unsigned short* identify_info
= ata_get_identify();
1577 bool timing_info_present
= false;
1580 simplelist_set_line_count(0);
1582 for (i
=0; i
< 20; i
++)
1583 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+27]);
1585 /* kill trailing space */
1586 for (i
=39; i
&& buf
[i
]==' '; i
--)
1588 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", buf
);
1589 for (i
=0; i
< 4; i
++)
1590 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+23]);
1592 simplelist_addline(SIMPLELIST_ADD_LINE
,
1593 "Firmware: %s", buf
);
1594 snprintf(buf
, sizeof buf
, "%ld MB",
1595 ((unsigned long)identify_info
[61] << 16 |
1596 (unsigned long)identify_info
[60]) / 2048 );
1597 simplelist_addline(SIMPLELIST_ADD_LINE
,
1600 fat_size( IF_MV2(0,) NULL
, &free
);
1601 simplelist_addline(SIMPLELIST_ADD_LINE
,
1602 "Free: %ld MB", free
/ 1024);
1603 simplelist_addline(SIMPLELIST_ADD_LINE
,
1604 "Spinup time: %d ms", storage_spinup_time() * (1000/HZ
));
1605 i
= identify_info
[83] & (1<<3);
1606 simplelist_addline(SIMPLELIST_ADD_LINE
,
1607 "Power mgmt: %s", i
? "enabled" : "unsupported");
1608 i
= identify_info
[83] & (1<<9);
1609 simplelist_addline(SIMPLELIST_ADD_LINE
,
1610 "Noise mgmt: %s", i
? "enabled" : "unsupported");
1611 i
= identify_info
[82] & (1<<6);
1612 simplelist_addline(SIMPLELIST_ADD_LINE
,
1613 "Read-ahead: %s", i
? "enabled" : "unsupported");
1614 timing_info_present
= identify_info
[53] & (1<<1);
1615 if(timing_info_present
) {
1616 char pio3
[2], pio4
[2];pio3
[1] = 0;
1618 pio3
[0] = (identify_info
[64] & (1<<0)) ? '3' : 0;
1619 pio4
[0] = (identify_info
[64] & (1<<1)) ? '4' : 0;
1620 simplelist_addline(SIMPLELIST_ADD_LINE
,
1621 "PIO modes: 0 1 2 %s %s", pio3
, pio4
);
1624 simplelist_addline(SIMPLELIST_ADD_LINE
,
1625 "No PIO mode info");
1627 timing_info_present
= identify_info
[53] & (1<<1);
1628 if(timing_info_present
) {
1629 simplelist_addline(SIMPLELIST_ADD_LINE
,
1630 "Cycle times %dns/%dns",
1632 identify_info
[68] );
1634 simplelist_addline(SIMPLELIST_ADD_LINE
,
1637 int sector_size
= 512;
1638 if((identify_info
[106] & 0xe000) == 0x6000)
1639 sector_size
*= BIT_N(identify_info
[106] & 0x000f);
1640 simplelist_addline(SIMPLELIST_ADD_LINE
,
1641 "Physical sector size: %d", sector_size
);
1643 if (identify_info
[63] & (1<<0)) {
1644 char mdma0
[2], mdma1
[2], mdma2
[2];
1645 mdma0
[1] = mdma1
[1] = mdma2
[1] = 0;
1646 mdma0
[0] = (identify_info
[63] & (1<<0)) ? '0' : 0;
1647 mdma1
[0] = (identify_info
[63] & (1<<1)) ? '1' : 0;
1648 mdma2
[0] = (identify_info
[63] & (1<<2)) ? '2' : 0;
1649 simplelist_addline(SIMPLELIST_ADD_LINE
,
1650 "MDMA modes: %s %s %s", mdma0
, mdma1
, mdma2
);
1651 simplelist_addline(SIMPLELIST_ADD_LINE
,
1652 "MDMA Cycle times %dns/%dns",
1654 identify_info
[66] );
1657 simplelist_addline(SIMPLELIST_ADD_LINE
,
1658 "No MDMA mode info");
1660 if (identify_info
[53] & (1<<2)) {
1661 char udma0
[2], udma1
[2], udma2
[2], udma3
[2], udma4
[2], udma5
[2], udma6
[2];
1662 udma0
[1] = udma1
[1] = udma2
[1] = udma3
[1] = udma4
[1] = udma5
[1] = udma6
[1] = 0;
1663 udma0
[0] = (identify_info
[88] & (1<<0)) ? '0' : 0;
1664 udma1
[0] = (identify_info
[88] & (1<<1)) ? '1' : 0;
1665 udma2
[0] = (identify_info
[88] & (1<<2)) ? '2' : 0;
1666 udma3
[0] = (identify_info
[88] & (1<<3)) ? '3' : 0;
1667 udma4
[0] = (identify_info
[88] & (1<<4)) ? '4' : 0;
1668 udma5
[0] = (identify_info
[88] & (1<<5)) ? '5' : 0;
1669 udma6
[0] = (identify_info
[88] & (1<<6)) ? '6' : 0;
1670 simplelist_addline(SIMPLELIST_ADD_LINE
,
1671 "UDMA modes: %s %s %s %s %s %s %s", udma0
, udma1
, udma2
,
1672 udma3
, udma4
, udma5
, udma6
);
1675 simplelist_addline(SIMPLELIST_ADD_LINE
,
1676 "No UDMA mode info");
1678 #endif /* HAVE_ATA_DMA */
1679 timing_info_present
= identify_info
[53] & (1<<1);
1680 if(timing_info_present
) {
1681 i
= identify_info
[49] & (1<<11);
1682 simplelist_addline(SIMPLELIST_ADD_LINE
,
1683 "IORDY support: %s", i
? "yes" : "no");
1684 i
= identify_info
[49] & (1<<10);
1685 simplelist_addline(SIMPLELIST_ADD_LINE
,
1686 "IORDY disable: %s", i
? "yes" : "no");
1688 simplelist_addline(SIMPLELIST_ADD_LINE
,
1691 simplelist_addline(SIMPLELIST_ADD_LINE
,
1692 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
1694 i
= ata_get_dma_mode();
1696 simplelist_addline(SIMPLELIST_ADD_LINE
,
1699 simplelist_addline(SIMPLELIST_ADD_LINE
,
1701 (i
& 0x40) ? "UDMA" : "MDMA",
1704 #endif /* HAVE_ATA_DMA */
1707 #else /* No SD, MMC or ATA */
1708 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1712 struct storage_info info
;
1713 storage_get_info(0,&info
);
1714 simplelist_addline(SIMPLELIST_ADD_LINE
, "Vendor: %s", info
.vendor
);
1715 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", info
.product
);
1716 simplelist_addline(SIMPLELIST_ADD_LINE
, "Firmware: %s", info
.revision
);
1717 simplelist_addline(SIMPLELIST_ADD_LINE
,
1718 "Size: %ld MB", info
.num_sectors
*(info
.sector_size
/512)/2024);
1720 fat_size( IF_MV2(0,) NULL
, &free
);
1721 simplelist_addline(SIMPLELIST_ADD_LINE
,
1722 "Free: %ld MB", free
/ 1024);
1723 simplelist_addline(SIMPLELIST_ADD_LINE
,
1724 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
1729 #if (CONFIG_STORAGE & STORAGE_ATA)
1730 static bool dbg_identify_info(void)
1732 int fd
= creat("/identify_info.bin", 0666);
1735 #ifdef ROCKBOX_LITTLE_ENDIAN
1736 ecwrite(fd
, ata_get_identify(), SECTOR_SIZE
/2, "s", true);
1738 write(fd
, ata_get_identify(), SECTOR_SIZE
);
1746 static bool dbg_disk_info(void)
1748 struct simplelist_info info
;
1749 simplelist_info_init(&info
, "Disk Info", 1, NULL
);
1750 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1753 info
.callback_data
= (void*)&card
;
1756 info
.action_callback
= disk_callback
;
1757 info
.hide_selection
= true;
1758 info
.scroll_all
= true;
1759 return simplelist_show_list(&info
);
1761 #endif /* PLATFORM_NATIVE */
1763 #ifdef HAVE_DIRCACHE
1764 static int dircache_callback(int btn
, struct gui_synclist
*lists
)
1766 (void)btn
; (void)lists
;
1767 simplelist_set_line_count(0);
1768 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache initialized: %s",
1769 dircache_is_enabled() ? "Yes" : "No");
1770 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache size: %d B",
1771 dircache_get_cache_size());
1772 simplelist_addline(SIMPLELIST_ADD_LINE
, "Last size: %d B",
1773 global_status
.dircache_size
);
1774 simplelist_addline(SIMPLELIST_ADD_LINE
, "Limit: %d B",
1776 simplelist_addline(SIMPLELIST_ADD_LINE
, "Reserve: %d/%d B",
1777 dircache_get_reserve_used(), DIRCACHE_RESERVE
);
1778 simplelist_addline(SIMPLELIST_ADD_LINE
, "Scanning took: %d s",
1779 dircache_get_build_ticks() / HZ
);
1780 simplelist_addline(SIMPLELIST_ADD_LINE
, "Entry count: %d",
1781 dircache_get_entry_count());
1785 static bool dbg_dircache_info(void)
1787 struct simplelist_info info
;
1788 simplelist_info_init(&info
, "Dircache Info", 7, NULL
);
1789 info
.action_callback
= dircache_callback
;
1790 info
.hide_selection
= true;
1791 info
.scroll_all
= true;
1792 return simplelist_show_list(&info
);
1795 #endif /* HAVE_DIRCACHE */
1797 #ifdef HAVE_TAGCACHE
1798 static int database_callback(int btn
, struct gui_synclist
*lists
)
1801 struct tagcache_stat
*stat
= tagcache_get_stat();
1802 static bool synced
= false;
1804 simplelist_set_line_count(0);
1806 simplelist_addline(SIMPLELIST_ADD_LINE
, "Initialized: %s",
1807 stat
->initialized
? "Yes" : "No");
1808 simplelist_addline(SIMPLELIST_ADD_LINE
, "DB Ready: %s",
1809 stat
->ready
? "Yes" : "No");
1810 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM Cache: %s",
1811 stat
->ramcache
? "Yes" : "No");
1812 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM: %d/%d B",
1813 stat
->ramcache_used
, stat
->ramcache_allocated
);
1814 simplelist_addline(SIMPLELIST_ADD_LINE
, "Progress: %d%% (%d entries)",
1815 stat
->progress
, stat
->processed_entries
);
1816 simplelist_addline(SIMPLELIST_ADD_LINE
, "Curfile: %s",
1817 stat
->curentry
? stat
->curentry
: "---");
1818 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit step: %d",
1820 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit delayed: %s",
1821 stat
->commit_delayed
? "Yes" : "No");
1823 simplelist_addline(SIMPLELIST_ADD_LINE
, "Queue length: %d",
1824 stat
->queue_length
);
1829 tagcache_screensync_event();
1832 if (!btn
&& stat
->curentry
)
1835 return ACTION_REDRAW
;
1838 if (btn
== ACTION_STD_CANCEL
)
1839 tagcache_screensync_enable(false);
1843 static bool dbg_tagcache_info(void)
1845 struct simplelist_info info
;
1846 simplelist_info_init(&info
, "Database Info", 8, NULL
);
1847 info
.action_callback
= database_callback
;
1848 info
.hide_selection
= true;
1849 info
.scroll_all
= true;
1851 /* Don't do nonblock here, must give enough processing time
1852 for tagcache thread. */
1853 /* info.timeout = TIMEOUT_NOBLOCK; */
1855 tagcache_screensync_enable(true);
1856 return simplelist_show_list(&info
);
1860 #if CONFIG_CPU == SH7034
1861 static bool dbg_save_roms(void)
1864 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
1866 fd
= creat("/internal_rom_0000-FFFF.bin", 0666);
1869 write(fd
, (void *)0, 0x10000);
1873 fd
= creat("/internal_rom_2000000-203FFFF.bin", 0666);
1876 write(fd
, (void *)0x2000000, 0x40000);
1880 system_memory_guard(oldmode
);
1883 #elif defined CPU_COLDFIRE
1884 static bool dbg_save_roms(void)
1887 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
1889 #if defined(IRIVER_H100_SERIES)
1890 fd
= creat("/internal_rom_000000-1FFFFF.bin", 0666);
1891 #elif defined(IRIVER_H300_SERIES)
1892 fd
= creat("/internal_rom_000000-3FFFFF.bin", 0666);
1893 #elif defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IAUDIO_M3)
1894 fd
= creat("/internal_rom_000000-3FFFFF.bin", 0666);
1895 #elif defined(MPIO_HD200)
1896 fd
= creat("/internal_rom_000000-1FFFFF.bin", 0666);
1900 write(fd
, (void *)0, FLASH_SIZE
);
1903 system_memory_guard(oldmode
);
1906 fd
= creat("/internal_eeprom.bin", 0666);
1910 char buf
[EEPROM_SIZE
];
1913 old_irq_level
= disable_irq_save();
1915 err
= eeprom_24cxx_read(0, buf
, sizeof buf
);
1917 restore_irq(old_irq_level
);
1920 splashf(HZ
*3, "Eeprom read failure (%d)", err
);
1923 write(fd
, buf
, sizeof buf
);
1932 #elif defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)
1933 static bool dbg_save_roms(void)
1937 fd
= creat("/internal_rom_000000-0FFFFF.bin", 0666);
1940 write(fd
, (void *)0x20000000, FLASH_SIZE
);
1946 #elif CONFIG_CPU == IMX31L
1947 static bool dbg_save_roms(void)
1951 fd
= creat("/flash_rom_A0000000-A01FFFFF.bin", 0666);
1954 write(fd
, (void*)0xa0000000, FLASH_SIZE
);
1960 #elif defined(CPU_TCC780X)
1961 static bool dbg_save_roms(void)
1965 fd
= creat("/eeprom_E0000000-E0001FFF.bin", 0666);
1968 write(fd
, (void*)0xe0000000, 0x2000);
1979 #ifdef CONFIG_TUNER_MULTI
1980 static int tuner_type
= 0;
1981 #define IF_TUNER_TYPE(type) if(tuner_type==type)
1983 #define IF_TUNER_TYPE(type)
1986 static int radio_callback(int btn
, struct gui_synclist
*lists
)
1989 if (btn
== ACTION_STD_CANCEL
)
1991 simplelist_set_line_count(1);
1993 #if (CONFIG_TUNER & LV24020LP)
1994 simplelist_addline(SIMPLELIST_ADD_LINE
,
1995 "CTRL_STAT: %02X", lv24020lp_get(LV24020LP_CTRL_STAT
) );
1996 simplelist_addline(SIMPLELIST_ADD_LINE
,
1997 "RADIO_STAT: %02X", lv24020lp_get(LV24020LP_REG_STAT
) );
1998 simplelist_addline(SIMPLELIST_ADD_LINE
,
1999 "MSS_FM: %d kHz", lv24020lp_get(LV24020LP_MSS_FM
) );
2000 simplelist_addline(SIMPLELIST_ADD_LINE
,
2001 "MSS_IF: %d Hz", lv24020lp_get(LV24020LP_MSS_IF
) );
2002 simplelist_addline(SIMPLELIST_ADD_LINE
,
2003 "MSS_SD: %d Hz", lv24020lp_get(LV24020LP_MSS_SD
) );
2004 simplelist_addline(SIMPLELIST_ADD_LINE
,
2005 "if_set: %d Hz", lv24020lp_get(LV24020LP_IF_SET
) );
2006 simplelist_addline(SIMPLELIST_ADD_LINE
,
2007 "sd_set: %d Hz", lv24020lp_get(LV24020LP_SD_SET
) );
2008 #endif /* LV24020LP */
2009 #if (CONFIG_TUNER & S1A0903X01)
2010 simplelist_addline(SIMPLELIST_ADD_LINE
,
2011 "Samsung regs: %08X", s1a0903x01_get(RADIO_ALL
));
2012 /* This one doesn't return dynamic data atm */
2013 #endif /* S1A0903X01 */
2014 #if (CONFIG_TUNER & TEA5767)
2015 struct tea5767_dbg_info nfo
;
2016 tea5767_dbg_info(&nfo
);
2017 simplelist_addline(SIMPLELIST_ADD_LINE
, "Philips regs:");
2018 simplelist_addline(SIMPLELIST_ADD_LINE
,
2019 " Read: %02X %02X %02X %02X %02X",
2020 (unsigned)nfo
.read_regs
[0], (unsigned)nfo
.read_regs
[1],
2021 (unsigned)nfo
.read_regs
[2], (unsigned)nfo
.read_regs
[3],
2022 (unsigned)nfo
.read_regs
[4]);
2023 simplelist_addline(SIMPLELIST_ADD_LINE
,
2024 " Write: %02X %02X %02X %02X %02X",
2025 (unsigned)nfo
.write_regs
[0], (unsigned)nfo
.write_regs
[1],
2026 (unsigned)nfo
.write_regs
[2], (unsigned)nfo
.write_regs
[3],
2027 (unsigned)nfo
.write_regs
[4]);
2028 #endif /* TEA5767 */
2029 #if (CONFIG_TUNER & SI4700)
2030 IF_TUNER_TYPE(SI4700
)
2032 struct si4700_dbg_info nfo
;
2034 si4700_dbg_info(&nfo
);
2035 simplelist_addline(SIMPLELIST_ADD_LINE
, "SI4700 regs:");
2036 for (i
= 0; i
< 16; i
+= 4) {
2037 simplelist_addline(SIMPLELIST_ADD_LINE
,"%02X: %04X %04X %04X %04X",
2038 i
, nfo
.regs
[i
], nfo
.regs
[i
+1], nfo
.regs
[i
+2], nfo
.regs
[i
+3]);
2042 #if (CONFIG_TUNER & RDA5802)
2043 IF_TUNER_TYPE(RDA5802
)
2045 struct rda5802_dbg_info nfo
;
2047 rda5802_dbg_info(&nfo
);
2048 simplelist_addline(SIMPLELIST_ADD_LINE
, "RDA5802 regs:");
2049 for (i
= 0; i
< 16; i
+= 4) {
2050 simplelist_addline(SIMPLELIST_ADD_LINE
,"%02X: %04X %04X %04X %04X",
2051 i
, nfo
.regs
[i
], nfo
.regs
[i
+1], nfo
.regs
[i
+2], nfo
.regs
[i
+3]);
2054 #endif /* RDA55802 */
2055 return ACTION_REDRAW
;
2057 static bool dbg_fm_radio(void)
2059 struct simplelist_info info
;
2060 #ifdef CONFIG_TUNER_MULTI
2061 tuner_type
= tuner_detect_type();
2063 info
.scroll_all
= true;
2064 simplelist_info_init(&info
, "FM Radio", 1, NULL
);
2065 simplelist_set_line_count(0);
2066 simplelist_addline(SIMPLELIST_ADD_LINE
, "HW detected: %s",
2067 radio_hardware_present() ? "yes" : "no");
2069 info
.action_callback
= radio_hardware_present()?radio_callback
: NULL
;
2070 info
.hide_selection
= true;
2071 return simplelist_show_list(&info
);
2073 #endif /* CONFIG_TUNER */
2074 #endif /* !SIMULATOR */
2076 #ifdef HAVE_LCD_BITMAP
2077 extern bool do_screendump_instead_of_usb
;
2079 static bool dbg_screendump(void)
2081 do_screendump_instead_of_usb
= !do_screendump_instead_of_usb
;
2082 splashf(HZ
, "Screendump %s",
2083 do_screendump_instead_of_usb
?"enabled":"disabled");
2086 #endif /* HAVE_LCD_BITMAP */
2088 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2089 static bool dbg_set_memory_guard(void)
2091 static const struct opt_items names
[MAXMEMGUARD
] = {
2093 { "Flash ROM writes", -1 },
2094 { "Zero area (all)", -1 }
2096 int mode
= system_memory_guard(MEMGUARD_KEEP
);
2098 set_option( "Catch mem accesses", &mode
, INT
, names
, MAXMEMGUARD
, NULL
);
2099 system_memory_guard(mode
);
2103 #endif /* CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) */
2105 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2106 static bool dbg_write_eeprom(void)
2111 char buf
[EEPROM_SIZE
];
2114 fd
= open("/internal_eeprom.bin", O_RDONLY
);
2118 rc
= read(fd
, buf
, EEPROM_SIZE
);
2120 if(rc
== EEPROM_SIZE
)
2122 old_irq_level
= disable_irq_save();
2124 err
= eeprom_24cxx_write(0, buf
, sizeof buf
);
2126 splashf(HZ
*3, "Eeprom write failure (%d)", err
);
2128 splash(HZ
*3, "Eeprom written successfully");
2130 restore_irq(old_irq_level
);
2134 splashf(HZ
*3, "File read error (%d)",rc
);
2140 splash(HZ
*3, "Failed to open 'internal_eeprom.bin'");
2145 #endif /* defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS) */
2146 #ifdef CPU_BOOST_LOGGING
2147 static bool cpu_boost_log(void)
2150 int count
= cpu_boost_log_getcount();
2151 int lines
= LCD_HEIGHT
/SYSFONT_HEIGHT
;
2154 lcd_setfont(FONT_SYSFIXED
);
2155 str
= cpu_boost_log_getlog_first();
2158 lcd_clear_display();
2159 for(j
=0; j
<lines
; j
++,i
++)
2162 str
= cpu_boost_log_getlog_next();
2165 if(strlen(str
) > LCD_WIDTH
/SYSFONT_WIDTH
)
2166 lcd_puts_scroll(0, j
, str
);
2176 switch(get_action(CONTEXT_STD
,TIMEOUT_BLOCK
))
2179 case ACTION_STD_PREV
:
2180 case ACTION_STD_NEXT
:
2183 case ACTION_STD_CANCEL
:
2191 get_action(CONTEXT_STD
,TIMEOUT_BLOCK
);
2192 lcd_setfont(FONT_UI
);
2197 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) \
2198 && !defined(IPOD_MINI) && !defined(SIMULATOR))
2199 extern bool wheel_is_touched
;
2200 extern int old_wheel_value
;
2201 extern int new_wheel_value
;
2202 extern int wheel_delta
;
2203 extern unsigned int accumulated_wheel_delta
;
2204 extern unsigned int wheel_velocity
;
2206 static bool dbg_scrollwheel(void)
2210 lcd_setfont(FONT_SYSFIXED
);
2214 if (action_userabort(HZ
/10))
2217 lcd_clear_display();
2219 /* show internal variables of scrollwheel driver */
2220 lcd_putsf(0, 0, "wheel touched: %s", (wheel_is_touched
) ? "true" : "false");
2221 lcd_putsf(0, 1, "new position: %2d", new_wheel_value
);
2222 lcd_putsf(0, 2, "old position: %2d", old_wheel_value
);
2223 lcd_putsf(0, 3, "wheel delta: %2d", wheel_delta
);
2224 lcd_putsf(0, 4, "accumulated delta: %2d", accumulated_wheel_delta
);
2225 lcd_putsf(0, 5, "velo [deg/s]: %4d", (int)wheel_velocity
);
2227 /* show effective accelerated scrollspeed */
2228 speed
= button_apply_acceleration( (1<<31)|(1<<24)|wheel_velocity
);
2229 lcd_putsf(0, 6, "accel. speed: %4d", speed
);
2233 lcd_setfont(FONT_UI
);
2238 #if defined (HAVE_USBSTACK)
2240 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2241 static bool toggle_usb_core_driver(int driver
, char *msg
)
2243 bool enabled
= !usb_core_driver_enabled(driver
);
2245 usb_core_enable_driver(driver
,enabled
);
2246 splashf(HZ
, "%s %s", msg
, enabled
?"enabled":"disabled");
2251 static bool toggle_usb_serial(void)
2253 return toggle_usb_core_driver(USB_DRIVER_SERIAL
,"USB Serial");
2259 #if CONFIG_USBOTG == USBOTG_ISP1583
2260 extern int dbg_usb_num_items(void);
2261 extern const char* dbg_usb_item(int selected_item
, void *data
,
2262 char *buffer
, size_t buffer_len
);
2264 static int isp1583_action_callback(int action
, struct gui_synclist
*lists
)
2267 if (action
== ACTION_NONE
)
2268 action
= ACTION_REDRAW
;
2272 static bool dbg_isp1583(void)
2274 struct simplelist_info isp1583
;
2275 isp1583
.scroll_all
= true;
2276 simplelist_info_init(&isp1583
, "ISP1583", dbg_usb_num_items(), NULL
);
2277 isp1583
.timeout
= HZ
/100;
2278 isp1583
.hide_selection
= true;
2279 isp1583
.get_name
= dbg_usb_item
;
2280 isp1583
.action_callback
= isp1583_action_callback
;
2281 return simplelist_show_list(&isp1583
);
2285 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2286 extern int pic_dbg_num_items(void);
2287 extern const char* pic_dbg_item(int selected_item
, void *data
,
2288 char *buffer
, size_t buffer_len
);
2290 static int pic_action_callback(int action
, struct gui_synclist
*lists
)
2293 if (action
== ACTION_NONE
)
2294 action
= ACTION_REDRAW
;
2298 static bool dbg_pic(void)
2300 struct simplelist_info pic
;
2301 pic
.scroll_all
= true;
2302 simplelist_info_init(&pic
, "PIC", pic_dbg_num_items(), NULL
);
2303 pic
.timeout
= HZ
/100;
2304 pic
.hide_selection
= true;
2305 pic
.get_name
= pic_dbg_item
;
2306 pic
.action_callback
= pic_action_callback
;
2307 return simplelist_show_list(&pic
);
2312 /****** The menu *********/
2313 struct the_menu_item
{
2314 unsigned char *desc
; /* string or ID */
2315 bool (*function
) (void); /* return true if USB was connected */
2317 static const struct the_menu_item menuitems
[] = {
2318 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || \
2319 (defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)) || \
2320 CONFIG_CPU == IMX31L || defined(CPU_TCC780X)
2321 { "Dump ROM contents", dbg_save_roms
},
2323 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || defined(CPU_PP) \
2324 || CONFIG_CPU == S3C2440 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 \
2325 || CONFIG_CPU == DM320 || defined(CPU_S5L870X) || CONFIG_CPU == AS3525v2
2326 { "View I/O ports", dbg_ports
},
2328 #if (CONFIG_RTC == RTC_PCF50605) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
2329 { "View PCF registers", dbg_pcf
},
2331 #if defined(HAVE_TSC2100) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
2332 { "TSC2100 debug", tsc2100_debug
},
2334 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2335 { "CPU frequency", dbg_cpufreq
},
2337 #if defined(IRIVER_H100_SERIES) && !defined(SIMULATOR)
2338 { "S/PDIF analyzer", dbg_spdif
},
2340 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2341 { "Catch mem accesses", dbg_set_memory_guard
},
2343 { "View OS stacks", dbg_os
},
2344 #ifdef HAVE_LCD_BITMAP
2345 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
2346 { "View battery", view_battery
},
2348 { "Screendump", dbg_screendump
},
2350 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
2351 { "View HW info", dbg_hw_info
},
2353 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
2354 { "View partitions", dbg_partitions
},
2356 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
2357 { "View disk info", dbg_disk_info
},
2358 #if (CONFIG_STORAGE & STORAGE_ATA)
2359 { "Dump ATA identify info", dbg_identify_info
},
2362 #ifdef HAVE_DIRCACHE
2363 { "View dircache info", dbg_dircache_info
},
2365 #ifdef HAVE_TAGCACHE
2366 { "View database info", dbg_tagcache_info
},
2368 #ifdef HAVE_LCD_BITMAP
2369 #if CONFIG_CODEC == SWCODEC
2370 { "View buffering thread", dbg_buffering_thread
},
2371 #elif !defined(SIMULATOR)
2372 { "View audio thread", dbg_audio_thread
},
2375 { "pm histogram", peak_meter_histogram
},
2376 #endif /* PM_DEBUG */
2377 #endif /* HAVE_LCD_BITMAP */
2380 { "FM Radio", dbg_fm_radio
},
2383 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2384 { "Write back EEPROM", dbg_write_eeprom
},
2386 #if CONFIG_USBOTG == USBOTG_ISP1583
2387 { "View ISP1583 info", dbg_isp1583
},
2389 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2390 { "View PIC info", dbg_pic
},
2392 #ifdef ROCKBOX_HAS_LOGF
2393 {"Show Log File", logfdisplay
},
2394 {"Dump Log File", logfdump
},
2396 #if defined(HAVE_USBSTACK)
2397 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2398 {"USB Serial driver (logf)", toggle_usb_serial
},
2400 #endif /* HAVE_USBSTACK */
2401 #ifdef CPU_BOOST_LOGGING
2402 {"cpu_boost log",cpu_boost_log
},
2404 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) \
2405 && !defined(IPOD_MINI) && !defined(SIMULATOR))
2406 {"Debug scrollwheel", dbg_scrollwheel
},
2409 static int menu_action_callback(int btn
, struct gui_synclist
*lists
)
2412 if (btn
== ACTION_STD_OK
)
2415 viewportmanager_theme_enable(i
, false, NULL
);
2416 menuitems
[gui_synclist_get_sel_pos(lists
)].function();
2417 btn
= ACTION_REDRAW
;
2419 viewportmanager_theme_undo(i
, false);
2424 static const char* dbg_menu_getname(int item
, void * data
,
2425 char *buffer
, size_t buffer_len
)
2427 (void)data
; (void)buffer
; (void)buffer_len
;
2428 return menuitems
[item
].desc
;
2431 bool debug_menu(void)
2433 struct simplelist_info info
;
2435 simplelist_info_init(&info
, "Debug Menu", ARRAYLEN(menuitems
), NULL
);
2436 info
.action_callback
= menu_action_callback
;
2437 info
.get_name
= dbg_menu_getname
;
2438 return simplelist_show_list(&info
);