Bootloader通常称为系统的引导程åºï¼Œæ˜¯ç³»ç»ŸåŠ 电或å¤ä½åŽæ‰§è¡Œçš„第一段代ç ï¼»1]。一般他åªåœ¨ç³»ç»Ÿå¯åŠ¨æ—¶è¿è¡Œéžå¸¸çŸçš„时间,但对于嵌入å¼ç³»ç»Ÿæ¥è¯´ï¼Œè¿™æ˜¯ä¸€ä¸ªéžå¸¸é‡è¦çš„系统组æˆéƒ¨åˆ†ã€‚通过这段å°ç¨‹åºï¼Œå¯ä»¥åˆå§‹åŒ–硬件设备ã€å»ºç«‹å†…å˜ç©ºé—´çš„æ˜ å°„å›¾ï¼Œä»Žè€Œå°†ç³»ç»Ÿçš„è½¯ç¡¬ä»¶çŽ¯å¢ƒå¸¦åˆ°ä¸€ä¸ªåˆé€‚的状æ€ï¼Œä»¥ä¾¿ä¸ºè°ƒç”¨æ“ä½œç³»ç»Ÿå†…æ ¸å‡†å¤‡å¥½æ£ç¡®çš„环境,并åŒæ—¶æ供基本输入ã€è¾“出系统监控功能和程åºè°ƒè¯•åŠŸèƒ½ã€‚ä¸åŒçš„CPU有ä¸åŒçš„Bootloader,å³ä½¿ä»–们是基于åŒä¸€ç§CPU而构建的,è¦æƒ³è®©å…¶è¿è¡Œåœ¨ä¸€å—ç›®æ ‡æ¿ä¸Šçš„BOOtloader程åºä¹Ÿèƒ½è¿è¡Œåœ¨å¦ä¸€å—ç›®æ ‡æ¿ä¸Šï¼Œé€šå¸¸ä¹Ÿéƒ½éœ€è¦ä¿®æ”¹ä¸Žç›®æ ‡ç¡¬ä»¶ç›¸å…³çš„代ç ã€‚å› æ¤æœ‰å¿…è¦åˆ†æžBootloader,并ç†è§£å’Œæ‰¾å‡ºå…¶ä¸çš„原ç†å’Œè§„律,就其特定的嵌入å¼ç³»ç»Ÿï¼Œç§»æ¤å¹¶èƒ½å¤Ÿè¿è¡Œå…¶ä¸Šçš„Bootloader。
1 系统硬件平å°ç®€ä»‹
本系统采用的是SamSungå…¬å¸çš„S3C2410处ç†å™¨ï¼»2],他是专门为移动手æŒè®¾å¤‡æ供的高性价比和高性能的嵌入å¼å¾®å¤„ç†å™¨è§£å†³æ–¹æ¡ˆã€‚å…¶å†…æ ¸æ˜¯ARM920T,最高能工作在202.8 MHz,为了å‡å°‘系统总æˆæœ¬å’Œå‡å°‘外围器件,他集æˆäº†å¦‚下部件:分别为16 kB指令和数æ®Cahceã€1个LCD控制器ã€SDRAM控制器ã€NANDFLASH控制器ã€3通é“UARTã€4通é“DMAã€4个具有PwM功能的计时器和1个内部时钟ã€8通é“10ä½ADCã€è§¦æ‘¸å±æŽ¥å£ã€I2S总线接å£ï¼Œ2个L1SB主机接å£ã€1个L]SB设备接å£ï¼Œ2个SPI接å£ã€SDå’ŒMMCå¡æŽ¥å£ã€çœ‹é—¨ç‹—定时器ã€117ä½é€šç”¨Iï¼Oå£ã€24ä½å¤–部ä¸æ–æºã€8通é“10ä½Aï¼D控制器ç‰ã€‚本文涉åŠçš„S3C2410å¼€å‘æ¿çš„硬件结构如图1所示。本文主è¦é˜è¿°ä»ŽNorflash引导æ“作系统è¦å®Œæˆçš„主è¦ä»»åŠ¡å’Œå®žçŽ°æ–¹æ³•ï¼Œè‡³äºŽä»ŽNandflash引导æ“作系统,ä¸æ‰“算介ç»ã€‚
2å˜å‚¨ç©ºé—´åˆ†å¸ƒå’Œæ˜ 射图 硬件平å°çš„Norflash(åž‹å·æ˜¯ï¼šAM29LV160DBï¼»3ï¼½)空间为2 MB(Ox00000000~Ox001FFFFF),SDRAM(åž‹å·æ˜¯ï¼šHY57V561620_1_,32 M×2)空间为64 M(Ox30000000~Ox33FFFFFF),采用如图2所示的å˜å‚¨ç©ºé—´åˆ†å¸ƒå›¾ï¼Žæ ¹æ®ç³»ç»Ÿè®¾è®¡éœ€è¦ï¼Œä¹Ÿå¯ä»¥ä¿®æ”¹å…¶ä¸ä¸€äº›åœ°å€å€¼ï¼Œä½¿å˜å‚¨ç©ºé—´å¸ƒå±€æ›´é€‚åˆè®¾è®¡ç›®çš„。
3 Bootloader的设计æµç¨‹ Bootloader引导程åºæ˜¯ç¡¬ä»¶ä¸Šç”µå¤ä½åŽé¦–å…ˆè¿è¡Œçš„代ç ,由他æ¥åŠ 载嵌入å¼æ“作系统。然åŽç”±æ“作系统接管整个系统,进行进程管ç†ã€å†…å˜ç®¡ç†ã€ç£ç›˜ç®¡ç†å’Œå„个外设管ç†ç‰å·¥ä½œã€‚BootLoader是æ“ä½œç³»ç»Ÿå†…æ ¸è¿è¡Œä¹‹å‰çš„一段自举程åºï¼Œç”¨æ¥åˆå§‹åŒ–硬件设备ã€æ”¹å˜å¤„ç†å™¨è¿è¡Œæ¨¡å¼å’Œé‡ç»„ä¸æ–å‘é‡ï¼Œå»ºç«‹å†…å˜ç©ºé—´çš„æ˜ å°„å›¾ï¼Œå°†ç³»ç»Ÿçš„è½¯ç¡¬ä»¶çŽ¯å¢ƒå¸¦åˆ°ä¸€ä¸ªç”±ç”¨æˆ·å®šåˆ¶çš„ç‰¹å®šçŠ¶æ€ï¼Œç„¶åŽåŠ è½½æ“ä½œç³»ç»Ÿå†…æ ¸ã€‚ä»Žæ“作系统的角度æ¥çœ‹ï¼ŒBootloaderçš„æ€»ç›®æ ‡å°±æ˜¯æ£ç¡®åœ°è°ƒç”¨å†…æ ¸æ¥æ‰§è¡Œã€‚Bootloader一般分为stagelå’Œstage2两大部分[5],对于ä¾èµ–CPU体系结构的代ç ,比如设备åˆå§‹åŒ–代ç ç‰ï¼Œé€šå¸¸éƒ½æ”¾åœ¨stagelä¸ï¼Œè€Œä¸”通常用汇编è¯è¨€æ¥å®žçŽ°ï¼Œä»¥è¾¾åˆ°çŸå°ç²¾æ‚的目的,也就是å¯åŠ¨ä»£ç 。而stage2则通常用Cè¯è¨€æ¥å®žçŽ°ï¼Œè¿™æ ·å¯ä»¥å®žçŽ°å¤æ‚的功能,而且代ç 会具有更好的å¯è¯»æ€§å’Œå¯ç§»æ¤æ€§ã€‚
3.1 Bootloader的stagel
这部分代ç 必须首先完æˆä¸€äº›åŸºæœ¬çš„硬件åˆå§‹åŒ–。为stage2的执行以åŠéšåŽçš„å†…æ ¸çš„æ‰§è¡Œå‡†å¤‡å¥½ä¸€äº›åŸºæœ¬çš„ç¡¬ä»¶çŽ¯å¢ƒã€‚Bootloadei。的stagel一般通用的内容包括:
(1)设置ä¸æ–和异常å‘é‡ï¼›
(2)ç¦æ¢çœ‹é—¨ç‹—ï¼›
(3)å±è”½æ‰€æœ‰çš„ä¸æ–,在Boot Loader的执行全过程ä¸å¯ä»¥ä¸å¿…å“应任何ä¸æ–,ä¸æ–å±è”½å¯ä»¥é€šè¿‡å†™CPUçš„ä¸æ–å±è”½å¯„å˜å™¨æˆ–状æ€å¯„å˜å™¨CPSR寄å˜å™¨æ¥å®Œæˆï¼›
(4)设置CPU的速度和时钟频率;
(5)对RAM进行åˆå§‹åŒ–,包括æ£ç¡®è®¾ç½®ç³»ç»Ÿçš„内å˜æŽ§åˆ¶å™¨çš„功能寄å˜å™¨ç‰ï¼›
(6)åˆå§‹åŒ–LED或UART,通过GPIO驱动LED,也å¯ä»¥é€šè¿‡åˆå§‹åŒ–UARTå‘串å£æ‰“å°Bootloader的调试信æ¯æ¥è¡¨æ˜Žç³»ç»Ÿçš„状æ€æ˜¯OK还是ERROR,以便跟踪系统è¿è¡Œæƒ…况;
(7)å…³é—CPU内部指令ï¼æ•°æ®é«˜é€Ÿç¼“å˜(Cache)ï¼›
(8)ä¸ºåŠ è½½Bootloaderçš„stage2准备RAM空间;
(9)è®¾ç½®å¥½å †æ ˆï¼›
(10)跳转到stage2çš„Cå…¥å£ç‚¹ï¼Œå…¶æµç¨‹å›¾å¦‚图3所示。
3.2 Bootloaderçš„stage2 为了让程åºè·³å…¥Cè¯è¨€çš„"main'函数,这里采用直接跳转到"main'函数的方法,实现代ç 如下: b Main进入main函数åŽå³å¯ä»¥å¼€å§‹æœ¬é˜¶æ®µstage2çš„åˆå§‹åŒ–任务,这包括:
(1)如果stagel没有åˆå§‹åŒ–UART,这时候至少åˆå§‹åŒ–一个串å£ï¼Œä»¥ä¾¿å’Œç»ˆç«¯ç”¨æˆ·è¿›è¡Œäº¤äº’,当然也å¯ä»¥ç»§ç»ç‚¹äº®æˆ–熄çLEDæ¥åˆ¤æ–程åºæ‰§è¡Œæƒ…况;
(2)修改时钟频率;
(3)使能指令Cache;
(4)从串å£ä¸æ‰“å°ä¸€äº›å¿…è¦çš„交互信æ¯ï¼Œäº†è§£ç³»ç»ŸçŠ¶æ€ï¼›
(5)åˆå§‹åŒ–ä¸æ–,包括å±è”½ä¸æ–,清除ä¸æ–æ‚¬æŒ‚æ ‡å¿—ï¼Œåˆå§‹åŒ–ä¸æ–å‘é‡è¡¨ï¼Œæ³¨å†Œéœ€è¦çš„ä¸æ–处ç†å‡½æ•°ç‰ï¼Œ (6)打å°ç‰ˆæœ¬ã€æ—¶é—´ç‰ä¿¡æ¯ï¼Œå¹¶ä»ŽNorflashå¤åˆ¶å†…æ ¸åˆ°SDRAMä¸ï¼Œå½“然也å¯ä»¥ä¿®æ”¹æŒ‡é’ˆï¼Œè·³åˆ°å†…æ ¸å›ºåŒ–åœ¨FLASHä¸çš„首地å€å¤„,将控制æƒäº¤ç»™æ“作系统,开始在FLASHä¸é€å¥æ‰§è¡Œå†…æ ¸è‡ªå¸¦çš„å¼•å¯¼ç¨‹åºï¼Œç”±è¯¥å¼•å¯¼ç¨‹åºå®Œæˆå†…æ ¸çš„åŠ è½½å·¥ä½œã€‚å¾ˆæ˜Žæ˜¾ï¼Œè®¿é—®é€Ÿåº¦è¾ƒæ…¢ï¼›
(7)ä¿®æ”¹æŒ‡é’ˆï¼Œç›´æŽ¥è·³åˆ°å†…æ ¸åœ¨SDRAMä¸çš„首地å€å¤„。至æ¤ï¼Œå®Œæˆäº†Bootloader的全部è¿è¡ŒåŠ 载工作。
下é¢æ˜¯main()函数和从Norflashå¤åˆ¶å†…æ ¸åˆ°SDRAMä¸çš„ReadImageFã€romNorFlash()函数的具体实现,但çœç•¥äº†ä¸€äº›å…·ä½“细节。
4试验结果 由于本试验æ¿çš„Norflash是挂接在S3C2410çš„bankO地å€ä¸Šï¼Œå› æ¤ï¼ŒFLASH是从0x0地å€å¼€å§‹çš„,而且Bootload-er必须烧写在FLASH的开始处。系统æ¯æ¬¡ä¸Šç”µæˆ–å¤ä½åŽï¼Œé¦–先开始è¿è¡Œçš„就是Bootloader使用ADS1.2集æˆå¼€å‘环境建立BootlOaderåº”ç”¨å·¥ç¨‹ï¼Œæ·»åŠ å¿…éœ€çš„æ–‡ä»¶å¹¶è®¾ç½®å¥½ç¼–è¯‘çŽ¯å¢ƒï¼Œè°ƒè¯•å¹¶æœ€åŽç”Ÿæˆå¯æ‰§è¡ŒäºŒè¿›åˆ¶æ–‡ä»¶ï¼Œé€šè¿‡JTAG接å£æŠŠBootloader烧写到NOrrlashçš„OxO地å€å¤„,把æ“作系统烧写到0x10000地å€å¼€å§‹å¤„,å¯åŠ¨ç³»ç»Ÿè¿è¡ŒåŽçš„结果如图4所示,该程åºç”¨äºŽåŸºäºŽÎ¼COSæ“作系统的图åƒé‡‡é›†ç³»ç»Ÿçš„引导,使用结果表明,这是一ç§ç®€å•å¯è¡Œçš„方法。
5 结 è¯ Bootloader的设计与实现是一个éžå¸¸å¤æ‚的过程,一个好的Bootloaderå¯ä»¥å¤§å¤§å¢žå¼ºç³»ç»Ÿçš„稳定性,æ高系统的实时性。本文设计的Bootloader完æˆçš„主è¦åŠŸèƒ½åŒ…括:试验æ¿ç¡¬ä»¶çš„åˆå§‹åŒ–ã€ä¸²å£åˆå§‹åŒ–ã€æ—¶é’Ÿé¢‘率修改以åŠä»ŽNorfIasllå¤åˆ¶æ“作系统到SDRAMä¸è¿è¡Œç‰ï¼Œå¹¶é€šè¿‡PC机上的超级终端显示了æ£ç¡®çš„å¯åŠ¨è¿è¡Œä¿¡æ¯ï¼Œä¸”å¯æ‰§è¡Œä»£ç åªæœ‰3 kå·¦å³ã€‚å› æ¤ï¼Œæœ¬æ–‡æ‰€è¯¦ç»†æ述的:Bootloaderå¯åŠ¨è¿è¡Œçš„全过程,对设计和移æ¤åˆ°å…¶ä»–类型的嵌入å¼ç³»ç»Ÿæœ‰ä¸€å®šçš„å‚考价值。
|