📄 cmd_bc3450.c
字号:
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 + -