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

📄 setup.c

📁 pxa270 的bootloader源码
💻 C
字号:
#include <stdio.h>#include <string.h>#include <command.h>#include <network.h>#include <board.h>#include <setup.h>#include <pxareg.h>extern void delay(time);#define assert(fmt, args...)	//printf(fmt, ##args)#define STATUS_ID			0x5166a1c0extern unsigned long loader_size;extern unsigned long setup_size;# define setup_storeat		((void *)((ulong)setup & 0x000FFFFF))static struct setup_t __bsetup _setup = {	.sid        = 0x5cda7192,	.size       = (uint32)&loader_size,	.myipaddr   = 0x0100a8c0,	.destipaddr = 0x3200a8c0,	.myhaddr    = {0x00,0x05,0x10,0x82,0xd8,0x92},	.autoboot   = AUTOBOOT,	.kernelname     = KERNEL,	.fsname   = FILESYSTEM,	.delay     = DELAYTIME,};struct setup_t *setup = &_setup;static bool do_config(int argc, char **argv);static void config_usage(void);static void view_setup(void);extern void init_map(void);struct command_t cmd_config = {	.name  = "set",	.run   = do_config,	.usage = config_usage};bool config_init(void){	init_map();	return true;}static void config_usage(void){	usage_format("set", "");	usage_format("set name value", "");	return;}static bool do_config(int argc, char **argv){	if (argc == 1){		view_setup();		return true;	} else if (argc == 3){		if (!strcmp(argv[1], "myipaddr")){			setup->myipaddr = inet_addr(argv[2]);		} else if (!strcmp(argv[1], "destipaddr")){			setup->destipaddr = inet_addr(argv[2]);		} else if (!strcmp(argv[1], "myhaddr")){			void *mac = mac_aton(argv[2]);			if (!mac) goto invalid;			memcpy(setup->myhaddr, mac, 6);			net_set_haddr(setup->myhaddr);		} else if (!strcmp(argv[1], "autoboot")){			strcpy(setup->autoboot, argv[2]);		} else if (!strcmp(argv[1], "kernelname")){			strcpy(setup->kernelname, argv[2]);		} else if (!strcmp(argv[1], "fsname")){			strcpy(setup->fsname, argv[2]);		} else if (!strcmp(argv[1], "delay")){			setup->delay = delay_aton(argv[2]);		} else goto invalid;	} else goto invalid;	save_setup();	return true;invalid :	config_usage();	return false;}static void view_setup(void){	printf(" %-10s : %s\n", "myipaddr", inet_ntoa(setup->myipaddr));	printf(" %-10s : %s\n", "destipaddr", inet_ntoa(setup->destipaddr));	printf(" %-10s : %s\n", "myhaddr", mac_ntoa(setup->myhaddr));	printf(" %-10s : %s\n", "autoboot", setup->autoboot);	printf(" %-10s : %s\n", "kernelname", setup->kernelname);	printf(" %-10s : %s\n", "fsname", setup->fsname);	printf(" %-10s : %d\n", "delay", setup->delay);	return;}extern int flash_write(void *dest, const void *src, uint cnt);extern void save_setup(void){	struct setup_t *s;	s = setup_storeat;	if (s->sid == setup->sid){		flash_write(s, setup, (int)&setup_size);	} else {		assert(" failed : invalid setup id. reboot and try again.\n");		return;	}	return;}volatile P_I2c_RegsT *I2C_regs = (P_I2c_RegsT *)PWR_I2C_REGISTER_BASE;volatile CLKMGR_T *clkMgr = (CLKMGR_T*)CKEN_REGISTER_BASE;volatile OST_T *pOstRegs = (OST_T*)OST_REGISTER_BASE;void OstDelayMilliSeconds (uint32 milliseconds)
{
    uint32    ticks;

    ticks = milliseconds * OST_TICKS_MS;
    OstDelayTicks (ticks);
    return;
}
void OstDelayTicks(uint32 ticks)
{    
    uint32    expireTime, time;

    time = pOstRegs->oscr0;
	expireTime = time + ticks;

    //
    // Check if we wrapped on the expireTime
    // and delay first part until wrap
    //
	if (expireTime < time) 
    {
		while (time < pOstRegs->oscr0);
	}
	while (pOstRegs->oscr0 <= expireTime);
    return;
}BOOL_T I2cTxEmpty(volatile P_I2c_RegsT *I2C_regs)
{
	uint32 temp,timeout=20;
	
	while (timeout--)
	{		
		if( (I2C_regs->isr & ISR_ITE) == ISR_ITE)
		{
			
			I2C_regs->isr |= ISR_ITE;
			return FALSE;
		}		// delay 1 ms here
		OstDelayMilliSeconds(1);
	}

	return TRUE;
}BOOL_T I2CWrite(uint8 theReg, uint8 data)
{
	uint32 reg;
	
	clkMgr->cken |=1<<15 ;

	I2C_regs->pcfr |= 0x40;
			OstDelayMilliSeconds(500);	I2C_regs->icr = 0;
	I2C_regs->icr |= ICR_SCLE;
	I2C_regs->icr |= ICR_IUE;
	I2C_regs->idbr = 0x34<<1; 
	I2C_regs->icr |= (ICR_START | ICR_TB | ICR_SCLE | ICR_IUE );
	I2C_regs->icr &= ~(ICR_STOP | ICR_ALDIE);		if (I2cTxEmpty(I2C_regs) == TRUE)
	{
		printf("I2CWrite:send addr failed! \r\n");
		
	}
	I2C_regs->idbr = theReg;	reg = I2C_regs->icr;
	reg |= (ICR_TB |  ICR_SCLE| ICR_IUE);
	reg &= ~(ICR_STOP | ICR_ALDIE|ICR_START);	
	I2C_regs->icr = reg;	if (I2cTxEmpty(I2C_regs) == TRUE)
	{
		printf("I2CWrite:send addr failed! \r\n");
		
	}	I2C_regs->idbr = data;		reg = I2C_regs->icr;
		
		reg |= (ICR_TB|ICR_STOP);		reg |= ICR_SCLE;
		reg |= ICR_IUE;	
		I2C_regs->icr = reg;		if (I2cTxEmpty(I2C_regs) == TRUE)
		{
			printf("I2CWrite:send data failed! \r\n");
		
		}
	// Clear the STOP bit always
	I2C_regs->icr &= ~ICR_STOP;
}

⌨️ 快捷键说明

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