www.pudn.com > mizi_vivi.rar > test.c


#include "config.h"
#include "bootconfig.h"
#include "command-lib.h"
#include 
#ifdef CONFIG_MTD_CFI
#include "cfi.h"
#else
#include "flash.h"
#endif
#include "mtd.h"
#include "heap.h"
#include "debug.h"
#if defined(CONFIG_S3C2400_SMDK)
#include "smdk-cfg.h"
#elif defined(CONFIG_ARCH_S3C2400)
#include "s3c2400.h"
#elif defined(CONFIG_ARCH_SA1100)
#include "sa1100.h"
#elif defined(CONFIG_ARCH_S3C2410)
#include "s3c2410.h"
#endif



static void command_led1(int argc, const char **argv);
static void command_led2(int argc, const char **argv);
static void command_led3(int argc, const char **argv);
static void command_rtcdump(int argc, const char **argv);
static void command_resetrtc(int argc, const char **argv);
static void command_timer(int argc, const char **argv);
static void command_show_timer_reg(int argc, const char **argv);
static void command_enable_irq(int argc, const char **argv);
static void command_stop(int argc, const char **argv);
static void command_go_gpos(int argc, const char **argv);
static void command_led_key(int argc, const char **argv);
static void command_question(int argc, const char **argv);

extern struct mtd_info g_mtd;
extern struct cfi_private g_cfi;

void tests_usage(void);

static struct bootblk_command tests_commands[] = {
#if defined(CONFIG_S3C2400_SMDK)
	{ "led1",	command_led1,		NULL },
	{ "led2",	command_led2,		NULL },
	{ "led3",	command_led3,		NULL },
	{ "rtcdump",	command_rtcdump,	NULL },
	{ "restorertc",	command_resetrtc,	NULL },
	{ "timer",	command_timer,		NULL },
	{ "show_timer_reg",	command_show_timer_reg, NULL },
	{ "enable_irq",	command_enable_irq,	NULL },
#endif
#ifdef CONFIG_S3C2400_GAMEPARK
	{ "led_key",	command_led_key,	"key-led" },
	{ "gpos",	command_go_gpos,	"gpos" },
	{ "stop",	command_stop,		"stop" },
#endif
	{ "q",		command_question,	"q" },
	{ NULL,		NULL,			NULL }
};

void command_tests(int argc, const char **argv)
{
	if (argc == 1) {
		putstr("invalid 'test' command: too few arguments\r\n");
		tests_usage();
	} else {
		execcmd(tests_commands, argc - 1, argv + 1);
	}
}

static void command_question(int argc, const char **argv)
{
	int retry = 3;
	__u8 c[2];

	while (retry > 0) {
		putstr("are you sure (y/n) ? ");
		*c = getc();
		c[1] = '\0';
		if ((strcmp(c, "y") == 0) || (strcmp(c, "n") == 0)) {
			putstr(c);
			putstr("\r\n");
			break;
		}
		retry--;
		putstr("\r\n");
	}
}

#ifdef CONFIG_S3C2400_GAMEPARK
#define TMP_REG	(*(volatile unsigned long *)(0x15a00034))
static void command_go_gpos(int argc, const char **argv)
{
	putstr("Go GPOS\r\n");

	TMP_REG = 0x17;

	_SRCPND = 0xffffffff;
	_INTPND = 0xffffffff;

	cpu_arm920_cache_clean_invalidate_all();
	cpu_arm920_tlb_invalidate_all();

	__asm__("mov	r1, #0\n"
		"mov	r2, #0\n"
		"mrc	p15, 0, r1, c1, c0, 0\n"	/* read ctrl register */
		"bic	r1, r1, #0x1100\n"		/* ...i...s........ */
		"bic	r1, r1, #0x000f\n"		/* .............cam */
		"mcr	p15, 0, r1, c1, c0, 0\n"	/* write ctrl register */
		"mov	pc, r2\n"
		"nop\n"
		"nop\n");
}

static void command_led_key(int argc, const char **argv)
{
	_PDCON = (1 << 10);
	_PDDAT = (1 << 5);
}

