📄 setup.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 + -