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


#include "config.h"
#include "machine.h"
#include "command.h"
#include "mmu.h"
#include "printk.h"
#include "vivi_string.h"
#include 


#if 0
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");
	}
}
#endif

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

	TMP_REG = (0x3 << 28);

	_SRCPND = 0xffffffff;
	_INTPND = 0xffffffff;

	cache_clean_invalidate();
	tlb_invalidate();

	__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 */

	_PECON = (0x2 << 14);
	_PEUP = (0 << 7);
	_EXTINT = (4 << 28);
	_INTMOD = 0x00000000;
	_INTMSK = ~(IRQ_EINT7);

	//go_sleep();

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

	cache_clean_invalidate();
	tlb_invalidate();

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

user_subcommand_t test_cmds[];

static void command_help(int argc, const char **argv)
{
	print_usage("  ", test_cmds);
}

user_subcommand_t test_cmds[] = {
{
	"help",
	command_help,
	"help -- help about 'test' command"
}, {
	"gpos",
	command_go_gpos,
	"gpos -- Go to the GPOS"
}, {
	"stop",
	command_stop,
	"stop -- "
}, {
	NULL,
	NULL,
	NULL
}
};

void command_test(int argc, const char **argv)
{
	if (argc == 1) {
		printk("invalid 'test' command: too few arguments\n");
		print_usage("  ", test_cmds);
	}
	execsubcmd(test_cmds, argc-1, argv+1);
}

user_command_t test_cmd = {
	"test",
	command_test,
	NULL,
	"test -- "
};