extern void go_sleep(void);
static void command_stop(int argc, const char **argv)
{
#if 0
	unsigned long cpsr;
	unsigned long count = 0;

	_SRCPND = 0xffffffff;
	_INTPND = 0xffffffff;

	putLabeledWord("SRCPND = 0x", _SRCPND);
	putLabeledWord("INTPND = 0x", _INTPND);

	_INTMSK = 0x0;
	putLabeledWord("INTMSK = 0x", _INTMSK);

	_PECON = (0x2 << 2);
	_PEUP = (0 << 1);
	_EXTINT = (4 << 4);
	_INTMOD = 0x00000000;
	//_INTMSK = ~(IRQ_EINT1);
	_INTMSK = 0xffffffff;

	while (1) {
		if ((0x000000ff & _SRCPND) == 0x2) break;
		putstr("show\r\n");
		putLabeledWord("SRCPND = 0x", _SRCPND);
		putLabeledWord("INTPND = 0x", _INTPND);
		count = 0x100000;
		while (count > 0) count--;

	}

	putstr("Intrrupt is occured\r\n");
	putLabeledWord("SRCPND = 0x", _SRCPND);
	putLabeledWord("INTPND = 0x", _INTPND);

	count = 0x100000;
	while (count > 0) count--;

	__asm__("mrs %0, cpsr" : "=r" (cpsr));
	cpsr &= ~(I_BIT);
	__asm__("msr cpsr_c, %0" : : "r" (cpsr));	/* enable IRQ */

	putstr("Enable I_BIT\r\n");
	putLabeledWord("SRCPND = 0x", _SRCPND);
	putLabeledWord("INTPND = 0x", _INTPND);
#endif

	unsigned long cpsr;

	__asm__("mrs %0, cpsr" : "=r" (cpsr));
	cpsr &= ~(I_BIT);
	__asm__("msr cpsr_c, %0" : : "r" (cpsr));	/* enable IRQ */

#ifdef CONFIG_S3C2400_SMDK
	_PECON = 0x2;
	_INTMOD = 0x00000000;
	_INTMSK = ~(IRQ_EINT0);
#elif defined(CONFIG_S3C2400_GAMEPARK)
	_PECON = (0x2 << 14);
	_PEUP = (0 << 7);
	_EXTINT = (4 << 28);
	_INTMOD = 0x00000000;
	_INTMSK = ~(IRQ_EINT7);
#endif

	//go_sleep();

	_SRCPND = 0xffffffff;
	_INTPND = 0xffffffff;
	_PECON = (0x2 << 14);
	_PEUP = (0 << 7);
	_EXTINT = (4 << 28);

	cpu_arm920_cache_clean_invalidate_all();
	cpu_arm920_tlb_invalidate_all();

        __asm__("mov    r1, #0\n"
                "mov    r2, #0x34\n"
                "mrc    p15, 0, r1, c1, c0, 0\n"        /* read ctrl register */
                "bic    r1, r1, #0x1100\n"              /* ...i...s........ */
                "bic    r1, r1, #0x000f\n"              /* .............cam */
                "mcr    p15, 0, r1, c1, c0, 0\n"        /* write ctrl register */
                "mov    pc, r2\n"
                "nop\n"
                "nop\n");
}
#endif

#if defined(CONFIG_S3C2400_SMDK)
#define PCDAT *(volatile unsigned long *)(S3C2400_IOPORT_BASE_ADDR + S3C2400_PCDAT)
static void command_led1(int argc, const char **argv)
{
	int i;

	for (i = 0; i < 3; i++) {
		PCDAT = (PCDAT & 0xfff) | ((0xf & 0xf) << 12);
		udelay(10000);
		PCDAT = (PCDAT & 0xfff) | ((0x0 & 0xf) << 12);
		udelay(10000);
	}
}

static void command_led2(int argc, const char **argv)
{
	PCDAT = (PCDAT & 0xfff) | ((0x7 & 0xf) << 12);
	udelay(10000);
	PCDAT = (PCDAT & 0xfff) | ((0x3 & 0xf) << 12);
	udelay(10000);
	PCDAT = (PCDAT & 0xfff) | ((0x1 & 0xf) << 12);
	udelay(10000);
	PCDAT = (PCDAT & 0xfff) | ((0x0 & 0xf) << 12);
	udelay(10000);
}

static void command_led3(int argc, const char **argv)
{
	unsigned long temp;

	PCDAT |= (1 << 12);
	temp = 1000000;
	while (temp != 0)
		temp--;
	PCDAT &= ~(1 << 12);
}

