FL2440 Linux-3.0内核最小系统移植

本文档详细介绍了如何基于crosstool-ng创建交叉编译器,用于FL2440开发板上的Linux-3.0内核最小系统移植。首先,通过脚本下载并配置crosstool-ng以生成arm920t的交叉编译器。接着,下载Linux-3.0内核源码,并进行一系列修改,包括修改内核配置、添加DM9000网卡支持。最后,讲解了如何使用修改后的内核源码配置和编译内核,以及如何在u-boot中设置启动参数。整个过程涵盖了内核配置、源码修改和根文件系统初始化等多个步骤。

FL2440 Linux-3.0最小系统移植

该文档基于crosstool-ng这个交叉编译器制作,可以使用下面脚本和命令制作交叉编译器:

[wudongxu@localhost~l]$mkdir crosstool

[wudongxu@localhost ~]$cd crosstool

[wudongxu@localhost crosstool]$vim build.sh //编写制作交叉编译器的脚本,该脚本主要是从FTP服务器上下载文件并修改只制作arm920t的交叉编译器

#!/bin/bash 

# This shell script used to download crosstool-ng install binary and compile it for arm920t 

CROSSTOOL=crosstool-ng-centos-LingYun-v1.0.0.bin
if [ ! -f ${CROSSTOOL} ] ; then 

  wget ftp://master.iot-yun.com/linux_tools/${CROSSTOOL}

   sed -i -e "s|^sup_arch=.*|sup_arch=(\"\", \"arm920t\")|g" ${CROSSTOOL}
fi

chmod a+x ${CROSSTOOL}
./${CROSSTOOL}

[wudongxu@localhost crosstool]$sh build.sh   //开始制作交叉编译器,这个过程较长

[wudongxu@localhost crosstool]$/opt/xtools/arm920t/bin/arm-linux-gcc -v // 验证交叉编译器制作是否正确

Using built-in specs. 

Target: arm-arm920t-linux-gnueabi
Configured with: /home/guowenxue/crosstool-ng-1.16.0/.build/src/gcc-4.4.6/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64- build_unknown-linux-gnu --target=arm-arm920t-linux-gnueabi --prefix=/opt/xtools/arm920t --with-sysroot=/opt/xtools/arm920t/arm-arm920t-linux- gnueabi/sysroot --enable-languages=c,c++ --with-arch=armv4t --with-cpu=arm9tdmi --with-tune=arm920t --with-float=soft --with- pkgversion='crosstool-NG 1.16.0' --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with- gmp=/home/guowenxue/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-mpfr=/home/guowenxue/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-ppl=/home/guowenxue/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools
--with-cloog=/home/guowenxue/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-
lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --disable-multilib --with-local-prefix=/opt/xtools/arm920t/arm-arm920tlinux-gnueabi/sysroot --enable-c99 --enable-long-long
Thread model: posix 

