⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd_stk52xx.c

📁 u-boot-1.1.6 源码包
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -