历史上的今天
返回首页

历史上的今天

今天是:2025年01月12日(星期日)

2020年01月12日 | ARM-Linux移植之二

2020-01-12 来源:eefocus

平台:mini2440  交叉工具链:arm-linux-gcc-4.3.2

 

一、内核移植基本知识

移植内核也叫构建BSP(boardsupprot packet)。BSP的作用有两个:一是为内核运行提供底层支持,二是屏蔽与板相关的细节。


BSP的构建分三个层次


1、体系结构层次

对一些体系结提供linux内核支持,比如说ARM,X86等芯片。这一类工作一般在arc/xxx/下面额除了palt-xxx和mach-xxx目录的其他目录完成。


2、SOC层次

对一些公司提供的SOC微处理器提供linux内核支持,比如说三星公司的   S3C2440。这一类工作一般在arch/xxx/plat-xxxxarch/xxx/mach-xxxx目录下完成。我们可以看到在arch /arm/目录下同时有plat-s3c24xx和mach-s3c2440两个目录,这样做是因为plat-s3c24xx目录下存放了所有s3c24 系列相同的代码,mach-s3c2440则只存放了与S3C2440有关的代码。


2,板级层次

这是我们一般的菜鸟要做的,上面两个层次一般有芯片公司的大牛完成了,但是不同的电路板的板级层次则需要由我们菜鸟完成的。这一类工作主要在mach- xxxx/目录下面的板文件完成,比如说mach-s3c2440/smdk-s3c2440.c这个S3C2440标准板文件。很多文档很多书籍都都直 接在这个文件里面进行修改,这样是不对的,对于不同的电路板应该建立不同的板文件,比如说我的是mini2440,就应该建立一个smdk- mini2440.c文件或者mach-mini2440.c文件在mach-s3c2440下面。如果直接在里面修改是非常不规范的做法,这样不是在移 植内核,这样是在破坏内核!(这一句是宋宝华说的)。

 

下面开始移植。

 

二、BSP构建

1.建立板文件支持

这一步我会重新建立一个板文件mach-mini2440.c,而不是直接在smdk-s3c2440.c里面修改,这样或许麻烦一些,但是为了保持对内核尊重的态度和规范的做法,认为应该这样做。


如果我们重新建立一个空的板文件将会导致大量的工作量,幸运的是smdk-s3c2440.c文件已经帮我们做了大量的工作,我们直接拷贝过来命名为mach-mini2440.c

cp   arch/arm/mach-s3c2440/smdks3c2440.c     arch/arm/mach-s3c2440/mach-mini2440.c

        

修改arch/arm/mach-s3c2440/mach-mini2440.c文件将MACHINE_START宏括号里面的名字换成ID换成 MINI2440,名字随便取,我们取“MINI2440”,这个ID最终会被扩展为MACH_TYPE_MINI2440,然后到arch/arm /tools/mach_types里面找对应的ID号,所有做完以这一步我们要在mach_types添加我们机器的ID

MACHINE_START(MINI2440,"MINI2440")

         /*Maintainer: Ben Dooks */

         .phys_io   = S3C2410_PA_UART,

         .io_pg_offst     = (((u32)S3C24XX_VA_UART) >> 18)& 0xfffc,

         .boot_params = S3C2410_SDRAM_PA + 0x100,

 

         .init_irq    = s3c24xx_init_irq,

         .map_io             = smdk2440_map_io,

         .init_machine  = smdk2440_machine_init,

         .timer                = &s3c24xx_timer,

MACHINE_END


然后在mach_types里面添加我们机器的ID,再最后一行添加

         mini2440        MACH_MINI2440             MINI2440       1999


第一个表示机器名字,这个也随便取,第二个在Kconfig配置项里面定义的宏名称,下面一步我们会定义到,我们取名为MACH_MINI2440,第三表示MACH_START第一个参数ID名字,第四个是ID号。ID号我们取为1999。

        

修改arch/arm/mach-s3c2440/目录下的Kconfig和Makefile,以建立内核对板文件的支持使其可以被配置和编译进内核。

         首先修改Kconfig,在endmenu之前加入下面的内容:

 

87 config MACH_MINI2440     // 开发板名称宏定义

