Helper2416开发板学习①环境搭建

来源:互联网 发布:软件著作权 电话 编辑:程序博客网 时间:2024/04/30 22:12

Helper2416是基于三星S3C2416处理器的开发板,现在当下在CPU主频飞速发展的环境下基于ARM9的S3C2416处理器已然落伍,但是用作学习和对性能要求不高的产品还是绰绰有余的。我是通过论坛得到的,之前一直在吃灰,现在正好在学习嵌入式Linux,前面也用了不少用全志处理器的板子,但是总感觉全志的板子给人的自由度不高,最要命的是全志处理器的学习资料不多,真的很难在网上找到,三星提供的资料还是非常全的,学习起来应该比较顺手,那就尝尝这块板子吧。

板子自带的资源里面有编译器、板载所有芯片的数据手册、三星官方文档、硬件资料、烧录镜像、源码和工具。编译器的版本比较旧了,我使用我之前文章:http://blog.csdn.net/tq384998430/article/details/77864324里面转载的ARM交叉编译工具,使用的版本是 Codesourcery 公司的arm-none-linux-gnueabi-gcc编译器,gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)不支持硬件浮点(hf)。

下载编译器之后解压到工作目录,不用设置环境变量,后面使用到直接引用全路径就行了。将提供的Linux kernel和uboot源码解压到工作目录中去。需要搭建根文件系统,可以使用busybox工具,从官方下载最新的busybox解压即可。现在工作目录下应该有下面文件:

tq@ubuntu:~/work/helper2416$ lsarm-jyxtec-linux-gnueabi  busybox-1.27.2  s3c-linux.jyx  u-boot-1.3.4.jyx

编译源代码之前先将宿主系统的环境搭建好,学习阶段为了避免频繁的烧写内核和方便的修改板子的根文件系统,我们使用TFTP服务器和NFS服务器,u-boot启动的时候从TFTP服务器中获取内核镜像uImage或者zImage,内核起来之后挂载NFS服务器的根文件系统。搭建TFTP服务器和NFS服务器网上教程非常多,不再敖述,不能挂载Windows的NFS服务器,Windows文件系统不支持Linux的软连接等特性。另外板子已经烧写了uboot在nandflash中了,我们的可以直接使用,烧写uboot倒是不难,可以烧写到nandflash中启动uboot也可以烧写到SD卡中启动。

现在一切就绪了,可以编译内核了,内核源码中已经有提供好的配置文件了Helper2416,复制Helper2416文件成“.config”文件或者使用

make ARCH=arm CROSS_COMPILE=compiler_path/arm-linux- menuconfig

在最下面的load a alternative configuration file加载Helper2416文件。可以自己在此基础上对系统进行剪裁,从头开始配置一个Linux源码是很麻烦的,初级阶段使用现成的配置文件进行修改是明智的选择,等哪天熟悉了之后尝试从头剪裁一个Linux内核。然后执行编译命令:

make ARCH=arm CROSS_COMPILE=compiler_path/arm-linux- uImage

编译完成之后Image、zImage、uImage和都放在arch\arm\boot目录下面,但是实际上没有生成uImage只有zImage和Image文件,没有将zImage转成uImage,无所谓,提供的uboot源码修改过了是支持zImage启动的(反而不支持uImage了)。现在得到了内核镜像了,完成了最重要的一步。试试从TFTP服务器启动内核试试。
1、将zImage拷贝到TFTP服务器根目录中。
2、进入uboot命令行模式,查看当前的bootcmd:

Helper2416 # print bootcmdbootcmd=nand read.i c0008000 40000 300000;bootm c0008000

现在是从nandflash中的40000地址处读取300000个字节的数据到内存地址c0008000处,那我们就仿造这个从TFTP中读取zImage到内存的c0008000处:

Helper2416 # tftp c0008000 zImagesmc911x: initializingsmc911x: detected LAN9220 controllersmc911x: phy initializedsmc911x: MAC 00:40:5c:26:0a:5bTFTP from server 192.168.1.106; our IP address is 192.168.1.111Filename 'zImage'.Load address: 0xc0008000Loading: #################################################################     #################################################################     #################################################################     #################################################################     #################################################################     ###################################################doneBytes transferred = 1924944 (0x1d5f50)

顺利读取到zImage,然后我们注意到bootcmd后面还有一个bootm c0008000,意思就是从c0008000地址处启动内核,我也照做:

