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 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
103 #include "debug-target.h"
106 #if defined(SANSA_E200) || defined(SANSA_C200) || defined(PHILIPS_SA9200) \
107 || (CONFIG_CPU == AS3525 && defined(CONFIG_CHARGING)) \
108 || CONFIG_CPU == AS3525v2
114 #include "pmu-target.h"
118 #include "usb_core.h"
121 #if defined(IPOD_ACCESSORY_PROTOCOL)
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)
279 #ifdef CPUFREQ_NORMAL
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
);
374 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
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) */
463 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
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 /* PLATFORM_NATIVE */
761 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
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
);
789 #endif /* PLATFORM_NATIVE */
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
);
931 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
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 */
953 #if (CONFIG_RTC == RTC_PCF50605) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
954 static bool dbg_pcf(void)
958 #ifdef HAVE_LCD_BITMAP
959 lcd_setfont(FONT_SYSFIXED
);
967 lcd_putsf(0, line
++, "DCDC1: %02x", pcf50605_read(0x1b));
968 lcd_putsf(0, line
++, "DCDC2: %02x", pcf50605_read(0x1c));
969 lcd_putsf(0, line
++, "DCDC3: %02x", pcf50605_read(0x1d));
970 lcd_putsf(0, line
++, "DCDC4: %02x", pcf50605_read(0x1e));
971 lcd_putsf(0, line
++, "DCDEC1: %02x", pcf50605_read(0x1f));
972 lcd_putsf(0, line
++, "DCDEC2: %02x", pcf50605_read(0x20));
973 lcd_putsf(0, line
++, "DCUDC1: %02x", pcf50605_read(0x21));
974 lcd_putsf(0, line
++, "DCUDC2: %02x", pcf50605_read(0x22));
975 lcd_putsf(0, line
++, "IOREGC: %02x", pcf50605_read(0x23));
976 lcd_putsf(0, line
++, "D1REGC: %02x", pcf50605_read(0x24));
977 lcd_putsf(0, line
++, "D2REGC: %02x", pcf50605_read(0x25));
978 lcd_putsf(0, line
++, "D3REGC: %02x", pcf50605_read(0x26));
979 lcd_putsf(0, line
++, "LPREG1: %02x", pcf50605_read(0x27));
981 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
983 lcd_setfont(FONT_UI
);
988 lcd_setfont(FONT_UI
);
993 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
994 static bool dbg_cpufreq(void)
999 #ifdef HAVE_LCD_BITMAP
1000 lcd_setfont(FONT_SYSFIXED
);
1002 lcd_clear_display();
1008 lcd_putsf(0, line
++, "Frequency: %ld", FREQ
);
1009 lcd_putsf(0, line
++, "boost_counter: %d", get_cpu_boost_counter());
1012 button
= get_action(CONTEXT_STD
,HZ
/10);
1016 case ACTION_STD_PREV
:
1020 case ACTION_STD_NEXT
:
1025 while (get_cpu_boost_counter() > 0)
1027 set_cpu_frequency(CPUFREQ_DEFAULT
);
1030 case ACTION_STD_CANCEL
:
1031 lcd_setfont(FONT_UI
);
1035 lcd_setfont(FONT_UI
);
1038 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
1040 #if defined(HAVE_TSC2100) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
1041 #include "tsc2100.h"
1042 static char *itob(int n
, int len
)
1044 static char binary
[64];
1046 for (i
=1, j
=0;i
<=len
;i
++)
1048 binary
[j
++] = n
&(1<<(len
-i
))?'1':'0';
1056 static const char* tsc2100_debug_getname(int selected_item
, void * data
,
1057 char *buffer
, size_t buffer_len
)
1059 int *page
= (int*)data
;
1060 bool reserved
= false;
1064 if ((selected_item
> 0x0a) ||
1065 (selected_item
== 0x04) ||
1066 (selected_item
== 0x08))
1070 if ((selected_item
> 0x05) ||
1071 (selected_item
== 0x02))
1075 if (selected_item
> 0x1e)
1080 snprintf(buffer
, buffer_len
, "%02x: RESERVED", selected_item
);
1082 snprintf(buffer
, buffer_len
, "%02x: %s", selected_item
,
1083 itob(tsc2100_readreg(*page
, selected_item
)&0xffff,16));
1086 static int tsc2100debug_action_callback(int action
, struct gui_synclist
*lists
)
1088 int *page
= (int*)lists
->data
;
1089 if (action
== ACTION_STD_OK
)
1091 *page
= (*page
+1)%3;
1092 snprintf(lists
->title
, 32,
1093 "tsc2100 registers - Page %d", *page
);
1094 return ACTION_REDRAW
;
1098 static bool tsc2100_debug(void)
1101 char title
[32] = "tsc2100 registers - Page 0";
1102 struct simplelist_info info
;
1103 simplelist_info_init(&info
, title
, 32, &page
);
1104 info
.timeout
= HZ
/100;
1105 info
.get_name
= tsc2100_debug_getname
;
1106 info
.action_callback
= tsc2100debug_action_callback
;
1107 return simplelist_show_list(&info
);
1110 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
1111 #ifdef HAVE_LCD_BITMAP
1113 * view_battery() shows a automatically scaled graph of the battery voltage
1114 * over time. Usable for estimating battery life / charging rate.
1115 * The power_history array is updated in power_thread of powermgmt.c.
1118 #define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN)
1119 #define BAT_YSPACE (LCD_HEIGHT - 20)
1122 static bool view_battery(void)
1125 int i
, x
, y
, y1
, y2
, grid
, graph
;
1126 unsigned short maxv
, minv
;
1128 lcd_setfont(FONT_SYSFIXED
);
1132 lcd_clear_display();
1134 case 0: /* voltage history graph */
1135 /* Find maximum and minimum voltage for scaling */
1136 minv
= power_history
[0];
1138 for (i
= 1; i
< BAT_LAST_VAL
&& power_history
[i
]; i
++) {
1139 if (power_history
[i
] > maxv
)
1140 maxv
= power_history
[i
];
1141 if (power_history
[i
] < minv
)
1142 minv
= power_history
[i
];
1145 /* adjust grid scale */
1146 if ((maxv
- minv
) > 50)
1152 lcd_putsf(0, 0, "battery %d.%03dV", power_history
[0] / 1000,
1153 power_history
[0] % 1000);
1154 lcd_putsf(0, 1, "%d.%03d-%d.%03dV (%2dmV)",
1155 minv
/ 1000, minv
% 1000, maxv
/ 1000, maxv
% 1000,
1159 while ((y
= (minv
- (minv
% grid
)+i
*grid
)) < maxv
)
1161 graph
= ((y
-minv
)*BAT_YSPACE
)/(maxv
-minv
);
1162 graph
= LCD_HEIGHT
-1 - graph
;
1164 /* draw dotted horizontal grid line */
1165 for (x
=0; x
<LCD_WIDTH
;x
=x
+2)
1166 lcd_drawpixel(x
,graph
);
1172 /* draw plot of power history
1173 * skip empty entries
1175 for (i
= BAT_LAST_VAL
- 1; i
> 0; i
--)
1177 if (power_history
[i
] && power_history
[i
-1])
1179 y1
= (power_history
[i
] - minv
) * BAT_YSPACE
/
1181 y1
= MIN(MAX(LCD_HEIGHT
-1 - y1
, 20),
1183 y2
= (power_history
[i
-1] - minv
) * BAT_YSPACE
/
1185 y2
= MIN(MAX(LCD_HEIGHT
-1 - y2
, 20),
1188 lcd_set_drawmode(DRMODE_SOLID
);
1190 /* make line thicker */
1191 lcd_drawline(((x
*LCD_WIDTH
)/(BAT_LAST_VAL
)),
1193 (((x
+1)*LCD_WIDTH
)/(BAT_LAST_VAL
)),
1195 lcd_drawline(((x
*LCD_WIDTH
)/(BAT_LAST_VAL
))+1,
1197 (((x
+1)*LCD_WIDTH
)/(BAT_LAST_VAL
))+1,
1204 case 1: /* status: */
1205 #if CONFIG_CHARGING >= CHARGING_MONITOR
1206 lcd_putsf(0, 0, "Pwr status: %s",
1207 charging_state() ? "charging" : "discharging");
1209 lcd_puts(0, 0, "Power status:");
1211 battery_read_info(&y
, NULL
);
1212 lcd_putsf(0, 1, "Battery: %d.%03d V", y
/ 1000, y
% 1000);
1213 #ifdef ADC_EXT_POWER
1214 y
= (adc_read(ADC_EXT_POWER
) * EXT_SCALE_FACTOR
) / 1000;
1215 lcd_putsf(0, 2, "External: %d.%03d V", y
/ 1000, y
% 1000);
1218 #if defined ARCHOS_RECORDER
1219 lcd_putsf(0, 3, "Chgr: %s %s",
1220 charger_inserted() ? "present" : "absent",
1221 charger_enabled() ? "on" : "off");
1222 lcd_putsf(0, 5, "short delta: %d", short_delta
);
1223 lcd_putsf(0, 6, "long delta: %d", long_delta
);
1224 lcd_puts(0, 7, power_message
);
1225 lcd_putsf(0, 8, "USB Inserted: %s",
1226 usb_inserted() ? "yes" : "no");
1227 #elif defined IPOD_NANO || defined IPOD_VIDEO
1228 int usb_pwr
= (GPIOL_INPUT_VAL
& 0x10)?true:false;
1229 int ext_pwr
= (GPIOL_INPUT_VAL
& 0x08)?false:true;
1230 int dock
= (GPIOA_INPUT_VAL
& 0x10)?true:false;
1231 int charging
= (GPIOB_INPUT_VAL
& 0x01)?false:true;
1232 int headphone
= (GPIOA_INPUT_VAL
& 0x80)?true:false;
1234 lcd_putsf(0, 3, "USB pwr: %s",
1235 usb_pwr
? "present" : "absent");
1236 lcd_putsf(0, 4, "EXT pwr: %s",
1237 ext_pwr
? "present" : "absent");
1238 lcd_putsf(0, 5, "Battery: %s",
1239 charging
? "charging" : (usb_pwr
||ext_pwr
) ? "charged" : "discharging");
1240 lcd_putsf(0, 6, "Dock mode: %s",
1241 dock
? "enabled" : "disabled");
1242 lcd_putsf(0, 7, "Headphone: %s",
1243 headphone
? "connected" : "disconnected");
1245 if(probed_ramsize
== 64)
1246 x
= (adc_read(ADC_4066_ISTAT
) * 2400) / (1024 * 2);
1248 x
= (adc_read(ADC_4066_ISTAT
) * 2400) / (1024 * 3);
1249 lcd_putsf(0, 8, "Ibat: %d mA", x
);
1250 lcd_putsf(0, 9, "Vbat * Ibat: %d mW", x
* y
/ 1000);
1252 #elif defined TOSHIBA_GIGABEAT_S
1256 static const unsigned char * const chrgstate_strings
[] =
1267 lcd_putsf(0, line
++, "Charger: %s",
1268 charger_inserted() ? "present" : "absent");
1270 st
= power_input_status() &
1271 (POWER_INPUT_CHARGER
| POWER_INPUT_BATTERY
);
1272 lcd_putsf(0, line
++, "%s%s",
1273 (st
& POWER_INPUT_MAIN_CHARGER
) ? " Main" : "",
1274 (st
& POWER_INPUT_USB_CHARGER
) ? " USB" : "");
1276 y
= ARRAYLEN(chrgstate_strings
) - 1;
1278 switch (charge_state
)
1280 case CHARGE_STATE_DISABLED
: y
--;
1281 case CHARGE_STATE_ERROR
: y
--;
1282 case DISCHARGING
: y
--;
1289 lcd_putsf(0, line
++, "State: %s", chrgstate_strings
[y
]);
1291 lcd_putsf(0, line
++, "Battery Switch: %s",
1292 (st
& POWER_INPUT_BATTERY
) ? "On" : "Off");
1294 y
= chrgraw_adc_voltage();
1295 lcd_putsf(0, line
++, "CHRGRAW: %d.%03d V",
1296 y
/ 1000, y
% 1000);
1298 y
= application_supply_adc_voltage();
1299 lcd_putsf(0, line
++, "BP : %d.%03d V",
1300 y
/ 1000, y
% 1000);
1302 y
= battery_adc_charge_current();
1303 if (y
< 0) x
= '-', y
= -y
;
1305 lcd_putsf(0, line
++, "CHRGISN:%c%d mA", x
, y
);
1307 y
= cccv_regulator_dissipation();
1308 lcd_putsf(0, line
++, "P CCCV : %d mW", y
);
1310 y
= battery_charge_current();
1311 if (y
< 0) x
= '-', y
= -y
;
1313 lcd_putsf(0, line
++, "I Charge:%c%d mA", x
, y
);
1315 y
= battery_adc_temp();
1318 lcd_putsf(0, line
++, "T Battery: %dC (%dF)", y
,
1321 /* Conversion disabled */
1322 lcd_puts(0, line
++, "T Battery: ?");
1325 #elif defined(SANSA_E200) || defined(SANSA_C200) || CONFIG_CPU == AS3525 || \
1326 CONFIG_CPU == AS3525v2
1327 static const char * const chrgstate_strings
[] =
1329 [CHARGE_STATE_DISABLED
- CHARGE_STATE_DISABLED
]= "Disabled",
1330 [CHARGE_STATE_ERROR
- CHARGE_STATE_DISABLED
] = "Error",
1331 [DISCHARGING
- CHARGE_STATE_DISABLED
] = "Discharging",
1332 [CHARGING
- CHARGE_STATE_DISABLED
] = "Charging",
1334 const char *str
= NULL
;
1336 lcd_putsf(0, 3, "Charger: %s",
1337 charger_inserted() ? "present" : "absent");
1339 y
= charge_state
- CHARGE_STATE_DISABLED
;
1340 if ((unsigned)y
< ARRAYLEN(chrgstate_strings
))
1341 str
= chrgstate_strings
[y
];
1343 lcd_putsf(0, 4, "State: %s",
1344 str
? str
: "<unknown>");
1346 lcd_putsf(0, 5, "CHARGER: %02X", ascodec_read_charger());
1347 #elif defined(IPOD_NANO2G)
1348 y
= pmu_read_battery_voltage();
1349 lcd_putsf(17, 1, "RAW: %d.%03d V", y
/ 1000, y
% 1000);
1350 y
= pmu_read_battery_current();
1351 lcd_putsf(0, 2, "Battery current: %d mA", y
);
1352 lcd_putsf(0, 3, "PWRCON: %8x", PWRCON
);
1353 lcd_putsf(0, 4, "PWRCONEXT: %8x", PWRCONEXT
);
1354 x
= pmu_read(0x1b) & 0xf;
1355 y
= pmu_read(0x1a) * 25 + 625;
1356 lcd_putsf(0, 5, "AUTO: %x / %d mV", x
, y
);
1357 x
= pmu_read(0x1f) & 0xf;
1358 y
= pmu_read(0x1e) * 25 + 625;
1359 lcd_putsf(0, 6, "DOWN1: %x / %d mV", x
, y
);
1360 x
= pmu_read(0x23) & 0xf;
1361 y
= pmu_read(0x22) * 25 + 625;
1362 lcd_putsf(0, 7, "DOWN2: %x / %d mV", x
, y
);
1363 x
= pmu_read(0x27) & 0xf;
1364 y
= pmu_read(0x26) * 100 + 900;
1365 lcd_putsf(0, 8, "MEMLDO: %x / %d mV", x
, y
);
1366 for (i
= 0; i
< 6; i
++)
1368 x
= pmu_read(0x2e + (i
<< 1)) & 0xf;
1369 y
= pmu_read(0x2d + (i
<< 1)) * 100 + 900;
1370 lcd_putsf(0, 9 + i
, "LDO%d: %x / %d mV", i
+ 1, x
, y
);
1372 lcd_putsf(0, 15, "CLKCON: %8x", CLKCON
);
1373 lcd_putsf(17, 15, "PLL0: %6x", PLL0PMS
);
1375 lcd_putsf(0, 3, "Charger: %s",
1376 charger_inserted() ? "present" : "absent");
1377 #endif /* target type */
1378 #endif /* CONFIG_CHARGING */
1381 case 2: /* voltage deltas: */
1382 lcd_puts(0, 0, "Voltage deltas:");
1384 for (i
= 0; i
<= 6; i
++) {
1385 y
= power_history
[i
] - power_history
[i
+1];
1386 lcd_putsf(0, i
+1, "-%d min: %s%d.%03d V", i
,
1387 (y
< 0) ? "-" : "", ((y
< 0) ? y
* -1 : y
) / 1000,
1388 ((y
< 0) ? y
* -1 : y
) % 1000);
1392 case 3: /* remaining time estimation: */
1394 #ifdef ARCHOS_RECORDER
1395 lcd_putsf(0, 0, "charge_state: %d", charge_state
);
1397 lcd_putsf(0, 1, "Cycle time: %d m", powermgmt_last_cycle_startstop_min
);
1399 lcd_putsf(0, 2, "Lvl@cyc st: %d%%", powermgmt_last_cycle_level
);
1401 lcd_putsf(0, 3, "P=%2d I=%2d", pid_p
, pid_i
);
1403 lcd_putsf(0, 4, "Trickle sec: %d/60", trickle_sec
);
1404 #endif /* ARCHOS_RECORDER */
1406 lcd_putsf(0, 5, "Last PwrHist: %d.%03dV",
1407 power_history
[0] / 1000,
1408 power_history
[0] % 1000);
1410 lcd_putsf(0, 6, "battery level: %d%%", battery_level());
1412 lcd_putsf(0, 7, "Est. remain: %d m", battery_time());
1418 switch(get_action(CONTEXT_STD
,HZ
/2))
1420 case ACTION_STD_PREV
:
1425 case ACTION_STD_NEXT
:
1430 case ACTION_STD_CANCEL
:
1431 lcd_setfont(FONT_UI
);
1435 lcd_setfont(FONT_UI
);
1439 #endif /* HAVE_LCD_BITMAP */
1442 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
1443 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1445 #if (CONFIG_STORAGE & STORAGE_MMC)
1446 #define CARDTYPE "MMC"
1447 #elif (CONFIG_STORAGE & STORAGE_SD)
1448 #define CARDTYPE "microSD"
1451 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1454 int *cardnum
= (int*)lists
->data
;
1455 unsigned char card_name
[6];
1456 unsigned char pbuf
[32];
1457 char *title
= lists
->title
;
1458 static const unsigned char i_vmin
[] = { 0, 1, 5, 10, 25, 35, 60, 100 };
1459 static const unsigned char i_vmax
[] = { 1, 5, 10, 25, 35, 45, 80, 200 };
1460 static const unsigned char * const kbit_units
[] = { "kBit/s", "MBit/s", "GBit/s" };
1461 static const unsigned char * const nsec_units
[] = { "ns", "µs", "ms" };
1462 #if (CONFIG_STORAGE & STORAGE_MMC)
1463 static const char * const mmc_spec_vers
[] = { "1.0-1.2", "1.4", "2.0-2.2",
1464 "3.1-3.31", "4.0" };
1467 if ((btn
== ACTION_STD_OK
) || (btn
== SYS_FS_CHANGED
) || (btn
== ACTION_REDRAW
))
1470 if (btn
== ACTION_STD_OK
)
1472 *cardnum
^= 0x1; /* change cards */
1476 simplelist_set_line_count(0);
1478 card
= card_get_info(*cardnum
);
1480 if (card
->initialized
> 0)
1483 for (i
=0; i
<sizeof(card_name
); i
++)
1485 card_name
[i
] = card_extract_bits(card
->cid
, (103-8*i
), 8);
1487 strlcpy(card_name
, card_name
, sizeof(card_name
));
1488 simplelist_addline(SIMPLELIST_ADD_LINE
,
1489 "%s Rev %d.%d", card_name
,
1490 (int) card_extract_bits(card
->cid
, 63, 4),
1491 (int) card_extract_bits(card
->cid
, 59, 4));
1492 simplelist_addline(SIMPLELIST_ADD_LINE
,
1494 #if (CONFIG_STORAGE & STORAGE_SD)
1495 (int) card_extract_bits(card
->cid
, 11, 4),
1496 (int) card_extract_bits(card
->cid
, 19, 8) + 2000
1497 #elif (CONFIG_STORAGE & STORAGE_MMC)
1498 (int) card_extract_bits(card
->cid
, 15, 4),
1499 (int) card_extract_bits(card
->cid
, 11, 4) + 1997
1502 simplelist_addline(SIMPLELIST_ADD_LINE
,
1503 #if (CONFIG_STORAGE & STORAGE_SD)
1505 card_extract_bits(card
->cid
, 55, 32)
1506 #elif (CONFIG_STORAGE & STORAGE_MMC)
1508 card_extract_bits(card
->cid
, 47, 16)
1512 simplelist_addline(SIMPLELIST_ADD_LINE
, "M=%02x, "
1513 #if (CONFIG_STORAGE & STORAGE_SD)
1515 (int) card_extract_bits(card
->cid
, 127, 8),
1516 card_extract_bits(card
->cid
, 119, 8),
1517 card_extract_bits(card
->cid
, 111, 8)
1518 #elif (CONFIG_STORAGE & STORAGE_MMC)
1520 (int) card_extract_bits(card
->cid
, 127, 8),
1521 (int) card_extract_bits(card
->cid
, 119, 16)
1525 #if (CONFIG_STORAGE & STORAGE_MMC)
1526 int temp
= card_extract_bits(card
->csd
, 125, 4);
1527 simplelist_addline(SIMPLELIST_ADD_LINE
,
1528 "MMC v%s", temp
< 5 ?
1529 mmc_spec_vers
[temp
] : "?.?");
1531 simplelist_addline(SIMPLELIST_ADD_LINE
,
1532 "Blocks: 0x%08lx", card
->numblocks
);
1533 output_dyn_value(pbuf
, sizeof pbuf
, card
->speed
/ 1000,
1535 simplelist_addline(SIMPLELIST_ADD_LINE
,
1537 output_dyn_value(pbuf
, sizeof pbuf
, card
->taac
,
1539 simplelist_addline(SIMPLELIST_ADD_LINE
,
1541 simplelist_addline(SIMPLELIST_ADD_LINE
,
1542 "Nsac: %d clk", card
->nsac
);
1543 simplelist_addline(SIMPLELIST_ADD_LINE
,
1544 "R2W: *%d", card
->r2w_factor
);
1545 simplelist_addline(SIMPLELIST_ADD_LINE
,
1547 i_vmin
[card_extract_bits(card
->csd
, 61, 3)],
1548 i_vmax
[card_extract_bits(card
->csd
, 58, 3)]);
1549 simplelist_addline(SIMPLELIST_ADD_LINE
,
1551 i_vmin
[card_extract_bits(card
->csd
, 55, 3)],
1552 i_vmax
[card_extract_bits(card
->csd
, 52, 3)]);
1554 else if (card
->initialized
== 0)
1556 simplelist_addline(SIMPLELIST_ADD_LINE
, "Not Found!");
1558 #if (CONFIG_STORAGE & STORAGE_SD)
1559 else /* card->initialized < 0 */
1561 simplelist_addline(SIMPLELIST_ADD_LINE
, "Init Error! (%d)", card
->initialized
);
1564 snprintf(title
, 16, "[" CARDTYPE
" %d]", *cardnum
);
1565 gui_synclist_set_title(lists
, title
, Icon_NOICON
);
1566 gui_synclist_set_nb_items(lists
, simplelist_get_line_count());
1567 gui_synclist_select_item(lists
, 0);
1568 btn
= ACTION_REDRAW
;
1572 #elif (CONFIG_STORAGE & STORAGE_ATA)
1573 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1578 unsigned short* identify_info
= ata_get_identify();
1579 bool timing_info_present
= false;
1582 simplelist_set_line_count(0);
1584 for (i
=0; i
< 20; i
++)
1585 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+27]);
1587 /* kill trailing space */
1588 for (i
=39; i
&& buf
[i
]==' '; i
--)
1590 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", buf
);
1591 for (i
=0; i
< 4; i
++)
1592 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+23]);
1594 simplelist_addline(SIMPLELIST_ADD_LINE
,
1595 "Firmware: %s", buf
);
1596 snprintf(buf
, sizeof buf
, "%ld MB",
1597 ((unsigned long)identify_info
[61] << 16 |
1598 (unsigned long)identify_info
[60]) / 2048 );
1599 simplelist_addline(SIMPLELIST_ADD_LINE
,
1602 fat_size( IF_MV2(0,) NULL
, &free
);
1603 simplelist_addline(SIMPLELIST_ADD_LINE
,
1604 "Free: %ld MB", free
/ 1024);
1605 simplelist_addline(SIMPLELIST_ADD_LINE
,
1606 "Spinup time: %d ms", storage_spinup_time() * (1000/HZ
));
1607 i
= identify_info
[83] & (1<<3);
1608 simplelist_addline(SIMPLELIST_ADD_LINE
,
1609 "Power mgmt: %s", i
? "enabled" : "unsupported");
1610 i
= identify_info
[83] & (1<<9);
1611 simplelist_addline(SIMPLELIST_ADD_LINE
,
1612 "Noise mgmt: %s", i
? "enabled" : "unsupported");
1613 i
= identify_info
[82] & (1<<6);
1614 simplelist_addline(SIMPLELIST_ADD_LINE
,
1615 "Read-ahead: %s", i
? "enabled" : "unsupported");
1616 timing_info_present
= identify_info
[53] & (1<<1);
1617 if(timing_info_present
) {
1618 char pio3
[2], pio4
[2];pio3
[1] = 0;
1620 pio3
[0] = (identify_info
[64] & (1<<0)) ? '3' : 0;
1621 pio4
[0] = (identify_info
[64] & (1<<1)) ? '4' : 0;
1622 simplelist_addline(SIMPLELIST_ADD_LINE
,
1623 "PIO modes: 0 1 2 %s %s", pio3
, pio4
);
1626 simplelist_addline(SIMPLELIST_ADD_LINE
,
1627 "No PIO mode info");
1629 timing_info_present
= identify_info
[53] & (1<<1);
1630 if(timing_info_present
) {
1631 simplelist_addline(SIMPLELIST_ADD_LINE
,
1632 "Cycle times %dns/%dns",
1634 identify_info
[68] );
1636 simplelist_addline(SIMPLELIST_ADD_LINE
,
1639 int sector_size
= 512;
1640 if((identify_info
[106] & 0xe000) == 0x6000)
1641 sector_size
*= BIT_N(identify_info
[106] & 0x000f);
1642 simplelist_addline(SIMPLELIST_ADD_LINE
,
1643 "Physical sector size: %d", sector_size
);
1645 if (identify_info
[63] & (1<<0)) {
1646 char mdma0
[2], mdma1
[2], mdma2
[2];
1647 mdma0
[1] = mdma1
[1] = mdma2
[1] = 0;
1648 mdma0
[0] = (identify_info
[63] & (1<<0)) ? '0' : 0;
1649 mdma1
[0] = (identify_info
[63] & (1<<1)) ? '1' : 0;
1650 mdma2
[0] = (identify_info
[63] & (1<<2)) ? '2' : 0;
1651 simplelist_addline(SIMPLELIST_ADD_LINE
,
1652 "MDMA modes: %s %s %s", mdma0
, mdma1
, mdma2
);
1653 simplelist_addline(SIMPLELIST_ADD_LINE
,
1654 "MDMA Cycle times %dns/%dns",
1656 identify_info
[66] );
1659 simplelist_addline(SIMPLELIST_ADD_LINE
,
1660 "No MDMA mode info");
1662 if (identify_info
[53] & (1<<2)) {
1663 char udma0
[2], udma1
[2], udma2
[2], udma3
[2], udma4
[2], udma5
[2], udma6
[2];
1664 udma0
[1] = udma1
[1] = udma2
[1] = udma3
[1] = udma4
[1] = udma5
[1] = udma6
[1] = 0;
1665 udma0
[0] = (identify_info
[88] & (1<<0)) ? '0' : 0;
1666 udma1
[0] = (identify_info
[88] & (1<<1)) ? '1' : 0;
1667 udma2
[0] = (identify_info
[88] & (1<<2)) ? '2' : 0;
1668 udma3
[0] = (identify_info
[88] & (1<<3)) ? '3' : 0;
1669 udma4
[0] = (identify_info
[88] & (1<<4)) ? '4' : 0;
1670 udma5
[0] = (identify_info
[88] & (1<<5)) ? '5' : 0;
1671 udma6
[0] = (identify_info
[88] & (1<<6)) ? '6' : 0;
1672 simplelist_addline(SIMPLELIST_ADD_LINE
,
1673 "UDMA modes: %s %s %s %s %s %s %s", udma0
, udma1
, udma2
,
1674 udma3
, udma4
, udma5
, udma6
);
1677 simplelist_addline(SIMPLELIST_ADD_LINE
,
1678 "No UDMA mode info");
1680 #endif /* HAVE_ATA_DMA */
1681 timing_info_present
= identify_info
[53] & (1<<1);
1682 if(timing_info_present
) {
1683 i
= identify_info
[49] & (1<<11);
1684 simplelist_addline(SIMPLELIST_ADD_LINE
,
1685 "IORDY support: %s", i
? "yes" : "no");
1686 i
= identify_info
[49] & (1<<10);
1687 simplelist_addline(SIMPLELIST_ADD_LINE
,
1688 "IORDY disable: %s", i
? "yes" : "no");
1690 simplelist_addline(SIMPLELIST_ADD_LINE
,
1693 simplelist_addline(SIMPLELIST_ADD_LINE
,
1694 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
1696 i
= ata_get_dma_mode();
1698 simplelist_addline(SIMPLELIST_ADD_LINE
,
1701 simplelist_addline(SIMPLELIST_ADD_LINE
,
1703 (i
& 0x40) ? "UDMA" : "MDMA",
1706 #endif /* HAVE_ATA_DMA */
1709 #else /* No SD, MMC or ATA */
1710 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1714 struct storage_info info
;
1715 storage_get_info(0,&info
);
1716 simplelist_addline(SIMPLELIST_ADD_LINE
, "Vendor: %s", info
.vendor
);
1717 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", info
.product
);
1718 simplelist_addline(SIMPLELIST_ADD_LINE
, "Firmware: %s", info
.revision
);
1719 simplelist_addline(SIMPLELIST_ADD_LINE
,
1720 "Size: %ld MB", info
.num_sectors
*(info
.sector_size
/512)/2024);
1722 fat_size( IF_MV2(0,) NULL
, &free
);
1723 simplelist_addline(SIMPLELIST_ADD_LINE
,
1724 "Free: %ld MB", free
/ 1024);
1725 simplelist_addline(SIMPLELIST_ADD_LINE
,
1726 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
1731 #if (CONFIG_STORAGE & STORAGE_ATA)
1732 static bool dbg_identify_info(void)
1734 int fd
= creat("/identify_info.bin", 0666);
1737 #ifdef ROCKBOX_LITTLE_ENDIAN
1738 ecwrite(fd
, ata_get_identify(), SECTOR_SIZE
/2, "s", true);
1740 write(fd
, ata_get_identify(), SECTOR_SIZE
);
1748 static bool dbg_disk_info(void)
1750 struct simplelist_info info
;
1751 simplelist_info_init(&info
, "Disk Info", 1, NULL
);
1752 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1755 info
.callback_data
= (void*)&card
;
1758 info
.action_callback
= disk_callback
;
1759 info
.hide_selection
= true;
1760 info
.scroll_all
= true;
1761 return simplelist_show_list(&info
);
1763 #endif /* PLATFORM_NATIVE */
1765 #ifdef HAVE_DIRCACHE
1766 static int dircache_callback(int btn
, struct gui_synclist
*lists
)
1768 (void)btn
; (void)lists
;
1769 simplelist_set_line_count(0);
1770 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache initialized: %s",
1771 dircache_is_enabled() ? "Yes" : "No");
1772 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache size: %d B",
1773 dircache_get_cache_size());
1774 simplelist_addline(SIMPLELIST_ADD_LINE
, "Last size: %d B",
1775 global_status
.dircache_size
);
1776 simplelist_addline(SIMPLELIST_ADD_LINE
, "Limit: %d B",
1778 simplelist_addline(SIMPLELIST_ADD_LINE
, "Reserve: %d/%d B",
1779 dircache_get_reserve_used(), DIRCACHE_RESERVE
);
1780 simplelist_addline(SIMPLELIST_ADD_LINE
, "Scanning took: %d s",
1781 dircache_get_build_ticks() / HZ
);
1782 simplelist_addline(SIMPLELIST_ADD_LINE
, "Entry count: %d",
1783 dircache_get_entry_count());
1787 static bool dbg_dircache_info(void)
1789 struct simplelist_info info
;
1790 simplelist_info_init(&info
, "Dircache Info", 7, NULL
);
1791 info
.action_callback
= dircache_callback
;
1792 info
.hide_selection
= true;
1793 info
.scroll_all
= true;
1794 return simplelist_show_list(&info
);
1797 #endif /* HAVE_DIRCACHE */
1799 #ifdef HAVE_TAGCACHE
1800 static int database_callback(int btn
, struct gui_synclist
*lists
)
1803 struct tagcache_stat
*stat
= tagcache_get_stat();
1804 static bool synced
= false;
1806 simplelist_set_line_count(0);
1808 simplelist_addline(SIMPLELIST_ADD_LINE
, "Initialized: %s",
1809 stat
->initialized
? "Yes" : "No");
1810 simplelist_addline(SIMPLELIST_ADD_LINE
, "DB Ready: %s",
1811 stat
->ready
? "Yes" : "No");
1812 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM Cache: %s",
1813 stat
->ramcache
? "Yes" : "No");
1814 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM: %d/%d B",
1815 stat
->ramcache_used
, stat
->ramcache_allocated
);
1816 simplelist_addline(SIMPLELIST_ADD_LINE
, "Progress: %d%% (%d entries)",
1817 stat
->progress
, stat
->processed_entries
);
1818 simplelist_addline(SIMPLELIST_ADD_LINE
, "Curfile: %s",
1819 stat
->curentry
? stat
->curentry
: "---");
1820 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit step: %d",
1822 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit delayed: %s",
1823 stat
->commit_delayed
? "Yes" : "No");
1825 simplelist_addline(SIMPLELIST_ADD_LINE
, "Queue length: %d",
1826 stat
->queue_length
);
1831 tagcache_screensync_event();
1834 if (!btn
&& stat
->curentry
)
1837 return ACTION_REDRAW
;
1840 if (btn
== ACTION_STD_CANCEL
)
1841 tagcache_screensync_enable(false);
1845 static bool dbg_tagcache_info(void)
1847 struct simplelist_info info
;
1848 simplelist_info_init(&info
, "Database Info", 8, NULL
);
1849 info
.action_callback
= database_callback
;
1850 info
.hide_selection
= true;
1851 info
.scroll_all
= true;
1853 /* Don't do nonblock here, must give enough processing time
1854 for tagcache thread. */
1855 /* info.timeout = TIMEOUT_NOBLOCK; */
1857 tagcache_screensync_enable(true);
1858 return simplelist_show_list(&info
);
1862 #if CONFIG_CPU == SH7034
1863 static bool dbg_save_roms(void)
1866 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
1868 fd
= creat("/internal_rom_0000-FFFF.bin", 0666);
1871 write(fd
, (void *)0, 0x10000);
1875 fd
= creat("/internal_rom_2000000-203FFFF.bin", 0666);
1878 write(fd
, (void *)0x2000000, 0x40000);
1882 system_memory_guard(oldmode
);
1885 #elif defined CPU_COLDFIRE
1886 static bool dbg_save_roms(void)
1889 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
1891 #if defined(IRIVER_H100_SERIES)
1892 fd
= creat("/internal_rom_000000-1FFFFF.bin", 0666);
1893 #elif defined(IRIVER_H300_SERIES)
1894 fd
= creat("/internal_rom_000000-3FFFFF.bin", 0666);
1895 #elif defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IAUDIO_M3)
1896 fd
= creat("/internal_rom_000000-3FFFFF.bin", 0666);
1897 #elif defined(MPIO_HD200)
1898 fd
= creat("/internal_rom_000000-1FFFFF.bin", 0666);
1902 write(fd
, (void *)0, FLASH_SIZE
);
1905 system_memory_guard(oldmode
);
1908 fd
= creat("/internal_eeprom.bin", 0666);
1912 char buf
[EEPROM_SIZE
];
1915 old_irq_level
= disable_irq_save();
1917 err
= eeprom_24cxx_read(0, buf
, sizeof buf
);
1919 restore_irq(old_irq_level
);
1922 splashf(HZ
*3, "Eeprom read failure (%d)", err
);
1925 write(fd
, buf
, sizeof buf
);
1934 #elif defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)
1935 static bool dbg_save_roms(void)
1939 fd
= creat("/internal_rom_000000-0FFFFF.bin", 0666);
1942 write(fd
, (void *)0x20000000, FLASH_SIZE
);
1948 #elif CONFIG_CPU == IMX31L
1949 static bool dbg_save_roms(void)
1953 fd
= creat("/flash_rom_A0000000-A01FFFFF.bin", 0666);
1956 write(fd
, (void*)0xa0000000, FLASH_SIZE
);
1962 #elif defined(CPU_TCC780X)
1963 static bool dbg_save_roms(void)
1967 fd
= creat("/eeprom_E0000000-E0001FFF.bin", 0666);
1970 write(fd
, (void*)0xe0000000, 0x2000);
1981 #ifdef CONFIG_TUNER_MULTI
1982 static int tuner_type
= 0;
1983 #define IF_TUNER_TYPE(type) if(tuner_type==type)
1985 #define IF_TUNER_TYPE(type)
1988 static int radio_callback(int btn
, struct gui_synclist
*lists
)
1991 if (btn
== ACTION_STD_CANCEL
)
1993 simplelist_set_line_count(1);
1995 #if (CONFIG_TUNER & LV24020LP)
1996 simplelist_addline(SIMPLELIST_ADD_LINE
,
1997 "CTRL_STAT: %02X", lv24020lp_get(LV24020LP_CTRL_STAT
) );
1998 simplelist_addline(SIMPLELIST_ADD_LINE
,
1999 "RADIO_STAT: %02X", lv24020lp_get(LV24020LP_REG_STAT
) );
2000 simplelist_addline(SIMPLELIST_ADD_LINE
,
2001 "MSS_FM: %d kHz", lv24020lp_get(LV24020LP_MSS_FM
) );
2002 simplelist_addline(SIMPLELIST_ADD_LINE
,
2003 "MSS_IF: %d Hz", lv24020lp_get(LV24020LP_MSS_IF
) );
2004 simplelist_addline(SIMPLELIST_ADD_LINE
,
2005 "MSS_SD: %d Hz", lv24020lp_get(LV24020LP_MSS_SD
) );
2006 simplelist_addline(SIMPLELIST_ADD_LINE
,
2007 "if_set: %d Hz", lv24020lp_get(LV24020LP_IF_SET
) );
2008 simplelist_addline(SIMPLELIST_ADD_LINE
,
2009 "sd_set: %d Hz", lv24020lp_get(LV24020LP_SD_SET
) );
2010 #endif /* LV24020LP */
2011 #if (CONFIG_TUNER & S1A0903X01)
2012 simplelist_addline(SIMPLELIST_ADD_LINE
,
2013 "Samsung regs: %08X", s1a0903x01_get(RADIO_ALL
));
2014 /* This one doesn't return dynamic data atm */
2015 #endif /* S1A0903X01 */
2016 #if (CONFIG_TUNER & TEA5767)
2017 struct tea5767_dbg_info nfo
;
2018 tea5767_dbg_info(&nfo
);
2019 simplelist_addline(SIMPLELIST_ADD_LINE
, "Philips regs:");
2020 simplelist_addline(SIMPLELIST_ADD_LINE
,
2021 " Read: %02X %02X %02X %02X %02X",
2022 (unsigned)nfo
.read_regs
[0], (unsigned)nfo
.read_regs
[1],
2023 (unsigned)nfo
.read_regs
[2], (unsigned)nfo
.read_regs
[3],
2024 (unsigned)nfo
.read_regs
[4]);
2025 simplelist_addline(SIMPLELIST_ADD_LINE
,
2026 " Write: %02X %02X %02X %02X %02X",
2027 (unsigned)nfo
.write_regs
[0], (unsigned)nfo
.write_regs
[1],
2028 (unsigned)nfo
.write_regs
[2], (unsigned)nfo
.write_regs
[3],
2029 (unsigned)nfo
.write_regs
[4]);
2030 #endif /* TEA5767 */
2031 #if (CONFIG_TUNER & SI4700)
2032 IF_TUNER_TYPE(SI4700
)
2034 struct si4700_dbg_info nfo
;
2036 si4700_dbg_info(&nfo
);
2037 simplelist_addline(SIMPLELIST_ADD_LINE
, "SI4700 regs:");
2038 for (i
= 0; i
< 16; i
+= 4) {
2039 simplelist_addline(SIMPLELIST_ADD_LINE
,"%02X: %04X %04X %04X %04X",
2040 i
, nfo
.regs
[i
], nfo
.regs
[i
+1], nfo
.regs
[i
+2], nfo
.regs
[i
+3]);
2044 #if (CONFIG_TUNER & RDA5802)
2045 IF_TUNER_TYPE(RDA5802
)
2047 struct rda5802_dbg_info nfo
;
2049 rda5802_dbg_info(&nfo
);
2050 simplelist_addline(SIMPLELIST_ADD_LINE
, "RDA5802 regs:");
2051 for (i
= 0; i
< 16; i
+= 4) {
2052 simplelist_addline(SIMPLELIST_ADD_LINE
,"%02X: %04X %04X %04X %04X",
2053 i
, nfo
.regs
[i
], nfo
.regs
[i
+1], nfo
.regs
[i
+2], nfo
.regs
[i
+3]);
2056 #endif /* RDA55802 */
2057 return ACTION_REDRAW
;
2059 static bool dbg_fm_radio(void)
2061 struct simplelist_info info
;
2062 #ifdef CONFIG_TUNER_MULTI
2063 tuner_type
= tuner_detect_type();
2065 info
.scroll_all
= true;
2066 simplelist_info_init(&info
, "FM Radio", 1, NULL
);
2067 simplelist_set_line_count(0);
2068 simplelist_addline(SIMPLELIST_ADD_LINE
, "HW detected: %s",
2069 radio_hardware_present() ? "yes" : "no");
2071 info
.action_callback
= radio_hardware_present()?radio_callback
: NULL
;
2072 info
.hide_selection
= true;
2073 return simplelist_show_list(&info
);
2075 #endif /* CONFIG_TUNER */
2076 #endif /* !SIMULATOR */
2078 #ifdef HAVE_LCD_BITMAP
2079 extern bool do_screendump_instead_of_usb
;
2081 static bool dbg_screendump(void)
2083 do_screendump_instead_of_usb
= !do_screendump_instead_of_usb
;
2084 splashf(HZ
, "Screendump %s",
2085 do_screendump_instead_of_usb
?"enabled":"disabled");
2088 #endif /* HAVE_LCD_BITMAP */
2090 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2091 static bool dbg_set_memory_guard(void)
2093 static const struct opt_items names
[MAXMEMGUARD
] = {
2095 { "Flash ROM writes", -1 },
2096 { "Zero area (all)", -1 }
2098 int mode
= system_memory_guard(MEMGUARD_KEEP
);
2100 set_option( "Catch mem accesses", &mode
, INT
, names
, MAXMEMGUARD
, NULL
);
2101 system_memory_guard(mode
);
2105 #endif /* CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) */
2107 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2108 static bool dbg_write_eeprom(void)
2113 char buf
[EEPROM_SIZE
];
2116 fd
= open("/internal_eeprom.bin", O_RDONLY
);
2120 rc
= read(fd
, buf
, EEPROM_SIZE
);
2122 if(rc
== EEPROM_SIZE
)
2124 old_irq_level
= disable_irq_save();
2126 err
= eeprom_24cxx_write(0, buf
, sizeof buf
);
2128 splashf(HZ
*3, "Eeprom write failure (%d)", err
);
2130 splash(HZ
*3, "Eeprom written successfully");
2132 restore_irq(old_irq_level
);
2136 splashf(HZ
*3, "File read error (%d)",rc
);
2142 splash(HZ
*3, "Failed to open 'internal_eeprom.bin'");
2147 #endif /* defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS) */
2148 #ifdef CPU_BOOST_LOGGING
2149 static bool cpu_boost_log(void)
2152 int count
= cpu_boost_log_getcount();
2153 int lines
= LCD_HEIGHT
/SYSFONT_HEIGHT
;
2156 lcd_setfont(FONT_SYSFIXED
);
2157 str
= cpu_boost_log_getlog_first();
2160 lcd_clear_display();
2161 for(j
=0; j
<lines
; j
++,i
++)
2164 str
= cpu_boost_log_getlog_next();
2167 if(strlen(str
) > LCD_WIDTH
/SYSFONT_WIDTH
)
2168 lcd_puts_scroll(0, j
, str
);
2178 switch(get_action(CONTEXT_STD
,TIMEOUT_BLOCK
))
2181 case ACTION_STD_PREV
:
2182 case ACTION_STD_NEXT
:
2185 case ACTION_STD_CANCEL
:
2193 get_action(CONTEXT_STD
,TIMEOUT_BLOCK
);
2194 lcd_setfont(FONT_UI
);
2199 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) \
2200 && !defined(IPOD_MINI) && !defined(SIMULATOR))
2201 extern bool wheel_is_touched
;
2202 extern int old_wheel_value
;
2203 extern int new_wheel_value
;
2204 extern int wheel_delta
;
2205 extern unsigned int accumulated_wheel_delta
;
2206 extern unsigned int wheel_velocity
;
2208 static bool dbg_scrollwheel(void)
2212 lcd_setfont(FONT_SYSFIXED
);
2216 if (action_userabort(HZ
/10))
2219 lcd_clear_display();
2221 /* show internal variables of scrollwheel driver */
2222 lcd_putsf(0, 0, "wheel touched: %s", (wheel_is_touched
) ? "true" : "false");
2223 lcd_putsf(0, 1, "new position: %2d", new_wheel_value
);
2224 lcd_putsf(0, 2, "old position: %2d", old_wheel_value
);
2225 lcd_putsf(0, 3, "wheel delta: %2d", wheel_delta
);
2226 lcd_putsf(0, 4, "accumulated delta: %2d", accumulated_wheel_delta
);
2227 lcd_putsf(0, 5, "velo [deg/s]: %4d", (int)wheel_velocity
);
2229 /* show effective accelerated scrollspeed */
2230 speed
= button_apply_acceleration( (1<<31)|(1<<24)|wheel_velocity
);
2231 lcd_putsf(0, 6, "accel. speed: %4d", speed
);
2235 lcd_setfont(FONT_UI
);
2240 #if defined (HAVE_USBSTACK)
2242 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2243 static bool toggle_usb_core_driver(int driver
, char *msg
)
2245 bool enabled
= !usb_core_driver_enabled(driver
);
2247 usb_core_enable_driver(driver
,enabled
);
2248 splashf(HZ
, "%s %s", msg
, enabled
?"enabled":"disabled");
2253 static bool toggle_usb_serial(void)
2255 return toggle_usb_core_driver(USB_DRIVER_SERIAL
,"USB Serial");
2261 #if CONFIG_USBOTG == USBOTG_ISP1583
2262 extern int dbg_usb_num_items(void);
2263 extern const char* dbg_usb_item(int selected_item
, void *data
,
2264 char *buffer
, size_t buffer_len
);
2266 static int isp1583_action_callback(int action
, struct gui_synclist
*lists
)
2269 if (action
== ACTION_NONE
)
2270 action
= ACTION_REDRAW
;
2274 static bool dbg_isp1583(void)
2276 struct simplelist_info isp1583
;
2277 isp1583
.scroll_all
= true;
2278 simplelist_info_init(&isp1583
, "ISP1583", dbg_usb_num_items(), NULL
);
2279 isp1583
.timeout
= HZ
/100;
2280 isp1583
.hide_selection
= true;
2281 isp1583
.get_name
= dbg_usb_item
;
2282 isp1583
.action_callback
= isp1583_action_callback
;
2283 return simplelist_show_list(&isp1583
);
2287 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2288 extern int pic_dbg_num_items(void);
2289 extern const char* pic_dbg_item(int selected_item
, void *data
,
2290 char *buffer
, size_t buffer_len
);
2292 static int pic_action_callback(int action
, struct gui_synclist
*lists
)
2295 if (action
== ACTION_NONE
)
2296 action
= ACTION_REDRAW
;
2300 static bool dbg_pic(void)
2302 struct simplelist_info pic
;
2303 pic
.scroll_all
= true;
2304 simplelist_info_init(&pic
, "PIC", pic_dbg_num_items(), NULL
);
2305 pic
.timeout
= HZ
/100;
2306 pic
.hide_selection
= true;
2307 pic
.get_name
= pic_dbg_item
;
2308 pic
.action_callback
= pic_action_callback
;
2309 return simplelist_show_list(&pic
);
2314 /****** The menu *********/
2315 struct the_menu_item
{
2316 unsigned char *desc
; /* string or ID */
2317 bool (*function
) (void); /* return true if USB was connected */
2319 static const struct the_menu_item menuitems
[] = {
2320 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || \
2321 (defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)) || \
2322 CONFIG_CPU == IMX31L || defined(CPU_TCC780X)
2323 { "Dump ROM contents", dbg_save_roms
},
2325 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || defined(CPU_PP) \
2326 || CONFIG_CPU == S3C2440 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 \
2327 || CONFIG_CPU == DM320 || defined(CPU_S5L870X) || CONFIG_CPU == AS3525v2
2328 { "View I/O ports", dbg_ports
},
2330 #if (CONFIG_RTC == RTC_PCF50605) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
2331 { "View PCF registers", dbg_pcf
},
2333 #if defined(HAVE_TSC2100) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
2334 { "TSC2100 debug", tsc2100_debug
},
2336 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2337 { "CPU frequency", dbg_cpufreq
},
2339 #if defined(IRIVER_H100_SERIES) && !defined(SIMULATOR)
2340 { "S/PDIF analyzer", dbg_spdif
},
2342 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2343 { "Catch mem accesses", dbg_set_memory_guard
},
2345 { "View OS stacks", dbg_os
},
2346 #ifdef HAVE_LCD_BITMAP
2347 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
2348 { "View battery", view_battery
},
2350 { "Screendump", dbg_screendump
},
2352 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
2353 { "View HW info", dbg_hw_info
},
2355 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
2356 { "View partitions", dbg_partitions
},
2358 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
2359 { "View disk info", dbg_disk_info
},
2360 #if (CONFIG_STORAGE & STORAGE_ATA)
2361 { "Dump ATA identify info", dbg_identify_info
},
2364 #ifdef HAVE_DIRCACHE
2365 { "View dircache info", dbg_dircache_info
},
2367 #ifdef HAVE_TAGCACHE
2368 { "View database info", dbg_tagcache_info
},
2370 #ifdef HAVE_LCD_BITMAP
2371 #if CONFIG_CODEC == SWCODEC
2372 { "View buffering thread", dbg_buffering_thread
},
2373 #elif !defined(SIMULATOR)
2374 { "View audio thread", dbg_audio_thread
},
2377 { "pm histogram", peak_meter_histogram
},
2378 #endif /* PM_DEBUG */
2379 #endif /* HAVE_LCD_BITMAP */
2382 { "FM Radio", dbg_fm_radio
},
2385 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2386 { "Write back EEPROM", dbg_write_eeprom
},
2388 #if CONFIG_USBOTG == USBOTG_ISP1583
2389 { "View ISP1583 info", dbg_isp1583
},
2391 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2392 { "View PIC info", dbg_pic
},
2394 #ifdef ROCKBOX_HAS_LOGF
2395 {"Show Log File", logfdisplay
},
2396 {"Dump Log File", logfdump
},
2398 #if defined(HAVE_USBSTACK)
2399 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2400 {"USB Serial driver (logf)", toggle_usb_serial
},
2402 #endif /* HAVE_USBSTACK */
2403 #ifdef CPU_BOOST_LOGGING
2404 {"cpu_boost log",cpu_boost_log
},
2406 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) \
2407 && !defined(IPOD_MINI) && !defined(SIMULATOR))
2408 {"Debug scrollwheel", dbg_scrollwheel
},
2411 static int menu_action_callback(int btn
, struct gui_synclist
*lists
)
2414 if (btn
== ACTION_STD_OK
)
2417 viewportmanager_theme_enable(i
, false, NULL
);
2418 menuitems
[gui_synclist_get_sel_pos(lists
)].function();
2419 btn
= ACTION_REDRAW
;
2421 viewportmanager_theme_undo(i
, false);
2426 static const char* dbg_menu_getname(int item
, void * data
,
2427 char *buffer
, size_t buffer_len
)
2429 (void)data
; (void)buffer
; (void)buffer_len
;
2430 return menuitems
[item
].desc
;
2433 bool debug_menu(void)
2435 struct simplelist_info info
;
2437 simplelist_info_init(&info
, "Debug Menu", ARRAYLEN(menuitems
), NULL
);
2438 info
.action_callback
= menu_action_callback
;
2439 info
.get_name
= dbg_menu_getname
;
2440 return simplelist_show_list(&info
);