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

📄 cmd_bc3450.c

📁 u-boot-1.1.6 源码包
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (bc_ds1620_get_data ())			value |= mask;		mask <<= 1;		bc_ds1620_set_clk (1);		udelay (1);	}	return value;}static void ds1620_out (int cmd, int bits, int value){	bc_ds1620_set_clk (1);	bc_ds1620_set_data_dir (0);	bc_ds1620_set_reset (0);	udelay (1);	bc_ds1620_set_reset (1);	udelay (1);	ds1620_send_bits (8, cmd);	if (bits)		ds1620_send_bits (bits, value);	udelay (1);	/* go stand alone */	bc_ds1620_set_data_dir (1);	bc_ds1620_set_reset (0);	bc_ds1620_set_clk (0);	udelay (10000);}static unsigned int ds1620_in (int cmd, int bits){	unsigned int value;	bc_ds1620_set_clk (1);	bc_ds1620_set_data_dir (0);	bc_ds1620_set_reset (0);	udelay (1);	bc_ds1620_set_reset (1);	udelay (1);	ds1620_send_bits (8, cmd);	bc_ds1620_set_data_dir (1);	value = ds1620_recv_bits (bits);	/* go stand alone */	bc_ds1620_set_data_dir (1);	bc_ds1620_set_reset (0);	bc_ds1620_set_clk (0);	return value;}static int cvt_9_to_int (unsigned int val){	if (val & 0x100)		val |= 0xfffffe00;	return val;}/* set thermostate thresholds */static void ds1620_write_state (struct therm *therm){	ds1620_out (THERM_WRITE_TL, 9, therm->lo);	ds1620_out (THERM_WRITE_TH, 9, therm->hi);	ds1620_out (THERM_START_CONVERT, 0, 0);}static int cmd_temp (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){	int i;	struct therm therm;	sm501_gpio_init ();	/* print temperature */	if (argc == 1) {		i = cvt_9_to_int (ds1620_in (THERM_READ_TEMP, 9));		printf ("%d.%d C\n", i >> 1, i & 1 ? 5 : 0);		return 0;	}	/* set to default operation */	if (strncmp (argv[1], "set", 3) == 0) {		if (strncmp (argv[2], "default", 3) == 0) {			therm.hi = +88;			therm.lo = -20;			therm.hi <<= 1;			therm.lo <<= 1;			ds1620_write_state (&therm);			ds1620_out (THERM_WRITE_CONFIG, 8, CFG_STANDALONE);			return 0;		}	}	printf ("Usage:%s\n", cmdtp->help);	return 1;}U_BOOT_CMD (temp, 3, 1, cmd_temp,	    "temp    - print current temperature\n",	    "\n" "temp\n" "     - print current temperature\n");#ifdef CONFIG_BC3450_CAN/* * Initialise CAN interface * * 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 BC3450.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;}/* * Do CAN test * by sending message between CAN1 and CAN2 * * 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;}#endif /* CONFIG_BC3450_CAN *//* * test - BC3450 HW test routines */int cmd_test (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){#ifdef CONFIG_BC3450_CAN	int rcode;	can_init ();#endif /* CONFIG_BC3450_CAN */	sm501_gpio_init ();	if (argc != 2) {		printf ("Usage:%s\n", cmdtp->help);		return 1;	}	if (strncmp (argv[1], "unit-off", 8) == 0) {		printf ("waiting 2 seconds...\n");		udelay (2000000);		*(vu_long *) (SM501_MMIO_BASE + SM501_GPIO_DATA_HIGH) &=			~PWR_OFF;		return 0;	}#ifdef CONFIG_BC3450_CAN	else if (strncmp (argv[1], "can", 2) == 0) {		rcode = do_can (argv);		if (simple_strtoul (argv[2], NULL, 10) == 2) {			if (rcode == 0)				printf ("OK\n");			else				printf ("Error\n");		}		return rcode;	}#endif /* CONFIG_BC3450_CAN */	printf ("Usage:%s\n", cmdtp->help);	return 1;}U_BOOT_CMD (test, 2, 1, cmd_test, "test    - unit test routines\n", "\n"#ifdef CONFIG_BC3450_CAN	    "test can\n"	    "     - connect CAN1 (X8) with CAN2 (X9) for this test\n"#endif /* CONFIG_BC3450_CAN */	    "test unit-off\n"	    "     - turns off the BC3450 unit\n"	    "       WARNING: Unsaved environment variables will be lost!\n");#endif /* CFG_CMD_BSP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -