www.pudn.com > mizi_vivi.rar > smdk2410_test.c
/* * vivi/arch/s3c2410/smdk2410_test.c: test codes for SMDK-2410 * * Copyrigth (C) 2002 MIZI Research, Inc. * * Author: Janghoon Lyu* Date : $Date: 2002/09/12 03:50:23 $ * * $Revision: 1.5 $ */ #include #include #include #include #include #include #include #include #include #define PM_RESUME 0 #define PM_SUSPEND 2 #define LOWLEVEL 0 #define HIGHLEVEL 1 #define FALLING_EDGE 2 #define RISINGE_EDGE 4 #define BOTH_EDGE 6 #define EINT0 0 int pm_set_gpios(int request) { switch (request) { case PM_SUSPEND: break; case PM_RESUME: break; default: return -1; } return 0; } int pm_send_all(int request) { switch (request) { case PM_SUSPEND: /* Suspend USB pads */ PMCTL1 |= (USBSPD1 | USBSPD0); /* Disable LCD */ break; case PM_RESUME: /* Resume USB pads */ PMCTL1 &= ~(USBSPD1 | USBSPD0); /* Enable LCD */ break; default: return -1; } return 0; } int pm_s3c2410_cpu_suspend(void) { /* save return address */ PMSR0 = 0x38; printk("call SleepRamProc()\n"); cache_clean_invalidate(); tlb_invalidate(); __asm__( "mov r2, #0x34\n" "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */ "bic r1, r1, #0x0001\n" /* MMU is off */ "mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */ "mov pc, r2\n" "nop\n" "nop\n"); for (;;) ; } int pm_cpu_suspend(void) { pm_set_gpios(PM_SUSPEND); pm_s3c2410_cpu_suspend(); pm_set_gpios(PM_RESUME); return 0; } int pm_sys_suspend(void) { int ret; /* Disable all interrupts */ ret = pm_send_all(PM_SUSPEND); pm_cpu_suspend(); ret = pm_send_all(PM_RESUME); /* Enable all interrupts */ return 0; } int pm_go_suspend(void) { GPFCON = 2; EXTINT0 = (FALLING_EDGE << EINT0); SRCPND = 0xffffffff; INTPND = 0xffffffff; INTMOD = 0x00000000; INTMSK = ~(0x1); pm_sys_suspend(); return 0; } void wait_eint0(void) { unsigned long cpsr; /* Setup power button */ __asm__("mrs %0, cpsr" : "=r" (cpsr)); cpsr &= ~(I_BIT); __asm__("msr cpsr_c, %0" : : "r" (cpsr)); /* enable IRQ */ /* setup edge */ GPFCON = 2; EXTINT0 = (FALLING_EDGE << EINT0); SRCPND = 0xffffffff; INTPND = 0xffffffff; INTMOD = 0x00000000; INTMSK = ~(0x1); } void z_car(void) { __u8 c = 0; GPFCON = 0x55aa; GPFUP = 0xff; for (;;) { GPFDAT = 0xe0; mdelay(100); GPFDAT = 0xd0; mdelay(100); GPFDAT = 0xb0; mdelay(100); GPFDAT = 0x70; mdelay(100); GPFDAT = 0xb0; mdelay(100); GPFDAT = 0xd0; mdelay(100); c = do_getc(NULL, 0x100, NULL); if (c != 0) break; } } static void wait_int(int irq) { while (!(INTPND & (1 << irq))) ; printk("OK. detected irq %d\n", irq); } void test_btn(void) { GPFCON = 2; EXTINT0 = (BOTH_EDGE << EINT0); SRCPND = 0xffffffff; INTPND = 0xffffffff; INTMOD = 0x00000000; INTMSK = ~(0x1); printk("GPFDAT = 0x%08lx\n", GPFDAT); wait_int(EINT0); printk("GPFDAT = 0x%08lx\n", GPFDAT); SRCPND = 0xffffffff; INTPND = 0xffffffff; wait_int(EINT0); printk("GPFDAT = 0x%08lx\n", GPFDAT); } void display_help(void) { printk("Usage:\n"); printk("\ttest sleep\t\t-- Test sleep mode. (pwbt is eint0)\n"); printk("\ttest int\t\t-- Test external interrupt 0\n"); printk("\ttest led\t\t-- Test LEDs\n"); } void command_test(int argc, const char **argv) { switch (argc) { case 2: if (strncmp("sleep", argv[1], 4) == 0) { pm_go_suspend(); break; } if (strncmp("int", argv[1], 3) == 0) { wait_eint0(); break; } if (strncmp("led", argv[1], 3) == 0) { z_car(); break; } if (strncmp("btn", argv[1], 3) == 0) { test_btn(); break; } default: display_help(); } } user_command_t test_cmd = { "test", command_test, NULL, "test [{cmds}]\t\t\t-- Test functions" };