Helper2416 # bootm c0008000Boot with zImageStarting kernel ...Uncompressing Linux... done, booting the kernel.Linux version 3.2.50 (root@ubuntu) (gcc version 4.4.6 (crosstool-NG 1.13.3) ) #1 Fri Sep 1 09:10:07 PDT 2017CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177CPU: VIVT data cache, VIVT instruction cacheMachine: SMDK2416Memory policy: ECC disabled, Data cache writebackCPU S3C2416/S3C2450 (id 0x32450003)S3C24XX Clocks, Copyright 2004 Simtec ElectronicsCPU: MPLL on 534.000 MHz, cpu 534.000 MHz, mem 133.500 MHz, pclk 66.750 MHzCPU: EPLL on 96.000 MHz, usb-bus 48.000 MHzBuilt 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256Kernel command line: root=/dev/mtdblock2 console=ttySAC0,115200 rootfstype=yaffs2 mem=64mPID hash table entries: 256 (order: -2, 1024 bytes)Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)Memory: 64MB = 64MB totalMemory: 59612k/59612k available, 5924k reserved, 0K highmemVirtual kernel memory layout:    vector  : 0xffff0000 - 0xffff1000   (   4 kB)    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)    vmalloc : 0xc4800000 - 0xf6000000   ( 792 MB)    lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)    modules : 0xbf000000 - 0xc0000000   (  16 MB)      .text : 0xc0008000 - 0xc048f598   (4638 kB)      .init : 0xc0490000 - 0xc04d4000   ( 272 kB)      .data : 0xc04d4000 - 0xc04ff500   ( 174 kB)       .bss : 0xc04ff524 - 0xc052c81c   ( 181 kB)......Please press Enter to activate this console. smc911x smc911x: eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1[root@jyxtec /]# 

启动内核成功!!!

到现在我们已经可以编译自己的内核了,可以添加自己的驱动代码了,但是先不急着写驱动程序,还有一个重要的步骤要做,那就是搭建自己的根文件系统,前面使用的是烧写到nandflash中的根文件系统。其实根文件系统就是内核起来之后可以使用到的文件目录,文件目录下有/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys等文件夹,其中有的文件夹必不可少,例如bin文件夹中的文件都是可执行的文件或者脚本,如果没有的话我们连ls命令都没法用。所以我们需要制作一个基本的根文件系统所需要的内容。

首先我们在宿主Ubuntu系统的NFS服务器指定的根目录nfsroot下建立一个文件夹helper2416-rootfs作为根文件系统,这样NFS客户端挂载到NFS主机的时候就能指定挂载到helper2416-rootfs文件夹,所有我们在根文件夹中存放上面说的dev、bin、lib、usr等文件夹,很简单,mkdir创建文件夹就行了:

mkdir dev etc lib usr var proc tmp home root mnt sys

然后我们修改uboot的bootargs参数使得内核挂载到NFS根文件系统上去。启动板子进入到uboot的命令行模式修改bootargs。我们先查看当前的bootargs参数:

Helper2416 # print bootargsbootargs=root=/dev/mtdblock2 console=ttySAC0,115200 rootfstype=yaffs2 mem=64m

我们修改成:

setenv bootargs 'root=/dev/nfs console=ttySAC0,115200 nfsroot=192.168.1.106:/home/tq/work/nfsroot/helper2416-rootfs/ rw ip=dhcp rootfstype=nfs mem=64m'

然后执行boot命令启动Linux内核,但是由于我们创建的根文件系统中的文件夹都是空的,还不能用,挂载上去了也没用,输出最后部分信息如下:

IP-Config: Complete:     device=eth0, addr=192.168.1.178, mask=255.255.255.0, gw=192.168.1.1,     host=192.168.1.178, domain=, nis-domain=(none),     bootserver=0.0.0.0, rootserver=192.168.1.106, rootpath=VFS: Mounted root (nfs filesystem) on device 0:12.Freeing init memory: 272KKernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.[<c0013e58>] (unwind_backtrace+0x0/0xf0) from [<c034e618>] (panic+0x54/0x190)[<c034e618>] (panic+0x54/0x190) from [<c0008904>] (init_post+0xa0/0xc4)[<c0008904>] (init_post+0xa0/0xc4) from [<c049028c>] (kernel_init+0xf8/0x12c)

其中Kernel panic - not syncing: No init found. Try passing init= option to kernel表示init进程没有找到,说明这个init进程是必须的,我们还是使用busybox来创建一个最简单的根文件系统吧。busybox的使用参见我转载的文章:http://blog.csdn.net/tq384998430/article/details/77853165,简单来说就是下载最新的busybox源码并解压之后使用menuconfig进行配置,进入到Busybox Settings->Build Options目录下配置:

