时间:2015-06-17 来源:

uboot第二阶段分析 【移动开发】

uboot的第二阶段主要是start_armboot函数

{

flashbase + (j - 3) * MAIN_SECT_SIZE;

gd->env_valid = 1;

#ifdef CONFIG_KEYBOARD

上面两行就是现实NADN的大小承接网站前端,下面进入nand_init函数,承接网站前端它在nand.c中定义

#if !defined(ENV_IS_EMBEDDED)//没有定义,html切图报价运行

int interrupt_init (void)

unsigned longflags;

for (i=0; i<CONFIG_NR_DRAM_BANKS; i++) {

#endif

unsigned longreloc_off;/* Relocation Offset */

nand_init_chip(&nand_info[i],

0x2000;

if (inputdev != NULL) {

for (i = 1;

#ifdef CONFIG_AMD_LV800

dev.tstc = serial_tstc;

if ((j == 1) || (j == 2)) {

     i++

}

       &flash_info[0]);

 * (default) and prescaler = 16. Should be 10390

{

 

 

#endif

gd->bd->bi_dram[0].start = PHYS_SDRAM_1;//sdram的开始地址

 

 

return 0;

 

(AMD_MANUFACT & FLASH_VENDMASK) |

这里就是运行相关的函数.关于init_fnc_ptr ,/* configure available RAM banks */

    unsigned charbi_enetaddr[6]; /* Ethernet adress */

ulong flash_init (void)

dev.putc = serial_putc;//添加设备输出字符函数

}

    intbi_baudrate;/* 串口波特率 */

然后就是进入main_loop函数了.

 

size += nand_info[i].size;

device_t *dev = ListGetPtrToItem (devlist, CFG_I2C_SLAVE);

则执行env_nand.c.在这个函数里default_environment是默认参数承接网站前端,这里在 arm_jason.h中定义.

//这里省略的代码就是配置GPIO和时钟相关寄存器,承接网站前端每个处理器的配置不一样

} else {

dev.puts = serial_puts;//添加设备输出字符串函数

int len;

dcache_enable();

if(gd->env_valid == 1) {

S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

setenv (stdio_names[i], manual update of Timer 4 */

s = getenv ("bootcmd");//获取启动内核的命令

所以init_fnc_t **init_fnc_ptr;就表示定义了一个无形参返回值为整型的二级指针.(因为指向指针数组)

经过对nand_init_chip的一系列跟踪可得

timestamp = 0;

ulong reg;

printf ("%s\n", items = ListNumItems (devlist);//设备链表中的设备数目

strcpy (dev.name, "serial");//设备名字为serial(串口)

} env_t;

puts ("NAND:  ");

}

gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));

从宏名字就可以知道,网页切图制作这个函数是将环境变量放在NAND中的.

int env_init(void)

#endif

# endif

#endif

}

gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

const char version_string[] =

gd->jt[XF_get_version] = (void *) get_version;

#if defined(ENV_IS_EMBEDDED)

outputdev = search_device (DEV_FLAGS_OUTPUT, tmp_env1->data, stdio_devices[stderr]->name);

devices_init (); /* get the devices list going. */

 

typedef struct environment_s {

ulong size;

return (0);

unsigned char data[ENV_SIZE]; /* Environment data */

if (!crc1_ok && !crc2_ok)

 

if (len > 0)

 

}

#ifdef CONFIG_AMIGAONEG3SE

所以flash_init函数需要移植

 

 */

 

debug ("### main_loop entered: bootdelay=%d\n\n", bootdelay);

}

#endif

dram_init:在arm_jason.c中定义,psd切图html为给gd赋值sdram大小和开始地址

tmp_env1 = (env_t *) malloc(CFG_ENV_SIZE);

 

//给板子id赋数值

memset (&dev, sizeof (dev));

int bootdelay;

return (0);

 

int i;

timers->TCON = (timers->TCON & ~0x0700000) | 0x500000;

/* Setting environment variables */

#endif

} else {

return (0);

interrupt_init, env_ptr->data, NULL, 0, console_buffer);

{

/* If nothing usable installed, use only the initial console */

env_relocate ();然后就是环境变量重定位,手机网页制作判断nandflash是否有环境参数(jason_arm.h中有#define CFG_ENV_IS_IN_NAND 1),如果有则从nand中读参数,网页切图制作反之从nor中读取

}

/* prescaler for Timer 4 is 16 */

#endif

//这个函数在每个板子的.h文件中定义div+css+js切图, tmp, sizeof (tmp));//从存放环境变量的地方取出baudrate变量,承接网站前端此时没有移动变量到内存psd切图html,若以norflash存放uboot则是从nor中取,psd切图html

}

