因为之前做过2440和6410,鉴于时刻原因,这儿暂时跨过其他模块的裸机驱动和uboot移植,直接进入内核移植及驱动开发方面的学习。
内核移植其实很简单,因为内核是linus带领的linux内核开发团队开发并保护的,咱们只需求跟咱们的渠道穿插编译一下即可运用,可是,内核移植也不简单,因为内核移植起见呈现任何问题都可能会被卡住,因为内核代码十分巨大,咱们无法通读内核代码,下面是我移植期间遇到的各种悲催的问题和解决方案,首先是必备的开发环境:
a) Linux内核代码,版别3.8.3
b) S5PV210开发板(我的是TQ210)
c) HOST环境是WIN7(64位)下装置的Ubuntu虚拟机(12.10)
一 内核编译
从Linux内核网站(kernel.org)下载内核代码、解压并进入内核目录
(1)批改Makefile,将195行和196行改为:
- ARCH=arm
- CROSS_COMPILE?=arm-linux-
(2)进行默许装备,进入arch/arm/configs目录,能够发现最接近咱们开发板的装备文件是s5pv210_defconfig,故
- makes5pv210_defconfig
(3)编译内核,假如需求生成zImage则履行
- makezImage
假如需求生成uImage则履行
- makeuImage
(4)用uboot下载并测验运转,结果是悲惨剧的,在uboot打印”Starting kernel…“之后就看不到任何输出了,明显,有两种原因:
a. 编译的内核类型过错,比方您的uboot运用的是uImage,而您编译的是zImage。
b. 移植的uboot存在问题,没能正确的复制内核到正确的内存地址并发动。
c. 内核存在某些装备,咱们没有装备。
通过查看内核装备项知道,内核默许选用的UART1打印调试信息,因而,履行:
- makemenuconfig
在出来的对话中顺次挑选System type =>(1) S3C UART to use for low-level messages,在编辑框中将1改为0,然后保存装备并再次编译内核,直接履行make即可,无需make clean。假如是初次履行make menuconfig会遇到过错,这是因为make menuconfig依靠一个库,这儿我忘掉姓名了,假如是ubuntu能够直接用指令装置的,网上搜一下就能够搞定。
编译完内核之后再次下载并测验运转,这时,能够看到内核打印的信息了,假如您不幸只看到“Uncompressing Linux… done, booting the kernel.”就没有任何输出了,那么请查看uboot传入的机器码跟内核机器码是否匹配,假如不匹配请批改,然后从头编译运转内核或许uboot,假如批改之后依然看不到其他输出,那么请查看uboot的bootargs参数,bootargs中有必要装备console=ttySAC0,不然也看不到打印信息。
假如没有呈现上面的过错,那么您的内核现已能够打印出许多信息,可是因为内核默许没有供给对Nand或网卡的支撑,无法挂接文件体系,所以依然无法正常运转。为了能使内核进入控制台,为后边的驱动开发供给环境,咱们先制造文件体系,然后来移植网卡驱动,让内核NFS方法挂接文件体系,然后咱们就能够开发其他驱动了,如Nand、LCD、声卡等等。
二 构建文件体系
其实构建文件体系仍是比较简单的,留意几个当地,然后墨守成规的来就能够了。
(1)创立根文件体系目录结构,能够运用如下脚本:
- #!/bin/sh
- echo”——Createrootfsdirectonsstart…——–“
- mkdirrootfs
- cdrootfs
- echo”——–Createroot,dev….———-“
- mkdirrootdevetcboottmpvarsysproclibmnthomeusr
- mkdiretc/init.detc/rc.detc/sysconfig
- mkdirusr/sbinusr/binusr/libusr/modules
- echo”makenodeindev/consoledev/null”
- sudomknod-m600dev/consolec51
- sudomknod-m600dev/nullc13
- mkdirmnt/etcmnt/jffs2mnt/yaffsmnt/datamnt/temp
- mkdirvar/libvar/lockvar/runvar/tmp
- chmod1777tmp
- chmod1777var/tmp
- echo”——-makedirectiondone———“
在这儿我将脚本命名为mkrootfs.sh,接下来给脚本加可履行权限(即chmod a+x mkrootfs)并运转脚本。我的脚本是在/nfsroot目录下运转的,所以我的根文件体系的根目录为/nfsroot/rootfs,后边均以该目录为例论述。
(2)编译Busybox
到Busybox下载最新版的Busybox源码,我是用的是1.21.0版别,下载完后解压并进入busybox目录,首先是装备busybox
- makemenuconfig
装备菜单跟装备内核时的差不多,顺次进入Busybox Settings =>Build Options =>Cross Compiler prefix (NEW),设置为编译器的前缀,我的是arm-linux-。网上有些朋友还引荐挑选Busybox Settings => Build Options =>Build BusyBox as a static binary (no shared libs),可是假如咱们正确复制编译器了运转库的话,不设置也能够。现在能够编译Busybox了,履行
- make
编译进程很顺畅,我这儿没有遇到任何过错,接下来将编译好的Busybox装置到/nfsroot/rootfs就能够了,履行
- makeCONFIG_PREFIX=/nfsroot/rootfsinstall
(3)复制编译器运转库
我的编译器是4.5.1版别的,复制arm-none-linux-gnueabi/sys-root/lib的一切动态库到/nfsroot/rootfs/lib下,为了不复制衔接,应该加上”-d”选项,履行
- cp*so*/nfsroot/rootfs/lib-d
相同复制arm-none-linux-gnueabi/sys-root/usr/lib下的一切动态库到/nfsroot/rootfs/usr/lib下,履行
- cp*so*/nfsroot/rootfs/usr/lib-d
(4)构建etc目录