MiniGUI在S3C2440上的移植及软件开发
- 格式:pdf
- 大小:250.73 KB
- 文档页数:4
首先:在汇编中初始化堆栈,中断向量表,MMU,时钟,串口等,然后跳到C语言的Main 函数。
这部分代码小于4K,放在block0。
这个Main函数用来将第二段代码拷备到DRAM 中并执行。
其次:进入第二段代码。
第二段代码也是先在汇编中初始化堆栈,中断向量表等,然后跳到C语言的Main函数。
这部分代码就不用有4K限制了,具体大小由第一段代码决定,因为它本身由第一段代码来搬运。
这个Main函数用来显示开机图片以及进度条。
然后视串口接收信息运行带有USB下载NK的Eboot或是读取NK映像,启动WINCE系统。
最后:进入第三段代码。
这段代码用于通过USB将PC上的NK.nb0或NK.bin文件下载进NANDFLASH并运行。
可见,扬创公司光bootloader就分成了三个部分,即3个bin文件组成。
然后分别将这三段二进制代码下载进分别从block0,block2,block8(block12)开始的三块。
具体烧写手段采用老掉牙的giveio烧写,就是曾经大名鼎鼎的SJF2440了,相信不少嵌入式高手都用过,哈哈。
如果不小心将bootloader弄丢了,再重烧一片,得等上好几分钟,足够你到外面跑上几千米再回来这么长了。
尽管如此,我们的扬创公司仍然拿他们的代码当宝,死活不肯开源。
要知道对于买你们板子的人,都是来学习的呀!学习嵌入式系统,bootloader是最基础也是进入嵌入式行业的敲门砖,没有了代码,无疑给学习添加了很大的麻烦,而扬创官方回答却是:用户开发产品用不着修改bootloader.我看扬创没开发过东西,不了解行情。
不说这么多废话了,说多了无益,让我们一起来揭开bootloader的神秘的面纱吧!先说下我移植的bootloader的功能,以及烧录时间,和扬创的做下对比。
第一次下载bootloader到NANDFLASH的方法:方法一:通过扬创的老掉牙的方法,先在ADS1.2里面生成bootloader.bin文件,然后用SJF2440烧写工具,配合giveio将BIN文件烧写进从block0开始的块。
学校代码:11059学号:0705075032Hefei University毕业论文(设计)BACHELOR DISSERT A TIO N论文题目:基于S3C2440的QT移植与编程实现学位类别:工学学士学科专业:自动化作者姓名:黄静导师姓名:干开峰完成时间: 2012年5月基于S3C2440的QT移植与编程实现中文摘要随着计算机技术和信息网络技术的飞速发展,嵌入式系统的应用越来越广泛,而嵌入式产品以其小巧、使用方便、实用等特点越来越受到人们的青睐。
特别是近几年来,嵌入式产品越来越多的被应用于各个领域,如国防、工业控制、通信、办公自动化和消费电子领域等。
图形用户界面是嵌入式系统软件开发的重要内容,基于Linux内核开发实用、高效、美观的GUI是目前研究的一个重要课题。
本课题研究了基于Linux的典型嵌入式图形界面支持系统Qt,基于嵌入式Linux操作系统和S3C2440硬件平台,完成Qt开发环境搭建和Qt相关平台移植,最后完成应用程序编程实例实现,并将应用程序成功移植到GT2440开发板上,测试结果证实该程序运行稳定,性能良好。
关键词:嵌入式系统;QT;嵌入式linux;S3C2440Transplantation and programming of QT based on S3C2440AbstractThis paper introduces the QT / Embedded linux embedded system development environment to establish and transplant. Through a lot of source code analysis, build Qt / development environment in the linux host and s3c2410 transplant, and then on the QT / E programs.Qt / Embedded is Trolltech launched Linux-based embedded platform development tools, embedded version of Qt. It inherits the Qt's standard APIs, provide a more compact than Xlib and XWindows window generation system FrameBuffer direct operations (see Figure 1). The fully modular design and efficient build system to reduce memory consumption, these Qt / Embedded as the embedded environment, powerful and comprehensive GUI development tools. KDE and other projects using Qt as the support library, so many Qt-based X-Windows program can be easily ported to Qt / Embedded version. Qt / Embedded with the advantages of object-oriented, cross-platform and interface design, convenient and aesthetic, have been widely used.KEY WORD: Embedded ;Transplant And Program; Qt/Embedded;linux;S3C2440第一章前言 (4)1.1 嵌入式系统概述 (4)1.2 图形开发 .............................. 错误!未定义书签。
一、Uboot移植前的准备1、修改makefile、配置文件在配置文件之前,需要修改makeflie相关内容:修改如下:(1)修改编译器,这里我们的makefile已经设置为arm-linux-无需再修改,如下所示:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-Endif(2)添加fl2440的配置项,如下所示:fl2440_config:unconfig@$(MKCONFIG) $(@:_config=) arm arm920t fl2440 step s3c24x0注意:在添加的fl2440_config的第二行,必须以Table开头,不能有任何多余的符号,否则极易导致编译错误。
Uboot支持多种处理器和平台,在编译uboot之前需要对其进行配置,使其支持我们自己的开发平台。
在执行编译make之前,需要进行配置即make fl2440_config。
通过查看顶层目录的makeflie文件,通过以下语句:MKCONFIG := $(SRCTREE)/mkconfig得出实际执行的命令为:./mkconfig fl2440 arm arm920t fl2440 step s3c24x0执行完这句后,产生如下结果:(1)开发板名称为fl2440;(2)将include中的头文件连接到同平台相关的头文件中,这里的连接为:asm->asm-armarch->arch-s3c24x0proc->proc-armv(3)创建顶层Makefile包含的文件inclued/config.mk,该文件内容如下ARCH = armCPU = arm920tBOARD = fl2440VENDOR = stepSOC = s3c24x0(4)创建开发板相关头文件include/config.h,该文件中包含了对开发板的相关配置,如下所示:#include <configs/fl2440.h>从上面可以知道,在将uboot配置为适合自己的平台的时候,需要在路径/include/configs下添加配置头文件fl2440.h。
s3c2440嵌入式开发平台操作系统和驱动开发文档目录一前言 (3)二s3c2440嵌入式开发平台介绍 (3)2.1硬件配置: (3)2.2 s3c2440嵌入式开发平台移植的系统软件 (4)2.3 s3c2440嵌入式开发平台特点: (4)三基于s3c2440的bootloader开发和应用 (7)3.1 Bootloader及u-boot简介 (7)3.2 u-boot系统启动流程 (7)3.3 s3c2440开发平台的u-boot移植 (8)3.4 常用uboot命令介绍 (10)四 4.2操作系统简介 (12)4.1 嵌入式系统 (12)4.2 嵌入式操作系统与Windows CE (12)4.3 从操作系统角度看Windows 的主要功能 (13)4.4 从开发角度看Windows 的主要功能 (13)4.5 Windows 操作系统模型 (14)五开发平台Platform Builder 4.2简介 (16)5.1 PB的安装步骤 (16)5.2 Plarform Builder文件夹结构 (20)六S3C2440嵌入式开发平台的WINCE开发流程 (22)6.1 安装Platform Builder 4.2 (22)6.2 安装Embeded Visual C++ (22)6.3 选择BSP (22)6.4 PB下WINCE的开发、定制 (23)七基于s3c2440的WINCE驱动开发 (33)7.1 wince驱动模型 (33)7.2 2440一个驱动程序示例:基于WinCE的I2C驱动程序设计 (42)八基于2440的嵌入式应用程序开发以及加载至内核 (45)8.1 主流嵌入式开发软件介绍 (45)8.2 基于s3c2440嵌入式开发平台的EVC开发 (46)8.3 把应用程序加入到WINCE内核 (49)8.4 一些EVC下实用的WIN32函数 (50)8.5 EVC下的调试工具 (52)九实现永久保存注册表数据 (53)十Windows CE 下应用程序自动启动 (54)10.1建立快捷方式 (54)10.2 修改shell.reg文件 (55)十一开机后直接运行您的程序而不显示Windows CE桌面 (56)附录一flash.c (57)附录二dm9000.c (69)附录三smdk2440nand.h (74)一前言本开发文档是基于s3c2440嵌入式开发平台所制定,主要从s3c2440的bootloader开发、应用以及windows 4.2在该平台的移植、基于本平台的驱动开发介绍以及基于该平台的一些开发技巧。
基于S3C2440的嵌入式Linux内核移植及字符设备驱动开发胡祖宝;董国通【期刊名称】《工业控制计算机》【年(卷),期】2015(028)012【摘要】It is important to port kernel system and code driver when applying Linux kernel in a special embedded plat-form.In this work,the embedded platform has been adopted Linux 2.6.22.6 system based onS3C2440 processor.The archi-tecture of Linux kernel is described in detail,and kernel system has been ported successfully in thispaper.Meanwhile,the root filesystem has been established.Furthermore,a character device driver is built as wel.%嵌入式平台多种多样,在一个特定的嵌入式系统应用Linux内核,需要内核的移植和驱动的开发.基于S3C2440芯片的嵌入式开发平台,操作系统选用Linux2.6.22.6版本,分析了Linux内核的体系结构,完成了内核移植过程,构建了根文件系统,对字符设备驱动程序进行了设计与开发.实验证明该方法可行,系统运行可靠.【总页数】3页(P14-15,18)【作者】胡祖宝;董国通【作者单位】上海宝信软件股份有限公司,上海 201203;上海大学机电工程与自动化学院,上海 200072【正文语种】中文【相关文献】1.基于嵌入式Linux的字符设备驱动开发 [J], 王科;姚振东2.基于S3C2440 Codec通道的视频驱动开发 [J], 崔小川;马田;李玉超3.基于ARM的嵌入式Linux字符设备驱动设计研究 [J], 梁金宏;叶海蓉;孙世菊4.基于DSP的嵌入式Linux内核移植的研究与实现 [J], 王晓东5.基于嵌入式Linux内核移植设备驱动的微喷自动装置 [J], 王慧;张璐因版权原因,仅展示原文概要,查看原文内容请购买。
S3C2440完全开发流程作者:dreamer2006@2009-11-3 一.简介 (3)二.建立开发环境 (4)1、编译器ARM-LINUX-GCC-3.4.1 (4)2、J FLASH-S3C2440:S3C2440芯片的JTAG工具 (4)3、安装GDB调试工具 (5)4、USB下载工具 (6)5、UBUNTU开发环境建立 (6)三.S3C2440基础实验 (8)1、实验一:LED_ON (8)2、实验二:LED_ON_C (9)3、实验三:I/O PORTS (11)5、实验五:MEMORY CONTROLLER (15)6、实验六:NAND FLASH CONTROLLER (17)7、实验七:UART (20)8、实验八:PRINTF、SCANF (23)9、实验九:INTERRUPT CONTROLLER (24)10、实验十:TIMER (28)11、实验十一:MMU (31)12、实验十二:CLOCK (39)四.BOOTLOADER VIVI (43)1、阶段1:ARCH/S3C2440/HEAD.S (43)2、阶段2:INIT/MAIN.C (45)1)、Step 1:reset_handler() (45)2)、Step 2:board_init() (46)3)、Step 3:建立页表和启动MMU (47)4)、Step 4:heap_init() (50)5)、Step 5:mtd_dev_init() (52)6)、Step 6:init_priv_data() (56)7)、Step 7:misc()和init_builtin_cmds() (57)8)、Step 8:boot_or_vivi() (58)五.附录一VI命令解释 (65)1、HELP命令 (65)2、MEM命令 (65)3、LOAD命令 (66)4、PARAM命令 (67)5、PART命令 (69)6、BOOT命令 (70)7、BON命令 (71)一.简介本书面向由传统51单片机转向ARM嵌入式开发的硬件工程师、由硬件转嵌入式软件开发的工程师、没有嵌入式开发经验的软件工程师,本书开发板基于天嵌科技的TQ S3C2440开发板,其官方网站为:/,共分9个部分:1、开发环境建立2、S3C2440功能部件介绍与实验(含实验代码)3、Bootloader vivi详细注释4、Linux移植5、Linux驱动6、Yaffs文件系统详解7、调试工具8、GUI开发简介9、UC/OS移植通过学习第二部分,即可了解基于ARM CPU的嵌入式开发所需要的外围器件及其接口。
工 业 技 术DOI:10.16661/ki.1672-3791.2019.10.053嵌入式s3c2410下MiniGUI移植与实现蒋若鸿(桂林优利特医疗电子有限公司 广西桂林 541004)摘 要:当前嵌入式系统被广泛应用于工业领域和家用领域,且随着嵌入式系统的不断发展,用户对嵌入式系统的要求也越来越高,因此实现与用户交流功能的嵌入式GUI成为嵌入式研究领域中的一个重点。
该文详细描述了MiniGUI系统基于s3c2410开发板的移植与实现,内容包括交叉编译环境的建立、MiniGUI编译选项的配置和修改、启动项参数的设置以及交叉编译MiniGUI应用程序等。
关键词:s3c2410 MiniGUI 移植中图分类号:TP273 文献标识码:A 文章编号:1672-3791(2019)04(a)-0053-02MiniGUI是目前比较常见的几种GUI系统之一,与其他的GUI相比,MiniGUI最显著的特点是:(1)小巧轻型、占用资源少,稳定性高,可移植性好。
(2)拥有丰富的控件资源,包括静态框控件、按钮控件、编辑框控件、列表框控件、进度条控件、滑块控件、组合框控件、工具栏控件等。
(3)支持拼音输入法和五笔输入法。
(4)支持消息传递机制。
(5)支持JPG、PNG和BMP等图像文件。
1 MiniGUI的移植Samsung公司的s3c2410开发板,平台硬件系统为64MB Nandflash、2MB Norflash、64MB SDRAM。
s3c2410开发板通过USB口、串口、网口与宿主机通信,图形图像处理通过LCD显示。
把MiniGUI移植到s3c2410开发板的步骤:(1)安装交叉编译器和设置交叉编译器环境;(2)使用编译器CC对MiniGUI进行交叉编译,获得可在s3c2410上运行的库;(3)在s3c2410开发板的文件系统中添加交叉编译的MiniGUI 库;(4)编译MiniGUI可执行程序,并下载到s3c2410开发板上。
嵌入式课程设计基于S3C2440的串口传输及其界面设计姓名班级学号指导老师目录第一章绪论 (2)第二章 MiniGUI 在PC机上的安装 (3)2.1 移植源代码准备 (3)2.2 移植基本内容 (3)2.3 测试 (5)第三章 MiniGUI 在ARM上的移植 (5)3.1 移植基本内容 (6)3.2 测试 (8)第四章 MiniGUI串口传输界面设计 (9)4.1 MiniGUI设计知识介绍 (9)4.2 串口传输知识介绍 (10)4.3 设计方法及整体框架 (11)4.4 重要程序解析 (11)第五章程序调试 (12)5.1 发送部分调试及结果 (12)5.2 接受部分调试及结果 (12)第六章设计总结及改进 (13)6.1 设计总结 (14)6.2 设计改进 (14)第七章心得体会 (15)第八章参考文献 (16)第九章附录 (17)第一章绪论近几年,随着嵌入式系统的日益发展和32位嵌入式处理器以及图形显示设备的广泛应用,目标产品对GUI(图形用户界面)的需求越来越多。
由于嵌入式系统一般实时性要求很高,所以嵌入式系统下的GUI需要具有轻量级型、占用资源少、高性能等特点。
此外,嵌入式系统往往是一种定制设备,它对GUI的需求各不相同,因此,GUI必须也可以定制。
而MiniGUI是一个非常适合实时嵌入式产品的高效、可靠、可定制、小巧灵活的图形用户界面支持系统,被广泛的应用于高端科技产品中。
利用MiniGUI开发出良好的人机交互界面已成为嵌入式开发中的迫切需求。
MiniGUI 是嵌入式系统的高级图形系统。
为嵌入式软件的开发提供了完整的图形系统支持,是全球针对嵌入式 Linux仅有的两个商用嵌入式GUI系统之一。
MiniGUI还为嵌入式Linux 系统提供了完整的多进程支持;可以 MiniGUI-Processes、MiniGUI-Threads或者MiniGUI-Standalone 三种运行模式运行。
S3C2440uboot2010.06LCD驱动移植手册十四、添加LCD驱动和LOGO制作1、在drivers/video目录中新增s3c2440_fb.c,代码如下:#include#if defined(CONFIG_VIDEO_S3C2440)#include#include "videomodes.h"#include#include/** Export Graphic Device*/GraphicDevice smi;#define VIDEO_MEM_SIZE 0x200000#define MVAL (0)#define MVAL_USED (0) //0=each frame 1=rate by MVAL#define INVVDEN (1) //0=normal 1=inverted#define BSWP (0) //Byte swap control#define HWSWP (1) //Half word swap control#define VBPD (12)#define VFPD (4)#define VSPW (10)#define HBPD (43)#define HFPD (8)#define HSPW (1)#define CLKVAL_TFT (4)void lcd_enable(void){struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();gpio->GPGUP = gpio->GPGUP & ((~(1 << 4)) | (1 << 4));gpio->GPGCON = gpio->GPGCON & ((~( 3 << 8)) | ( 3 << 8));gpio->GPGDAT = gpio->GPGDAT | (1 << 4 );lcd->LCDCON5 = lcd->LCDCON5 & ((~( 1 << 3)) | (1 << 3)); // PWREN lcd->LCDCON5 = lcd->LCDCON5 & ((~( 1 << 5)) | (0 << 5)); // INVPWREN lcd->LCDCON1 |= 1;gpio->GPBUP = gpio->GPBUP & ((~(1 << 1)) | (1 << 1));gpio->GPBCON = gpio->GPBCON & ((~( 3 << 2)) | ( 3 << 2));gpio->GPBDAT = gpio->GPBDAT | (1 << 1 );/************************************************************** ******************* Init video chip with common Linux graphic modes (lilo)*/void *video_hw_init (void){struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();GraphicDevice *pGD = (GraphicDevice *)&smiint videomode;int bppmode;unsigned long t1, hsynch, vsynch;char *penv;int tmp, i, bits_per_pixel;struct ctfb_res_modes *res_mode;struct ctfb_res_modes var_mode;tmp = 0;videomode = CONFIG_SYS_DEFAULT_VIDEO_MODE;/* get video mode via environment */if ((penv = getenv ("videomode")) != NULL) {/* deceide if it is a string */if (penv[0] <= '9') {videomode = (int) simple_strtoul (penv, NULL, 16);tmp = 1;}}else{tmp = 1;}if (tmp) {/* parameter are vesa modes *//* search params */for (i = 0; i < VESA_MODES_COUNT; i++) {if (vesa_modes[i].vesanr == videomode)break;}if (i == VESA_MODES_COUNT) {printf ("no VESA Mode found, switching to mode 0x%x ", CONFIG_SYS_DEFAULT_VIDEO_MODE);i = 0;res_mode = (struct ctfb_res_modes *) &res_mode_init[vesa_modes[i].resindex];bits_per_pixel = vesa_modes[i].bits_per_pixel;}else{res_mode = (struct ctfb_res_modes *) &var_mode;bits_per_pixel = video_get_params (res_mode, penv);}/* calculate hsynch and vsynch freq (info only) */t1 = (res_mode->left_margin + res_mode->xres + res_mode->right_margin + res_mode->hsync_le n) / 8;t1 *= 8;t1 *= res_mode->pixclock;t1 /= 1000;hsynch = 1000000000L / t1;t1 *= (res_mode->upper_margin + res_mode->yres + res_mode->lower_margin + res_mode->vsy nc_len);t1 /= 1000;vsynch = 1000000000L / t1;/* fill in Graphic device struct */sprintf (pGD->modeIdent, "%dx%dx%d %ldkHz %ldHz", res_mode->xres, res_mode->yres, bits_pe r_pixel, (hsynch / 1000), (vsynch / 1000));pGD->winSizeX = res_mode->xres;pGD->winSizeY = res_mode->yres;pGD->plnSizeX = res_mode->xres;pGD->plnSizeY = res_mode->yres;switch (bits_per_pixel){case 8:pGD->gdfBytesPP = 1;pGD->gdfIndex = GDF__8BIT_INDEX;bppmode = 11;break;case 16:pGD->gdfBytesPP = 2;pGD->gdfIndex = GDF_16BIT_565RGB;bppmode = 12;break;case 24:pGD->gdfBytesPP = 3;pGD->gdfIndex = GDF_24BIT_888RGB;bppmode = 13;break;}pGD->frameAdrs = LCD_VIDEO_ADDR;pGD->memSize = VIDEO_MEM_SIZE;lcd->LCDCON1 = (CLKVAL_TFT << 8) | (MVAL_USED << 7) | (3 << 5) | (bppmode << 1) | 0;lcd->LCDCON2 = (VBPD << 24) | (pGD->winSizeY-1 << 14) | (VFPD << 6) | (VSPW);lcd->LCDCON3 = (HBPD << 19) | (pGD->winSizeX-1 << 8) | (HFPD);lcd->LCDCON4 = (MVAL << 8) | (HSPW);lcd->LCDCON5 = (1 << 11) | (0 << 10) | (1 << 9) | (1 << 8) | (0 << 7) | (0 << 6) | (1 << 3) | (BSWP < < 1) | (HWSWP);lcd->LCDINTMSK |= (3);lcd->LPCSEL &= (~7);lcd->TPAL = 0x0;writel((pGD->frameAdrs >> 1), &lcd->LCDSADDR1);/* This marks the end of the frame buffer. */writel((((readl(&lcd->LCDSADDR1))&0x1fffff) + (pGD->winSizeX+0) *pGD->winSizeY), &lcd->LCDSA DDR2);writel((pGD->winSizeX & 0x7ff), &lcd->LCDSADDR3);/* Clear video memory */memset((void *)pGD->frameAdrs, 0, pGD->memSize);lcd_enable();return ((void*)&smi);}void video_set_lut (unsigned int index,/* color number */unsigned char r, /* red */unsigned char g, /* green */unsigned char b /* blue */){}#endif /* CONFIG_VIDEO_S3C2440 */修改video目录下Makefile文件COBJS-$(CONFIG_VIDEO_VCXK) += bus_vcxk.oCOBJS-$(CONFIG_VIDEO_S3C24X0) += s3c24x0_fb.o videomodes.o cfb_console.o COBJS := $(COBJS-y)2、修改include/configs/SMDK2440.h,添加下面的宏定义/* LCD settings */#define CONFIG_VIDEO#define CONFIG_VIDEO_S3C2440#define CONFIG_VIDEO_LOGO#define CONFIG_VIDEO_BMP_LOGO#define VIDEO_FB_16BPP_WORD_SWAP#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (800*480+1024+100)#define LCD_VIDEO_ADDR 0x33d00000#define CONFIG_CMD_BMP#define CONFIG_CFB_CONSOLE#define CONFIG_SYS_CONSOLE_INFO_QUIET/* for PC-keyboard */#define VIDEO_KBD_INIT_FCT 0#define VIDEO_TSTC_FCT serial_tstc#define VIDEO_GETC_FCT serial_getc3、修改drivers/video/videomodes.c{0x31A, RES_MODE_1280x1024, 16},{0x31B, RES_MODE_1280x1024, 24},{0x213, RES_MODE_800x480, 16},};RES_MODE_800x480前的数据0x213与前面的不同即可。
u-boot在S3C2440上的移植问题及解决方法集锦(一)一、移植环境∙主机:VMWare6.5--Fedora 9∙开发板:自制开发板CPU:S3C2440;SDRAM:HY57V561620FTP-H;NOR flash:SST_39VF1601(2M);NAND flash:K9F1G08U0B(128M);网卡芯片:DM9000EP∙编译器:arm-linux-gcc-4.3.2∙u-boot:u-boot-2009.08∙linux kernel:linux-2.6.30∙busybox:busybox-1.13.3二、博客地址/liuqiqi677如有错误,欢迎指正。
三、参考资料主要参考了黄刚的博客/u3/101649/,他的博客写得相当不错,将嵌入式开发各个阶段的知识以边做边学的方式,辅以图片、解释,清晰地呈现给读者,能够让读者把握主线,对嵌入式开发有整体的了解。
强烈推荐!!!四、问题及解决方法1、NAND flash(K9F1G08U0B)的寻址方案开始照着黄刚的博客进行u-boot移植,u-boot从NOR flash启动比较顺利,但是从NAND flash启动时,就遇到问题了,u-boot不能完全启动!通过在程序中插入点led灯的方法,将问题定位在了NAND flash的读取函数nand_read_ll中对NAND flash单元进行寻址的几条指令上。
这时,问题大概有眉目了,黄刚所用的开发板是友善之臂的mini2440,上面的NAND flash 的型号是K9F1208,容量为64M,与我所用的芯片不一样。
下面比较一下这两款芯片的寻址方案:图1 K9F1208寻址方案图2 K9F1G08寻址方案黄刚博客中K9F1208的寻址代码是:NFADDR = i & 0xFF;NFADDR = (i >> 9) & 0xFF;NFADDR = (i >> 17) & 0xFF;NFADDR = (i >> 25) & 0xFF;而我的K9F1G08的寻址代码则是:NFADDR = 0;NFADDR = 0;NFADDR = (i >> 11) & 0xFF;NFADDR = (i >> 19) & 0xFF;NFADDR = (i >> 27) & 0xFF;但是,这里又出现三个问题了:(1)K9F1G08的寻址方案只有4个周期,而我的代码却有5个周期;(2)为什么前两个周期我给的值都是0;(3)按照芯片手册,第3-5个周期起,移位操作应该分别为(i >> 12)、(i >> 20)、(i >> 28),那为什么却是上面那样的呢?一开始,我也是挺纳闷的,但是通过查找资料与不断试验,终于弄懂了这些原因。
内核移植09号王萍一:为什么做内核移植?因为硬件的不同才做移植,那么与硬件相关的目录是arch和driver目录Arch目录:内核所支持的每种cpu(处理器,而不是操作系统)体系,在该目录下都有对应的子目录,每个子目录下又分有boot、mm、kernel、还有一些mach开头的目录(是与开发板相关的)Drivers:设备驱动程序Include:内核所需要的头文件,与平台无关的头文件在include/linux下,与平台有关的则放在相应的子目录下二:明白我要移植的目标系统的体系架构我要往mini2440开发板上移植内核,其是ARM9的处理器三:做移植前的准备工作下载linux内核的源代码linux-2.6.37.tar.bz2()工具m kimage(是u-boot生成的,在u-boot下的/tools下。
zImage是编译Linux内核产生的,uImage是u-boot中烧写的内核压缩映象,我们需要先下载测试)四:开始1.解压源代码#tar -jxvflinux-2.6.37.tar.bz2#cd linux-2.6.37最好先执行make distclean(确保我们即将编译的内核代码未经任何修改)2. 修改Makefile(内核根目录下)ARCH ?=arm //体系架构CROSS_COMPILE ?=arm-linux- //这个是交叉编译工具保存退出3. 内核的配置内核配置通常在一个已有的配置文件基础上,通过一定的修改得到新的配置文件,此处我们的配置文件是arch/arm/configs/mini2440_defconfig,所以我们只需要拷贝它到内核根目录下(cp arch/arm/configs/mini2440_defconfig .config)再make menuconfig进行一些配置(自己根据需要进行选择,此时它会使用这个.config),保存修改退出4.编译内核Make(会根据.config里的选中的内容开始编译内核)不出错的话,生成的内核文件在arch/arm/boot5.生成我们要测试的uImage(放到arch/arm/boot下)./mkimage -A arm -T kernel -C none -O linux -a 0x30008000 -e 0x30008040 -d zImage -n 'wp_Linux' uImage将生成的uImage放到windows下五:下载内核测试首先设置dnw的下载地址为0x30008000,然后在u-boot中执行:说明:我的开发板上的u-boot大小为312K的,所以(bootargs,bootcmd)bootargs“noinitrd root=/dev/mtdblock3 init=/linuxrc console=tty0 console=ttySAC0,115200”bootcmd“nand read 0x30008000 0x80000 0x300000;bootm”(从内存启动)#usbslave(在dnw中选择要我的uImage)#bootm(会出现内核启动失败(Kernel panic),出现的原因是没有添加Yaffs驱动)解决方法:a)调整内核中Nand Flash分区(可从nand启动)分区划分在文件arch/arm/mach-s3c2440/mach-mini2440.c中。
S3C2440移植uboot之启动过程概述上节烧写了uboot到开发板,不能运行。
这节我们分析uboot重新编译uboot,由最后一条链接命令开始分析uboot 目录•1.分析start.S•2._start会跳转到start_code处•3.然后进入第一个C数:board_init_f()•4.接下来进入重定位•5.清除bss段下图为编译uboot后显示的最后一条链接命令。
1.分析start.S打开uboot.lds,发现链接地址为0,所以新的uboot只能在nor flash运行。
运行开始文件为start.o。
下面我们分析arch/arm/cpu/arm920t/start.S从start_code开始运行.globl _start //声明_start全局符号,这个符号会被lds链接脚本用到_start:b start_code //跳转到start_code符号处,0x00ldr pc, _undefined_instruction //0x04ldr pc, _software_interrupt //0x08ldr pc, _prefetch_abort //0x0cldr pc, _data_abort //0x10ldr pc, _not_used //0x14ldr pc, _irq //0x18ldr pc, _fiq //0x20_undefined_instruction: .word undefined_instruction//定义_undefined_instruction指向undefined_instruction(32位地址)_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef //balignl使用,参考/lifexy/p/7171507.html2._start会跳转到start_code处start_code:/*设置CPSR寄存器,让CPU进入管理模式*/mrs r0, cpsr //读出cpsr的值bic r0, r0, #0x1f //清位orr r0, r0, #0xd3 //位或msr cpsr, r0 //写入cpsr#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK)/** relocate exception table*/ldr r0, =_startldr r1, =0x0 //r1等于异常向量基地址mov r2, #16copyex:subs r2, r2, #1 //减16次,s表示每次减都要更新条件标志位ldr r3, [r0], #4str r3, [r1], #4 //将_start标号后的16个符号存到异常向量基地址0x0~0x3c处bne copyex //直到r2减为0#endif#ifdef CONFIG_S3C24X0/* 关看门狗*/# define pWTCON 0x53000000# define INTMSK 0x4A000008 /* Interrupt-Controller base addresses */# define INTSUBMSK 0x4A00001C# define CLKDIVN 0x4C000014 /* clock divisor register */ldr r0, =pWTCONmov r1, #0x0str r1, [r0] //关看门狗,使WTCON寄存器=0/*关中断*/mov r1, #0xffffffffldr r0, =INTMSKstr r1, [r0] //关闭所有中断# if defined(CONFIG_S3C2410)ldr r1, =0x3ffldr r0, =INTSUBMSKstr r1, [r0] //关闭次级所有中断# endif/* 设置时钟频率, FCLK:HCLK:PCLK = 1:2:4 ,而FCLK默认为120Mhz*/ldr r0, =CLKDIVNmov r1, #3str r1, [r0]#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit //关闭mmu,并初始化各个bank #endifcall_board_init_f:ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) //CONFIG_SYS_INIT_SP_ADDR=0x30000f80bic sp, sp, #7 //sp=0x30000f80ldr r0,=0x00000000bl board_init_f上面的CONFIG_SYS_INIT_SP_ADDR =0x30000f80,是通过arm-linux-objdump -D u-boot>u-boot.dis生成反汇编,然后从u-boot.dis得到的。