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

📄 du440.c

📁 U-BOOT,著名的Bootloader程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		for (i = 0; i < 500; i++)			udelay(1000);	}	return 0;}#if defined(CONFIG_I2C_MULTI_BUS)/* * read field strength from I2C ADC */int dcf77_status(void){	unsigned int oldbus;	uchar u[2];	int mv;	oldbus = I2C_GET_BUS();	I2C_SET_BUS(1);	if (i2c_read (IIC1_MCP3021_ADDR, 0, 0, u, 2)) {		I2C_SET_BUS(oldbus);		return -1;	}	mv = (int)(((u[0] << 8) | u[1]) >> 2) * 3300 / 1024;	I2C_SET_BUS(oldbus);	return mv;}int do_dcf77(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	int mv;	u32 pin, pinold;	unsigned long long t1, t2;	bd_t *bd = gd->bd;	printf("DCF77: ");	mv = dcf77_status();	if (mv > 0)		printf("signal=%d mV\n", mv);	else		printf("ERROR - no signal\n");	t1 = t2 = 0;	pinold = in_be32((void*)GPIO1_IR) & CFG_GPIO1_DCF77;	while (!ctrlc()) {		pin = in_be32((void*)GPIO1_IR) & CFG_GPIO1_DCF77;		if (pin && !pinold) { /* bit start */			t1 = get_ticks();			if (t2 && ((unsigned int)(t1 - t2) /				   (bd->bi_procfreq / 1000) >= 1800))				printf("Start of minute\n");			t2 = t1;		}		if (t1 && !pin && pinold) { /* bit end */			printf("%5d\n", (unsigned int)(get_ticks() - t1) /			       (bd->bi_procfreq / 1000));		}		pinold = pin;	}	printf("Abort\n");	return 0;}U_BOOT_CMD(	dcf77, 1, 1, do_dcf77,	"dcf77   - Check DCF77 receiver\n",	NULL	);/* * initialize USB hub via I2C1 */int usbhub_init(void){	int reg;	int ret = 0;	unsigned int oldbus;	uchar u[] = {0x04, 0x24, 0x04, 0x07, 0x25, 0x00, 0x00, 0xd3,		     0x18, 0xe0, 0x00, 0x00, 0x01, 0x64, 0x01, 0x64,		     0x32};	uchar stcd;	printf("Hub:   ");	oldbus = I2C_GET_BUS();	I2C_SET_BUS(1);	for (reg = 0; reg < sizeof(u); reg++)		if (i2c_write (IIC1_USB2507_ADDR, reg, 1, &u[reg], 1)) {			ret = -1;			break;		}	if (ret == 0) {		stcd = 0x03;		if (i2c_write (IIC1_USB2507_ADDR, 0, 1, &stcd, 1))			ret = -1;	}	if (ret == 0)		printf("initialized\n");	else		printf("failed - cannot initialize USB hub\n");	I2C_SET_BUS(oldbus);	return ret;}int do_hubinit(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	usbhub_init();	return 0;}U_BOOT_CMD(	hubinit, 1, 1, do_hubinit,	"hubinit - Initialize USB hub\n",	NULL	);#endif /* CONFIG_I2C_MULTI_BUS */#define CFG_BOOT_EEPROM_PAGE_WRITE_BITS 3int boot_eeprom_write (unsigned dev_addr,		       unsigned offset,		       uchar *buffer,		       unsigned cnt){	unsigned end = offset + cnt;	unsigned blk_off;	int rcode = 0;#if defined(CFG_EEPROM_WREN)	eeprom_write_enable(dev_addr, 1);#endif	/*	 * Write data until done or would cross a write page boundary.	 * We must write the address again when changing pages	 * because the address counter only increments within a page.	 */	while (offset < end) {		unsigned alen, len;		unsigned maxlen;		uchar addr[2];		blk_off = offset & 0xFF;	/* block offset */		addr[0] = offset >> 8;		/* block number */		addr[1] = blk_off;		/* block offset */		alen = 2;		addr[0] |= dev_addr;		/* insert device address */		len = end - offset;		/*		 * For a FRAM device there is no limit on the number of the		 * bytes that can be ccessed with the single read or write		 * operation.		 */#if defined(CFG_BOOT_EEPROM_PAGE_WRITE_BITS)#define	BOOT_EEPROM_PAGE_SIZE (1 << CFG_BOOT_EEPROM_PAGE_WRITE_BITS)#define BOOT_EEPROM_PAGE_OFFSET(x) ((x) & (BOOT_EEPROM_PAGE_SIZE - 1))		maxlen = BOOT_EEPROM_PAGE_SIZE -			BOOT_EEPROM_PAGE_OFFSET(blk_off);#else		maxlen = 0x100 - blk_off;#endif		if (maxlen > I2C_RXTX_LEN)			maxlen = I2C_RXTX_LEN;		if (len > maxlen)			len = maxlen;		if (i2c_write (addr[0], offset, alen - 1, buffer, len) != 0)			rcode = 1;		buffer += len;		offset += len;#if defined(CFG_EEPROM_PAGE_WRITE_DELAY_MS)		udelay(CFG_EEPROM_PAGE_WRITE_DELAY_MS * 1000);#endif	}#if defined(CFG_EEPROM_WREN)	eeprom_write_enable(dev_addr, 0);#endif	return rcode;}int do_setup_boot_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	ulong sdsdp[4];	if (argc > 1) {		if (!strcmp(argv[1], "533")) {			printf("Bootstrapping for 533MHz\n");			sdsdp[0] = 0x87788252;			/* PLB-PCI-divider = 3 : sync PCI clock=44MHz */			sdsdp[1] = 0x095fa030;			sdsdp[2] = 0x40082350;			sdsdp[3] = 0x0d050000;		} else if (!strcmp(argv[1], "533-66")) {			printf("Bootstrapping for 533MHz (66MHz PCI)\n");			sdsdp[0] = 0x87788252;			/* PLB-PCI-divider = 2 : sync PCI clock=66MHz */			sdsdp[1] = 0x0957a030;			sdsdp[2] = 0x40082350;			sdsdp[3] = 0x0d050000;		} else if (!strcmp(argv[1], "667")) {			printf("Bootstrapping for 667MHz\n");			sdsdp[0] = 0x8778a256;			/* PLB-PCI-divider = 4 : sync PCI clock=33MHz */			sdsdp[1] = 0x0947a030;			/* PLB-PCI-divider = 3 : sync PCI clock=44MHz			 * -> not working when overclocking 533MHz chips			 * -> untested on 667MHz chips */			/* sdsdp[1]=0x095fa030; */			sdsdp[2] = 0x40082350;			sdsdp[3] = 0x0d050000;		}	} else {		printf("Bootstrapping for 533MHz (default)\n");		sdsdp[0] = 0x87788252;		/* PLB-PCI-divider = 3 : sync PCI clock=44MHz */		sdsdp[1] = 0x095fa030;		sdsdp[2] = 0x40082350;		sdsdp[3] = 0x0d050000;	}	printf("Writing boot EEPROM ...\n");	if (boot_eeprom_write(CFG_I2C_BOOT_EEPROM_ADDR,			      0, (uchar*)sdsdp, 16) != 0)		printf("boot_eeprom_write failed\n");	else		printf("done (dump via 'i2c md 52 0.1 10')\n");	return 0;}U_BOOT_CMD(	sbe, 2, 0, do_setup_boot_eeprom,	"sbe     - setup boot eeprom\n",	NULL	);#if defined(CFG_EEPROM_WREN)/* * Input: <dev_addr>  I2C address of EEPROM device to enable. *         <state>     -1: deliver current state *                      0: disable write *                      1: enable write * Returns:            -1: wrong device address *                      0: dis-/en- able done *                    0/1: current state if <state> was -1. */int eeprom_write_enable (unsigned dev_addr, int state){	if ((CFG_I2C_EEPROM_ADDR != dev_addr) &&	    (CFG_I2C_BOOT_EEPROM_ADDR != dev_addr))		return -1;	else {		switch (state) {		case 1:			/* Enable write access, clear bit GPIO_SINT2. */			out_be32((void*)GPIO0_OR,				 in_be32((void*)GPIO0_OR) & ~CFG_GPIO0_EP_EEP);			state = 0;			break;		case 0:			/* Disable write access, set bit GPIO_SINT2. */			out_be32((void*)GPIO0_OR,				 in_be32((void*)GPIO0_OR) | CFG_GPIO0_EP_EEP);			state = 0;			break;		default:			/* Read current status back. */			state = (0 == (in_be32((void*)GPIO0_OR) &				       CFG_GPIO0_EP_EEP));			break;		}	}	return state;}int do_eep_wren (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	int query = argc == 1;	int state = 0;	if (query) {		/* Query write access state. */		state = eeprom_write_enable(CFG_I2C_EEPROM_ADDR, -1);		if (state < 0)			puts ("Query of write access state failed.\n");		else {			printf ("Write access for device 0x%0x is %sabled.\n",				CFG_I2C_EEPROM_ADDR, state ? "en" : "dis");			state = 0;		}	} else {		if ('0' == argv[1][0]) {			/* Disable write access. */			state = eeprom_write_enable(CFG_I2C_EEPROM_ADDR, 0);		} else {			/* Enable write access. */			state = eeprom_write_enable(CFG_I2C_EEPROM_ADDR, 1);		}		if (state < 0)			puts ("Setup of write access state failed.\n");	}	return state;}U_BOOT_CMD(eepwren, 2, 0, do_eep_wren,	   "eepwren - Enable / disable / query EEPROM write access\n",	   NULL);#endif /* #if defined(CFG_EEPROM_WREN) */static int got_pldirq;static int pld_interrupt(u32 arg){	int rc = -1; /* not for us */	u8 status = in8(CFG_CPLD_BASE);	/* check for PLD interrupt */	if (status & PWR_INT_FLAG) {		/* reset this int */		out8(CFG_CPLD_BASE, 0);		rc = 0;		got_pldirq = 1; /* trigger backend */	}	return rc;}int do_waitpwrirq(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	got_pldirq = 0;	/* clear any pending interrupt */	out8(CFG_CPLD_BASE, 0);	irq_install_handler(CPLD_IRQ,			    (interrupt_handler_t *)pld_interrupt, 0);	printf("Waiting ...\n");	while(!got_pldirq) {		/* Abort if ctrl-c was pressed */		if (ctrlc()) {			puts("\nAbort\n");			break;		}	}	if (got_pldirq) {		printf("Got interrupt!\n");		printf("Power %sready!\n",		       in8(CFG_CPLD_BASE) & PWR_RDY ? "":"NOT ");	}	irq_free_handler(CPLD_IRQ);	return 0;}U_BOOT_CMD(	wpi,	1,	1,	do_waitpwrirq,	"wpi     - Wait for power change interrupt\n",	NULL	);/* * initialize DVI panellink transmitter */int dvi_init(void){	int i;	int ret = 0;	unsigned int oldbus;	uchar u[] = {0x08, 0x34,		     0x09, 0x20,		     0x0a, 0x90,		     0x0c, 0x89,		     0x08, 0x35};	printf("DVI:   ");	oldbus = I2C_GET_BUS();	I2C_SET_BUS(0);	for (i = 0; i < sizeof(u); i += 2)		if (i2c_write (0x38, u[i], 1, &u[i + 1], 1)) {			ret = -1;			break;		}	if (ret == 0)		printf("initialized\n");	else		printf("failed - cannot initialize DVI transmitter\n");	I2C_SET_BUS(oldbus);	return ret;}int do_dviinit(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	dvi_init();	return 0;}U_BOOT_CMD(	dviinit, 1, 1, do_dviinit,	"dviinit - Initialize DVI Panellink transmitter\n",	NULL	);/* * TODO: 'time' command might be useful for others as well. *       Move to 'common' directory. */int do_time(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	unsigned long long start, end;	char c, cmd[CFG_CBSIZE];	char *p, *d = cmd;	int ret, i;	ulong us;	for (i = 1; i < argc; i++) {		p = argv[i];		if (i > 1)			*d++ = ' ';		while ((c = *p++) != '\0') {			*d++ = c;		}	}	*d = '\0';	start = get_ticks();	ret = run_command (cmd, 0);	end = get_ticks();	printf("ticks=%ld\n", (ulong)(end - start));	us = (ulong)((1000L * (end - start)) / (get_tbclk() / 1000));	printf("usec=%ld\n", us);	return ret;}U_BOOT_CMD(	time,	CFG_MAXARGS,	1,	do_time,	"time    - run command and output execution time\n",	NULL	);extern void video_hw_rectfill (	unsigned int bpp,		/* bytes per pixel */	unsigned int dst_x,		/* dest pos x */	unsigned int dst_y,		/* dest pos y */	unsigned int dim_x,		/* frame width */	unsigned int dim_y,		/* frame height */	unsigned int color		/* fill color */	);/* * graphics demo * draw rectangles using pseudorandom number generator * (see http://www.embedded.com/columns/technicalinsights/20900500) */unsigned int rprime = 9972;static unsigned int r;static unsigned int Y;unsigned int prng(unsigned int max){	if (r == 0 || r == 1 || r == -1)		r = rprime; /* keep from getting stuck */	r = (9973 * ~r) + ((Y) % 701); /* the actual algorithm */	Y = (r >> 16) % max; /* choose upper bits and reduce */	return Y;}int do_gfxdemo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	unsigned int color;	unsigned int x, y, dx, dy;	while (!ctrlc()) {		x = prng(1280 - 1);		y = prng(1024 - 1);		dx = prng(1280- x - 1);		dy = prng(1024 - y - 1);		color = prng(0x10000);		video_hw_rectfill(2, x, y, dx, dy, color);	}	return 0;}U_BOOT_CMD(	gfxdemo,	CFG_MAXARGS,	1,	do_gfxdemo,	"gfxdemo - demo\n",	NULL	);

⌨️ 快捷键说明

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