[*] Build BusyBox as a static binary (no shared libs)                       [ ] Force NOMMU build                                                       [*] Build with Large File Support (for accessing files > 2 GB)              (/home/tq/work/arm-2014.05/bin/arm-none-linux-gnueabi-) Cross Compiler prefi

对busybox进行静态编译,不需要动态链接库的支持,方便我们进行开发调试,只是文件较动态编译更大。然后在下面进行Cross Compiler prefix配置,将自己的交叉编译器的路径写进去,相当于使用make的时候制定CROSS_COMPILE一样。配置完这两样之后进行make编译,编译完成之后执行make install,生成的内容存放在“_install”文件夹中:

tq@ubuntu:~/work/helper2416/busybox-1.27.2$ ls _install/bin  linuxrc  sbin  usr

哈哈,很顺利,我们得到了三个重要的文件和一个linuxrc文件。查看bin文件夹中的内容:

tq@ubuntu:~/work/helper2416/busybox-1.27.2$ ls _install/bin/ -altotal 1992drwxr-xr-x 2 root root    4096 Sep  6 08:08 .drwxr-xr-x 5 root root    4096 Sep  6 08:08 ..lrwxrwxrwx 1 root root       7 Sep  6 08:08 ash -> busyboxlrwxrwxrwx 1 root root       7 Sep  6 08:08 base64 -> busybox-rwxr-xr-x 1 root root 2029316 Sep  6 08:08 busyboxlrwxrwxrwx 1 root root       7 Sep  6 08:08 cat -> busyboxlrwxrwxrwx 1 root root       7 Sep  6 08:08 chattr -> busyboxlrwxrwxrwx 1 root root       7 Sep  6 08:08 chgrp -> busyboxlrwxrwxrwx 1 root root       7 Sep  6 08:08 chmod -> busyboxlrwxrwxrwx 1 root root       7 Sep  6 08:08 chown -> busyboxlrwxrwxrwx 1 root root       7 Sep  6 08:08 conspy -> busyboxlrwxrwxrwx 1 root root       7 Sep  6 08:08 cp -> busybox......

我们发现所有的文件都是busybox文件的链接文件,意思就是执行cat命令和ls命令的时候都会执行到busybox,那为什么执行cat和ls命令得到的结果不一样呢?其实很简单,执行ls命令的时候“ls”作为一个参数传入到了可执行文件busybox中去了,busybox文件会识别第一个参数的名称,如果识别到的是“ls”就会执行ls相应的处理,可以做一个测试,当help2416板子挂载到根文件系统之后执行命令:

/ # busybox lsa.txt    dev      home     linuxrc  proc     tmp      varbin      etc      lib      mnt      sbin     usr

结果很明显。当然了这里命令的第一个参数是“busybox”而不是“ls”,我猜测busybox程序会判断第一个参数是不是“busybox”,不是的话以第一个参数作为实际命令,是的话则表示第二个参数为实际命令。总的来说busybox文件其实是一个功能十分多的文件,可以完成ls、cd、cat等等命令的功能,然后使用软连接的方式创建很多busybox所能完成的命令,我们可以理解busybox名字的意思了,busy box,的确是一个很忙碌的盒子,鸡贼!

我们将编译busybox生成的几个文件和文件夹都拷贝到我们创建的根文件夹helper2416-rootfs里面去,然后按照前面说的方法修改bootargs参数启动Linux内核,前面已经透露了挂载上这个根文件系统之后是可以使用的,因为bin文件夹里面已经有init文件了,也就是系统初始化程序(也是指向busybox的)。结尾部分log内容如下:

     device=eth0, addr=192.168.1.182, mask=255.255.255.0, gw=192.168.1.1,     host=192.168.1.182, domain=, nis-domain=(none),     bootserver=0.0.0.0, rootserver=192.168.1.106, rootpath=VFS: Mounted root (nfs filesystem) on device 0:12.Freeing init memory: 272Kcan't run '/etc/init.d/rcS': No such file or directoryPlease press Enter to activate this console. 

bingo,成功启动内核并挂载到根文件系统,尝试执行命令:

/ # lsa.txt    dev      home     linuxrc  proc     tmp      varbin      etc      lib      mnt      sbin     usr

没有问题!

现在虽然可以正常使用Linux的各种命令了,但是我们的lib、etc、usr等文件夹下都是空的,很多事还是做不了的,例如lib目录下没有库文件,我们的程序连printf都调用不了!!!下一篇准备试试搭建一个完整可用的根文件系统,正好对Linux的根文件系统有个更清楚的认识。

原创粉丝点击