1
0
Fork 0
forked from len0rd/rockbox

imx233: rewrite debug screens

The old code used get_action which is bad because it belongs to
apps/. Instead rewrite a simple version of get_action, also
rewrite the top level handler. Since the number of screens is
becoming quite high, it now shows a list and the user can start
from any screen. Once in a screen and as long as the user presses
select, it will advance to next screen until it finally returns
to the list on cancellation.

Change-Id: Icbc7676a17e4a6e859b7781a4a471d8303910591
This commit is contained in:
Amaury Pouly 2013-07-12 22:26:15 +02:00
parent a22855ce61
commit a3af301677

View file

@ -21,7 +21,6 @@
#include "system.h" #include "system.h"
#include "dma-imx233.h" #include "dma-imx233.h"
#include "action.h"
#include "lcd.h" #include "lcd.h"
#include "font.h" #include "font.h"
#include "adc.h" #include "adc.h"
@ -35,10 +34,54 @@
#include "ocotp-imx233.h" #include "ocotp-imx233.h"
#include "pwm-imx233.h" #include "pwm-imx233.h"
#include "emi-imx233.h" #include "emi-imx233.h"
#include "audioout-imx233.h"
#include "string.h" #include "string.h"
#include "stdio.h" #include "stdio.h"
#include "button.h"
#define DEBUG_CANCEL BUTTON_BACK #define ACT_NONE 0
#define ACT_CANCEL 1
#define ACT_OK 2
#define ACT_PREV 3
#define ACT_NEXT 4
#define ACT_LEFT 5
#define ACT_RIGHT 6
#define ACT_REPEAT 0x1000
int my_get_action(int tmo)
{
int btn = button_get_w_tmo(tmo);
while(btn & BUTTON_REL)
btn = button_get_w_tmo(tmo);
bool repeat = btn & BUTTON_REPEAT;
int act = ACT_NONE;
switch(btn)
{
case BUTTON_POWER:
case BUTTON_BACK:
act = ACT_CANCEL;
break;
#ifdef BUTTON_SELECT
case BUTTON_SELECT:
#endif
#if !defined(BUTTON_SELECT) && defined(BUTTON_PLAYPAUSE)
case BUTTON_PLAYPAUSE:
#endif
act = ACT_OK;
break;
case BUTTON_UP:
act = ACT_PREV;
break;
case BUTTON_DOWN:
act = ACT_NEXT;
break;
default:
yield();
}
if(repeat)
act |= ACT_REPEAT;
return act;
}
static struct static struct
{ {
@ -97,23 +140,22 @@ static struct
bool dbg_hw_info_dma(void) bool dbg_hw_info_dma(void)
{ {
lcd_setfont(FONT_SYSFIXED); lcd_setfont(FONT_SYSFIXED);
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 25); int button = my_get_action(HZ / 25);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
lcd_clear_display(); lcd_clear_display();
lcd_putsf(0, 0, "S C name bar apb ahb una"); lcd_putsf(0, 0, "S C name bar apb ahb una");
@ -126,7 +168,7 @@ bool dbg_hw_info_dma(void)
dbg_channels[i].name, info.bar, info.apb_bytes, info.ahb_bytes, dbg_channels[i].name, info.bar, info.apb_bytes, info.ahb_bytes,
info.nr_unaligned); info.nr_unaligned);
} }
lcd_update(); lcd_update();
yield(); yield();
} }
@ -135,23 +177,22 @@ bool dbg_hw_info_dma(void)
bool dbg_hw_info_power(void) bool dbg_hw_info_power(void)
{ {
lcd_setfont(FONT_SYSFIXED); lcd_setfont(FONT_SYSFIXED);
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
lcd_clear_display(); lcd_clear_display();
struct imx233_power_info_t info = imx233_power_get_info(POWER_INFO_ALL); struct imx233_power_info_t info = imx233_power_get_info(POWER_INFO_ALL);
@ -187,32 +228,31 @@ bool dbg_hw_info_power(void)
lcd_putsf(0, line++, "5V: dcdc: %d xfer: %d", info._5v_enable_dcdc, info._5v_dcdc_xfer); lcd_putsf(0, line++, "5V: dcdc: %d xfer: %d", info._5v_enable_dcdc, info._5v_dcdc_xfer);
lcd_putsf(0, line++, "5V: thr: %d mV use: %d cmps: %d", info._5v_vbusvalid_thr, lcd_putsf(0, line++, "5V: thr: %d mV use: %d cmps: %d", info._5v_vbusvalid_thr,
info._5v_vbusvalid_detect, info._5v_vbus_cmps); info._5v_vbusvalid_detect, info._5v_vbus_cmps);
lcd_update(); lcd_update();
yield(); yield();
} }
} }
bool dbg_hw_info_adc(void) bool dbg_hw_info_lradc(void)
{ {
lcd_setfont(FONT_SYSFIXED); lcd_setfont(FONT_SYSFIXED);
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 25); int button = my_get_action(HZ / 25);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
lcd_clear_display(); lcd_clear_display();
/* add battery readout in mV, this it is not the direct output of a channel */ /* add battery readout in mV, this it is not the direct output of a channel */
@ -222,7 +262,7 @@ bool dbg_hw_info_adc(void)
lcd_putsf(0, i + 1, "%s %d", imx233_adc_channel_name[i], lcd_putsf(0, i + 1, "%s %d", imx233_adc_channel_name[i],
adc_read(i)); adc_read(i));
} }
lcd_update(); lcd_update();
yield(); yield();
} }
@ -255,19 +295,18 @@ static struct
bool dbg_hw_info_clkctrl(void) bool dbg_hw_info_clkctrl(void)
{ {
lcd_setfont(FONT_SYSFIXED); lcd_setfont(FONT_SYSFIXED);
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
@ -313,23 +352,22 @@ bool dbg_hw_info_powermgmt(void)
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
lcd_clear_display(); lcd_clear_display();
struct imx233_powermgmt_info_t info = imx233_powermgmt_get_info(); struct imx233_powermgmt_info_t info = imx233_powermgmt_get_info();
lcd_putsf(0, 0, "state: %s", lcd_putsf(0, 0, "state: %s",
info.state == DISCHARGING ? "discharging" : info.state == DISCHARGING ? "discharging" :
#if CONFIG_CHARGING >= CHARGING_MONITOR #if CONFIG_CHARGING >= CHARGING_MONITOR
@ -345,7 +383,7 @@ bool dbg_hw_info_powermgmt(void)
lcd_putsf(0, 1, "charging tmo: %d", info.charging_timeout); lcd_putsf(0, 1, "charging tmo: %d", info.charging_timeout);
lcd_putsf(0, 2, "topoff tmo: %d", info.topoff_timeout); lcd_putsf(0, 2, "topoff tmo: %d", info.topoff_timeout);
lcd_putsf(0, 3, "4p2ilimit tmo: %d", info.incr_4p2_ilimit_timeout); lcd_putsf(0, 3, "4p2ilimit tmo: %d", info.incr_4p2_ilimit_timeout);
lcd_update(); lcd_update();
yield(); yield();
} }
@ -354,30 +392,29 @@ bool dbg_hw_info_powermgmt(void)
bool dbg_hw_info_rtc(void) bool dbg_hw_info_rtc(void)
{ {
lcd_setfont(FONT_SYSFIXED); lcd_setfont(FONT_SYSFIXED);
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
lcd_clear_display(); lcd_clear_display();
struct imx233_rtc_info_t info = imx233_rtc_get_info(); struct imx233_rtc_info_t info = imx233_rtc_get_info();
lcd_putsf(0, 0, "seconds: %lu", info.seconds); lcd_putsf(0, 0, "seconds: %lu", info.seconds);
for(int i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
lcd_putsf(0, i + 1, "persistent%d: 0x%lx", i, info.persistent[i]); lcd_putsf(0, i + 1, "persistent%d: 0x%lx", i, info.persistent[i]);
lcd_update(); lcd_update();
yield(); yield();
} }
@ -387,26 +424,25 @@ bool dbg_hw_info_rtc(void)
bool dbg_hw_info_dcp(void) bool dbg_hw_info_dcp(void)
{ {
lcd_setfont(FONT_SYSFIXED); lcd_setfont(FONT_SYSFIXED);
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
lcd_clear_display(); lcd_clear_display();
struct imx233_dcp_info_t info = imx233_dcp_get_info(DCP_INFO_ALL); struct imx233_dcp_info_t info = imx233_dcp_get_info(DCP_INFO_ALL);
lcd_putsf(0, 0, "crypto: %d csc: %d", info.has_crypto, info.has_csc); lcd_putsf(0, 0, "crypto: %d csc: %d", info.has_crypto, info.has_csc);
lcd_putsf(0, 1, "keys: %d channels: %d", info.num_keys, info.num_channels); lcd_putsf(0, 1, "keys: %d channels: %d", info.num_keys, info.num_channels);
lcd_putsf(0, 2, "ciphers: 0x%lx hash: 0x%lx", info.ciphers, info.hashs); lcd_putsf(0, 2, "ciphers: 0x%lx hash: 0x%lx", info.ciphers, info.hashs);
@ -446,24 +482,23 @@ bool dbg_hw_info_icoll(void)
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
first_irq++; first_irq++;
if(first_irq >= dbg_irqs_count) if(first_irq >= dbg_irqs_count)
first_irq = dbg_irqs_count - 1; first_irq = dbg_irqs_count - 1;
break; break;
case ACTION_STD_PREV: case ACT_PREV:
first_irq--; first_irq--;
if(first_irq < 0) if(first_irq < 0)
first_irq = 0; first_irq = 0;
break; break;
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
@ -490,25 +525,24 @@ bool dbg_hw_info_pinctrl(void)
#endif #endif
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
#ifdef IMX233_PINCTRL_DEBUG #ifdef IMX233_PINCTRL_DEBUG
top_user++; top_user++;
break; break;
#endif #endif
case ACTION_STD_PREV: case ACT_PREV:
#ifdef IMX233_PINCTRL_DEBUG #ifdef IMX233_PINCTRL_DEBUG
if(top_user > 0) if(top_user > 0)
top_user--; top_user--;
break; break;
#endif #endif
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
@ -587,21 +621,20 @@ bool dbg_hw_info_ocotp(void)
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
top_user++; top_user++;
break; break;
case ACTION_STD_PREV: case ACT_PREV:
if(top_user > 0) if(top_user > 0)
top_user--; top_user--;
break; break;
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
@ -634,18 +667,17 @@ bool dbg_hw_info_pwm(void)
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
detailled_view = !detailled_view; detailled_view = !detailled_view;
break; break;
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
@ -693,22 +725,21 @@ bool dbg_hw_info_usb(void)
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
BF_SET(USBPHY_CTRL, ENOTGIDDETECT); BF_SET(USBPHY_CTRL, ENOTGIDDETECT);
BF_SET(USBPHY_CTRL, ENDEVPLUGINDETECT); BF_SET(USBPHY_CTRL, ENDEVPLUGINDETECT);
break; break;
case ACTION_STD_PREV: case ACT_PREV:
BF_CLR(USBPHY_CTRL, ENOTGIDDETECT); BF_CLR(USBPHY_CTRL, ENOTGIDDETECT);
BF_CLR(USBPHY_CTRL, ENDEVPLUGINDETECT); BF_CLR(USBPHY_CTRL, ENDEVPLUGINDETECT);
break; break;
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
@ -739,16 +770,15 @@ bool dbg_hw_info_emi(void)
while(1) while(1)
{ {
int button = get_action(CONTEXT_STD, HZ / 10); int button = my_get_action(HZ / 10);
switch(button) switch(button)
{ {
case ACTION_STD_NEXT: case ACT_NEXT:
case ACTION_STD_PREV: case ACT_PREV:
case ACTION_STD_OK: case ACT_OK:
case ACTION_STD_MENU:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return true; return true;
case ACTION_STD_CANCEL: case ACT_CANCEL:
lcd_setfont(FONT_UI); lcd_setfont(FONT_UI);
return false; return false;
} }
@ -769,13 +799,138 @@ bool dbg_hw_info_emi(void)
} }
} }
bool dbg_hw_info_audioout(void)
{
lcd_setfont(FONT_SYSFIXED);
while(1)
{
int button = my_get_action(HZ / 10);
switch(button)
{
case ACT_NEXT:
case ACT_PREV:
case ACT_OK:
lcd_setfont(FONT_UI);
return true;
case ACT_CANCEL:
lcd_setfont(FONT_UI);
return false;
}
lcd_clear_display();
struct imx233_audioout_info_t info = imx233_audioout_get_info();
int line = 0;
#define display_sys(sys, name) \
if(info.sys) \
{ \
char buffer[64]; \
snprintf(buffer, 64, "%s: ", name); \
for(int i = 0; i < 2; i++) \
{ \
if(info.sys##mute[i]) \
strcat(buffer, "mute"); \
else \
snprintf(buffer + strlen(buffer), 64, "%d.%d", \
/* properly handle negative values ! */ \
info.sys##vol[i] / 10, (10 + (info.sys##vol[i]) % 10) % 10); \
if(i == 0) \
strcat(buffer, " / "); \
else \
strcat(buffer, " dB"); \
} \
lcd_putsf(0, line++, "%s", buffer); \
} \
else \
lcd_putsf(0, line++, "%s: powered down", name);
display_sys(dac, "DAC");
display_sys(hp, "HP");
display_sys(spkr, "SPKR");
#undef display_sys
lcd_putsf(0, line++, "capless: %d", info.capless);
lcd_update();
yield();
}
}
static struct
{
const char *name;
bool (*fn)(void);
} debug_screens[] =
{
{"clock", dbg_hw_info_clkctrl},
{"dma", dbg_hw_info_dma},
{"lradc", dbg_hw_info_lradc},
{"power", dbg_hw_info_power},
{"powermgmt", dbg_hw_info_powermgmt},
{"rtc", dbg_hw_info_rtc},
{"dcp", dbg_hw_info_dcp},
{"pinctrl", dbg_hw_info_pinctrl},
{"icoll", dbg_hw_info_icoll},
{"ocotp", dbg_hw_info_ocotp},
{"pwm", dbg_hw_info_pwm},
{"usb", dbg_hw_info_usb},
{"emi", dbg_hw_info_emi},
{"audioout", dbg_hw_info_audioout},
{"target", dbg_hw_target_info},
};
bool dbg_hw_info(void) bool dbg_hw_info(void)
{ {
return dbg_hw_info_clkctrl() && dbg_hw_info_dma() && dbg_hw_info_adc() && int nr_lines = lcd_getheight() / font_get(lcd_getfont())->height;
dbg_hw_info_power() && dbg_hw_info_powermgmt() && dbg_hw_info_rtc() && int len = ARRAYLEN(debug_screens);
dbg_hw_info_dcp() && dbg_hw_info_pinctrl() && dbg_hw_info_icoll() && int top_visible = 0;
dbg_hw_info_ocotp() && dbg_hw_info_pwm() && dbg_hw_info_usb() && dbg_hw_info_emi() && int highlight = 0;
dbg_hw_target_info(); while(1)
{
int button = my_get_action(HZ / 10);
switch(button)
{
case ACT_NEXT:
highlight = (highlight + 1) % len;
break;
case ACT_PREV:
highlight = (highlight + len - 1) % len;
break;
case ACT_OK:
// if the screen returns true, advance to next screen
while(debug_screens[highlight].fn())
highlight = (highlight + 1) % len;
lcd_setfont(FONT_UI);
break;
case ACT_CANCEL:
return false;
}
// adjust top visible if needed
if(highlight < top_visible)
top_visible = highlight;
else if(highlight >= top_visible + nr_lines)
top_visible = highlight - nr_lines + 1;
lcd_clear_display();
for(int i = top_visible; i < len && i < top_visible + nr_lines; i++)
{
if(i == highlight)
{
lcd_set_foreground(LCD_BLACK);
lcd_set_background(LCD_RGBPACK(255, 255, 0));
}
else
{
lcd_set_foreground(LCD_WHITE);
lcd_set_background(LCD_BLACK);
}
lcd_putsf(0, i - top_visible, "%s", debug_screens[i].name);
}
lcd_set_foreground(LCD_WHITE);
lcd_set_background(LCD_BLACK);
lcd_update();
yield();
}
} }
bool dbg_ports(void) bool dbg_ports(void)