int i;

/* auto load,

ulong size = 0;

gd->env_valid = 2;

flashbase + 0;

devlist = ListCreate (sizeof (device_t));

flag |= CMD_FLAG_REPEAT;

//在int dram_init (void)函数中初始化了sdram的大小

board_init:在arm_jason.c中从新定义)

memset (flash_info[i].protect, CFG_MAX_FLASH_SECT);

print_size(size,串口返回信息表明不为0

else

display_flash_config (size);//打印norflash的大小

unsigned int size = 0;

}

debug ("### main_loop: bootcmd=\"%s\"\n", crc2_ok = 0;

return (0);

env_get_char = env_get_char_memory;

}

 

puts ("No input devices available!\n");

}

#ifndef CFG_HUSH_PARSER

gd->env_valid = 2;

 

gd->jt[XF_free] = (void *) free;

ulong flashbase = 0;

debug ("U-Boot code: %08lX -> %08lX  BSS: -> %08lX\n",/* initialze baudrate settings */

drv_usbtty_init ();

dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;

crc2_ok = (crc32(0, ENV_SIZE) == tmp_env2->crc);

static int display_banner (void)

eputs ("Cannot initialize the list of devices!\n");

而board_nand_init需要开发者根据板子创建

strcpy (dev.name, "nulldev");

}

 

//初始化串口,div页面这个函数执行完后div+css+js切图, version_string);//打印出第一条语句承接网站前端,uboot的版本,承接网站前端烧写时间

flash_info[i].start[j] =

#if defined(CONFIG_I386) || defined(CONFIG_PPC)

/* Initializes input console */

{

#endif

/* Suppress all output if "silent" mode requested */

函数名本身就是一个指针psd切图html,所以可以用函数名初始化指针数组,承接网页制作最后一个函数指针为NULL用于判断结束.

env_init:根据arm_jason.h中的定义来执行web外包,

lastcommand[0] = 0;//上个命令为空网页切图制作,执行命令情况是将获得的命令赋值给上个命令然后运行上个命令

//设置保护在uboot存放的位置CFG_FLASH_BASE为起始位置,网页切图制作monitor_flash_len 为uboot大小

flash_protect (FLAG_PROTECT_SET, outputdev);//这个函数可以给stdio_devices[stdout]指针赋值

 

/* 4th 32 KB */

然后就是

}

#ifdef CONFIG_SILENT_CONSOLE

puts ("<INTERRUPT>\n");//中断符

 

int cpu_init (void)

 

//所以这个函数就是给gd->bd->bi_baudrate 和gd->baudrate 赋值

char *s;

void env_relocate_spec (void)

}

...

int prev = disable_ctrlc(1); /* disable Control C checking */

/* Initialize the list */

 

if (gd->env_valid == 1)

#define PHYS_FLASH_SIZE 0x00100000 /* 1MB */

 

else if (len == 0)

 

gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, 16) : 0;

//获取GPIO相关寄存器的地址

}//这一个判断就是说nand中有环境参数psd切图html, NULL, 10) : CONFIG_BOOTDELAY;

 

free(env_ptr);

 

//在serial_setbrg ();函数中调用了get_PCLK();函数,div切图排版这个函数在jason_arm目录下的speed.c中定义根据不同芯片 不同.

unsigned longhave_console;//是否有控制台

 

 

 

char tmp[64];

#if 0

/* arch number of s3c2440-Board */

}

init_sequence是一个函数指针数组网页切图制作, forget it */

gd->bd->bi_baudrate = gd->baudrate = (i > 0)

 

int i, _bss_start, *e;

#ifndef CFG_CONSOLE_INFO_QUIET

nand_read(&nand_info[0], &total,

flashbase = PHYS_FLASH_1;//在jaosn_arm.h定义nor的起始地址

debug ("IRQ Stack: %08lx\n", tmp, inputdev);//这个函数可以给stdio_devices[stdin]指针赋值

//上面就是打印标准输出标准输入和标准错误使用的是什么设备

/* both ok - check serial */

}

default_environment_size);//给env_ptr赋环境参数值

int i;

size = flash_init ();//返回norflash的大小

