S3c44B0在uClinux的移植步骤
- 格式:pdf
- 大小:20.70 KB
- 文档页数:4
Blob在S3C44B0上的移植摘要:Bootloader是嵌入式系统软件开发的第一个环节,它紧密地将软硬件衔接在一起,对于一个嵌入式设备后续的软件开发至关重要。
Blob 是一款功能强大的Bootloader,S3C44B0是三星公司一款基于ARM7TDMI的嵌入式通用处理器。
本文详细介绍Blob在基于S3C44B0的开发板上的运行原理与移植过程。
关键词:S3C44B0 Blob Bootloader 移值Bootloader对于嵌入式设备来说至关重要,它涉及到许多硬件相关的知识。
对于自制的嵌入式开发板,它又是不可跳过的步骤,所以很多人对于它感到很头痛。
本文将以一款优秀的Bootloader Blob为例,详细讲解它的运行原理以及在S3C44B0通用处理器上的移植过程,为在嵌入式设备上的后续软件开发打下基础。
1 Blob简介Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。
它遵循GPL,源泉代码完全开放。
Blob既可以用来简单的调试,也可以启动Linux kernel。
Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART (Linux Advanced Radio Terminal)的板子写的,该板使用的处理器是StrongARM SA-1100。
现在Blob已经被移植到了很多CPU上,包括S3C44B0。
MBA44B0是一款基于S3C44B0的开发板。
本文将以运行在MBA44B0开发板上的Blob的源代码为基础,再针对自己的开发板进行Blob的移植。
开发板的主要配置为:*三星ARM7处理器S3C44B0;*2MB的Flash,地址范围0x0000 0000~0x0020 0000;*8MB的SDRAM,地址范围0x0c00 0000~0x0c80 0000;*1个串口,2个LED灯;*JTAG接口;*晶振为6MHz,系统主频为60MHz。
合肥学院嵌入式系统设计实验报告(20 13 - 20 14 第 2 学期)专业:实验项目:BootLoader移植实验实验时间:2014年5月19日实验成员:____________________________________________________________________指导老师:电子信息与电气工程系2014 年 4 月制实验三BootLoader 移植实验一、实验目的1、熟悉 Bootloader 工作原理。
2、了解 U-Boot 的代码结构。
3、掌握 U-Boot 移植过程。
二、实验内容本实验熟悉 Bootloader 工作原理,了解 U-Boot 源码结构,基于 S3C2440 处理器,完成 U-Boot 移植,并在目标开发板上测试通过。
三、实验设备硬件: 1、 pc 机2、 FriendlyARM开发套件即MIRCO2440 核心板软件: 1、虚拟机( VMware )2、U-Boot 源码( u-boot-2011.03.tar )四、实验过程1、 Micro2440配置在mini2440/micro2440上的移植准备工作,我们仍然将开发板文件建立在board/samsung 下,2、配置时出现错误,字体要修改,复制粘贴的时候出现的错误,有的地方有中文,去掉就行了。
3、编译完成失败,只有上网查找错误,最后解决了错误。
11124、编译完成后将u-boot.bin下载到SDRAM的 0x33f80000地址处, u-boot已经能在RAM中运行。
二、支持DM90001、编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处。
三、支持内核启动1、编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处。
四、支持Nand Flash1、编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处。
五、实验小结本实验需要熟悉Bootloader 工作原理,了解U-Boot 源码结构,基于S3C2440 处理器,完成 U-Boot 移植,并在目标开发板上测试通过,首先可以看到实验指导书上的介绍,了解U-Boot 的移植。
关于三星S3C44B0X目标板的uClinux Bootloader 是为控制领域设计的操作系统,它沿袭了主流Linux的大部分特性,并举行了一定幅度的裁减。
其设计主要针对没有内存管理单元(MMU)的微处理器,例如基于7TDMI内核的S3C44B0X。
嵌入式Linux系统通常由三部份组成:Bootloader、Kernel和File System。
其中Bootloader是在系统启动之后、Kernel运行之前所执行的第一段代码,其任务是为调用Kernel预备须要的软硬件环境。
由此可见,Bootloader是十分依靠于硬件和操作系统的。
所谓依靠于硬件,是指Bootloader的实现与处理器体系架构和板级硬件资源疏远相关;所谓依靠于操作系统,是指不同操作系统的内核对调用方式和运行环境有不同的要求。
理论上,uClinux在引导时并非一定需要一个自立于Kernel Image的Bootloader Image。
然而将Bootloader与Kernel分开设计能够使软件架构越发清楚,也有助于灵便地支持多种引导方式,实现须要的辅助功能。
uClinux Bootloader的主要任务可概括如下:●引导和初始化●加载uClinux Kernel●设置内核启动参数●调用uClinux Kernel●辅助功能:文件下载、Flash烧写、人机界面等对于常见架构的处理器,普通都能找到现成的Bootloader,但其结构往往较为复杂,且仍需要针对详细的目标板举行移植。
固然,也可以挑选自行开发Bootloader。
因为Bootloader Image在物理上自立于Kernel Image,因此不一定尾随Linux选用GNU作为开发工具。
对于ARM处理器,彻低可以用法ADS或RVDS等集成环境来开发Bootloader。
1.引导和初始化1.1 硬件初始化阶段一第1页共7页。
UCGUI在44BO上的移植在网络上看到已经有不少人把UCGUI成功移植到44BO上了不过他们只提供了他们的演示程序而公开他们的移植方法过程这里我把我的移植过程写写希望对各位有帮助我们采用的是思创嵌入式开发网研发的S3C44B0黄金开发板及其液晶显示模块我的移植分两个大部分来做的一是液晶的正确初始化二是UCGUI移植原本应该包括触控屏的移植可是因为IAR下的中断一直没有调通就没有做触控屏的移植我的液晶是320240 16灰度的跟44BO的连接方式是4位单扫描一液晶的正确初始化液晶的初始化可以参照下面的函数最后得到显示缓冲区数组跟视窗屏幕的对应关系如下事实上液晶的正确初始化就是需要明确显示缓冲区跟视窗屏幕的对应关系为了达到这个目的可是通过单步调试逐个显示点来观察这种对应关系在上图中那就是这样一个顺序Bmp[0]=0xF000;//点0Bmp[0]=0xFF00;//点0 1Bmp[0]=0xFFF0;//点01 2Bmp[0]=0xFFFF;//点012 3单步执行查看液晶屏上显示点的位置这样就可以确定对应关系了这44BO中的液晶控制寄存器中有BSWP这个设置位它是用于调整每4个字节的字节顺序的也是通过单步调试来明确这种对应关系的#define SCR_XSIZE (320)//视窗屏幕大小#define SCR_YSIZE (240)#define LCD_XSIZE (320)//液晶屏幕大小#define LCD_YSIZE (240)#define MVAL_USED (0)#define MVAL (13)#define INVCLK (0)#define INVFRAME (0)#define INVLINE (0)#define CLKVAL_SL (8) //VCLK=MCLK/(CLKVAL*2) (CLKVAL >= 2)#define M5D(n) ((n) & 0x1fffff)#define ARRAY_SIZE_G16 (SCR_XSIZE*SCR_YSIZE)unsigned short Bmp[ARRAY_SIZE_G16/2];//液晶显示缓冲数组#define CLKVAL_G16 (10) //40Mhz, CLKVAL=10 ->101HzHOZVAL(LCD_XSIZE/4-1)#define(LCD_YSIZE-1)#defineLINEVALMVAL (13)#defineBSWP (1)//这个决定了每4个字节的顺序是否进行交换#define#define MODESEL (2)//Gray 16void LcdInit(void){//The following value has to be changed for better display.rDITHMODE=0x12210;//rDITHMODE=0x0;rDP1_2 =0xa5a5;=0xba5da65;rDP4_7=0xa5a5f;rDP3_5rDP2_3=0xd6b;=0xeb7b5ed;rDP5_7rDP3_4=0x7dbe;=0x7ebdf;rDP4_5=0x7fdfbfe;rDP6_7rLCDCON1 = (0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_G16<<12);// disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2 = (LINEVAL)|(HOZVAL<<10)|(10<<21);//LINEBLANK=10 (without any calculation)rLCDSADDR1 = (MODESEL<<27) | ( ((uint)Bmp>>22)<<21 ) | M5D((uint)Bmp>>1);// 16-gray, LCDBANK, LCDBASEUrLCDSADDR2 = (BSWP<<29)|M5D((((uint)Bmp+(SCR_XSIZE*LCD_YSIZE/2))>>1))|(MVAL<<21);rLCDSADDR3 = (LCD_XSIZE/4) | ( ((SCR_XSIZE-LCD_XSIZE)/4)<<9 );rLCDCON1 = (1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_G16<<12);}二UCGUI的移植移植的思路是使用UCGUI支持的buffer型的LCD控制器EPSON 1375我想就是这样一个使用双口RAM的LCD 控制器吧因为我注意到UCGUI的代码中若是使用1375控制器时需要定义四个读写函数#define LCD_READ_MEM(Off) *((U16*) (0xc00000+(((U32)(Off))<<1)))#define LCD_WRITE_MEM(Off,data) *((U16*) (0xc00000+(((U32)(Off))<<1)))=data#define LCD_READ_REG(Off) *((volatile U16*)(0xc1ffe0+(((U16)(Off))<<1)))#define LCD_WRITE_REG(Off,data) *((volatile U16*)(0xc1ffe0+(((U16)(Off))<<1)))=data前两个是读写内存的定义后两个是读写寄存器的定义注意到常数0xc00000和0xc1ffe0没有0xc00000是1375控制器的显示缓冲区开始地址(Base Address)0xc1ffe0是1375控制器的寄存器开始地址(Base Address)读写显示缓冲区就是根据地址偏移off和开始地址0xc00000来读写Buffer的读写控制寄存器就是根据地址偏移off和开始地址0xc1ffe0来读写Buffer的我想可以使用欺骗的一招我们把我们液晶的显示缓冲区的开始地址(Bmp[0])告诉这几个函数那么就可以了而读写寄存器的两个函数我们就不用了等我移植完毕我发现网络上的其它移植版本也是如此使用了1375控制器的了不信看看他们提供的演示DOME显示的液晶控制器是不是EPSON 13705在LCD.H中定义数据类型#define I8 signed char#define U8 unsigned char /* unsigned 8 bits. */#define I16 signed short /* signed 16 bits. */#define U16 unsigned short /* unsigned 16 bits. */#define I32 signed long /* signed 32 bits. */#define U32 unsigned long /* unsigned 32 bits. */#define I16P I16 /* signed 16 bits OR MORE ! */#define U16P U16 /* unsigned 16 bits OR MORE ! */在LCDConf.H中定义#define LCD_XSIZE (320) /* X-resolution of LCD, Logical coor. */#define LCD_YSIZE (240) /* Y-resolution of LCD, Logical coor. */#define LCD_BITSPERPIXEL (4) //16灰度#define LCD_CONTROLLER 1375extern unsigned short Bmp[]; //引入显示缓冲区数组#define LCD_READ_MEM(Off) *((U16*) (Bmp+(((U32)(Off)))))#define LCD_WRITE_MEM(Off,data) *((U16*) (Bmp+(((U32)(Off)))))=data//#define LCD_READ_REG(Off) //这个函数可以不用定义反正我们没有用到#define LCD_WRITE_REG(Off,data) //有些地方用到了定义为空避免做大改动#define LCD_SWAP_BYTE_ORDER (1) //这个是做字节转换的在LCD13XX.C中定义液晶总线宽度#ifndef LCD_BUSWIDTH#define LCD_BUSWIDTH (16)#endif这里提及关键对应部分->定义显示缓冲区时使用的short数据类型,它是16bit的:unsigned short Bmp[ARRAY_SIZE_G16/2];//液晶显示缓冲数组->定义读写缓冲区时使用的数据类型,也是16bit的U16:#define LCD_READ_MEM(Off) *((U16*) (Bmp+(((U32)(Off)))))#define LCD_WRITE_MEM(Off,data) *((U16*) (Bmp+(((U32)(Off)))))=data//#define LCD_READ_REG(Off) //这个函数可以不用定义反正我们没有用到#define LCD_WRITE_REG(Off,data) //有些地方用到了定义为空避免做大改动 ->定义液晶总线宽度定义位16bit的#ifndef LCD_BUSWIDTH#define LCD_BUSWIDTH (16)#endif->定义字节顺序#define LCD_SWAP_BYTE_ORDER (1) //16bit时需要交换的读者已经能看到了对应关系了都是使用16bit的数据类型这是关键别用错了由此延伸若是把这些对应关系换成8bit的数据类型如下->定义显示缓冲区时使用的char数据类型,它是8bit的:unsigned char Bmp[ARRAY_SIZE_G16];//液晶显示缓冲数组->定义读写缓冲区时使用的数据类型,也是8bit的U8:#define LCD_READ_MEM(Off) *((U8*) (Bmp+(((U32)(Off)))))#define LCD_WRITE_MEM(Off,data) *((U8*) (Bmp+(((U32)(Off)))))=data//#define LCD_READ_REG(Off) //这个函数可以不用定义反正我们没有用到#define LCD_WRITE_REG(Off,data) //有些地方用到了定义为空避免做大改动 ->定义液晶总线宽度定义位8bit的#ifndef LCD_BUSWIDTH#define LCD_BUSWIDTH (8)#endif->定义字节顺序#define LCD_SWAP_BYTE_ORDER (0) //8bit时不需要交换的这样的对应关系也是可行的我测试过不过若是你想把它换成32bit的话就不行了因为UCGUI不支持32bit 的液晶总线宽度的以上两部分是整个移植工作的关键当然还有一些繁琐的事情请阅读UCGUI的手册中Getting Started一章在IAR下移植时需要建立group对照文件夹加入UCGUI代码需要说明的是除了LCDDriver下只加入LCD13XX.C在Config下额外加入GUI_X.C外其余的都是加入相应文件夹中的所有C文件我还额外加入了跟开发板有关的文件:LCDLIB.C(液晶的初始化函数LcdInit())Platform.C(板级初始化函数它会调用LcdInit()来初始化液晶控制器)设置include路径:我加入的inclide路径为D:\Program Files\IAR Systems\UCGUI\gui\core\D:\Program Files\IAR Systems\UCGUI\Config\D:\Program Files\IAR Systems\UCGUI\gui\WM\D:\Program Files\IAR Systems\UCGUI\gui\Widget\D:\Program Files\IAR Systems\UCGUI\Sample\GUIDemo\在GUIConf.H中定义#define GUI_OS (0) /* Compile with multitasking support */#define GUI_WINSUPPORT (1) /* Use window manager if true (1) */#define GUI_SUPPORT_MEMDEV (1) /* Support memory devices */#define GUI_SUPPORT_TOUCH (0) /* Support a touch screen (req. win-manager) */#define GUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */我们还没有移植到OS上也没有加入触摸屏的支持在GUI_X.C中定义三个未定义的函数void GUI_X_Log (const char *s) {}void GUI_X_Warn (const char *s) {}void GUI_X_ErrorOut(const char *s) {}修改一个函数定义void GUI_X_Delay(int ms) {// int tEnd = OS_TimeMS + ms;// while ((tEnd - OS_TimeMS) > 0);extern void Delay(int time);//我自己的延时函数Delay(150*ms);}原因是在UCGUI的应用中有一些函数是跟时间相关的UCGUI认为使用的是UCOS UCOS会维护时间OS_TimeMS;这里我调用我自己的延迟程序来实现延迟事实上正是因为有一些函数跟时间有关因此在UCGUI提供的演示程序中就出现了问题例如在GUIDEMO_Speed.C中有这么个循环for (i = 0; (((t + 8000) - (int)GUI_GetTime()) > 0) && !GUIDEMO_CheckCancel(); i++) {}它调用了GUI_GetTime读取当前系统时间来控制循环若是系统没有维护时间OS_TimeMS那就会出问题了我的简单解决方法是改为for (i = 0;i<0xFFF;i++){}在其它的GUIDEMO_XXXX.C中也有这样一些循环你要是调试是发现液晶屏上的显示一直停在一个画面上很久的话估计就是碰上了上面的问题好了加入那个最简单的主函数Basic_Helloworld.Cvoid BoardInit (void);void main(void) {/*ToDo: Make sure hardware is initilized first!!*/BoardInit ();//板级初始化它调用了LcdInit()GUI_Init();GUI_DispString("Hello world!");while(1);}应该能在你的液晶屏上看到UCGUI跟你打招呼的了"Hello world!"这样UCGUI的移植基本上已经完成了当然了这里只提供了移植关键的部分更多的更完整的移植还需要做不少的工作如触控屏的移植键盘鼠标的移植中文字体的移植UCGUI支持UNICODE中文字体不成大问题的还有DEBUG输出的移植不难吧直接输出到串口不久可以了嘛若是在做UCGUI的移植前你的系统已经使用同一个编译环境移植了UCOS那么UCGUI的演示效果将是更好的原因就是由于UCGUI中有一些跟时间相关的调用――liandaolycld@。
硬件其实可以根据你的配置在BIOS中设置好,当然用自启动版可以在解压缩前设置好。
在好几个坛子上面看到大家对uC的讨论热火朝天,但差不多都是基于4510开发板的,而基于44B0的好象很少,并且不象4510的那样成熟和清晰。
可能和4510主要是网络应用有关吧,它可以充分利用uC的网络功能。
如果在44B0上加入uC,也可以体验一下这个操作系统,再加入往卡驱动的话,也能实现网络哦!记得以前在ARM开发论坛看到一位高人写过在44B0的uC上加网卡驱动的文章,想做这个的兄弟可以去找找。
我手头有4510和44B0的板子各一块,4510是代博的,上面带的uC挺好用。
于是想在44B0上也跑跑uC,两周前我调通了8019后觉得条件差不多了,因为uC的IMAGE.RAM是非压缩的,有1M多,调试的时候如果不用到网络下载的话会很慢,即使用串口调到115.2K也要几分钟时间,而且可靠性也较低,所以有网卡芯片是移植的一个重要条件,当然有USB通讯的话也很快,不过我的板那块坏了,并考虑到以后会用到网络,还是用8019吧。
从我有板开始我就一直找可用于44B0的uC,并下载过TPU兄的源文件,上次看到TPU兄的留言可帮忙移植就马上留言联系,后来通过一封MAIL好象就没消息了,只好自己摸索着做做,所以我的移植过程可能存在很多不对的地方,大家一起参考修正.开始我想跑跑TPU的ZIMAGE,这是一个压缩后的文件,运行时需要自解压,查到它的起始运行地址是0XC300 000,KENERL运行地址是0XC008000,用自己的BIOS将数据DOWN到设定地,再RUN,运行出现结果了,开始是些乱码,调了一下串口速率,在38400,显示UCOMPRESS KERNEL...不过到START KERNEL后,再没下文了,于是用AXD反汇编调试,发现是因为进入KERNEL后没找到PROCESSER ID而停掉,可能是要在BIOS中传递过去。
后来想到一个办法,把我现在在4510板上跑的uC改动后移植到44B0上,在那一版上大家对uC的应用都做得比较熟了,编起来也比较方便。
通过U-Boot实现基于S3C44B0X的uClinux移植
王丽伟;杨厚俊;范延滨
【期刊名称】《南京师范大学学报(工程技术版)》
【年(卷),期】2008(008)004
【摘要】在嵌入式系统开发中,为了加快应用程序以及设备驱动的开发周期,需要建立一个完备的嵌入式操作系统.首先,建立U-Boot引导程序是必不可少的.在U-Boot引导程序为操作系统内核准备好环境之后,利用它实现了uClinux基于
S3C44B0开发的移植.最后,从板级移植的角度,结合硬件平台结构系统地分析和讲解了移植过程.
【总页数】6页(P150-154,172)
【作者】王丽伟;杨厚俊;范延滨
【作者单位】青岛大学信息工程学院,山东,青岛,266071;青岛大学信息工程学院,山东,青岛,266071;青岛大学信息工程学院,山东,青岛,266071
【正文语种】中文
【中图分类】TP316
【相关文献】
1.基于S3C44B0X的U-Boot及μClinux的移植分析 [J], 郭建磊;杨厚俊
2.基于S3C44B0X的U-Boot的分析与移植 [J], 杨虹;徐超强;李杨
3.基于S3C44B0X处理器的U-BOOT的设计与实现 [J], 李兴霞
4.基于恒丰锐科S3C44B0X的U-BOOT启动流程分析 [J], 王璐鑫
5.U-BOOT在基于S3C44B0X系统板上的移植 [J], 袁进刚;高清维;翟寄文;程蒲
因版权原因,仅展示原文概要,查看原文内容请购买。
基于ARM7的uClinux移植1.引言随着计算机技术的发展,嵌入式系统已不仅仅属于计算机领域的一个研究热点,在电子、工业控制、航空航天等领域都有广泛的应用。
嵌入式设备应用广泛,几乎包括了我们周围的所有电器设备:PDA、手机、机顶盒、汽车、微波炉、自动取款机等。
和通用计算不同的是嵌入式系统针对的是具体的专用系统,一般也都具有成本和空间的敏感性,它的硬件和软件都必须高效率的设计。
在航空航天、医疗等特殊应用领域还要求做到很高的安全可靠性。
嵌入式系统还可以根据任务灵活的增减软硬件。
uClinux在官方网站()中有源代码提供,同时也有文档说明所支持的体系结构。
结合实际的应用,在众多的体系结构中选择一种。
下面介绍一下在移植uClinux中会遇到的一些关键问题。
(1)交叉编译环境的建立移植uClinux必须有一台PC机,安装了Linux操作系统。
同时还要有一块测试板,测试板的体系结构uClinux必须支持。
对于不同体系结构,GNU都提供了相应的开发软件包。
这可以到网上查找,有些是源代码包,下载后要经过GCC的编译才能应用;有些是应用程序包,安装后即可使用。
安装完了工具包后,Linux中就有了基于该体系结构的编译器,链接器,调试器以及一些实用小工具,例如反汇编,反编译等,以后编译uClinux内核,制作文件系统都要依赖交叉编译系统。
(2)uCli nux的内核加载方式的问题uClinux的内核有两种可选的运行方式:可以在Flash上直接运行,也可以加载到内存中运行。
前者可以减少内存需要。
Flash运行方式:把内核的可执行映像文件烧到Flash上,系统启动时从Flash的某个地址开始逐句执行。
这种方法实际上是很多嵌入式系统采用的方法。
内核加载方式:把内核的压缩文件存放在Flash上,系统启动时读取压缩文件在内存里解压,然后开始执行,这种方式相对复杂一些,但是运行速度可能更快(RAM的存取速率要比Flash高)。
S3c44B0在uClinux中需要修改的文件一.内核基本文件的修改 1.uClinux-Samsung\vendors\Samsung\S3C44B0
“config.linux-2.4.x”这个是linux内核编译配置选项文件。
# System Type
#
# CONFIG_ARCH_DSC21 is not set
# CONFIG_ARCH_CNXT is not set
# CONFIG_ARCH_SWARM is not set
#CONFIG_ARCH_SAMSUNG=y
CONFIG_ARCH_MBA44B0=y
# CONFIG_ARCH_ATMEL is not set
CONFIG_NO_PGT_CACHE=y
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
CONFIG_CPU_ARM710=y
CONFIG_CPU_WITH_CACHE=y
# CONFIG_CPU_WITH_MCR_INSTRUCTION is not set
CONFIG_SERIAL_44B0=y
#CONFIG_SET_MEM_SAMSUNG=y
DRAM_BASE=0x0c000000 #SDRAM起始是地址
DRAM_SIZE=0x01000000 #SDRAM大小16M
FLASH_MEM_BASE=0x00000000 #FLASH起始地址
FLASH_SIZE=0x00200000 #FLASH大小2M
#
# General setup
以后的make都以CONFIG_ARCH_S3C44B0=y这选项来解决是编译和S3C44B0相关的其他选项。
2.arch/armnommu/Makefie:
ifeq ($(CONFIG_ARCH_S3C44B0),y)
TEXTADDR = 0x0c008000
MACHINE = s3c44b0
endif
TEXTADDR = 0x0c008000表明未压缩的内核的位置
3.arch/armnommu/boot/Makefie:
ifeq ($(CONFIG_ARCH_S3C44B0),y)
ZRELADDR = 0x0c008000
ZTEXTADDR = 0x0c300000
endif
ZRELADDR = 0x0c008000表明未压缩的内核的位置
ZTEXTADDR = 0x0c300000表明压缩内核的位置
4.include/asm-armnommu//proc-armv/system.h
#ifdef CONFIG_ARCH_S3C44B0
#undef vectors_base()
#define vectors_base() (0x0c000008)
#endif
5.arch/armnommu/mach-s3c44b0/arch.c
MACHINE_START(MBA44B0, "S3C44B0")
MAINTAINER("Mac Wang")
BOOT_MEM(0x0c000000, 0x01c00000, 0x01c00000)
BOOT_PARAMS(0x0c000100)
INITIRQ(genarch_init_irq)
MACHINE_END
其中MACHINE_START(MBA44B0, "S3C44B0")的“MBA44B0”是在asm/mach-types.h 里定义的平台类型BOOT_MEM(0x0c000000, 0x01c00000, 0x01c00000)指定了启动的RAM 地址0x0c000000,特殊功能寄存器地址0x01c00000,BOOT_PARAMS(0x0c000100) 表示内核参数的传递地址。
6.arch/armnommu/tools/Match-types
s3c44b0 ARCH_S3C44B0 S3C44B0 178
178是arch_number
在跳转到内核时,r0=0,r1=arch_number,
7./driver/net/ne.c
dev->base_addr = base_addr = NE2000_ADDR;
dev->irq = NE2000_IRQ_VECTOR;
NE2000_ADDR和NE2000_IRQ_VECTOR分别是RTL8019AS的I/O起始地址和中断向量号,根据硬件连接改成相应的值。
ne_probe1中wordlength=2代表数据宽度为16位,改为wordlength=1代表数据宽度为8位。
二.内核和romfs联系的两种方式
1 使用inird技术,在加载内核前传递参数
static void setup_initrd_tag(void)
{
/* an ATAG_INITRD node tells the kernel where the compressed
* ramdisk can be found. ATAG_RDIMG is a better name, actually.
*/
params->hdr.tag = A TAG_INITRD;
params->hdr.size = tag_size(tag_initrd);
params->u.initrd.start = RAMDISK_RAM_BASE;
params->u.initrd.size = RAMDISK_FLASH_LEN;//k byte
params = tag_next(params);
}
此时initrd的第一个初始化文件为linuxrc,这种方式下romfs根目录下需包含linuxrc。
2 用block memory技术
(make menuconfig时选定romfs 和rom disk support)
driver/block/Blkmem.c
arena[] = {
#ifdef CONFIG_ARCH_S3C44B0
{0, 0x0CC00000, -1},
#endif这样只要将romfs加载到相应的地址0x0CC00000,内核就可以找到。
3 整合kernel和romfs
在调试好内核和ROMFS之后,可以将两个文件整合起来
char romfs_data[];
arena[] = {
#ifdef CONFIG_ARCH_ S3C44B0
{0, romfs_data, -1},
#endif
将romfs.img 转换成romfs.o文件与内核编译在一起,
arch/armnommu/Vmlinux-armv.lds.in
*(.got) /* Global offset table */
romfs_data = .;
romfs.o
romfs_data_end = .;
这样在压缩内核时,romfs和kernel都能被压缩。
以上只是一种实现方法,只要掌握了原理,可以根据自己的需要修改。
在相关的地方必须保持内核和BOOTLOADER一致才行。