88  bool "mini2440"    // 开发板名称

89  select CPU_S3C2440     // 开发板使用的处理器类型

90  help

91     Say Y here if you are using the mini2440. // 帮助信息

 

再修改Makefile

         obj-$(CONFIG_MACH_MINI2440)+= mach-mini2440.o

注意这一行要添加在obj-$(CONFIG_ARCH_S3C2440)+= smdk-s3c2440.o后面,否则会编译错误。


这样我们就可以通过makemenuconfig配置mini2440的板文件是否编译进内核。

        

我们再跳到linux-2.6.22目录,执行makemenuconfig


执行加载默认配置文件后,可以开始配置新增加的菜单。进入System Types菜单项,打开S3C24XX Implementations菜单,出现一个目标开发板的列表:

 

[ ] Simtec ElectronicsBAST (EB2410ITX)

[ ] IPAQ H1940

[ ] Acer N30

[ ] SMDK2410/A9M2410

[ ] SMDK2440

[ ] AESOP2440

[ ] Thorcom VR1000

[ ] HP iPAQ rx3715

[ ] NexVision OTOM Board

[ ] NexVision NEXCODER2440 Light Board

[ ] mini2440


选中mini2440选项


然后执行makezImage,如果能够正常编译,已经能够将mini2440板文件编译进内核了。如果不行,请检查上述步骤。


2.修改机器码

将编译在arch/arm/boot下面生成的zImage烧写到nand的kernel分区,然后启动。

         Copylinux kernel from 0x00060000 to 0x30008000, size = 0x00500000 ... done

zImage magic = 0x016f2818

Setup linux parameters at 0x30000100

linux command line is: "console=ttySAC0 root=/dev/nfsnfsroot=192.168.1.101:/home/work/shiyan/rootfsip=192.168.1.102:192.168.1.101:192.168.1.1:255.255.255.0:mini2440:eth0:off"

MACH_TYPE = 362

NOW, Booting Linux......

UncompressingLinux.................................................................................................done, booting the kernel.

 

Error: unrecognized/unsupported machine ID (r1 = 0x0000016a).

内核提示不能识别的机器ID,于是修改bootloader的参数使其机器ID为1999,我用的是supervivi使用命令set parammach_type 1999

 

3.修改时钟源频率

启动内核,出现一系列的乱码,这是因为时钟源设置的不对,我的开发板用的是12M的晶振,所以在arch/arm/mach-s3c2440.c的 s3c24xx_init_clocks(16934400);处将16924400修改为12000000。即改为 s3c24xx_init_clocks(12000000);

 

4.添加nand分区信息

再启动,发现还是不能启动,这是因为内核中填写的nand分区信息不对。于是修改nand分区信息,很多人的做法是直接修改arch/arm /plat-s3c24xx/Common-smdk.c文件里面的smdk_default_nand_part数据结构,这样是不提倡的做法,因为还 是那句话,破坏了内核。我们应该再arch/arm/mach-s3c2440/mach-mini2440.c文件中建立我们自己板文件的nand信 息。我们在mach-mini2440.c的staticstruct platform_device *smdk2440_devices[]前面添加

static struct mtd_partition smdk_default_nand_part[] = {

/*这里面填的是我用的mini2440分区信息*/

     [0] = {

              .name       = "patition1 supervivi",

              .size = 0x00040000,

              .offset      = 0,

     },

     [1] = {

              .name       = "patition2 param",

              .offset =0x00040000,

              .size = 0x00020000,

     },

     [2] = {

              .name       = "patition3 kernel",

              .offset =0x00060000,

              .size = 0x00500000,

     },

     [3] = {

              .name       = "patition4 root",

              .offset      = 0x00560000,

              .size = 64*1024*1024,

     },

     [4] = {

              .name       = "patition5 nand",

              .offset = 0,

              .size = 64*1024*1024,

     },

 

};

 

static struct s3c2410_nand_set smdk_nand_sets[] = {

     [0] = {

              .name                = "NAND",

              .nr_chips = 1,

              .nr_partitions  = ARRAY_SIZE(smdk_default_nand_part),

              .partitions        = smdk_default_nand_part,

     },

};

 