#if defined(CFG_ENV_IS_IN_NAND) /* Environment is in Nand Flash */

gd->env_valid = 1;

else if(tmp_env2->flags > tmp_env1->flags)

      1) *

size += flash_info[i].size;

flash_info[i].start[j] =

 

}

} gd_t;

}

run_command (s, outputdev);//这个函数可以给stdio_devices[stdout]指针赋值

#endif

gd->jt[XF_i2c_write] = (void *) i2c_write;

s = (i > 0) ? tmp : NULL;

}//for循环就是遍历链表来寻找标准输入标准输出标准错误

unsigned long crc; /* CRC32 over data bytes */

#endif /* ! ENV_IS_EMBEDDED */

# ifdef CONFIG_AUTOBOOT_KEYED

 

/* load value for 10 ms timeout */

/*

jumptable_init ();//初始化gd中的jump table中的函数psd切图html,malloc,

panic ("configured too many flash banks!\n");

#endif

return;

# ifndef CFG_HUSH_PARSER

 

return (0);

gd->reloc_off);

这些语句就是在nor中分配LCD的framebuffer缓存区

 

/* use PWM Timer 4 because it has no output */

gd->env_valid = 1;//标志置1

 

 

这个函数就是初始产生中断的各个寄存器网页切图制作,在uboot的cpu/arm920t\s3c24x0\interrupts.c中定义,网页切图制作所以只要是3c24x0系列芯片就不需要修改

(AMD_ID_LV400B & FLASH_TYPEMASK);

 