gcc version 4.4.6 (crosstool-NG 1.16.

一、 开发板简介

     FL2440开发板是飞凌公司使用三星的ARM9 S3C2440 CPU做的一个ARM Linux学习开发板,该CPU是使用armv4t指令集的ARM920T核,工作主频最高在400MHz。每个CPU厂商在研发并生产出CPU时并不是直接将该CPU推给客户让客户自己研究该CPU特性后再做硬件设计(因为客户不懂这些具体的CPU使用细节,而研发该CPU的公司会更懂它),而会先使用该CPU设计出母板(demo板,如SMDK2440),在母板上尽可能将该CPU的硬件使用信息展示给客户,客户再参考母板根据实际的功能、市场需求来高度定制自己的硬件,例如产品不需要显示则可以把母板中的LCD硬件部分去掉、CS8900网卡供货存在问题那就换成DM9000等等。
   相应的CPU厂商在开发出相应的硬件demo板后,也不是直接丢给客户来开发相应的软件,而是会安排软件研发人员针对母板硬件完成u-boot和Linux内核的开发,以支持相应硬件。因为我们的硬件是参考母板来定制开发的,所以我们的软件移植(u-boot和linux内核)也可以在相关源码里的母板代码上做针对硬件的修改来支持我们的产品。在FL2440开发板的移植过程中,我们将以SMDK2440为模版在它的基础上做些修改来支持我们相应的硬件。在开始移植之前,我们先创建FL2440整个项目的目录框架:

[wudongxu@localhost ~]$ mkdir fl2440
[wudongxu@localhost ~]$ cd fl2440
[wudongxu@localhost fl2440]$ mkdir -p {crosstool,bootloader,linux/{kernel,rootfs},driver,3rdparty,program,images}
[wudongxu@localhost fl2440]$ tree

|-- 3rdparty            ///今后移植到ARM开发板上的第三方应用程序软件包
|-- bootloader      //u-boot移植代码
|-- crosstool         ///交叉编译器
|-- driver               ///今后写的驱动文件
|-- images            ///编译出的image文件,如Linux内核,根文件系统等;
|-- linux
|  |-- kernel            ///Linux内核源码路径
  `-- rootfs             ////根文件系统目录树路径
`-- program          ///我们今后自己写的应用程序  


二、源码修改

Linux 是一个源码开放的操作系统,无论是普通用户还是企业用户都可以编写自己的内核代码,再加上对标准内核的裁剪从而制作出适合自己的操作系统。Linux操作系统有很多发行版本,如Redhat, CentOS, Ubuntu等等,但所有的这些Linux操作系统都是选择一个Linux内核稳定版本,外加不同的C基础库和应用程序构建的一个操作系统。嵌入式Linux系统开发其本质就是我们拿到源码并进行修改DIY(Do It Yourself)一个属于我们自己的操作系统,这个过程包括Booloader和Linux内核(裁剪)移植、驱动模块编写、根文件系统制作、第三方应用程序移植等,这个工作叫做BSP(Board Support Packet,板级支持包)开发,这里面需要相应的硬件协议、操作系统、以及C语言和数据结构等知识,难度较高。


Linux内核下载地址: https://www.kernel.org/pub/linux/kernel/v3.x/


[wudongxu@localhost ~]$ cd gitee/fl2440/linux/
[wudongxu@localhost linux]$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.0.tar.bz2
[wudongxu@localhost linux]$ tar -xjf linux-3.0.tar.bz2

[wudongxu@localhost linux]$ cd linux-3.0
[wudongxu@localhost linux-3.0]$ ls 

arch  CREDITS    drivers  include   Kbuild    lib mm    REPORTING-BUGS   security usr    block crypto    firmware init   Kconfig      MAINTAINERS net samples sound virt
COPYING    Documentation fs ipc   kernel Makefile README scripts tools 


下图是Linux源码目录树的目录结构:



修改1:

SMDK2440上使用的是16MHz的晶振,而FL2440上使用的是12MHz的晶振,所以开发板相应代码要做修改:



linux-3.0/arch/arm/mach-s3c2440/下支持很多使用S3C2440 CPU做的开发板(大家可以使用ls命令看看具体有哪些开发板,今后驱动添加我们可以参考其他开发板如mini2440的信息),我们以mach-smdk2440.c为原型来进行修改:
[wudongxu@localhost linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c

static void __init smdk2440_map_io(void)
{
    s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
-   s3c24xx_init_clocks(16934400);
+  s3c24xx_init_clocks(12000000);

    s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}


修改2:

我们的u-boot给Linux内核传的machine ID值为1999,而Linux内核里smdk2440开发板对应的machine ID是362,所以我们要修改内核代码让smdk2440的machine ID与u-boot里的保持一致,这里我们在源码中将两个machine ID值互换:
[wudongxu@localhost linux-3.0]$ vim arch/arm/tools/mach-types 

-   s3c2440                   ARCH_S3C2440          S3C2440                      362
+   s3c2440                  ARCH_S3C2440          S3C2440                     1999
... ...
-   mini2440                 MACH_MINI2440           MINI2440                   1999
+   mini2440                MACH_MINI2440           MINI2440                   362


修改3:

samsung的串口驱动设备名字默认叫ttySAC,而我们一般使用ttyS,所以将源码中的设备名改掉:
[wudongxu@localhost linux-3.0]$ vim drivers/tty/serial/samsung.c 

 -  #define                      S3C24XX_SERIAL_NAME                "ttySAC"
+  #define                     S3C24XX_SERIAL_NAME                  "ttyS"
   //注意S要大写


修改4:

修改顶层Makefile的ARCH为arm, CROSS_COMPILE为我们自己相应的交叉编译器:
[wudongxu@localhost linux-3.0]$ vim Makefile

-ARCH ?= $(SUBARCH)
-CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+ARCH ?= arm
+CROSS_COMPILE ?= /opt/xtools/arm920t/bin/arm-linux-    
 //这里改成大家自己的交叉编译器,注意arm-linux-后面应该紧跟回车,不能有其他任何字符


修改5:
添加DM9000网卡设备支持,下图是FL2440底板上的DM9000网卡原理图,注意这里网卡INT使用EINT7管脚,CMD连ADDR2,CS#片选管脚连了NGCS4,以及数据位数为LDATA0~LDATA15(16位模式)。下面是修改Linux内核源码添加DM9000网卡设备支持的过程。

2012年10月15日星期一亲测可以下载 公开视频光盘目录结构 国嵌视频1.iso -学习方法与课程体系介绍(学前必看) -学习方法介绍.avi -国嵌嵌入式课程体系.pdf -嵌入式Linux学习方法.pdf -国嵌课程1-嵌入式入门体验班(上) -第1天(嵌入式系统概述) -国嵌体验入门班-1-1(嵌入式系统概述).avi -国嵌体验入门班-1-2(ARM概述).avi -国嵌体验入门班-1-3(嵌入式Linux概述).avi -国嵌体验入门班-1-4(2440开发板介绍).avi -国嵌体验入门班-1-5(软硬件环境搭建).avi -第2天(开发板快乐体验) -国嵌体验入门班-2-1(开发板系统安装).avi -国嵌体验入门班-2-1(开发板系统安装-Jlink方式).avi -国嵌体验入门班-2-1(开发板系统安装-并口方式).avi -国嵌体验入门班-2-2(裸机程序体验).avi -国嵌体验入门班-2-3(QT系统体验).avi -国嵌体验入门班-2-4(Android系统体验).avi 国嵌视频2.iso -国嵌课程1-嵌入式入门体验班(下) -3天(Linux系统体验) -国嵌体验入门班-3-1(Linux定制安装).avi -国嵌体验入门班-3-2(Linux命令).avi -国嵌体验入门班-3-3(VI使用).avi -国嵌体验入门班-3-4(Linux系统管理).avi -国嵌体验入门班-3-5(Shell编程).avi -国嵌体验入门班-3-6(Qcd功能演示).avi -国嵌体验入门班-3-7(必修实验).avi -国嵌课程2-嵌入式Linux应用开发班 -第1天(编程基础) -国嵌应用班-1-1(GCC程序编译).avi -国嵌应用班-1-2(GDB程序调试).avi -国嵌应用班-1-3(makefile工程管理).avi -国嵌应用班-1-4(必修实验).avi -第2天(文件时间编程) -国嵌应用班-2-1(系统调用方式访问文件).avi -国嵌应用班-2-2(库函数访问文件).avi -国嵌应用班-2-3(时间编程).avi -国嵌应用班-2-4(必修实验).avi -3天(多进程程序设计) -国嵌应用班-3-1(进程控制原理).avi -国嵌应用班-3-2(进程控制程序设计).avi -国嵌应用班-3-3(必修实验).avi -第4天(进程间通讯) -国嵌应用班-4-1(进程间通讯概述).avi -国嵌应用班-4-2(管道通讯).avi -国嵌应用班-4-3(信号通讯).avi -国嵌应用班-4-4(共享内存通讯).avi -国嵌应用班-4-5(必修实验).avi -第5天(进程间通讯) -国嵌应用班-5-1(消息队列).avi -国嵌应用班-5-2(信号量).avi -国嵌应用班-5-3(必修实验).avi -第6天(进程间通讯) -国嵌应用班-6-1(线程基础).avi -国嵌应用班-6-2(多线程程序设计).avi -国嵌应用班-6-3(必修实验).avi -第7天(网络编程) -国嵌应用班-7-1(Linux网络概述).avi -国嵌应用班-7-2(Linux网络编程基础).avi -国嵌应用班-7-3(TCP程序设计).avi -国嵌应用班-7-4(UDP网络程序设计).avi -国嵌应用班-7-5(并发服务器).avi -国嵌应用班-7-6(必修实验).avi 国嵌视频3.iso -国嵌课程3-ARM系统进阶班 -第1天(ARM系统开发基础) -ARM系统精讲班-1-1(ADS集成开发环境).avi -ARM系统精讲班-1-2(ARM工作模式).avi -ARM系统精讲班-1-3(ARM寄存器).avi -ARM系统精讲班-1-4(ARM寻址方式).avi -ARM系统精讲班-1-5(ARM汇编指令详解).avi -第2天(ARM系统开发基础) -ARM系统精讲班-2-1(ARM汇编指令详解).avi -ARM系统精讲班-2-2(ARM伪指令).avi -ARM系统精讲班-2-3((混合编程).avi -ARM系统精讲班-1-8(必修实验).avi -3天(LED驱动程序设计) -ARM系统精讲班-2-1(GPIO).avi -ARM系统精讲班-2-2(LED控制程序设计).avi -ARM系统精讲班-2-3((LED闪烁).avi -第4天(LED与按键驱动程序设计) -ARM系统精讲班-4-1(ARM中断控制系统).avi -ARM系统精讲班-4-2(按键控制程序设计).avi -ARM系统精讲班-2-6(必修实验).avi -第5天(定时器与时钟驱动程序设计) -ARM系统精讲班-5-1(ARM时钟体系).avi -ARM系统精讲班-5-2(定时器驱动程序设计).avi -国嵌课程4(嵌入式LINUX内核驱动进阶班-上) -第1天(内核开发基础) -国嵌内核驱动进阶班-1-1(Linux内核简介).avi -国嵌内核驱动进阶班-1-2(Linux内核源代码).avi -国嵌内核驱动进阶班-1-3Linux内核配置与编译).avi -国嵌内核驱动进阶班-1-4(Linux内核模块开发).avi -国嵌内核驱动进阶班-1-5(必修实验).avi -第2天(U-Boot移植-国嵌内核驱动进阶班-2-1(嵌入式linux系统架构).avi -国嵌内核驱动进阶班-2-2(交叉工具链).avi -国嵌内核驱动进阶班-2-3(Bootloader介绍).avi -国嵌内核驱动进阶班-2-4(U-Boot介绍).avi -国嵌内核驱动进阶班-2-5(U-Boot命令).avi -国嵌内核驱动进阶班-2-6(U-Boot启动流程).avi -国嵌内核驱动进阶班-2-7(Uboot移植.avi -国嵌内核驱动进阶班-2-8(必修实验).avi 国嵌视频4.iso -国嵌课程4(嵌入式LINUX内核驱动进阶班-下) -3天(内核开发基础) -国嵌内核驱动进阶班-3-1(嵌入式linux内核制作).avi -国嵌内核驱动进阶班-3-2(根文件系统制作).avi -国嵌内核驱动进阶班-3-3内核启动流程).avi -国嵌内核驱动进阶班-3-4(嵌入式文件系统).avi -国嵌内核驱动进阶班-3-5(必修实验).avi -第4天(内存管理子系统) -国嵌内核驱动进阶班-4-1(Linux内存管理).avi -国嵌内核驱动进阶班-4-2(进程地址空间).avi -国嵌内核驱动进阶班-4-3内核地址空间).avi -国嵌内核驱动进阶班-4-4(Linux内核链表).avi -国嵌内核驱动进阶班-4-5(Linux内核定时器).avi -国嵌内核驱动进阶班-2-7(Uboot移植.avi -国嵌内核驱动进阶班-2-8(必修实验).avi -第5天(进程管理子系统) -国嵌内核驱动进阶班-5-1(LINUX进程控制).avi -国嵌内核驱动进阶班-5-2(LINUX进程调度).avi -国嵌内核驱动进阶班-5-3Linux系统调用).avi -国嵌内核驱动进阶班-5-4(Proc文件系统).avi -国嵌内核驱动进阶班-5-5(内核异常分析).avi -国嵌内核驱动进阶班-5-6(必修实验).avi -第6天(简单字符设备驱动程序设计) -国嵌内核驱动进阶班-6-1(LINUX驱动程序介绍).avi -国嵌内核驱动进阶班-6-2(字符设备驱动程序设计).avi -国嵌内核驱动进阶班-6-3(字符设备驱动程序实例分析).avi -国嵌内核驱动进阶班-6-4(竞争与互斥).avi -国嵌内核驱动进阶班-6-5(必修实验).avi -第7天(高级字符设备驱动程序设计) -国嵌内核驱动进阶班-7-1(Ioctl设备控制).avi -国嵌内核驱动进阶班-7-2(内核等待队列).avi -国嵌内核驱动进阶班-7-3(阻塞型字符设备驱动).avi -国嵌内核驱动进阶班-7-4(Poll设备方法).avi -国嵌内核驱动进阶班-7-5(自动创建设备文件).avi -国嵌内核驱动进阶班-7-6(必修实验).avi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值