1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 Heikki Hannikainen
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
29 #include "debug_menu.h"
36 #include "powermgmt.h"
40 #include "mp3_playback.h"
43 #include "statusbar.h"
54 #include "lcd-remote.h"
66 #include "eeprom_24cxx.h"
67 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
70 #if (CONFIG_STORAGE & STORAGE_ATA)
79 #ifdef HAVE_LCD_BITMAP
80 #include "scrollbar.h"
81 #include "peakmeter.h"
84 #if CONFIG_CODEC == SWCODEC
86 #include "buffering.h"
88 #if defined(HAVE_SPDIF_OUT) || defined(HAVE_SPDIF_IN)
92 #ifdef IRIVER_H300_SERIES
93 #include "pcf50606.h" /* for pcf50606_read */
100 #if CONFIG_RTC == RTC_PCF50605
101 #include "pcf50605.h"
103 #include "appevents.h"
105 #if CONFIG_CPU == DM320 || CONFIG_CPU == S3C2440 || CONFIG_CPU == TCC7801 \
106 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 || CONFIG_CPU == JZ4732 \
107 || defined(CPU_S5L870X)
108 #include "debug-target.h"
111 #if defined(SANSA_E200) || defined(SANSA_C200) || defined(PHILIPS_SA9200) \
112 || defined(SANSA_CLIP) || defined(SANSA_FUZE)
118 #include "pmu-target.h"
122 #include "usb_core.h"
125 /*---------------------------------------------------*/
126 /* SPECIAL DEBUG STUFF */
127 /*---------------------------------------------------*/
128 extern struct thread_entry threads
[MAXTHREADS
];
130 static char thread_status_char(unsigned status
)
132 static const char thread_status_chars
[THREAD_NUM_STATES
+1] =
134 [0 ... THREAD_NUM_STATES
] = '?',
135 [STATE_RUNNING
] = 'R',
136 [STATE_BLOCKED
] = 'B',
137 [STATE_SLEEPING
] = 'S',
138 [STATE_BLOCKED_W_TMO
] = 'T',
139 [STATE_FROZEN
] = 'F',
140 [STATE_KILLED
] = 'K',
143 if (status
> THREAD_NUM_STATES
)
144 status
= THREAD_NUM_STATES
;
146 return thread_status_chars
[status
];
149 static const char* threads_getname(int selected_item
, void *data
,
150 char *buffer
, size_t buffer_len
)
153 struct thread_entry
*thread
;
157 if (selected_item
< (int)NUM_CORES
)
159 snprintf(buffer
, buffer_len
, "Idle (%d): %2d%%", selected_item
,
160 idle_stack_usage(selected_item
));
164 selected_item
-= NUM_CORES
;
167 thread
= &threads
[selected_item
];
169 if (thread
->state
== STATE_KILLED
)
171 snprintf(buffer
, buffer_len
, "%2d: ---", selected_item
);
175 thread_get_name(name
, 32, thread
);
177 snprintf(buffer
, buffer_len
,
178 "%2d: " IF_COP("(%d) ") "%c%c " IF_PRIO("%d %d ") "%2d%% %s",
180 IF_COP(thread
->core
,)
181 #ifdef HAVE_SCHEDULER_BOOSTCTRL
182 (thread
->cpu_boost
) ? '+' :
184 ((thread
->state
== STATE_RUNNING
) ? '*' : ' '),
185 thread_status_char(thread
->state
),
186 IF_PRIO(thread
->base_priority
, thread
->priority
, )
187 thread_stack_usage(thread
), name
);
192 static int dbg_threads_action_callback(int action
, struct gui_synclist
*lists
)
195 #ifdef ROCKBOX_HAS_LOGF
196 if (action
== ACTION_STD_OK
)
198 int selpos
= gui_synclist_get_sel_pos(lists
);
200 if (selpos
>= NUM_CORES
)
201 remove_thread(threads
[selpos
- NUM_CORES
].id
);
203 remove_thread(threads
[selpos
].id
);
205 return ACTION_REDRAW
;
207 #endif /* ROCKBOX_HAS_LOGF */
208 if (action
== ACTION_NONE
)
209 action
= ACTION_REDRAW
;
213 static bool dbg_os(void)
215 struct simplelist_info info
;
216 simplelist_info_init(&info
, IF_COP("Core and ") "Stack usage:",
220 MAXTHREADS
+NUM_CORES
,
223 #ifndef ROCKBOX_HAS_LOGF
224 info
.hide_selection
= true;
225 info
.scroll_all
= true;
227 info
.action_callback
= dbg_threads_action_callback
;
228 info
.get_name
= threads_getname
;
229 return simplelist_show_list(&info
);
232 #ifdef HAVE_LCD_BITMAP
233 #if CONFIG_CODEC != SWCODEC
235 static bool dbg_audio_thread(void)
237 struct audio_debug d
;
239 lcd_setfont(FONT_SYSFIXED
);
243 if (action_userabort(HZ
/5))
246 audio_get_debugdata(&d
);
250 lcd_putsf(0, 0, "read: %x", d
.audiobuf_read
);
251 lcd_putsf(0, 1, "write: %x", d
.audiobuf_write
);
252 lcd_putsf(0, 2, "swap: %x", d
.audiobuf_swapwrite
);
253 lcd_putsf(0, 3, "playing: %d", d
.playing
);
254 lcd_putsf(0, 4, "playable: %x", d
.playable_space
);
255 lcd_putsf(0, 5, "unswapped: %x", d
.unswapped_space
);
257 /* Playable space left */
258 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8, 112, 4, d
.audiobuflen
, 0,
259 d
.playable_space
, HORIZONTAL
);
261 /* Show the watermark limit */
262 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, 6*8+4, 112, 4, d
.audiobuflen
, 0,
263 d
.low_watermark_level
, HORIZONTAL
);
265 lcd_putsf(0, 7, "wm: %x - %x",
266 d
.low_watermark_level
, d
.lowest_watermark_level
);
270 lcd_setfont(FONT_UI
);
273 #endif /* !SIMULATOR */
274 #else /* CONFIG_CODEC == SWCODEC */
275 static unsigned int ticks
, boost_ticks
, freq_sum
;
277 static void dbg_audio_task(void)
280 if(FREQ
> CPUFREQ_NORMAL
)
282 freq_sum
+= FREQ
/1000000; /* in MHz */
287 static bool dbg_buffering_thread(void)
293 size_t bufsize
= pcmbuf_get_bufsize();
294 int pcmbufdescs
= pcmbuf_descs();
295 struct buffering_debug d
;
296 size_t filebuflen
= audio_get_filebuflen();
297 /* This is a size_t, but call it a long so it puts a - when it's bad. */
299 ticks
= boost_ticks
= freq_sum
= 0;
301 tick_add_task(dbg_audio_task
);
303 lcd_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
);
325 bufused
= bufsize
- pcmbuf_free();
327 lcd_putsf(0, line
++, "pcm: %6ld/%ld", (long) bufused
, (long) bufsize
);
329 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
330 bufsize
, 0, bufused
, HORIZONTAL
);
333 lcd_putsf(0, line
++, "alloc: %6ld/%ld", audio_filebufused(),
337 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
338 filebuflen
, 0, audio_filebufused(), HORIZONTAL
);
341 lcd_putsf(0, line
++, "real: %6ld/%ld", (long)d
.buffered_data
,
344 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
345 filebuflen
, 0, (long)d
.buffered_data
, HORIZONTAL
);
349 lcd_putsf(0, line
++, "usefl: %6ld/%ld", (long)(d
.useful_data
),
353 gui_scrollbar_draw(&screens
[SCREEN_MAIN
],0, line
*8, LCD_WIDTH
, 6,
354 filebuflen
, 0, d
.useful_data
, HORIZONTAL
);
358 lcd_putsf(0, line
++, "data_rem: %ld", (long)d
.data_rem
);
360 lcd_putsf(0, line
++, "track count: %2d", audio_track_count());
362 lcd_putsf(0, line
++, "handle count: %d", (int)d
.num_handles
);
365 lcd_putsf(0, line
++, "cpu freq: %3dMHz",
366 (int)((FREQ
+ 500000) / 1000000));
371 int boostquota
= boost_ticks
* 1000 / ticks
; /* in 0.1 % */
372 int avgclock
= freq_sum
* 10 / ticks
; /* in 100 kHz */
373 lcd_putsf(0, line
++, "boost:%3d.%d%% (%d.%dMHz)",
374 boostquota
/10, boostquota
%10, avgclock
/10, avgclock
%10);
377 lcd_putsf(0, line
++, "pcmbufdesc: %2d/%2d",
378 pcmbuf_used_descs(), pcmbufdescs
);
379 lcd_putsf(0, line
++, "watermark: %6d",
385 tick_remove_task(dbg_audio_task
);
386 lcd_setfont(FONT_UI
);
390 #endif /* CONFIG_CODEC */
391 #endif /* HAVE_LCD_BITMAP */
394 #if (CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE))
395 /* Tool function to read the flash manufacturer and type, if available.
396 Only chips which could be reprogrammed in system will return values.
397 (The mode switch addresses vary between flash manufacturers, hence addr1/2) */
398 /* In IRAM to avoid problems when running directly from Flash */
399 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
400 unsigned addr1
, unsigned addr2
)
401 ICODE_ATTR
__attribute__((noinline
));
402 static bool dbg_flash_id(unsigned* p_manufacturer
, unsigned* p_device
,
403 unsigned addr1
, unsigned addr2
)
406 unsigned not_manu
, not_id
; /* read values before switching to ID mode */
407 unsigned manu
, id
; /* read values when in ID mode */
409 #if CONFIG_CPU == SH7034
410 volatile unsigned char* flash
= (unsigned char*)0x2000000; /* flash mapping */
411 #elif defined(CPU_COLDFIRE)
412 volatile unsigned short* flash
= (unsigned short*)0; /* flash mapping */
414 int old_level
; /* saved interrupt level */
416 not_manu
= flash
[0]; /* read the normal content */
417 not_id
= flash
[1]; /* should be 'A' (0x41) and 'R' (0x52) from the "ARCH" marker */
419 /* disable interrupts, prevent any stray flash access */
420 old_level
= disable_irq_save();
422 flash
[addr1
] = 0xAA; /* enter command mode */
424 flash
[addr1
] = 0x90; /* ID command */
425 /* Atmel wants 20ms pause here */
426 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
428 manu
= flash
[0]; /* read the IDs */
431 flash
[0] = 0xF0; /* reset flash (back to normal read mode) */
432 /* Atmel wants 20ms pause here */
433 /* sleep(HZ/50); no sleeping possible while interrupts are disabled */
435 restore_irq(old_level
); /* enable interrupts again */
437 /* I assume success if the obtained values are different from
438 the normal flash content. This is not perfectly bulletproof, they
439 could theoretically be the same by chance, causing us to fail. */
440 if (not_manu
!= manu
|| not_id
!= id
) /* a value has changed */
442 *p_manufacturer
= manu
; /* return the results */
444 return true; /* success */
446 return false; /* fail */
448 #endif /* (CONFIG_CPU == SH7034 || CPU_COLDFIRE) */
452 static int perfcheck(void)
458 "orr r0, r2, #0xc0 \n" /* disable IRQ and FIQ */
461 "ldr r0, [%[timr]] \n"
462 "add r0, r0, %[tmo] \n"
464 "add %[res], %[res], #1 \n"
465 "ldr r1, [%[timr]] \n"
468 "msr CPSR_c, r2 \n" /* reset IRQ and FIQ state */
472 [timr
]"r"(&USEC_TIMER
),
474 #if CONFIG_CPU == PP5002
476 #else /* PP5020/5022/5024 */
487 #ifdef HAVE_LCD_BITMAP
488 static bool dbg_hw_info(void)
490 #if CONFIG_CPU == SH7034
491 int bitmask
= HW_MASK
;
492 int rom_version
= ROM_VERSION
;
493 unsigned manu
, id
; /* flash IDs */
494 bool got_id
; /* flag if we managed to get the flash IDs */
495 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
496 bool has_bootrom
; /* flag for boot ROM present */
497 int oldmode
; /* saved memory guard mode */
499 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
501 /* get flash ROM type */
502 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
504 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
506 /* check if the boot ROM area is a flash mirror */
507 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
508 if (has_bootrom
) /* if ROM and Flash different */
510 /* calculate CRC16 checksum of boot ROM */
511 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
514 system_memory_guard(oldmode
); /* re-enable memory guard */
516 lcd_setfont(FONT_SYSFIXED
);
519 lcd_puts(0, 0, "[Hardware info]");
521 lcd_putsf(0, 1, "ROM: %d.%02d", rom_version
/100, rom_version
%100);
523 lcd_putsf(0, 2, "Mask: 0x%04x", bitmask
);
526 lcd_putsf(0, 3, "Flash: M=%02x D=%02x", manu
, id
);
528 lcd_puts(0, 3, "Flash: M=?? D=??"); /* unknown, sorry */
532 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
533 lcd_puts(0, 4, "Boot ROM: V1");
535 lcd_putsf(0, 4, "ROMcrc: 0x%08x", rom_crc
);
539 lcd_puts(0, 4, "Boot ROM: none");
544 while (!(action_userabort(TIMEOUT_BLOCK
)));
546 #elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250
547 unsigned manu
, id
; /* flash IDs */
548 int got_id
; /* flag if we managed to get the flash IDs */
549 int oldmode
; /* saved memory guard mode */
552 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
554 /* get flash ROM type */
555 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
557 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
559 system_memory_guard(oldmode
); /* re-enable memory guard */
561 lcd_setfont(FONT_SYSFIXED
);
564 lcd_puts(0, line
++, "[Hardware info]");
567 lcd_putsf(0, line
++, "Flash: M=%04x D=%04x", manu
, id
);
569 lcd_puts(0, line
++, "Flash: M=???? D=????"); /* unknown, sorry */
575 lcd_puts(0, ++line
, "Serial Number:");
577 got_id
= ds2411_read_id(&id
);
579 if (got_id
== DS2411_OK
)
581 lcd_putsf(0, ++line
, " FC=%02x", (unsigned)id
.family_code
);
582 lcd_putsf(0, ++line
, " ID=%02X %02X %02X %02X %02X %02X",
583 (unsigned)id
.uid
[0], (unsigned)id
.uid
[1], (unsigned)id
.uid
[2],
584 (unsigned)id
.uid
[3], (unsigned)id
.uid
[4], (unsigned)id
.uid
[5]);
585 lcd_putsf(0, ++line
, " CRC=%02X", (unsigned)id
.crc
);
589 lcd_putsf(0, ++line
, "READ ERR=%d", got_id
);
596 while (!(action_userabort(TIMEOUT_BLOCK
)));
598 #elif defined(CPU_PP502x)
600 char pp_version
[] = { (PP_VER2
>> 24) & 0xff, (PP_VER2
>> 16) & 0xff,
601 (PP_VER2
>> 8) & 0xff, (PP_VER2
) & 0xff,
602 (PP_VER1
>> 24) & 0xff, (PP_VER1
>> 16) & 0xff,
603 (PP_VER1
>> 8) & 0xff, (PP_VER1
) & 0xff, '\0' };
605 lcd_setfont(FONT_SYSFIXED
);
608 lcd_puts(0, line
++, "[Hardware info]");
611 lcd_putsf(0, line
++, "HW rev: 0x%08lx", IPOD_HW_REVISION
);
615 extern int lcd_type
; /* Defined in lcd-colornano.c */
617 lcd_putsf(0, line
++, "LCD type: %d", lcd_type
);
620 lcd_putsf(0, line
++, "PP version: %s", pp_version
);
622 lcd_putsf(0, line
++, "Est. clock (kHz): %d", perfcheck());
626 while (!(action_userabort(TIMEOUT_BLOCK
)));
628 #elif CONFIG_CPU == PP5002
630 char pp_version
[] = { (PP_VER4
>> 8) & 0xff, PP_VER4
& 0xff,
631 (PP_VER3
>> 8) & 0xff, PP_VER3
& 0xff,
632 (PP_VER2
>> 8) & 0xff, PP_VER2
& 0xff,
633 (PP_VER1
>> 8) & 0xff, PP_VER1
& 0xff, '\0' };
636 lcd_setfont(FONT_SYSFIXED
);
639 lcd_puts(0, line
++, "[Hardware info]");
642 lcd_putsf(0, line
++, "HW rev: 0x%08lx", IPOD_HW_REVISION
);
645 lcd_putsf(0, line
++, "PP version: %s", pp_version
);
647 lcd_putsf(0, line
++, "Est. clock (kHz): %d", perfcheck());
651 while (!(action_userabort(TIMEOUT_BLOCK
)));
654 /* Define this function in your target tree */
655 return __dbg_hw_info();
656 #endif /* CONFIG_CPU */
657 lcd_setfont(FONT_UI
);
660 #else /* !HAVE_LCD_BITMAP */
661 static bool dbg_hw_info(void)
665 int rom_version
= ROM_VERSION
;
666 unsigned manu
, id
; /* flash IDs */
667 bool got_id
; /* flag if we managed to get the flash IDs */
668 unsigned rom_crc
= 0xffffffff; /* CRC32 of the boot ROM */
669 bool has_bootrom
; /* flag for boot ROM present */
670 int oldmode
; /* saved memory guard mode */
672 oldmode
= system_memory_guard(MEMGUARD_NONE
); /* disable memory guard */
674 /* get flash ROM type */
675 got_id
= dbg_flash_id(&manu
, &id
, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */
677 got_id
= dbg_flash_id(&manu
, &id
, 0x555, 0x2AA); /* try AMD, Macronix */
679 /* check if the boot ROM area is a flash mirror */
680 has_bootrom
= (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0);
681 if (has_bootrom
) /* if ROM and Flash different */
683 /* calculate CRC16 checksum of boot ROM */
684 rom_crc
= crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff);
687 system_memory_guard(oldmode
); /* re-enable memory guard */
691 lcd_puts(0, 0, "[HW Info]");
697 lcd_putsf(0, 1, "ROM: %d.%02d",
698 rom_version
/100, rom_version
%100);
702 lcd_putsf(0, 1, "Flash:%02x,%02x", manu
, id
);
704 lcd_puts(0, 1, "Flash:??,??"); /* unknown, sorry */
709 if (rom_crc
== 0x56DBA4EE) /* known Version 1 */
710 lcd_puts(0, 1, "BootROM: V1");
711 else if (rom_crc
== 0x358099E8)
712 lcd_puts(0, 1, "BootROM: V2");
713 /* alternative boot ROM found in one single player so far */
715 lcd_putsf(0, 1, "R: %08x", rom_crc
);
718 lcd_puts(0, 1, "BootROM: no");
723 button
= get_action(CONTEXT_SETTINGS
,TIMEOUT_BLOCK
);
727 case ACTION_STD_CANCEL
:
730 case ACTION_SETTINGS_DEC
:
736 case ACTION_SETTINGS_INC
:
745 #endif /* !HAVE_LCD_BITMAP */
746 #endif /* !SIMULATOR */
749 static const char* dbg_partitions_getname(int selected_item
, void *data
,
750 char *buffer
, size_t buffer_len
)
753 int partition
= selected_item
/2;
754 struct partinfo
* p
= disk_partinfo(partition
);
757 snprintf(buffer
, buffer_len
, " T:%x %ld MB", p
->type
, p
->size
/ ( 2048 / ( SECTOR_SIZE
/ 512 )));
761 snprintf(buffer
, buffer_len
, "P%d: S:%lx", partition
, p
->start
);
766 bool dbg_partitions(void)
768 struct simplelist_info info
;
769 simplelist_info_init(&info
, "Partition Info", 4, NULL
);
770 info
.selection_size
= 2;
771 info
.hide_selection
= true;
772 info
.scroll_all
= true;
773 info
.get_name
= dbg_partitions_getname
;
774 return simplelist_show_list(&info
);
778 #if defined(CPU_COLDFIRE) && defined(HAVE_SPDIF_OUT)
779 static bool dbg_spdif(void)
782 unsigned int control
;
787 unsigned int interruptstat
;
788 bool valnogood
, symbolerr
, parityerr
;
791 int spdif_source
= spdif_get_output_source(&spdif_src_on
);
792 spdif_set_output_source(AUDIO_SRC_SPDIF
IF_SPDIF_POWER_(, true));
795 lcd_setfont(FONT_SYSFIXED
);
797 #ifdef HAVE_SPDIF_POWER
798 spdif_power_enable(true); /* We need SPDIF power for both sending & receiving */
805 control
= EBU1RCVCCHANNEL1
;
806 interruptstat
= INTERRUPTSTAT
;
807 INTERRUPTCLEAR
= 0x03c00000;
809 valnogood
= (interruptstat
& 0x01000000)?true:false;
810 symbolerr
= (interruptstat
& 0x00800000)?true:false;
811 parityerr
= (interruptstat
& 0x00400000)?true:false;
813 lcd_putsf(0, line
++, "Val: %s Sym: %s Par: %s",
816 parityerr
?"--":"OK");
818 lcd_putsf(0, line
++, "Status word: %08x", (int)control
);
823 lcd_putsf(0, line
++, "PRO: %d (%s)",
824 x
, x
?"Professional":"Consumer");
826 x
= (control
>> 30) & 1;
827 lcd_putsf(0, line
++, "Audio: %d (%s)",
828 x
, x
?"Non-PCM":"PCM");
830 x
= (control
>> 29) & 1;
831 lcd_putsf(0, line
++, "Copy: %d (%s)",
832 x
, x
?"Permitted":"Inhibited");
834 x
= (control
>> 27) & 7;
847 lcd_putsf(0, line
++, "Preemphasis: %d (%s)", x
, s
);
849 x
= (control
>> 24) & 3;
850 lcd_putsf(0, line
++, "Mode: %d", x
);
852 category
= (control
>> 17) & 127;
864 lcd_putsf(0, line
++, "Category: 0x%02x (%s)", category
, s
);
866 x
= (control
>> 16) & 1;
868 if(((category
& 0x70) == 0x10) ||
869 ((category
& 0x70) == 0x40) ||
870 ((category
& 0x78) == 0x38))
872 generation
= !generation
;
874 lcd_putsf(0, line
++, "Generation: %d (%s)",
875 x
, generation
?"Original":"No ind.");
877 x
= (control
>> 12) & 15;
878 lcd_putsf(0, line
++, "Source: %d", x
);
881 x
= (control
>> 8) & 15;
897 lcd_putsf(0, line
++, "Channel: %d (%s)", x
, s
);
899 x
= (control
>> 4) & 15;
912 lcd_putsf(0, line
++, "Frequency: %d (%s)", x
, s
);
914 x
= (control
>> 2) & 3;
915 lcd_putsf(0, line
++, "Clock accuracy: %d", x
);
919 lcd_putsf(0, line
++, "Measured freq: %ldHz",
920 spdif_measure_frequency());
925 if (action_userabort(HZ
/10))
929 spdif_set_output_source(spdif_source
IF_SPDIF_POWER_(, spdif_src_on
));
931 #ifdef HAVE_SPDIF_POWER
932 spdif_power_enable(global_settings
.spdif_enable
);
935 lcd_setfont(FONT_UI
);
938 #endif /* CPU_COLDFIRE */
941 #ifdef HAVE_LCD_BITMAP
942 /* button definitions */
943 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
944 (CONFIG_KEYPAD == IRIVER_H300_PAD)
945 # define DEBUG_CANCEL BUTTON_OFF
947 #elif CONFIG_KEYPAD == RECORDER_PAD
948 # define DEBUG_CANCEL BUTTON_OFF
950 #elif CONFIG_KEYPAD == ONDIO_PAD
951 # define DEBUG_CANCEL BUTTON_MENU
953 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || \
954 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
955 (CONFIG_KEYPAD == IPOD_4G_PAD)
956 # define DEBUG_CANCEL BUTTON_MENU
958 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
959 # define DEBUG_CANCEL BUTTON_PLAY
961 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
962 # define DEBUG_CANCEL BUTTON_REC
964 #elif (CONFIG_KEYPAD == IAUDIO_M3_PAD)
965 # define DEBUG_CANCEL BUTTON_RC_REC
967 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
968 # define DEBUG_CANCEL BUTTON_REW
970 #elif (CONFIG_KEYPAD == MROBE100_PAD)
971 # define DEBUG_CANCEL BUTTON_MENU
973 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
974 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
975 (CONFIG_KEYPAD == SANSA_FUZE_PAD)
976 # define DEBUG_CANCEL BUTTON_LEFT
978 /* This is temporary until the SA9200 touchpad works */
979 #elif (CONFIG_KEYPAD == PHILIPS_SA9200_PAD) || \
980 (CONFIG_KEYPAD == PHILIPS_HDD1630_PAD)
981 # define DEBUG_CANCEL BUTTON_POWER
983 #elif (CONFIG_KEYPAD == SAMSUNG_YH_PAD)
984 # define DEBUG_CANCEL BUTTON_PLAY
986 #endif /* key definitions */
991 #if CONFIG_CPU == SH7034
992 int adc_battery_voltage
, adc_battery_level
;
994 lcd_setfont(FONT_SYSFIXED
);
999 lcd_putsf(0, 0, "PADR: %04x", (unsigned short)PADR
);
1000 lcd_putsf(0, 1, "PBDR: %04x", (unsigned short)PBDR
);
1002 lcd_putsf(0, 2, "AN0: %03x AN4: %03x", adc_read(0), adc_read(4));
1003 lcd_putsf(0, 3, "AN1: %03x AN5: %03x", adc_read(1), adc_read(5));
1004 lcd_putsf(0, 4, "AN2: %03x AN6: %03x", adc_read(2), adc_read(6));
1005 lcd_putsf(0, 5, "AN3: %03x AN7: %03x", adc_read(3), adc_read(7));
1007 battery_read_info(&adc_battery_voltage
, &adc_battery_level
);
1008 lcd_putsf(0, 6, "Batt: %d.%03dV %d%% ", adc_battery_voltage
/ 1000,
1009 adc_battery_voltage
% 1000, adc_battery_level
);
1012 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1014 lcd_setfont(FONT_UI
);
1018 #elif defined(CPU_COLDFIRE)
1019 unsigned int gpio_out
;
1020 unsigned int gpio1_out
;
1021 unsigned int gpio_read
;
1022 unsigned int gpio1_read
;
1023 unsigned int gpio_function
;
1024 unsigned int gpio1_function
;
1025 unsigned int gpio_enable
;
1026 unsigned int gpio1_enable
;
1027 int adc_buttons
, adc_remote
;
1028 int adc_battery_voltage
, adc_battery_level
;
1031 lcd_clear_display();
1032 lcd_setfont(FONT_SYSFIXED
);
1037 gpio_read
= GPIO_READ
;
1038 gpio1_read
= GPIO1_READ
;
1039 gpio_out
= GPIO_OUT
;
1040 gpio1_out
= GPIO1_OUT
;
1041 gpio_function
= GPIO_FUNCTION
;
1042 gpio1_function
= GPIO1_FUNCTION
;
1043 gpio_enable
= GPIO_ENABLE
;
1044 gpio1_enable
= GPIO1_ENABLE
;
1046 lcd_putsf(0, line
++, "GPIO_READ: %08x", gpio_read
);
1047 lcd_putsf(0, line
++, "GPIO_OUT: %08x", gpio_out
);
1048 lcd_putsf(0, line
++, "GPIO_FUNC: %08x", gpio_function
);
1049 lcd_putsf(0, line
++, "GPIO_ENA: %08x", gpio_enable
);
1051 lcd_putsf(0, line
++, "GPIO1_READ: %08x", gpio1_read
);
1052 lcd_putsf(0, line
++, "GPIO1_OUT: %08x", gpio1_out
);
1053 lcd_putsf(0, line
++, "GPIO1_FUNC: %08x", gpio1_function
);
1054 lcd_putsf(0, line
++, "GPIO1_ENA: %08x", gpio1_enable
);
1056 adc_buttons
= adc_read(ADC_BUTTONS
);
1057 adc_remote
= adc_read(ADC_REMOTE
);
1058 battery_read_info(&adc_battery_voltage
, &adc_battery_level
);
1059 #if defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IRIVER_H300_SERIES)
1060 lcd_putsf(0, line
++, "ADC_BUTTONS (%c): %02x",
1061 button_scan_enabled() ? '+' : '-', adc_buttons
);
1063 lcd_putsf(0, line
++, "ADC_BUTTONS: %02x", adc_buttons
);
1065 #if defined(IAUDIO_X5) || defined(IAUDIO_M5)
1066 lcd_putsf(0, line
++, "ADC_REMOTE (%c): %02x",
1067 remote_detect() ? '+' : '-', adc_remote
);
1069 lcd_putsf(0, line
++, "ADC_REMOTE: %02x", adc_remote
);
1071 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
1072 lcd_putsf(0, line
++, "ADC_REMOTEDETECT: %02x",
1073 adc_read(ADC_REMOTEDETECT
));
1076 lcd_putsf(0, line
++, "Batt: %d.%03dV %d%% ", adc_battery_voltage
/ 1000,
1077 adc_battery_voltage
% 1000, adc_battery_level
);
1079 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
1080 lcd_putsf(0, line
++, "remotetype: %d", remote_type());
1084 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1086 lcd_setfont(FONT_UI
);
1091 #elif defined(CPU_PP502x)
1094 lcd_clear_display();
1095 lcd_setfont(FONT_SYSFIXED
);
1100 lcd_puts(0, line
++, "GPIO STATES:");
1101 lcd_putsf(0, line
++, "A: %02x E: %02x I: %02x",
1102 (unsigned int)GPIOA_INPUT_VAL
,
1103 (unsigned int)GPIOE_INPUT_VAL
,
1104 (unsigned int)GPIOI_INPUT_VAL
);
1105 lcd_putsf(0, line
++, "B: %02x F: %02x J: %02x",
1106 (unsigned int)GPIOB_INPUT_VAL
,
1107 (unsigned int)GPIOF_INPUT_VAL
,
1108 (unsigned int)GPIOJ_INPUT_VAL
);
1109 lcd_putsf(0, line
++, "C: %02x G: %02x K: %02x",
1110 (unsigned int)GPIOC_INPUT_VAL
,
1111 (unsigned int)GPIOG_INPUT_VAL
,
1112 (unsigned int)GPIOK_INPUT_VAL
);
1113 lcd_putsf(0, line
++, "D: %02x H: %02x L: %02x",
1114 (unsigned int)GPIOD_INPUT_VAL
,
1115 (unsigned int)GPIOH_INPUT_VAL
,
1116 (unsigned int)GPIOL_INPUT_VAL
);
1118 lcd_putsf(0, line
++, "GPO32_VAL: %08lx", GPO32_VAL
);
1119 lcd_putsf(0, line
++, "GPO32_EN: %08lx", GPO32_ENABLE
);
1120 lcd_putsf(0, line
++, "DEV_EN: %08lx", DEV_EN
);
1121 lcd_putsf(0, line
++, "DEV_EN2: %08lx", DEV_EN2
);
1122 lcd_putsf(0, line
++, "DEV_EN3: %08lx", inl(0x60006044)); /* to be verified */
1123 lcd_putsf(0, line
++, "DEV_INIT1: %08lx", DEV_INIT1
);
1124 lcd_putsf(0, line
++, "DEV_INIT2: %08lx", DEV_INIT2
);
1125 #ifdef ADC_ACCESSORY
1126 lcd_putsf(0, line
++, "ACCESSORY: %d", adc_read(ADC_ACCESSORY
));
1129 lcd_putsf(0, line
++, "4066_ISTAT: %d", adc_read(ADC_4066_ISTAT
));
1132 #if defined(IPOD_ACCESSORY_PROTOCOL)
1133 extern unsigned char serbuf
[];
1134 lcd_putsf(0, line
++, "IAP PACKET: %02x %02x %02x %02x %02x %02x %02x %02x",
1135 serbuf
[0], serbuf
[1], serbuf
[2], serbuf
[3], serbuf
[4], serbuf
[5],
1136 serbuf
[6], serbuf
[7]);
1139 #if defined(IRIVER_H10) || defined(IRIVER_H10_5GB)
1141 lcd_putsf(0, line
++, "BATT: %03x UNK1: %03x",
1142 adc_read(ADC_BATTERY
), adc_read(ADC_UNKNOWN_1
));
1143 lcd_putsf(0, line
++, "REM: %03x PAD: %03x",
1144 adc_read(ADC_REMOTE
), adc_read(ADC_SCROLLPAD
));
1145 #elif defined(PHILIPS_HDD1630)
1147 lcd_putsf(0, line
++, "BATT: %03x UNK1: %03x",
1148 adc_read(ADC_BATTERY
), adc_read(ADC_UNKNOWN_1
));
1149 #elif defined(SANSA_E200) || defined(PHILIPS_SA9200)
1150 lcd_putsf(0, line
++, "ADC_BVDD: %4d", adc_read(ADC_BVDD
));
1151 lcd_putsf(0, line
++, "ADC_RTCSUP: %4d", adc_read(ADC_RTCSUP
));
1152 lcd_putsf(0, line
++, "ADC_UVDD: %4d", adc_read(ADC_UVDD
));
1153 lcd_putsf(0, line
++, "ADC_CHG_IN: %4d", adc_read(ADC_CHG_IN
));
1154 lcd_putsf(0, line
++, "ADC_CVDD: %4d", adc_read(ADC_CVDD
));
1155 lcd_putsf(0, line
++, "ADC_BATTEMP: %4d", adc_read(ADC_BATTEMP
));
1156 lcd_putsf(0, line
++, "ADC_MICSUP1: %4d", adc_read(ADC_MICSUP1
));
1157 lcd_putsf(0, line
++, "ADC_MICSUP2: %4d", adc_read(ADC_MICSUP2
));
1158 lcd_putsf(0, line
++, "ADC_VBE1: %4d", adc_read(ADC_VBE1
));
1159 lcd_putsf(0, line
++, "ADC_VBE2: %4d", adc_read(ADC_VBE2
));
1160 lcd_putsf(0, line
++, "ADC_I_MICSUP1:%4d", adc_read(ADC_I_MICSUP1
));
1161 #if !defined(PHILIPS_SA9200)
1162 lcd_putsf(0, line
++, "ADC_I_MICSUP2:%4d", adc_read(ADC_I_MICSUP2
));
1163 lcd_putsf(0, line
++, "ADC_VBAT: %4d", adc_read(ADC_VBAT
));
1167 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1169 lcd_setfont(FONT_UI
);
1174 #elif CONFIG_CPU == PP5002
1177 lcd_clear_display();
1178 lcd_setfont(FONT_SYSFIXED
);
1183 lcd_putsf(0, line
++, "GPIO_A: %02x GPIO_B: %02x",
1184 (unsigned int)GPIOA_INPUT_VAL
, (unsigned int)GPIOB_INPUT_VAL
);
1185 lcd_putsf(0, line
++, "GPIO_C: %02x GPIO_D: %02x",
1186 (unsigned int)GPIOC_INPUT_VAL
, (unsigned int)GPIOD_INPUT_VAL
);
1188 lcd_putsf(0, line
++, "DEV_EN: %08lx", DEV_EN
);
1189 lcd_putsf(0, line
++, "CLOCK_ENABLE: %08lx", CLOCK_ENABLE
);
1190 lcd_putsf(0, line
++, "CLOCK_SOURCE: %08lx", CLOCK_SOURCE
);
1191 lcd_putsf(0, line
++, "PLL_CONTROL: %08lx", PLL_CONTROL
);
1192 lcd_putsf(0, line
++, "PLL_DIV: %08lx", PLL_DIV
);
1193 lcd_putsf(0, line
++, "PLL_MULT: %08lx", PLL_MULT
);
1194 lcd_putsf(0, line
++, "TIMING1_CTL: %08lx", TIMING1_CTL
);
1195 lcd_putsf(0, line
++, "TIMING2_CTL: %08lx", TIMING2_CTL
);
1198 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1200 lcd_setfont(FONT_UI
);
1204 lcd_setfont(FONT_UI
);
1206 return __dbg_ports();
1210 #else /* !HAVE_LCD_BITMAP */
1211 bool dbg_ports(void)
1215 int adc_battery_voltage
;
1218 lcd_clear_display();
1225 snprintf(buf
, 32, "PADR: %04x", (unsigned short)PADR
);
1228 snprintf(buf
, 32, "PBDR: %04x", (unsigned short)PBDR
);
1231 snprintf(buf
, 32, "AN0: %03x", adc_read(0));
1234 snprintf(buf
, 32, "AN1: %03x", adc_read(1));
1237 snprintf(buf
, 32, "AN2: %03x", adc_read(2));
1240 snprintf(buf
, 32, "AN3: %03x", adc_read(3));
1243 snprintf(buf
, 32, "AN4: %03x", adc_read(4));
1246 snprintf(buf
, 32, "AN5: %03x", adc_read(5));
1249 snprintf(buf
, 32, "AN6: %03x", adc_read(6));
1252 snprintf(buf
, 32, "AN7: %03x", adc_read(7));
1255 lcd_puts(0, 0, buf
);
1257 battery_read_info(&adc_battery_voltage
, NULL
);
1258 lcd_putsf(0, 1, "Batt: %d.%03dV", adc_battery_voltage
/ 1000,
1259 adc_battery_voltage
% 1000);
1262 button
= get_action(CONTEXT_SETTINGS
,HZ
/5);
1266 case ACTION_STD_CANCEL
:
1269 case ACTION_SETTINGS_DEC
:
1275 case ACTION_SETTINGS_INC
:
1284 #endif /* !HAVE_LCD_BITMAP */
1285 #endif /* !SIMULATOR */
1287 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
1288 static bool dbg_pcf(void)
1292 #ifdef HAVE_LCD_BITMAP
1293 lcd_setfont(FONT_SYSFIXED
);
1295 lcd_clear_display();
1301 lcd_putsf(0, line
++, "DCDC1: %02x", pcf50605_read(0x1b));
1302 lcd_putsf(0, line
++, "DCDC2: %02x", pcf50605_read(0x1c));
1303 lcd_putsf(0, line
++, "DCDC3: %02x", pcf50605_read(0x1d));
1304 lcd_putsf(0, line
++, "DCDC4: %02x", pcf50605_read(0x1e));
1305 lcd_putsf(0, line
++, "DCDEC1: %02x", pcf50605_read(0x1f));
1306 lcd_putsf(0, line
++, "DCDEC2: %02x", pcf50605_read(0x20));
1307 lcd_putsf(0, line
++, "DCUDC1: %02x", pcf50605_read(0x21));
1308 lcd_putsf(0, line
++, "DCUDC2: %02x", pcf50605_read(0x22));
1309 lcd_putsf(0, line
++, "IOREGC: %02x", pcf50605_read(0x23));
1310 lcd_putsf(0, line
++, "D1REGC: %02x", pcf50605_read(0x24));
1311 lcd_putsf(0, line
++, "D2REGC: %02x", pcf50605_read(0x25));
1312 lcd_putsf(0, line
++, "D3REGC: %02x", pcf50605_read(0x26));
1313 lcd_putsf(0, line
++, "LPREG1: %02x", pcf50605_read(0x27));
1315 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
1317 lcd_setfont(FONT_UI
);
1322 lcd_setfont(FONT_UI
);
1327 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
1328 static bool dbg_cpufreq(void)
1333 #ifdef HAVE_LCD_BITMAP
1334 lcd_setfont(FONT_SYSFIXED
);
1336 lcd_clear_display();
1342 lcd_putsf(0, line
++, "Frequency: %ld", FREQ
);
1343 lcd_putsf(0, line
++, "boost_counter: %d", get_cpu_boost_counter());
1346 button
= get_action(CONTEXT_STD
,HZ
/10);
1350 case ACTION_STD_PREV
:
1354 case ACTION_STD_NEXT
:
1359 while (get_cpu_boost_counter() > 0)
1361 set_cpu_frequency(CPUFREQ_DEFAULT
);
1364 case ACTION_STD_CANCEL
:
1365 lcd_setfont(FONT_UI
);
1369 lcd_setfont(FONT_UI
);
1372 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
1374 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
1375 #include "tsc2100.h"
1376 static char *itob(int n
, int len
)
1378 static char binary
[64];
1380 for (i
=1, j
=0;i
<=len
;i
++)
1382 binary
[j
++] = n
&(1<<(len
-i
))?'1':'0';
1390 static const char* tsc2100_debug_getname(int selected_item
, void * data
,
1391 char *buffer
, size_t buffer_len
)
1393 int *page
= (int*)data
;
1394 bool reserved
= false;
1398 if ((selected_item
> 0x0a) ||
1399 (selected_item
== 0x04) ||
1400 (selected_item
== 0x08))
1404 if ((selected_item
> 0x05) ||
1405 (selected_item
== 0x02))
1409 if (selected_item
> 0x1e)
1414 snprintf(buffer
, buffer_len
, "%02x: RESERVED", selected_item
);
1416 snprintf(buffer
, buffer_len
, "%02x: %s", selected_item
,
1417 itob(tsc2100_readreg(*page
, selected_item
)&0xffff,16));
1420 static int tsc2100debug_action_callback(int action
, struct gui_synclist
*lists
)
1422 int *page
= (int*)lists
->data
;
1423 if (action
== ACTION_STD_OK
)
1425 *page
= (*page
+1)%3;
1426 snprintf(lists
->title
, 32,
1427 "tsc2100 registers - Page %d", *page
);
1428 return ACTION_REDRAW
;
1432 static bool tsc2100_debug(void)
1435 char title
[32] = "tsc2100 registers - Page 0";
1436 struct simplelist_info info
;
1437 simplelist_info_init(&info
, title
, 32, &page
);
1438 info
.timeout
= HZ
/100;
1439 info
.get_name
= tsc2100_debug_getname
;
1440 info
.action_callback
= tsc2100debug_action_callback
;
1441 return simplelist_show_list(&info
);
1445 #ifdef HAVE_LCD_BITMAP
1447 * view_battery() shows a automatically scaled graph of the battery voltage
1448 * over time. Usable for estimating battery life / charging rate.
1449 * The power_history array is updated in power_thread of powermgmt.c.
1452 #define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN)
1453 #define BAT_YSPACE (LCD_HEIGHT - 20)
1455 static bool view_battery(void)
1459 unsigned short maxv
, minv
;
1461 lcd_setfont(FONT_SYSFIXED
);
1465 lcd_clear_display();
1467 case 0: /* voltage history graph */
1468 /* Find maximum and minimum voltage for scaling */
1469 minv
= power_history
[0];
1471 for (i
= 1; i
< BAT_LAST_VAL
&& power_history
[i
]; i
++) {
1472 if (power_history
[i
] > maxv
)
1473 maxv
= power_history
[i
];
1474 if (power_history
[i
] < minv
)
1475 minv
= power_history
[i
];
1478 lcd_putsf(0, 0, "Battery %d.%03d", power_history
[0] / 1000,
1479 power_history
[0] % 1000);
1480 lcd_putsf(0, 1, "scale %d.%03d-%d.%03dV",
1481 minv
/ 1000, minv
% 1000, maxv
/ 1000, maxv
% 1000);
1484 for (i
= BAT_LAST_VAL
- 1; i
>= 0; i
--) {
1485 y
= (power_history
[i
] - minv
) * BAT_YSPACE
/ (maxv
- minv
);
1486 lcd_set_drawmode(DRMODE_SOLID
|DRMODE_INVERSEVID
);
1487 lcd_vline(x
, LCD_HEIGHT
-1, 20);
1488 lcd_set_drawmode(DRMODE_SOLID
);
1489 lcd_vline(x
, LCD_HEIGHT
-1,
1490 MIN(MAX(LCD_HEIGHT
-1 - y
, 20), LCD_HEIGHT
-1));
1496 case 1: /* status: */
1497 lcd_puts(0, 0, "Power status:");
1499 battery_read_info(&y
, NULL
);
1500 lcd_putsf(0, 1, "Battery: %d.%03d V", y
/ 1000, y
% 1000);
1501 #ifdef ADC_EXT_POWER
1502 y
= (adc_read(ADC_EXT_POWER
) * EXT_SCALE_FACTOR
) / 1000;
1503 lcd_putsf(0, 2, "External: %d.%03d V", y
/ 1000, y
% 1000);
1506 #if defined ARCHOS_RECORDER
1507 lcd_putsf(0, 3, "Chgr: %s %s",
1508 charger_inserted() ? "present" : "absent",
1509 charger_enabled() ? "on" : "off");
1510 lcd_putsf(0, 5, "short delta: %d", short_delta
);
1511 lcd_putsf(0, 6, "long delta: %d", long_delta
);
1512 lcd_puts(0, 7, power_message
);
1513 lcd_putsf(0, 8, "USB Inserted: %s",
1514 usb_inserted() ? "yes" : "no");
1515 #elif defined IRIVER_H300_SERIES
1516 lcd_putsf(0, 9, "USB Charging Enabled: %s",
1517 usb_charging_enabled() ? "yes" : "no");
1518 #elif defined IPOD_NANO || defined IPOD_VIDEO
1519 int usb_pwr
= (GPIOL_INPUT_VAL
& 0x10)?true:false;
1520 int ext_pwr
= (GPIOL_INPUT_VAL
& 0x08)?false:true;
1521 int dock
= (GPIOA_INPUT_VAL
& 0x10)?true:false;
1522 int charging
= (GPIOB_INPUT_VAL
& 0x01)?false:true;
1523 int headphone
= (GPIOA_INPUT_VAL
& 0x80)?true:false;
1525 lcd_putsf(0, 3, "USB pwr: %s",
1526 usb_pwr
? "present" : "absent");
1527 lcd_putsf(0, 4, "EXT pwr: %s",
1528 ext_pwr
? "present" : "absent");
1529 lcd_putsf(0, 5, "Battery: %s",
1530 charging
? "charging" : (usb_pwr
||ext_pwr
) ? "charged" : "discharging");
1531 lcd_putsf(0, 6, "Dock mode: %s",
1532 dock
? "enabled" : "disabled");
1533 lcd_putsf(0, 7, "Headphone: %s",
1534 headphone
? "connected" : "disconnected");
1536 x
= (adc_read(ADC_4066_ISTAT
) * 2400) /
1542 lcd_putsf(0, 8, "Ibat: %d mA", x
);
1543 lcd_putsf(0, 9, "Vbat * Ibat: %d mW", x
* y
/ 1000);
1545 #elif defined TOSHIBA_GIGABEAT_S
1549 static const unsigned char * const chrgstate_strings
[] =
1560 lcd_putsf(0, line
++, "Charger: %s",
1561 charger_inserted() ? "present" : "absent");
1563 st
= power_input_status() &
1564 (POWER_INPUT_CHARGER
| POWER_INPUT_BATTERY
);
1565 lcd_putsf(0, line
++, "%s%s",
1566 (st
& POWER_INPUT_MAIN_CHARGER
) ? " Main" : "",
1567 (st
& POWER_INPUT_USB_CHARGER
) ? " USB" : "");
1569 lcd_putsf(0, line
++, "IUSB Max: %d", usb_allowed_current());
1571 y
= ARRAYLEN(chrgstate_strings
) - 1;
1573 switch (charge_state
)
1575 case CHARGE_STATE_DISABLED
: y
--;
1576 case CHARGE_STATE_ERROR
: y
--;
1577 case DISCHARGING
: y
--;
1584 lcd_putsf(0, line
++, "State: %s", chrgstate_strings
[y
]);
1586 lcd_putsf(0, line
++, "Battery Switch: %s",
1587 (st
& POWER_INPUT_BATTERY
) ? "On" : "Off");
1589 y
= chrgraw_adc_voltage();
1590 lcd_putsf(0, line
++, "CHRGRAW: %d.%03d V",
1591 y
/ 1000, y
% 1000);
1593 y
= application_supply_adc_voltage();
1594 lcd_putsf(0, line
++, "BP : %d.%03d V",
1595 y
/ 1000, y
% 1000);
1597 y
= battery_adc_charge_current();
1598 if (y
< 0) x
= '-', y
= -y
;
1600 lcd_putsf(0, line
++, "CHRGISN:%c%d mA", x
, y
);
1602 y
= cccv_regulator_dissipation();
1603 lcd_putsf(0, line
++, "P CCCV : %d mW", y
);
1605 y
= battery_charge_current();
1606 if (y
< 0) x
= '-', y
= -y
;
1608 lcd_putsf(0, line
++, "I Charge:%c%d mA", x
, y
);
1610 y
= battery_adc_temp();
1613 lcd_putsf(0, line
++, "T Battery: %dC (%dF)", y
,
1616 /* Conversion disabled */
1617 lcd_puts(0, line
++, "T Battery: ?");
1620 #elif defined(SANSA_E200) || defined(SANSA_C200) || defined(SANSA_CLIP) || defined(SANSA_FUZE)
1621 const int first
= CHARGE_STATE_DISABLED
;
1622 static const char * const chrgstate_strings
[] =
1624 [CHARGE_STATE_DISABLED
-first
] = "Disabled",
1625 [CHARGE_STATE_ERROR
-first
] = "Error",
1626 [DISCHARGING
-first
] = "Discharging",
1627 [CHARGING
-first
] = "Charging",
1629 const char *str
= NULL
;
1631 lcd_putsf(0, 3, "Charger: %s",
1632 charger_inserted() ? "present" : "absent");
1634 y
= charge_state
- first
;
1635 if ((unsigned)y
< ARRAYLEN(chrgstate_strings
))
1636 str
= chrgstate_strings
[y
];
1638 lcd_putsf(0, 4, "State: %s",
1639 str
? str
: "<unknown>");
1641 lcd_putsf(0, 5, "CHARGER: %02X",
1642 ascodec_read(AS3514_CHARGER
));
1643 #elif defined(IPOD_NANO2G)
1644 y
= pmu_read_battery_current();
1645 lcd_putsf(0, 2, "Battery current: %d mA", y
);
1647 lcd_putsf(0, 3, "Charger: %s",
1648 charger_inserted() ? "present" : "absent");
1649 #endif /* target type */
1650 #endif /* CONFIG_CHARGING */
1653 case 2: /* voltage deltas: */
1654 lcd_puts(0, 0, "Voltage deltas:");
1656 for (i
= 0; i
<= 6; i
++) {
1657 y
= power_history
[i
] - power_history
[i
+1];
1658 lcd_putsf(0, i
+1, "-%d min: %s%d.%03d V", i
,
1659 (y
< 0) ? "-" : "", ((y
< 0) ? y
* -1 : y
) / 1000,
1660 ((y
< 0) ? y
* -1 : y
) % 1000);
1664 case 3: /* remaining time estimation: */
1666 #ifdef ARCHOS_RECORDER
1667 lcd_putsf(0, 0, "charge_state: %d", charge_state
);
1669 lcd_putsf(0, 1, "Cycle time: %d m", powermgmt_last_cycle_startstop_min
);
1671 lcd_putsf(0, 2, "Lvl@cyc st: %d%%", powermgmt_last_cycle_level
);
1673 lcd_putsf(0, 3, "P=%2d I=%2d", pid_p
, pid_i
);
1675 lcd_putsf(0, 4, "Trickle sec: %d/60", trickle_sec
);
1676 #endif /* ARCHOS_RECORDER */
1678 lcd_putsf(0, 5, "Last PwrHist: %d.%03dV",
1679 power_history
[0] / 1000,
1680 power_history
[0] % 1000);
1682 lcd_putsf(0, 6, "battery level: %d%%", battery_level());
1684 lcd_putsf(0, 7, "Est. remain: %d m", battery_time());
1690 switch(get_action(CONTEXT_STD
,HZ
/2))
1692 case ACTION_STD_PREV
:
1697 case ACTION_STD_NEXT
:
1702 case ACTION_STD_CANCEL
:
1703 lcd_setfont(FONT_UI
);
1707 lcd_setfont(FONT_UI
);
1711 #endif /* HAVE_LCD_BITMAP */
1715 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
1717 #if (CONFIG_STORAGE & STORAGE_MMC)
1718 #define CARDTYPE "MMC"
1719 #elif (CONFIG_STORAGE & STORAGE_SD)
1720 #define CARDTYPE "microSD"
1723 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1726 int *cardnum
= (int*)lists
->data
;
1727 unsigned char card_name
[7];
1728 unsigned char pbuf
[32];
1729 char *title
= lists
->title
;
1730 static const unsigned char i_vmin
[] = { 0, 1, 5, 10, 25, 35, 60, 100 };
1731 static const unsigned char i_vmax
[] = { 1, 5, 10, 25, 35, 45, 80, 200 };
1732 static const unsigned char * const kbit_units
[] = { "kBit/s", "MBit/s", "GBit/s" };
1733 static const unsigned char * const nsec_units
[] = { "ns", "µs", "ms" };
1734 #if (CONFIG_STORAGE & STORAGE_MMC)
1735 static const char * const mmc_spec_vers
[] = { "1.0-1.2", "1.4", "2.0-2.2",
1736 "3.1-3.31", "4.0" };
1739 if ((btn
== ACTION_STD_OK
) || (btn
== SYS_FS_CHANGED
) || (btn
== ACTION_REDRAW
))
1742 if (btn
== ACTION_STD_OK
)
1744 *cardnum
^= 0x1; /* change cards */
1748 simplelist_set_line_count(0);
1750 card
= card_get_info(*cardnum
);
1752 if (card
->initialized
> 0)
1754 strlcpy(card_name
, ((unsigned char*)card
->cid
) + 3, sizeof(card_name
));
1755 simplelist_addline(SIMPLELIST_ADD_LINE
,
1756 "%s Rev %d.%d", card_name
,
1757 (int) card_extract_bits(card
->cid
, 55, 4),
1758 (int) card_extract_bits(card
->cid
, 51, 4));
1759 simplelist_addline(SIMPLELIST_ADD_LINE
,
1761 #if (CONFIG_STORAGE & STORAGE_SD)
1762 (int) card_extract_bits(card
->cid
, 11, 3),
1763 (int) card_extract_bits(card
->cid
, 19, 8) + 2000
1764 #elif (CONFIG_STORAGE & STORAGE_MMC)
1765 (int) card_extract_bits(card
->cid
, 15, 4),
1766 (int) card_extract_bits(card
->cid
, 11, 4) + 1997
1769 simplelist_addline(SIMPLELIST_ADD_LINE
,
1770 #if (CONFIG_STORAGE & STORAGE_SD)
1772 card_extract_bits(card
->cid
, 55, 32)
1773 #elif (CONFIG_STORAGE & STORAGE_MMC)
1775 card_extract_bits(card
->cid
, 47, 16)
1779 simplelist_addline(SIMPLELIST_ADD_LINE
, "M=%02x, "
1780 #if (CONFIG_STORAGE & STORAGE_SD)
1782 (int) card_extract_bits(card
->cid
, 127, 8),
1783 card_extract_bits(card
->cid
, 119, 8),
1784 card_extract_bits(card
->cid
, 111, 8)
1785 #elif (CONFIG_STORAGE & STORAGE_MMC)
1787 (int) card_extract_bits(card
->cid
, 127, 8),
1788 (int) card_extract_bits(card
->cid
, 119, 16)
1792 #if (CONFIG_STORAGE & STORAGE_MMC)
1793 int temp
= card_extract_bits(card
->csd
, 125, 4);
1794 simplelist_addline(SIMPLELIST_ADD_LINE
,
1795 "MMC v%s", temp
< 5 ?
1796 mmc_spec_vers
[temp
] : "?.?");
1798 simplelist_addline(SIMPLELIST_ADD_LINE
,
1799 "Blocks: 0x%08lx", card
->numblocks
);
1800 output_dyn_value(pbuf
, sizeof pbuf
, card
->speed
/ 1000,
1802 simplelist_addline(SIMPLELIST_ADD_LINE
,
1804 output_dyn_value(pbuf
, sizeof pbuf
, card
->taac
,
1806 simplelist_addline(SIMPLELIST_ADD_LINE
,
1808 simplelist_addline(SIMPLELIST_ADD_LINE
,
1809 "Nsac: %d clk", card
->nsac
);
1810 simplelist_addline(SIMPLELIST_ADD_LINE
,
1811 "R2W: *%d", card
->r2w_factor
);
1812 simplelist_addline(SIMPLELIST_ADD_LINE
,
1814 i_vmin
[card_extract_bits(card
->csd
, 61, 3)],
1815 i_vmax
[card_extract_bits(card
->csd
, 58, 3)]);
1816 simplelist_addline(SIMPLELIST_ADD_LINE
,
1818 i_vmin
[card_extract_bits(card
->csd
, 55, 3)],
1819 i_vmax
[card_extract_bits(card
->csd
, 52, 3)]);
1821 else if (card
->initialized
== 0)
1823 simplelist_addline(SIMPLELIST_ADD_LINE
, "Not Found!");
1825 #if (CONFIG_STORAGE & STORAGE_SD)
1826 else /* card->initialized < 0 */
1828 simplelist_addline(SIMPLELIST_ADD_LINE
, "Init Error! (%d)", card
->initialized
);
1831 snprintf(title
, 16, "[" CARDTYPE
" %d]", *cardnum
);
1832 gui_synclist_set_title(lists
, title
, Icon_NOICON
);
1833 gui_synclist_set_nb_items(lists
, simplelist_get_line_count());
1834 gui_synclist_select_item(lists
, 0);
1835 btn
= ACTION_REDRAW
;
1839 #elif (CONFIG_STORAGE & STORAGE_ATA)
1840 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1845 unsigned short* identify_info
= ata_get_identify();
1846 bool timing_info_present
= false;
1849 simplelist_set_line_count(0);
1851 for (i
=0; i
< 20; i
++)
1852 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+27]);
1854 /* kill trailing space */
1855 for (i
=39; i
&& buf
[i
]==' '; i
--)
1857 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", buf
);
1858 for (i
=0; i
< 4; i
++)
1859 ((unsigned short*)buf
)[i
]=htobe16(identify_info
[i
+23]);
1861 simplelist_addline(SIMPLELIST_ADD_LINE
,
1862 "Firmware: %s", buf
);
1863 snprintf(buf
, sizeof buf
, "%ld MB",
1864 ((unsigned long)identify_info
[61] << 16 |
1865 (unsigned long)identify_info
[60]) / 2048 );
1866 simplelist_addline(SIMPLELIST_ADD_LINE
,
1869 fat_size( IF_MV2(0,) NULL
, &free
);
1870 simplelist_addline(SIMPLELIST_ADD_LINE
,
1871 "Free: %ld MB", free
/ 1024);
1872 simplelist_addline(SIMPLELIST_ADD_LINE
,
1873 "Spinup time: %d ms", storage_spinup_time() * (1000/HZ
));
1874 i
= identify_info
[83] & (1<<3);
1875 simplelist_addline(SIMPLELIST_ADD_LINE
,
1876 "Power mgmt: %s", i
? "enabled" : "unsupported");
1877 i
= identify_info
[83] & (1<<9);
1878 simplelist_addline(SIMPLELIST_ADD_LINE
,
1879 "Noise mgmt: %s", i
? "enabled" : "unsupported");
1880 i
= identify_info
[82] & (1<<6);
1881 simplelist_addline(SIMPLELIST_ADD_LINE
,
1882 "Read-ahead: %s", i
? "enabled" : "unsupported");
1883 timing_info_present
= identify_info
[53] & (1<<1);
1884 if(timing_info_present
) {
1885 char pio3
[2], pio4
[2];pio3
[1] = 0;
1887 pio3
[0] = (identify_info
[64] & (1<<0)) ? '3' : 0;
1888 pio4
[0] = (identify_info
[64] & (1<<1)) ? '4' : 0;
1889 simplelist_addline(SIMPLELIST_ADD_LINE
,
1890 "PIO modes: 0 1 2 %s %s", pio3
, pio4
);
1893 simplelist_addline(SIMPLELIST_ADD_LINE
,
1894 "No PIO mode info");
1896 timing_info_present
= identify_info
[53] & (1<<1);
1897 if(timing_info_present
) {
1898 simplelist_addline(SIMPLELIST_ADD_LINE
,
1899 "Cycle times %dns/%dns",
1901 identify_info
[68] );
1903 simplelist_addline(SIMPLELIST_ADD_LINE
,
1907 if (identify_info
[63] & (1<<0)) {
1908 char mdma0
[2], mdma1
[2], mdma2
[2];
1909 mdma0
[1] = mdma1
[1] = mdma2
[1] = 0;
1910 mdma0
[0] = (identify_info
[63] & (1<<0)) ? '0' : 0;
1911 mdma1
[0] = (identify_info
[63] & (1<<1)) ? '1' : 0;
1912 mdma2
[0] = (identify_info
[63] & (1<<2)) ? '2' : 0;
1913 simplelist_addline(SIMPLELIST_ADD_LINE
,
1914 "MDMA modes: %s %s %s", mdma0
, mdma1
, mdma2
);
1915 simplelist_addline(SIMPLELIST_ADD_LINE
,
1916 "MDMA Cycle times %dns/%dns",
1918 identify_info
[66] );
1921 simplelist_addline(SIMPLELIST_ADD_LINE
,
1922 "No MDMA mode info");
1924 if (identify_info
[53] & (1<<2)) {
1925 char udma0
[2], udma1
[2], udma2
[2], udma3
[2], udma4
[2], udma5
[2], udma6
[2];
1926 udma0
[1] = udma1
[1] = udma2
[1] = udma3
[1] = udma4
[1] = udma5
[1] = udma6
[1] = 0;
1927 udma0
[0] = (identify_info
[88] & (1<<0)) ? '0' : 0;
1928 udma1
[0] = (identify_info
[88] & (1<<1)) ? '1' : 0;
1929 udma2
[0] = (identify_info
[88] & (1<<2)) ? '2' : 0;
1930 udma3
[0] = (identify_info
[88] & (1<<3)) ? '3' : 0;
1931 udma4
[0] = (identify_info
[88] & (1<<4)) ? '4' : 0;
1932 udma5
[0] = (identify_info
[88] & (1<<5)) ? '5' : 0;
1933 udma6
[0] = (identify_info
[88] & (1<<6)) ? '6' : 0;
1934 simplelist_addline(SIMPLELIST_ADD_LINE
,
1935 "UDMA modes: %s %s %s %s %s %s %s", udma0
, udma1
, udma2
,
1936 udma3
, udma4
, udma5
, udma6
);
1939 simplelist_addline(SIMPLELIST_ADD_LINE
,
1940 "No UDMA mode info");
1942 #endif /* HAVE_ATA_DMA */
1943 timing_info_present
= identify_info
[53] & (1<<1);
1944 if(timing_info_present
) {
1945 i
= identify_info
[49] & (1<<11);
1946 simplelist_addline(SIMPLELIST_ADD_LINE
,
1947 "IORDY support: %s", i
? "yes" : "no");
1948 i
= identify_info
[49] & (1<<10);
1949 simplelist_addline(SIMPLELIST_ADD_LINE
,
1950 "IORDY disable: %s", i
? "yes" : "no");
1952 simplelist_addline(SIMPLELIST_ADD_LINE
,
1955 simplelist_addline(SIMPLELIST_ADD_LINE
,
1956 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
1958 i
= ata_get_dma_mode();
1960 simplelist_addline(SIMPLELIST_ADD_LINE
,
1963 simplelist_addline(SIMPLELIST_ADD_LINE
,
1965 (i
& 0x40) ? "UDMA" : "MDMA",
1968 #endif /* HAVE_ATA_DMA */
1971 #else /* No SD, MMC or ATA */
1972 static int disk_callback(int btn
, struct gui_synclist
*lists
)
1976 struct storage_info info
;
1977 storage_get_info(0,&info
);
1978 simplelist_addline(SIMPLELIST_ADD_LINE
, "Vendor: %s", info
.vendor
);
1979 simplelist_addline(SIMPLELIST_ADD_LINE
, "Model: %s", info
.product
);
1980 simplelist_addline(SIMPLELIST_ADD_LINE
, "Firmware: %s", info
.revision
);
1981 simplelist_addline(SIMPLELIST_ADD_LINE
,
1982 "Size: %ld MB", info
.num_sectors
*(info
.sector_size
/512)/2024);
1984 fat_size( IF_MV2(0,) NULL
, &free
);
1985 simplelist_addline(SIMPLELIST_ADD_LINE
,
1986 "Free: %ld MB", free
/ 1024);
1987 simplelist_addline(SIMPLELIST_ADD_LINE
,
1988 "Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
1993 #if (CONFIG_STORAGE & STORAGE_ATA)
1994 static bool dbg_identify_info(void)
1996 int fd
= creat("/identify_info.bin");
1999 #ifdef ROCKBOX_LITTLE_ENDIAN
2000 ecwrite(fd
, ata_get_identify(), SECTOR_SIZE
/2, "s", true);
2002 write(fd
, ata_get_identify(), SECTOR_SIZE
);
2010 static bool dbg_disk_info(void)
2012 struct simplelist_info info
;
2013 simplelist_info_init(&info
, "Disk Info", 1, NULL
);
2014 #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
2017 info
.callback_data
= (void*)&card
;
2020 info
.action_callback
= disk_callback
;
2021 info
.hide_selection
= true;
2022 info
.scroll_all
= true;
2023 return simplelist_show_list(&info
);
2025 #endif /* !SIMULATOR */
2027 #ifdef HAVE_DIRCACHE
2028 static int dircache_callback(int btn
, struct gui_synclist
*lists
)
2030 (void)btn
; (void)lists
;
2031 simplelist_set_line_count(0);
2032 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache initialized: %s",
2033 dircache_is_enabled() ? "Yes" : "No");
2034 simplelist_addline(SIMPLELIST_ADD_LINE
, "Cache size: %d B",
2035 dircache_get_cache_size());
2036 simplelist_addline(SIMPLELIST_ADD_LINE
, "Last size: %d B",
2037 global_status
.dircache_size
);
2038 simplelist_addline(SIMPLELIST_ADD_LINE
, "Limit: %d B",
2040 simplelist_addline(SIMPLELIST_ADD_LINE
, "Reserve: %d/%d B",
2041 dircache_get_reserve_used(), DIRCACHE_RESERVE
);
2042 simplelist_addline(SIMPLELIST_ADD_LINE
, "Scanning took: %d s",
2043 dircache_get_build_ticks() / HZ
);
2044 simplelist_addline(SIMPLELIST_ADD_LINE
, "Entry count: %d",
2045 dircache_get_entry_count());
2049 static bool dbg_dircache_info(void)
2051 struct simplelist_info info
;
2052 simplelist_info_init(&info
, "Dircache Info", 7, NULL
);
2053 info
.action_callback
= dircache_callback
;
2054 info
.hide_selection
= true;
2055 info
.scroll_all
= true;
2056 return simplelist_show_list(&info
);
2059 #endif /* HAVE_DIRCACHE */
2061 #ifdef HAVE_TAGCACHE
2062 static int database_callback(int btn
, struct gui_synclist
*lists
)
2065 struct tagcache_stat
*stat
= tagcache_get_stat();
2066 static bool synced
= false;
2068 simplelist_set_line_count(0);
2070 simplelist_addline(SIMPLELIST_ADD_LINE
, "Initialized: %s",
2071 stat
->initialized
? "Yes" : "No");
2072 simplelist_addline(SIMPLELIST_ADD_LINE
, "DB Ready: %s",
2073 stat
->ready
? "Yes" : "No");
2074 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM Cache: %s",
2075 stat
->ramcache
? "Yes" : "No");
2076 simplelist_addline(SIMPLELIST_ADD_LINE
, "RAM: %d/%d B",
2077 stat
->ramcache_used
, stat
->ramcache_allocated
);
2078 simplelist_addline(SIMPLELIST_ADD_LINE
, "Progress: %d%% (%d entries)",
2079 stat
->progress
, stat
->processed_entries
);
2080 simplelist_addline(SIMPLELIST_ADD_LINE
, "Curfile: %s",
2081 stat
->curentry
? stat
->curentry
: "---");
2082 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit step: %d",
2084 simplelist_addline(SIMPLELIST_ADD_LINE
, "Commit delayed: %s",
2085 stat
->commit_delayed
? "Yes" : "No");
2087 simplelist_addline(SIMPLELIST_ADD_LINE
, "Queue length: %d",
2088 stat
->queue_length
);
2093 tagcache_screensync_event();
2096 if (!btn
&& stat
->curentry
)
2099 return ACTION_REDRAW
;
2102 if (btn
== ACTION_STD_CANCEL
)
2103 tagcache_screensync_enable(false);
2107 static bool dbg_tagcache_info(void)
2109 struct simplelist_info info
;
2110 simplelist_info_init(&info
, "Database Info", 8, NULL
);
2111 info
.action_callback
= database_callback
;
2112 info
.hide_selection
= true;
2113 info
.scroll_all
= true;
2115 /* Don't do nonblock here, must give enough processing time
2116 for tagcache thread. */
2117 /* info.timeout = TIMEOUT_NOBLOCK; */
2119 tagcache_screensync_enable(true);
2120 return simplelist_show_list(&info
);
2124 #if CONFIG_CPU == SH7034
2125 static bool dbg_save_roms(void)
2128 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
2130 fd
= creat("/internal_rom_0000-FFFF.bin");
2133 write(fd
, (void *)0, 0x10000);
2137 fd
= creat("/internal_rom_2000000-203FFFF.bin");
2140 write(fd
, (void *)0x2000000, 0x40000);
2144 system_memory_guard(oldmode
);
2147 #elif defined CPU_COLDFIRE
2148 static bool dbg_save_roms(void)
2151 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
2153 #if defined(IRIVER_H100_SERIES)
2154 fd
= creat("/internal_rom_000000-1FFFFF.bin");
2155 #elif defined(IRIVER_H300_SERIES)
2156 fd
= creat("/internal_rom_000000-3FFFFF.bin");
2157 #elif defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IAUDIO_M3)
2158 fd
= creat("/internal_rom_000000-3FFFFF.bin");
2162 write(fd
, (void *)0, FLASH_SIZE
);
2165 system_memory_guard(oldmode
);
2168 fd
= creat("/internal_eeprom.bin");
2172 char buf
[EEPROM_SIZE
];
2175 old_irq_level
= disable_irq_save();
2177 err
= eeprom_24cxx_read(0, buf
, sizeof buf
);
2179 restore_irq(old_irq_level
);
2182 splashf(HZ
*3, "Eeprom read failure (%d)", err
);
2185 write(fd
, buf
, sizeof buf
);
2194 #elif defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)
2195 static bool dbg_save_roms(void)
2199 fd
= creat("/internal_rom_000000-0FFFFF.bin");
2202 write(fd
, (void *)0x20000000, FLASH_SIZE
);
2208 #elif CONFIG_CPU == IMX31L
2209 static bool dbg_save_roms(void)
2213 fd
= creat("/flash_rom_A0000000-A01FFFFF.bin");
2216 write(fd
, (void*)0xa0000000, FLASH_SIZE
);
2222 #elif defined(CPU_TCC780X)
2223 static bool dbg_save_roms(void)
2227 fd
= creat("/eeprom_E0000000-E0001FFF.bin");
2230 write(fd
, (void*)0xe0000000, 0x2000);
2240 static int radio_callback(int btn
, struct gui_synclist
*lists
)
2243 if (btn
== ACTION_STD_CANCEL
)
2245 simplelist_set_line_count(1);
2247 #if (CONFIG_TUNER & LV24020LP)
2248 simplelist_addline(SIMPLELIST_ADD_LINE
,
2249 "CTRL_STAT: %02X", lv24020lp_get(LV24020LP_CTRL_STAT
) );
2250 simplelist_addline(SIMPLELIST_ADD_LINE
,
2251 "RADIO_STAT: %02X", lv24020lp_get(LV24020LP_REG_STAT
) );
2252 simplelist_addline(SIMPLELIST_ADD_LINE
,
2253 "MSS_FM: %d kHz", lv24020lp_get(LV24020LP_MSS_FM
) );
2254 simplelist_addline(SIMPLELIST_ADD_LINE
,
2255 "MSS_IF: %d Hz", lv24020lp_get(LV24020LP_MSS_IF
) );
2256 simplelist_addline(SIMPLELIST_ADD_LINE
,
2257 "MSS_SD: %d Hz", lv24020lp_get(LV24020LP_MSS_SD
) );
2258 simplelist_addline(SIMPLELIST_ADD_LINE
,
2259 "if_set: %d Hz", lv24020lp_get(LV24020LP_IF_SET
) );
2260 simplelist_addline(SIMPLELIST_ADD_LINE
,
2261 "sd_set: %d Hz", lv24020lp_get(LV24020LP_SD_SET
) );
2262 #endif /* LV24020LP */
2263 #if (CONFIG_TUNER & S1A0903X01)
2264 simplelist_addline(SIMPLELIST_ADD_LINE
,
2265 "Samsung regs: %08X", s1a0903x01_get(RADIO_ALL
));
2266 /* This one doesn't return dynamic data atm */
2267 #endif /* S1A0903X01 */
2268 #if (CONFIG_TUNER & TEA5767)
2269 struct tea5767_dbg_info nfo
;
2270 tea5767_dbg_info(&nfo
);
2271 simplelist_addline(SIMPLELIST_ADD_LINE
, "Philips regs:");
2272 simplelist_addline(SIMPLELIST_ADD_LINE
,
2273 " Read: %02X %02X %02X %02X %02X",
2274 (unsigned)nfo
.read_regs
[0], (unsigned)nfo
.read_regs
[1],
2275 (unsigned)nfo
.read_regs
[2], (unsigned)nfo
.read_regs
[3],
2276 (unsigned)nfo
.read_regs
[4]);
2277 simplelist_addline(SIMPLELIST_ADD_LINE
,
2278 " Write: %02X %02X %02X %02X %02X",
2279 (unsigned)nfo
.write_regs
[0], (unsigned)nfo
.write_regs
[1],
2280 (unsigned)nfo
.write_regs
[2], (unsigned)nfo
.write_regs
[3],
2281 (unsigned)nfo
.write_regs
[4]);
2282 #endif /* TEA5767 */
2283 #if (CONFIG_TUNER & SI4700)
2284 struct si4700_dbg_info nfo
;
2285 si4700_dbg_info(&nfo
);
2286 simplelist_addline(SIMPLELIST_ADD_LINE
, "SI4700 regs:");
2288 simplelist_addline(SIMPLELIST_ADD_LINE
,
2289 "%04X %04X %04X %04X",
2290 (unsigned)nfo
.regs
[0], (unsigned)nfo
.regs
[1],
2291 (unsigned)nfo
.regs
[2], (unsigned)nfo
.regs
[3]);
2292 simplelist_addline(SIMPLELIST_ADD_LINE
,
2293 "%04X %04X %04X %04X",
2294 (unsigned)nfo
.regs
[4], (unsigned)nfo
.regs
[5],
2295 (unsigned)nfo
.regs
[6], (unsigned)nfo
.regs
[7]);
2296 simplelist_addline(SIMPLELIST_ADD_LINE
,
2297 "%04X %04X %04X %04X",
2298 (unsigned)nfo
.regs
[8], (unsigned)nfo
.regs
[9],
2299 (unsigned)nfo
.regs
[10], (unsigned)nfo
.regs
[11]);
2300 simplelist_addline(SIMPLELIST_ADD_LINE
,
2301 "%04X %04X %04X %04X",
2302 (unsigned)nfo
.regs
[12], (unsigned)nfo
.regs
[13],
2303 (unsigned)nfo
.regs
[14], (unsigned)nfo
.regs
[15]);
2305 return ACTION_REDRAW
;
2307 static bool dbg_fm_radio(void)
2309 struct simplelist_info info
;
2310 info
.scroll_all
= true;
2311 simplelist_info_init(&info
, "FM Radio", 1, NULL
);
2312 simplelist_set_line_count(0);
2313 simplelist_addline(SIMPLELIST_ADD_LINE
, "HW detected: %s",
2314 radio_hardware_present() ? "yes" : "no");
2316 info
.action_callback
= radio_hardware_present()?radio_callback
: NULL
;
2317 info
.hide_selection
= true;
2318 return simplelist_show_list(&info
);
2320 #endif /* CONFIG_TUNER */
2321 #endif /* !SIMULATOR */
2323 #ifdef HAVE_LCD_BITMAP
2324 extern bool do_screendump_instead_of_usb
;
2326 static bool dbg_screendump(void)
2328 do_screendump_instead_of_usb
= !do_screendump_instead_of_usb
;
2329 splashf(HZ
, "Screendump %s",
2330 do_screendump_instead_of_usb
?"enabled":"disabled");
2333 #endif /* HAVE_LCD_BITMAP */
2335 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2336 static bool dbg_set_memory_guard(void)
2338 static const struct opt_items names
[MAXMEMGUARD
] = {
2340 { "Flash ROM writes", -1 },
2341 { "Zero area (all)", -1 }
2343 int mode
= system_memory_guard(MEMGUARD_KEEP
);
2345 set_option( "Catch mem accesses", &mode
, INT
, names
, MAXMEMGUARD
, NULL
);
2346 system_memory_guard(mode
);
2350 #endif /* CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) */
2352 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2353 static bool dbg_write_eeprom(void)
2358 char buf
[EEPROM_SIZE
];
2361 fd
= open("/internal_eeprom.bin", O_RDONLY
);
2365 rc
= read(fd
, buf
, EEPROM_SIZE
);
2367 if(rc
== EEPROM_SIZE
)
2369 old_irq_level
= disable_irq_save();
2371 err
= eeprom_24cxx_write(0, buf
, sizeof buf
);
2373 splashf(HZ
*3, "Eeprom write failure (%d)", err
);
2375 splash(HZ
*3, "Eeprom written successfully");
2377 restore_irq(old_irq_level
);
2381 splashf(HZ
*3, "File read error (%d)",rc
);
2387 splash(HZ
*3, "Failed to open 'internal_eeprom.bin'");
2392 #endif /* defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS) */
2393 #ifdef CPU_BOOST_LOGGING
2394 static bool cpu_boost_log(void)
2397 int count
= cpu_boost_log_getcount();
2398 int lines
= LCD_HEIGHT
/SYSFONT_HEIGHT
;
2401 lcd_setfont(FONT_SYSFIXED
);
2402 str
= cpu_boost_log_getlog_first();
2405 lcd_clear_display();
2406 for(j
=0; j
<lines
; j
++,i
++)
2409 str
= cpu_boost_log_getlog_next();
2412 if(strlen(str
) > LCD_WIDTH
/SYSFONT_WIDTH
)
2413 lcd_puts_scroll(0, j
, str
);
2423 switch(get_action(CONTEXT_STD
,TIMEOUT_BLOCK
))
2426 case ACTION_STD_PREV
:
2427 case ACTION_STD_NEXT
:
2430 case ACTION_STD_CANCEL
:
2437 get_action(CONTEXT_STD
,TIMEOUT_BLOCK
);
2438 lcd_setfont(FONT_UI
);
2443 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2444 extern bool wheel_is_touched
;
2445 extern int old_wheel_value
;
2446 extern int new_wheel_value
;
2447 extern int wheel_delta
;
2448 extern unsigned int accumulated_wheel_delta
;
2449 extern unsigned int wheel_velocity
;
2451 static bool dbg_scrollwheel(void)
2455 lcd_setfont(FONT_SYSFIXED
);
2459 if (action_userabort(HZ
/10))
2462 lcd_clear_display();
2464 /* show internal variables of scrollwheel driver */
2465 lcd_putsf(0, 0, "wheel touched: %s", (wheel_is_touched
) ? "true" : "false");
2466 lcd_putsf(0, 1, "new position: %2d", new_wheel_value
);
2467 lcd_putsf(0, 2, "old position: %2d", old_wheel_value
);
2468 lcd_putsf(0, 3, "wheel delta: %2d", wheel_delta
);
2469 lcd_putsf(0, 4, "accumulated delta: %2d", accumulated_wheel_delta
);
2470 lcd_putsf(0, 5, "velo [deg/s]: %4d", (int)wheel_velocity
);
2472 /* show effective accelerated scrollspeed */
2473 speed
= button_apply_acceleration( (1<<31)|(1<<24)|wheel_velocity
);
2474 lcd_putsf(0, 6, "accel. speed: %4d", speed
);
2478 lcd_setfont(FONT_UI
);
2483 #if defined (HAVE_USBSTACK)
2485 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2486 static bool toggle_usb_core_driver(int driver
, char *msg
)
2488 bool enabled
= !usb_core_driver_enabled(driver
);
2490 usb_core_enable_driver(driver
,enabled
);
2491 splashf(HZ
, "%s %s", msg
, enabled
?"enabled":"disabled");
2496 static bool toggle_usb_serial(void)
2498 return toggle_usb_core_driver(USB_DRIVER_SERIAL
,"USB Serial");
2504 #if CONFIG_USBOTG == USBOTG_ISP1583
2505 extern int dbg_usb_num_items(void);
2506 extern const char* dbg_usb_item(int selected_item
, void *data
,
2507 char *buffer
, size_t buffer_len
);
2509 static int isp1583_action_callback(int action
, struct gui_synclist
*lists
)
2512 if (action
== ACTION_NONE
)
2513 action
= ACTION_REDRAW
;
2517 static bool dbg_isp1583(void)
2519 struct simplelist_info isp1583
;
2520 isp1583
.scroll_all
= true;
2521 simplelist_info_init(&isp1583
, "ISP1583", dbg_usb_num_items(), NULL
);
2522 isp1583
.timeout
= HZ
/100;
2523 isp1583
.hide_selection
= true;
2524 isp1583
.get_name
= dbg_usb_item
;
2525 isp1583
.action_callback
= isp1583_action_callback
;
2526 return simplelist_show_list(&isp1583
);
2530 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2531 extern int pic_dbg_num_items(void);
2532 extern const char* pic_dbg_item(int selected_item
, void *data
,
2533 char *buffer
, size_t buffer_len
);
2535 static int pic_action_callback(int action
, struct gui_synclist
*lists
)
2538 if (action
== ACTION_NONE
)
2539 action
= ACTION_REDRAW
;
2543 static bool dbg_pic(void)
2545 struct simplelist_info pic
;
2546 pic
.scroll_all
= true;
2547 simplelist_info_init(&pic
, "PIC", pic_dbg_num_items(), NULL
);
2548 pic
.timeout
= HZ
/100;
2549 pic
.hide_selection
= true;
2550 pic
.get_name
= pic_dbg_item
;
2551 pic
.action_callback
= pic_action_callback
;
2552 return simplelist_show_list(&pic
);
2557 /****** The menu *********/
2558 struct the_menu_item
{
2559 unsigned char *desc
; /* string or ID */
2560 bool (*function
) (void); /* return true if USB was connected */
2562 static const struct the_menu_item menuitems
[] = {
2563 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || \
2564 (defined(CPU_PP) && !(CONFIG_STORAGE & STORAGE_SD)) || \
2565 CONFIG_CPU == IMX31L || defined(CPU_TCC780X)
2566 { "Dump ROM contents", dbg_save_roms
},
2568 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE) || defined(CPU_PP) \
2569 || CONFIG_CPU == S3C2440 || CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 \
2570 || CONFIG_CPU == DM320 || defined(CPU_S5L870X)
2571 { "View I/O ports", dbg_ports
},
2573 #if (CONFIG_RTC == RTC_PCF50605) && !defined(SIMULATOR)
2574 { "View PCF registers", dbg_pcf
},
2576 #if defined(HAVE_TSC2100) && !defined(SIMULATOR)
2577 { "TSC2100 debug", tsc2100_debug
},
2579 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2580 { "CPU frequency", dbg_cpufreq
},
2582 #if defined(IRIVER_H100_SERIES) && !defined(SIMULATOR)
2583 { "S/PDIF analyzer", dbg_spdif
},
2585 #if CONFIG_CPU == SH7034 || defined(CPU_COLDFIRE)
2586 { "Catch mem accesses", dbg_set_memory_guard
},
2588 { "View OS stacks", dbg_os
},
2589 #ifdef HAVE_LCD_BITMAP
2591 { "View battery", view_battery
},
2593 { "Screendump", dbg_screendump
},
2596 { "View HW info", dbg_hw_info
},
2599 { "View partitions", dbg_partitions
},
2602 { "View disk info", dbg_disk_info
},
2603 #if (CONFIG_STORAGE & STORAGE_ATA)
2604 { "Dump ATA identify info", dbg_identify_info
},
2607 #ifdef HAVE_DIRCACHE
2608 { "View dircache info", dbg_dircache_info
},
2610 #ifdef HAVE_TAGCACHE
2611 { "View database info", dbg_tagcache_info
},
2613 #ifdef HAVE_LCD_BITMAP
2614 #if CONFIG_CODEC == SWCODEC
2615 { "View buffering thread", dbg_buffering_thread
},
2616 #elif !defined(SIMULATOR)
2617 { "View audio thread", dbg_audio_thread
},
2620 { "pm histogram", peak_meter_histogram
},
2621 #endif /* PM_DEBUG */
2622 #endif /* HAVE_LCD_BITMAP */
2625 { "FM Radio", dbg_fm_radio
},
2628 #if defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS)
2629 { "Write back EEPROM", dbg_write_eeprom
},
2631 #if CONFIG_USBOTG == USBOTG_ISP1583
2632 { "View ISP1583 info", dbg_isp1583
},
2634 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
2635 { "View PIC info", dbg_pic
},
2637 #ifdef ROCKBOX_HAS_LOGF
2638 {"logf", logfdisplay
},
2639 {"logfdump", logfdump
},
2641 #if defined(HAVE_USBSTACK)
2642 #if defined(ROCKBOX_HAS_LOGF) && defined(USB_ENABLE_SERIAL)
2643 {"USB Serial driver (logf)", toggle_usb_serial
},
2645 #endif /* HAVE_USBSTACK */
2646 #ifdef CPU_BOOST_LOGGING
2647 {"cpu_boost log",cpu_boost_log
},
2649 #if (defined(HAVE_WHEEL_ACCELERATION) && (CONFIG_KEYPAD==IPOD_4G_PAD) && !defined(SIMULATOR))
2650 {"Debug scrollwheel", dbg_scrollwheel
},
2653 static int menu_action_callback(int btn
, struct gui_synclist
*lists
)
2655 if (btn
== ACTION_STD_OK
)
2657 int oldbars
= viewportmanager_set_statusbar(VP_SB_HIDE_ALL
);
2658 menuitems
[gui_synclist_get_sel_pos(lists
)].function();
2659 btn
= ACTION_REDRAW
;
2660 send_event(GUI_EVENT_REFRESH
, NULL
);
2661 viewportmanager_set_statusbar(oldbars
);
2666 static const char* dbg_menu_getname(int item
, void * data
,
2667 char *buffer
, size_t buffer_len
)
2669 (void)data
; (void)buffer
; (void)buffer_len
;
2670 return menuitems
[item
].desc
;
2673 bool debug_menu(void)
2675 struct simplelist_info info
;
2677 simplelist_info_init(&info
, "Debug Menu", ARRAYLEN(menuitems
), NULL
);
2678 info
.action_callback
= menu_action_callback
;
2679 info
.get_name
= dbg_menu_getname
;
2680 return simplelist_show_list(&info
);