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å¯åЍè¿è¡Œçš„全过程,对设计和移æ¤åˆ°å…¶ä»–类型的嵌入å¼ç³»ç»Ÿæœ‰ä¸€å®šçš„å‚考价值。
|