再修改mach-mini2440.c的smdk2440_machine_init函数,将我们的nand传给给nand设备

static void __init smdk2440_machine_init(void)

{  

     s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);

 

     /*将我们的nand信息传给nand设备*/

     s3c_device_nand.dev.platform_data= &smdk_nand_info;   //set nand infoto nand

    

     platform_add_devices(smdk2440_devices,ARRAY_SIZE(smdk2440_devices));

 

     //smdk_machine_init();

//smdk_machine_init()函数屏蔽,因为他会将arch/arm/plat-s3c24xx/Common-smdk.c里面的分区信息传给nand,这样我们的自己的nand信息就被覆盖了

 

     s3c2410_pm_init();//添加加这个函数是因为smdk_machine_init()里面调用了。

}

 

再修改mach-mini2440.c的smdk2440_devices

static struct platform_device *smdk2440_devices[] __initdata = {

     &s3c_device_usb,

     &s3c_device_lcd,

     &s3c_device_nand,//向内核添加nand设备

     &s3c_device_wdt,

     &s3c_device_i2c,

     &s3c_device_iis,

};

 

6.添加YAFFS文件系统支持

完成上述步骤工作后,还是不能正常挂载根文件系统,因为内核还没对yaffs文件系统进行支持。

下载cvs-root-yaffs.tar.gz补丁包文件,解压,运行yaffs2文件夹里面的脚本文件patch-ker.sh来给内核打补丁,用法如下

Usage: ./patch-ker.sh  c/l kernelpath

if c/l is c,then copy, if l then link

如果是l则yaffs2源码被链接到内核,如果是c则复制

我们运行./patch-ker.sh      c work/kernel_make/linux2.6.22

给内核打上yaffs2补丁,然后使用makemenuconfig配置内核使其支持yaffs2文件系统

File systems   --->
Miscellaneous filesystems --->
    <*>YAFFS2 file system support

 

7.配置内核支持EABI接口

完成上面的步骤之后运行,内核会在输出

VFS: Mounted root (yaffs filesystem) on device 31:2.

Freeing init memory: 132K

之后卡住,这个打印反应出内核实际上已经挂接上了根文件系统,之所以卡在这里是因为无法启动根文件系统上的init进程。是由于内核和根文件系统的应用程序的接口不一致。所以在内核中使用make menuconfig配置EABI支持

Kernel Features --->
        Memory split...--->
        [ ]preemptible Kernel...
        [*]Use the ARM EABI to compile thekernel
       [*]        Allow old ABI binaries to run......
           Memory model(flatMemory)--->
        [ ]Add lru list to tarcknon-evictable pages

推荐阅读

史海拾趣

Ceramics公司的发展小趣事

“绿色陶瓷”公司以其环保理念为核心,致力于研发和生产环保型陶瓷电子材料。该公司采用可再生资源和低能耗生产工艺,成功降低了产品对环境的影响。同时,绿色陶瓷还积极推广循环经济模式,通过回收再利用废旧陶瓷材料,实现了资源的最大化利用。这一环保理念不仅赢得了消费者的青睐,也为公司在电子行业的可持续发展奠定了坚实基础。

Connective Peripherals Pte Ltd公司的发展小趣事

“全球陶瓷”公司凭借其卓越的产品质量和国际化战略,成功拓展了海外市场。该公司积极参与国际展览和交流活动,与多国电子企业建立了合作关系。同时,全球陶瓷还针对不同国家和地区的市场需求,推出了定制化的陶瓷电子材料解决方案。这一国际化战略不仅提升了公司的品牌影响力,也为其在全球范围内的业务拓展提供了有力支持。

Data Device Corporation公司的发展小趣事

Data Device Corporation(DDC)成立于1964年,总部位于美国纽约。在创立之初,DDC就专注于为军事和商业航空领域提供高质量的数据接口产品。凭借其卓越的技术实力和对市场的敏锐洞察,DDC迅速在电子行业中崭露头角。通过与各大军事机构和航空公司的紧密合作,DDC不断推出符合市场需求的新产品,逐步奠定了自己在行业中的领先地位。

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