static void command_rtcdump(int argc, const char **argv)
{
	putLabeledWord("TICNT = 0x", _TICNT);
	putLabeledWord("RTCALM = 0x", _RTCALM);
	putLabeledWord("BCDSEC = 0x", _BCDSEC);
	putLabeledWord("BCDMIN = 0x", _BCDMIN);
	putLabeledWord("BCDHOUR = 0x", _BCDHOUR);
	putLabeledWord("BCDDAY = 0x", _BCDDAY);
	putLabeledWord("BCDDATE = 0x", _BCDDATE);
	putLabeledWord("BCDMON = 0x", _BCDMON);
	putLabeledWord("BCDYEAR = 0x", _BCDYEAR);

}

/* reset rtc to 1970. 1. 1. 0. 0. 0 */
static void command_resetrtc(int argc, const char **argv)
{
	_RTCCON = (unsigned char)0x1;
	_TICNT = (unsigned char)0x0;
	_RTCALM = (unsigned char)0x0;
	_BCDSEC = (unsigned char)0x0;
	_BCDMIN = (unsigned char)0x0;
	_BCDHOUR = (unsigned char)0x0;
	_BCDDAY = (unsigned char)0x0;
	_BCDDATE = (unsigned char)0x1;
	_BCDMON = (unsigned char)0x1;
	_BCDYEAR = (unsigned char)0x70;
}

static void command_show_timer_reg(int argc, const char **argv)
{
	unsigned long cpsr = 0;

	putLabeledWord("TCON = ", _TCON);
	putLabeledWord("TCNTO4 = ", _TCNTO4);
	putLabeledWord("SRCPND = ", _SRCPND);
	putLabeledWord("INTPND = ", _INTPND);
	putLabeledWord("INTMSK = ", _INTMSK);
	__asm__("mrs %0, cpsr" : "=r" (cpsr));
	putLabeledWord(">> current CPSR = ", cpsr);
}

static void command_enable_irq(int argc, const char **argv)
{
	unsigned long cpsr = 0;

	__asm__("mrs %0, cpsr" : "=r" (cpsr));
	cpsr &= ~(I_BIT);
	__asm__("msr cpsr_c, %0" : : "r" (cpsr));	/* enable IRQ */
}

static void command_timer(int argc, const char **argv)
{
	unsigned long cpsr = 0;
	unsigned long count = 0;

	__asm__("mrs %0, cpsr" : "=r" (cpsr));
	/*putLabeledWord(">> current CPSR = ", cpsr);*/
#if 1 /* hacked by nandy */
	cpsr &= ~(I_BIT);
	__asm__("msr cpsr_c, %0" : : "r" (cpsr));	/* enable IRQ */
	/*putLabeledWord(">> current CPSR = ", cpsr);*/
#endif
	_TCFG0 = 0x0f00;	/* prescaler value = 15 */

#if 1
	_TCNTB4 = 15626;	/* down-counter, maximum value is 65535 (2^16) */
#else
	_TCNTB4 = 65535;	/* down-counter, maximum value is 65535 (2^16) */
#endif

	_INTMOD = 0x00000000;
#if 0
	_INTMSK = 0xffffbfff;
#else
	_INTMSK = 0x00000000;
#endif
	_SRCPND = 0x00000000;
	_INTPND = 0x00000000;

	_TCON = 0x600000; /* internal mode (auto reload), update TCNTB4, stop Timer 4 */
	_TCON = 0x500000;	/* interval mode, no operation, start Timer 4 */

#if 0
	count = 0;
	while (1) {
		if ((_INTPND & 0x00004000) && (0x00004000)) {
			if (count < 100000) {
				count++;
				_INTPND = 0x00000000;
			} else {
				count = 0;
				putstr(".\n");
				_INTPND = 0x00000000;
			}
		}
	}
#endif
#if 0
	putLabeledWord("SRCPND = ", _SRCPND);
	putLabeledWord("TCON = ", _TCON);
	putLabeledWord("TCNTB4 = ", _TCNTB4);
#endif
}
#endif


/*
 * Messages
 */

void tests_usage(void)
{
	int i = 0;
	putstr("Usage:\r\n");
	putstr("  test \r\n");
	putstr("  items: ");
	for (i = 0; tests_commands[i].cmdstr != NULL; i++) {
		if (!(i % 5)) {
			putstr("\r\n"); 
			putstr("         "); 
		}
		putstr(tests_commands[i].helpstr); putstr(", ");
	}
	putstr("\r\n");
}