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


#include "config.h"
#include "command.h"
#ifdef CONFIG_MTD_CFI
#include "cfi.h"
#else
#include "flash.h"
#endif
#include "mtd.h"
#include "heap.h"
#include "machine.h"
#include 

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[] = {
	{ "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 },
	{ 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");
	}
}

#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
}


/*
 * 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");
}