📄 cmd_stk52xx.c
字号:
gpt->gpt4.emsr |= (1 << 4); } else { gpt->gpt4.emsr &= ~(1 << 4); } break; case 5: if (strcmp (argv[3], "on") == 0) { gpt->gpt5.emsr |= (1 << 4); } else { gpt->gpt5.emsr &= ~(1 << 4); } break; case 6: if (strcmp (argv[3], "on") == 0) { gpt->gpt6.emsr |= (1 << 4); } else { gpt->gpt6.emsr &= ~(1 << 4); } break; case 7: if (strcmp (argv[3], "on") == 0) { gpt->gpt7.emsr |= (1 << 4); } else { gpt->gpt7.emsr &= ~(1 << 4); } break; case 24: if (strcmp (argv[3], "on") == 0) { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_LOW) |= (0x1 << 24); } else { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_LOW) &= ~(0x1 << 24); } break; case 25: if (strcmp (argv[3], "on") == 0) { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_LOW) |= (0x1 << 25); } else { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_LOW) &= ~(0x1 << 25); } break; case 26: if (strcmp (argv[3], "on") == 0) { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_LOW) |= (0x1 << 26); } else { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_LOW) &= ~(0x1 << 26); } break; case 27: if (strcmp (argv[3], "on") == 0) { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_LOW) |= (0x1 << 27); } else { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_LOW) &= ~(0x1 << 27); } break; case 48: if (strcmp (argv[3], "on") == 0) { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) |= (0x1 << 16); } else { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) &= ~(0x1 << 16); } break; case 49: if (strcmp (argv[3], "on") == 0) { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) |= (0x1 << 17); } else { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) &= ~(0x1 << 17); } break; case 50: if (strcmp (argv[3], "on") == 0) { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) |= (0x1 << 18); } else { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) &= ~(0x1 << 18); } break; case 51: if (strcmp (argv[3], "on") == 0) { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) |= (0x1 << 19); } else { *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) &= ~(0x1 << 19); } break; default: printf ("%s: invalid led number %s\n", __FUNCTION__, argv[2]); return 1; } return 0;}#endif#if defined(CONFIG_STK52XX) || defined(CONFIG_FO300)/* * return 1 on CAN initialization failure * return 0 if no failure */int can_init(void){ static int init_done = 0; int i; struct mpc5xxx_mscan *can1 = (struct mpc5xxx_mscan *)(CFG_MBAR + 0x0900); struct mpc5xxx_mscan *can2 = (struct mpc5xxx_mscan *)(CFG_MBAR + 0x0980); /* GPIO configuration of the CAN pins is done in TQM5200.h */ if (!init_done) { /* init CAN 1 */ can1->canctl1 |= 0x80; /* CAN enable */ udelay(100); i = 0; can1->canctl0 |= 0x02; /* sleep mode */ /* wait until sleep mode reached */ while (!(can1->canctl1 & 0x02)) { udelay(10); i++; if (i == 10) { printf ("%s: CAN1 initialize error, " "can not enter sleep mode!\n", __FUNCTION__); return 1; } } i = 0; can1->canctl0 = 0x01; /* enter init mode */ /* wait until init mode reached */ while (!(can1->canctl1 & 0x01)) { udelay(10); i++; if (i == 10) { printf ("%s: CAN1 initialize error, " "can not enter init mode!\n", __FUNCTION__); return 1; } } can1->canctl1 = 0x80; can1->canctl1 |= 0x40; can1->canbtr0 = 0x0F; can1->canbtr1 = 0x7F; can1->canidac &= ~(0x30); can1->canidar1 = 0x00; can1->canidar3 = 0x00; can1->canidar5 = 0x00; can1->canidar7 = 0x00; can1->canidmr0 = 0xFF; can1->canidmr1 = 0xFF; can1->canidmr2 = 0xFF; can1->canidmr3 = 0xFF; can1->canidmr4 = 0xFF; can1->canidmr5 = 0xFF; can1->canidmr6 = 0xFF; can1->canidmr7 = 0xFF; i = 0; can1->canctl0 &= ~(0x01); /* leave init mode */ can1->canctl0 &= ~(0x02); /* wait until init and sleep mode left */ while ((can1->canctl1 & 0x01) || (can1->canctl1 & 0x02)) { udelay(10); i++; if (i == 10) { printf ("%s: CAN1 initialize error, " "can not leave init/sleep mode!\n", __FUNCTION__); return 1; } } /* init CAN 2 */ can2->canctl1 |= 0x80; /* CAN enable */ udelay(100); i = 0; can2->canctl0 |= 0x02; /* sleep mode */ /* wait until sleep mode reached */ while (!(can2->canctl1 & 0x02)) { udelay(10); i++; if (i == 10) { printf ("%s: CAN2 initialize error, " "can not enter sleep mode!\n", __FUNCTION__); return 1; } } i = 0; can2->canctl0 = 0x01; /* enter init mode */ /* wait until init mode reached */ while (!(can2->canctl1 & 0x01)) { udelay(10); i++; if (i == 10) { printf ("%s: CAN2 initialize error, " "can not enter init mode!\n", __FUNCTION__); return 1; } } can2->canctl1 = 0x80; can2->canctl1 |= 0x40; can2->canbtr0 = 0x0F; can2->canbtr1 = 0x7F; can2->canidac &= ~(0x30); can2->canidar1 = 0x00; can2->canidar3 = 0x00; can2->canidar5 = 0x00; can2->canidar7 = 0x00; can2->canidmr0 = 0xFF; can2->canidmr1 = 0xFF; can2->canidmr2 = 0xFF; can2->canidmr3 = 0xFF; can2->canidmr4 = 0xFF; can2->canidmr5 = 0xFF; can2->canidmr6 = 0xFF; can2->canidmr7 = 0xFF; can2->canctl0 &= ~(0x01); /* leave init mode */ can2->canctl0 &= ~(0x02); i = 0; /* wait until init mode left */ while ((can2->canctl1 & 0x01) || (can2->canctl1 & 0x02)) { udelay(10); i++; if (i == 10) { printf ("%s: CAN2 initialize error, " "can not leave init/sleep mode!\n", __FUNCTION__); return 1; } } init_done = 1; } return 0;}/* * return 1 on CAN failure * return 0 if no failure */int do_can(char *argv[]){ int i; struct mpc5xxx_mscan *can1 = (struct mpc5xxx_mscan *)(CFG_MBAR + 0x0900); struct mpc5xxx_mscan *can2 = (struct mpc5xxx_mscan *)(CFG_MBAR + 0x0980); /* send a message on CAN1 */ can1->cantbsel = 0x01; can1->cantxfg.idr[0] = 0x55; can1->cantxfg.idr[1] = 0x00; can1->cantxfg.idr[1] &= ~0x8; can1->cantxfg.idr[1] &= ~0x10; can1->cantxfg.dsr[0] = 0xCC; can1->cantxfg.dlr = 1; can1->cantxfg.tbpr = 0; can1->cantflg = 0x01; i = 0; while ((can1->cantflg & 0x01) == 0) { i++; if (i == 10) { printf ("%s: CAN1 send timeout, " "can not send message!\n", __FUNCTION__); return 1; } udelay(1000); } udelay(1000); i = 0; while (!(can2->canrflg & 0x01)) { i++; if (i == 10) { printf ("%s: CAN2 receive timeout, " "no message received!\n", __FUNCTION__); return 1; } udelay(1000); } if (can2->canrxfg.dsr[0] != 0xCC) { printf ("%s: CAN2 receive error, " "data mismatch!\n", __FUNCTION__); return 1; } /* send a message on CAN2 */ can2->cantbsel = 0x01; can2->cantxfg.idr[0] = 0x55; can2->cantxfg.idr[1] = 0x00; can2->cantxfg.idr[1] &= ~0x8; can2->cantxfg.idr[1] &= ~0x10; can2->cantxfg.dsr[0] = 0xCC; can2->cantxfg.dlr = 1; can2->cantxfg.tbpr = 0; can2->cantflg = 0x01; i = 0; while ((can2->cantflg & 0x01) == 0) { i++; if (i == 10) { printf ("%s: CAN2 send error, " "can not send message!\n", __FUNCTION__); return 1; } udelay(1000); } udelay(1000); i = 0; while (!(can1->canrflg & 0x01)) { i++; if (i == 10) { printf ("%s: CAN1 receive timeout, " "no message received!\n", __FUNCTION__); return 1; } udelay(1000); } if (can1->canrxfg.dsr[0] != 0xCC) { printf ("%s: CAN1 receive error 0x%02x\n", __FUNCTION__, (can1->canrxfg.dsr[0])); return 1; } return 0;}/* * return 1 if rs232 port unknown * return 2 on txd/rxd failure (only rs232 2) * return 3 on rts/cts failure * return 0 if no failure */int do_rs232(char *argv[]){ int error_status = 0; struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; struct mpc5xxx_psc *psc1 = (struct mpc5xxx_psc *)MPC5XXX_PSC1; switch (simple_strtoul(argv[2], NULL, 10)) { case 1: /* check RTS <-> CTS loop */ /* set rts to 0 */ psc1->op1 |= 0x01; /* wait some time before requesting status */ udelay(10); /* check status at cts */ if ((psc1->ip & 0x01) != 0) { error_status = 3; printf ("%s: failure at rs232_1, cts status is %d " "(should be 0)\n", __FUNCTION__, (psc1->ip & 0x01)); } /* set rts to 1 */ psc1->op0 |= 0x01; /* wait some time before requesting status */ udelay(10); /* check status at cts */ if ((psc1->ip & 0x01) != 1) { error_status = 3; printf ("%s: failure at rs232_1, cts status is %d " "(should be 1)\n", __FUNCTION__, (psc1->ip & 0x01)); } break; case 2: /* set PSC3_0, PSC3_2 as output and PSC3_1, PSC3_3 as input */ gpio->simple_ddr &= ~(0x00000F00); gpio->simple_ddr |= 0x00000500; /* check TXD <-> RXD loop */ /* set TXD to 1 */ gpio->simple_dvo |= (1 << 8); /* wait some time before requesting status */ udelay(10); if ((gpio->simple_ival & 0x00000200) != 0x00000200) { error_status = 2; printf ("%s: failure at rs232_2, rxd status is %d " "(should be 1)\n", __FUNCTION__, (gpio->simple_ival & 0x00000200) >> 9); } /* set TXD to 0 */ gpio->simple_dvo &= ~(1 << 8); /* wait some time before requesting status */ udelay(10); if ((gpio->simple_ival & 0x00000200) != 0x00000000) { error_status = 2; printf ("%s: failure at rs232_2, rxd status is %d " "(should be 0)\n", __FUNCTION__, (gpio->simple_ival & 0x00000200) >> 9); } /* check RTS <-> CTS loop */ /* set RTS to 1 */ gpio->simple_dvo |= (1 << 10); /* wait some time before requesting status */ udelay(10); if ((gpio->simple_ival & 0x00000800) != 0x00000800) { error_status = 3; printf ("%s: failure at rs232_2, cts status is %d " "(should be 1)\n", __FUNCTION__, (gpio->simple_ival & 0x00000800) >> 11); } /* set RTS to 0 */ gpio->simple_dvo &= ~(1 << 10); /* wait some time before requesting status */ udelay(10); if ((gpio->simple_ival & 0x00000800) != 0x00000000) { error_status = 3; printf ("%s: failure at rs232_2, cts status is %d " "(should be 0)\n", __FUNCTION__, (gpio->simple_ival & 0x00000800) >> 11); } /* set PSC3_0, PSC3_1, PSC3_2 and PSC3_3 as output */ gpio->simple_ddr &= ~(0x00000F00); gpio->simple_ddr |= 0x00000F00; break; default: printf ("%s: invalid rs232 number %s\n", __FUNCTION__, argv[2]); error_status = 1; break; } return error_status;}#ifndef CONFIG_FO300static void sm501_backlight (unsigned int state){ if (state == BL_ON) { *(vu_long *)(SM501_MMIO_BASE+SM501_PANEL_DISPLAY_CONTROL) |= (1 << 26) | (1 << 27); } else if (state == BL_OFF) *(vu_long *)(SM501_MMIO_BASE+SM501_PANEL_DISPLAY_CONTROL) &= ~((1 << 26) | (1 << 27));}#endifint cmd_fkt(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ int rcode;#ifdef CONFIG_STK52XX_REV100 printf ("Revision 100 of STK52XX not supported!\n"); return 1;#endif#if defined(CONFIG_STK52XX) led_init();#endif can_init(); switch (argc) { case 0: case 1: break; case 2: if (strncmp (argv[1], "can", 3) == 0) { rcode = do_can (argv); if (rcode == 0) printf ("OK\n"); else printf ("Error\n"); return rcode; } break; case 3: if (strncmp (argv[1], "rs232", 3) == 0) { rcode = do_rs232 (argv); if (rcode == 0) printf ("OK\n"); else printf ("Error\n"); return rcode;#ifndef CONFIG_FO300 } else if (strncmp (argv[1], "backlight", 4) == 0) { if (strncmp (argv[2], "on", 2) == 0) { sm501_backlight (BL_ON); return 0; } else if (strncmp (argv[2], "off", 3) == 0) { sm501_backlight (BL_OFF); return 0; }#endif } break;#if defined(CONFIG_STK52XX) case 4: if (strcmp (argv[1], "led") == 0) { return (do_led (argv)); } break;#endif default: break; } printf ("Usage:\nfkt cmd [arg1] [arg2] ...\n"); return 1;}U_BOOT_CMD( sound , 5, 1, cmd_sound, "sound - Sound sub-system\n", "saw [duration] [freq] [channel]\n" " - generate sawtooth for 'duration' ms with frequency 'freq'\n" " on left \"l\" or right \"r\" channel\n" "sound square [duration] [freq] [channel]\n" " - generate squarewave for 'duration' ms with frequency 'freq'\n" " on left \"l\" or right \"r\" channel\n" "pcm1772 reg val\n");U_BOOT_CMD( wav , 3, 1, cmd_wav, "wav - play wav file\n", "[addr] [bytes]\n" " - play wav file at address 'addr' with length 'bytes'\n");U_BOOT_CMD( beep , 2, 1, cmd_beep, "beep - play short beep\n", "[channel]\n" " - play short beep on \"l\"eft or \"r\"ight channel\n");#endif /* CONFIG_STK52XX || CONFIG_FO300 */#if defined(CONFIG_STK52XX)U_BOOT_CMD( fkt , 4, 1, cmd_fkt, "fkt - Function test routines\n", "led number on/off\n" " - 'number's like printed on STK52XX board\n" "fkt can\n" " - loopback plug for X83 required\n" "fkt rs232 number\n" " - loopback plug(s) for X2 required\n" "fkt backlight on/off\n" " - switch backlight on or off\n");#elif defined(CONFIG_FO300)U_BOOT_CMD( fkt , 3, 1, cmd_fkt, "fkt - Function test routines\n", "fkt can\n" " - loopback plug for X16/X29 required\n" "fkt rs232 number\n" " - loopback plug(s) for X21/X22 required\n");#endif#endif /* CFG_CMD_BSP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -