rockbox/firmware/target/arm/imx31/debug-imx31.c

246 lines
7.5 KiB
C
Raw Normal View History

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2008 by Michael Sevakis
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#include "system.h"
#include "string.h"
#include "button.h"
#include "lcd.h"
#include "sprintf.h"
#include "font.h"
#include "debug-target.h"
#include "mc13783.h"
#include "adc.h"
#include "clkctl-imx31.h"
bool __dbg_hw_info(void)
{
char buf[50];
int line;
unsigned int pllref;
unsigned int mcu_pllfreq, ser_pllfreq, usb_pllfreq;
uint32_t mpctl, spctl, upctl;
unsigned int freq;
uint32_t regval;
lcd_clear_display();
lcd_setfont(FONT_SYSFIXED);
while (1)
{
line = 0;
snprintf(buf, sizeof (buf), "Sys Rev Code: 0x%02X",
iim_system_rev());
lcd_puts(0, line++, buf); line++;
mpctl = CCM_MPCTL;
spctl = CCM_SPCTL;
upctl = CCM_UPCTL;
pllref = ccm_get_pll_ref_clk();
mcu_pllfreq = ccm_get_pll(PLL_MCU);
ser_pllfreq = ccm_get_pll(PLL_SERIAL);
usb_pllfreq = ccm_get_pll(PLL_USB);
snprintf(buf, sizeof (buf), "pll_ref_clk: %u", pllref);
lcd_puts(0, line++, buf); line++;
/* MCU clock domain */
snprintf(buf, sizeof (buf), "MPCTL: %08lX", mpctl);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof (buf), " mpl_dpdgck_clk: %u", mcu_pllfreq);
lcd_puts(0, line++, buf); line++;
regval = CCM_PDR0;
snprintf(buf, sizeof (buf), " PDR0: %08lX", regval);
lcd_puts(0, line++, buf);
freq = mcu_pllfreq / (((regval & 0x7) + 1));
snprintf(buf, sizeof (buf), " mcu_clk: %u", freq);
lcd_puts(0, line++, buf);
freq = mcu_pllfreq / (((regval >> 11) & 0x7) + 1);
snprintf(buf, sizeof (buf), " hsp_clk: %u", freq);
lcd_puts(0, line++, buf);
freq = mcu_pllfreq / (((regval >> 3) & 0x7) + 1);
snprintf(buf, sizeof (buf), " hclk_clk: %u", freq);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof (buf), " ipg_clk: %u",
freq / (unsigned)(((regval >> 6) & 0x3) + 1));
lcd_puts(0, line++, buf);
snprintf(buf, sizeof (buf), " nfc_clk: %u",
freq / (unsigned)(((regval >> 8) & 0x7) + 1));
lcd_puts(0, line++, buf);
line++;
/* Serial clock domain */
snprintf(buf, sizeof (buf), "SPCTL: %08lX", spctl);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof (buf), " spl_dpdgck_clk: %u", ser_pllfreq);
lcd_puts(0, line++, buf);
line++;
/* USB clock domain */
snprintf(buf, sizeof (buf), "UPCTL: %08lX", upctl);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof (buf), " upl_dpdgck_clk: %u", usb_pllfreq);
lcd_puts(0, line++, buf); line++;
regval = CCM_PDR1;
snprintf(buf, sizeof (buf), " PDR1: %08lX", regval);
lcd_puts(0, line++, buf);
freq = usb_pllfreq /
((((regval >> 30) & 0x3) + 1) * (((regval >> 27) & 0x7) + 1));
snprintf(buf, sizeof (buf), " usb_clk: %u", freq);
lcd_puts(0, line++, buf);
freq = usb_pllfreq / (((CCM_PDR0 >> 16) & 0x1f) + 1);
snprintf(buf, sizeof (buf), " ipg_per_baud: %u", freq);
lcd_puts(0, line++, buf);
lcd_update();
if (button_get(true) == (DEBUG_CANCEL|BUTTON_REL))
return false;
}
}
bool __dbg_ports(void)
{
char buf[50];
int line;
int i;
static const char pmic_regset[] =
{
MC13783_INTERRUPT_STATUS0,
MC13783_INTERRUPT_SENSE0,
MC13783_INTERRUPT_STATUS1,
MC13783_INTERRUPT_SENSE1,
MC13783_CHARGER,
MC13783_RTC_TIME,
MC13783_RTC_ALARM,
MC13783_RTC_DAY,
MC13783_RTC_DAY_ALARM,
};
static const char *pmic_regnames[ARRAYLEN(pmic_regset)] =
{
"Int Stat0 ",
"Int Sense0",
"Int Stat1 ",
"Int Sense1",
"Charger ",
"RTC Time ",
"RTC Alarm ",
"RTC Day ",
"RTC Day Al",
};
uint32_t pmic_regs[ARRAYLEN(pmic_regset)];
lcd_clear_display();
lcd_setfont(FONT_SYSFIXED);
while(1)
{
line = 0;
snprintf(buf, sizeof(buf), "[Ports and Registers]");
lcd_puts(0, line++, buf); line++;
/* GPIO1 */
snprintf(buf, sizeof(buf), "GPIO1: DR: %08lx GDIR: %08lx", GPIO1_DR, GPIO1_GDIR);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " PSR: %08lx ICR1: %08lx", GPIO1_PSR, GPIO1_ICR1);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " ICR2: %08lx IMR: %08lx", GPIO1_ICR2, GPIO1_IMR);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " ISR: %08lx", GPIO1_ISR);
lcd_puts(0, line++, buf); line++;
/* GPIO2 */
snprintf(buf, sizeof(buf), "GPIO2: DR: %08lx GDIR: %08lx", GPIO2_DR, GPIO2_GDIR);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " PSR: %08lx ICR1: %08lx", GPIO2_PSR, GPIO2_ICR1);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " ICR2: %08lx IMR: %08lx", GPIO2_ICR2, GPIO2_IMR);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " ISR: %08lx", GPIO2_ISR);
lcd_puts(0, line++, buf); line++;
/* GPIO3 */
snprintf(buf, sizeof(buf), "GPIO3: DR: %08lx GDIR: %08lx", GPIO3_DR, GPIO3_GDIR);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " PSR: %08lx ICR1: %08lx", GPIO3_PSR, GPIO3_ICR1);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " ICR2: %08lx IMR: %08lx", GPIO3_ICR2, GPIO3_IMR);
lcd_puts(0, line++, buf);
snprintf(buf, sizeof(buf), " ISR: %08lx", GPIO3_ISR);
lcd_puts(0, line++, buf); line++;
lcd_puts(0, line++, "PMIC Registers"); line++;
mc13783_read_regset(pmic_regset, pmic_regs, ARRAYLEN(pmic_regs));
for (i = 0; i < (int)ARRAYLEN(pmic_regs); i++)
{
snprintf(buf, sizeof(buf), "%s: %08lx", pmic_regnames[i], pmic_regs[i]);
lcd_puts(0, line++, buf);
}
line++;
lcd_puts(0, line++, "ADC"); line++;
for (i = 0; i < NUM_ADC_CHANNELS; i += 4)
{
snprintf(buf, sizeof(buf),
"CH%02d:%04u CH%02d:%04u CH%02d:%04u CH%02d:%04u",
i+0, adc_read(i+0),
i+1, adc_read(i+1),
i+2, adc_read(i+2),
i+3, adc_read(i+3));
lcd_puts(0, line++, buf);
}
lcd_update();
if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL))
return false;
}
}