{

gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");//获取板子的IP地址

hang ();//打印ERROR并终止

flash_protect (FLAG_PROTECT_SET, CFG_ENV_OFFSET_REDUND,

unsigned longbaudrate;//波特率

     (i <= items) && ((inputdev == NULL) || (outputdev == NULL));

 

#ifndef CONFIG_ARM     /* already relocated for current ARM implementation */

typedefstructglobal_data {

    {

{

for (i = 0; i < XF_MAX; i++)

/* both ok - check serial */

if (devlist == NULL) {

int console_init_r (void)

serial_init :在这个函数中会调用serial_setbrg ();然后serial_setbrg ();调用 get_PCLK(); get_PCLK()在jaosn_arm目录下的 speed.c中定义.所以需要根据处理器来移 植speed.c

/* adress of boot parameters */

 

board_nand_select_device(nand_info[nand_curr_device].priv, nand_curr_device);

unsigned longenv_valid;/* Checksum of Environment valid? */

gd->env_valid = 2;

else if(tmp_env1->flags > tmp_env2->flags)

#endif

    ulong        bi_boot_params;/* 启动内核时,psd切图html参数在内存中存放的地址 */

{

//获取时钟相关寄存器的地址.

if (outputdev != NULL) {

flash_info[i].start[j] =

    define PAGE_SIZE 4096

cpu_init,

//当第一次启动uboot时候网页切图制作,nand中并没有环境参数,网页切图制作因此引用下面的函数

{

mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);

total = CFG_ENV_SIZE;//环境变量的空间大小div+css+js切图,需要配置文件定义

#else

#ifdef CONFIG_NETCONSOLE

size += gd->bd->bi_dram[i].size;

timers->TCON = (timers->TCON & ~0x0700000) | 0x600000;

在uboot代码和堆空间下面开辟一个全局变量gd的空间,div+css+js切图大小就是gd_t的大小

total = CFG_ENV_SIZE;

#endif

gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));//gd结构体中bd结构体开辟空间承接网站前端,紧挨着gd

else {

int dram_init (void)

free(tmp_env2);

}

}

drv_nc_init ();

}

//在device.h中定义分别为设备可被用为输出控制台,页面div重构输入控制台psd切图html, FIQ_STACK_START);

gd->jt[XF_get_timer] = (void *) get_timer;

而init_fnc_t 在board.c中有这样定义:typedef int (init_fnc_t) (void);这表明可以用init_fnc_t来命名一个无形参web外包, __FUNCTION__,

 

unsigned char flags; /* active/obsolete flags */

drv_keyboard_init ();

flashbase + 0x8000;

//从上面可以看出div+css+js切图,在设备初始化的时候,div+css+js切图将系统设备serial添加到设备链表中.然后在添加一个空设备在链表中.在console_init_r ()中又将这个serial设备传给标准输入标准输出标准错误.

#if (CONFIG_COMMANDS & CFG_CMD_I2C)

env_ptr = tmp_env2;

 

#endif /* CFG_CMD_I2C */

else if(tmp_env2->flags == 255 && tmp_env1->flags == 0)

/* 1st one is 16 KB */

env_init, *outputdev = NULL;

然后就是

 

tmp_env1 = env_ptr;//env_ptr的类型在environmect.h定义

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)

memset (env_ptr, sizeof(env_t));//

所以在jason_arm.h中需要定义如下宏

 

if (gd->flags & GD_FLG_SILENT)

 

if ((dev->flags & DEV_FLAGS_OUTPUT) && (outputdev == NULL)) {

board_init, crc2_ok = 0;

#else

void**jt;/* jump table */

if (timer_load_val == 0)

..........

if (j == 3) {

(AMD_ID_LV800B & FLASH_TYPEMASK);

device_register (&dev);//注册设备

/* Initializes output console first */

gd->env_valid = 1;

#elif defined(CONFIG_AMD_LV800)

unsigned longenv_addr;/* 环境变量的地址*/

 

if(!crc1_ok && !crc2_ok)//在第一次启动时nand中并没有数据网页切图制作, flag);//运行命令

//在刚把uboot镜像烧到nor中时 此时

经过上面的三个函数后div+css+js切图,环境参数被就明确了.具体是如果nand中没有参数,网页重构报价则使用nor中自带的承接网站前端, using default environment”,如果在启动之后执行saveenv命令,psd切图html则此时环境参数被保存在nand中了web外包,则就从nand取数据,div切图排版

 

 

crc2_ok = (crc32(0, ENV_SIZE) == tmp_env2->crc);

 

printf("%lu MiB\n", tmp_env1->data,先不介绍

else if (gd->env_valid == 2)

unsigned charvfd_type;/* display type */

 

printf ("%s\n", stdio_devices[stdout]->name);

 

gd->env_valid = 2;

puts ("Err:   ");

if (stdio_devices[stderr] == NULL) {

else if(tmp_env2->flags == 255 && tmp_env1->flags == 0)

return 0;

 

#ifdef CONFIG_DRIVER_CS8900

#ifdef CFG_DEVICE_NULLDEV///为防止设备列表中什么设备都没有,psd切图html注册一个空设备???

gd->env_valid = 1;

console_init_f,/* serial communications setup */

env_relocate_spec ();//运行这个函数

puts ("*** Warning - bad CRC or NAND,

{

return (0);

timers->TCFG0 = 0x0f00;

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)

 

    struct environment_s       *bi_env;

 

env_t *tmp_env1, };

#ifdef CONFIG_USB_TTY

int rc = 1;

tmp_env2 = (env_t *)((ulong)env_ptr + CFG_ENV_SIZE);

 

s = getenv ("bootdelay");//获取延迟的时间

if (j <= 3) {

size = lcd_setmem (addr);

#if defined(CONFIG_AMD_LV400)//如果jason_arm.h中定义了则执行

for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {

 

{

int devices_init (void)

ulong total;

static int display_dram_config (void)

 

#error "Unknown flash configured"

void main_loop (void)

gd->jt[XF_simple_strtoul] = (void *) simple_strtoul;

 

DEBUGF ("%s[%d] malloced ENV at %p\n",__LINE__, &flash_info[0]);

dev.tstc = nulldev_input;

env_t *tmp_env1, *tmp_env2;

env_init函数在多个文件内部都有定义.但是在每个文件开始位置都有一个预编译,手机网页制作来根据配置文件来决定是否来编译.

 

 

#ifdef CONFIG_LOGBUFFER//没有定义

 

}

outputdev = dev;

 * for 10 ms clock period @ PCLK with 4 bit divider = 1/2

#endif

#endif

然后

return (0);

len = readline (CFG_PROMPT);//从串口读取数据网页切图制作,/* say that we are here */

#else

for (j = 0; j < flash_info[i].sector_count; j++) {

}

: CONFIG_BAUDRATE;

点击次数:29614
作者:
web前端行业资讯
Web new NewsList
谷歌发布Tacotron2:能更简单地训练AI学习演讲 ,,2017年12月21日TensorFlow漏洞爆发背后:关于AI安全我们的傻与天真 ,,2017年12月21日Android端Edge浏览器新版发布:常规性能优化和BUG修复 ,,2017年12月21日三星开发出全球最小的DRAM芯片技术领先优势扩大 ,,2017年12月21日腾讯绝艺AI下一步将学习AlphaGozero自对弈训练 ,,2017年12月21日Facebook社交VR应用Spaces扩大覆盖面:入驻HTCVive ,,2017年12月21日设计图曝光:三星双屏折叠手机原来是这样的 ,,2017年12月21日微信支付和支付宝已成为世界移动支付的"老师" ,,2017年12月21日新专利表明FaceID未来有望装备在iPad、MacBook和iMac等设备 ,,2017年12月21日首批九个建议加入EE4J的项目 ,,2017年12月21日这就是SurfacePhone?微软可折叠手机概念图曝光 ,,2017年12月21日继“Angel”开源后,腾讯又开放TDinsight机器学习平台 ,,2017年12月21日谷歌母公司研发“闪光”网络技术无需铺设线缆 ,,2017年12月21日微软投资5千万美元利用人工智能对抗气候变化 ,,2017年12月21日谷歌中国2017:面向开发者的1年AI先行的1年 ,,2017年12月21日GreenKey加入Symphony软件基金会,将开源语音软件 ,,2017年12月21日腾讯发现者揭秘:怎么应对TensorFlow的安全风险,修复有多难 ,,2017年12月21日清华新成立两大交叉研究机构探索智能与未来 ,,2017年12月21日微软将AI融入生产力工具和搜索引擎与其它巨头竞争 ,,2017年12月21日Gfycat将利用机器学习技术创建高分辨率GIF动图 ,,2017年12月21日安全软件公司Avast开源化机器码反编译器RetDec ,,2017年12月21日谷歌开源TFGAN,让训练和评估GAN变得更加简单 ,,2017年12月21日社区对模块化不感兴趣时隔三周经典版FedoraServer27发布 ,,2017年12月21日Windows10加入OpenSSH客户端 ,,2017年12月21日FirefoxQuantum发布一个月安装量1.7亿 ,,2017年12月21日吴恩达宣布创业新项目已与富士康达成战略合作 ,,2017年12月21日Scala入门系列(十二):隐式转换2017年12月20日speedment入门教程2017年12月20日SLAM入门笔记(1):特征点的匹配2017年12月20日深入浅出了解frame和bounds2017年12月20日HDU1385:MinimumTransportCost【Floyd】 【编程语言】2015年08月24日php中session_unset与session_destroy的区别分析2014年01月29日C语言概述【编程语言】2015年07月14日飘逸的python-使用图像匹配SIFT算法进行LOGO检测 【编程语言】2014年12月01日收集学习asp.net比较完整的面向对象开发流程2014年01月29日(译)第二部分:什么是merge? 【Web前端】2015年05月11日如何让搜索引擎爱上你的网站?2014年01月28日渗透测试之DNS暴力破解fierce教程 【互联网】2015年04月13日javascript中DOM本质及操作2014年01月28日windows中apache301页面跳转实现方法2014年01月30日【CCF】ISBN号码 【编程语言】2015年09月19日hunnu-11546--Sumoff(x)【编程语言】2015年06月11日Android中的Button自定义点击效果实例代码2014年01月30日阿里云远程如何访问mysql 【综合】2015年05月15日WindowsApp开发之集成设置、帮助、搜索和共享 【互联网】2015年07月29日vmware安装mac10.9.3 【编程语言】2014年11月04日hdoj-2066-一个人的旅行(迪杰斯特拉)【云计算】2015年07月22日拓扑排序 【移动开发】2015年08月05日JWPlayer网页媒体播放利器播放视音频 【编程语言】2015年02月02日新手学JAVA(四)----装箱与拆箱 【架构设计】2015年05月05日由document.body和document.documentElement想到的2014年01月29日对于刚接触iOS开发,Xcode6的部分疑惑2015年02月02日【优波尔】JavaScript的笔记(1)简介用法输出语法【综合】2015年06月01日LinkedList学习示例模拟堆栈与队列数据结构2014年01月30日【数据结构】散列表【Web前端】2015年05月25日学习YUI.Ext第六天--关于树TreePanel(Part1)2014年01月29日x210v3开发板u-boot-2012.10移植之九---运行阵地转移,赶紧把BL2扔到内存 【移动开发】2015年06月17日STK10.1.3【综合】2015年03月16日SQLServe数据库到DB2连接服务器的实现过程全解2014年01月28日为什么你只是个码农 【移动开发】2015年07月23日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)