随着技术实力的不断提升,银河微电开始积极拓展市场。公司深入分析市场需求,针对不同行业和领域的特点,推出了定制化的产品解决方案。同时,银河微电还加大了营销力度,通过参加行业展会、举办技术研讨会等方式,与潜在客户建立联系,推动产品销售。在市场的不断拓展中,银河微电实现了跨越式发展,市场份额逐年提升。

Emmoco公司的发展小趣事

Emmoco公司成立于XXXX年,由一群富有远见和创新精神的电子工程师创立。公司自创立之初就明确了以技术创新为核心的发展道路,专注于研发高性能的电子元器件和模块。经过初期的不懈努力,Emmoco成功推出了一系列具有竞争力的产品,为公司的后续发展奠定了坚实的基础。

Astro Industries Inc公司的发展小趣事

Astro Industries Inc的创始人在电子行业拥有丰富的经验,他们看到了市场对于高性能电子产品的迫切需求。于是,公司从创立之初就专注于技术创新,投入大量资源进行研发。经过不懈的努力,Astro Industries Inc成功推出了一款具有颠覆性的电子产品,其性能远超当时市场上的同类产品,迅速获得了市场的认可。

问答坊 | AI 解惑

基于LabVIEW的信号输出与数据采集系统

基于LabVIEW的信号输出与数据采集系统…

查看全部问答>

MAX743双输出集成稳压器

MAX743双输出集成稳压器…

查看全部问答>

职业规划与职业危机

一个看上去很美的职业生涯,往往是有心人策划出来并锲而不舍地为之努力,才能成就的。然而,能在从业之初就有很明确职业规划的人,毕竟是少数,很多人的职业规划是在工作3-5年间慢慢建立起来的,甚至还有一部分人一辈子也没有明确的职业规划。   ...…

查看全部问答>

2410板子正常启动wince之后超级终端如何显示的??

小弟现在在搞wince 编译了一个内核下载到2410的开发板里面,但是现在暂时没有VGA的接口显示屏幕, 我想问一下正常启动wince在超级终端里面应该显示什么样子的??我总觉的我的有点问题ID[1] { chainInfo.dwLoadAddress: 0X00000000 chainInfo.dw ...…

查看全部问答>

请问wince环境下如何通过gprs远程无线与exchange服务器同步?

windowsmobile下手机上有个内置的activesync客户端一直在运行的,wince下不知道有没有这个东西,如果有,使用方式和wm下是一样的吗?谢谢…

查看全部问答>

利用2510-AT型自动调谐温度控制源表自动优化热电制冷器PID系数

概述 许多热电制冷器(TEC)控制器采用PI或PID(比例、积分、微分)环路实现温度控制。虽然这些环路可以提供精密的温度控制,但却要求适当的P(比例)、I(积分)、D(微分)值。在很多情况下,这些P(比例)、I(积分)、D(微分)值是通过试验和误 ...…

查看全部问答>

EK-LM3S811_ND Rev3在部分XP系统下驱动安装问题

首先,提一点我的EK-LM3S811_ND Rev3板载调试器用的是LMeb3601.然后呢,我就在我的XP系统上安装的驱动,一开始只能装一个就是如图所示的COM7,其余两个如何也装不上,我当时怀疑是板子的问题,查资料,询问有经验的人,两天过后突然想,是不是我的 ...…

查看全部问答>

利用CCSV5.1自带的430ware的强大资源库学习MSP430

本人为在校大学生,以前一直用的是51.八月初的时候被老师拉过来参加“TI杯”模拟电子专题邀请赛,这才接触到了MSP430。学校发了三块开发板,一块launchpad、一块MSP430FR5739、一块是MSP430F5529。这些板子用着感觉都挺好的,只可惜赛后都被收回去 ...…

查看全部问答>

有关LED灯珠的COB封装相对于传统SMD封装的介绍

随着固态照明技术的不断进步,COB(chip-on-board)封装技术得到越来越多的重视,由于COB光源有热阻低,光通量密度高,眩光少,发光均匀等特性,在室内外照明灯具中得到了广泛的应用,如筒灯,球泡灯,日光灯管,路灯以及工矿灯。   本文就COB封装 ...…

查看全部问答>