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