您的位置:首页 > 运维架构 > Linux

ARM11、OK6410_Linux、系统移植 和 驱动加载

2012-12-13 13:27 337 查看
今天可以说是很开心的一天,因为我终于完成了从一个基础内核到 ARM嵌入式内核的学习和移植工作,加上自己的uboot和根文件系统,呵呵。虽然是菜鸟的成果,但我依旧很开心,从我发表那一篇ARM_Linux 项目拉力正式开始的一周内,我还算是有了一个好的开始了,我做到了,呵呵。

我的开发环境是VMware 虚拟机 Ubuntu10.10 ,飞凌OK6410开发板,最终移植的内核为Linux-2.6.34.11。

板子最终的实现性能为,启动Uboot,加载内核,挂载NFS 主机上的根文件系统,并成功测试和加载OK6410 的LED 灯的驱动,运行LED 灯测试模块,驱动正常工作。

当然在这几天完成的都是疯狂的参考网友们的资料,其中也有很多CSDN的博友。写这篇博文,不是为了详细的叙述ARM Linux移植的技术点,就是问了将我们在移植过程中出现的对应的问题,来寻找对应的博客。

第一、先来说说Uboot。

因为是参考飞凌提供的Uboot来 自己制作uboot 的,所以做起来能够简单一些, 飞凌的uboot是 仿照三星 smdk6410 这个板子主体来做的。而我们现在到的通用Uboot,里面就有这一个函数体,Makefile 里有这一项smdk6410_config : uconfig

@$(MKCONFIG) $(@:_config=) arm s3c64xx smdk6410 samsung s3c6410

如果你需要改成自己的板载文件的话,也可以借鉴百度文库“我的arm_linux移植笔记.pdf”这篇博文,不过如果你也是飞凌的OK6410,或者其他ARM11,系列开发板的话,我这人不建议你去修改这一项,因为,飞凌无论是 uboot 还是后面的内核(飞凌提供的内核有
2.6.28 和2.6.36.2) 都是依赖于smdk6410,后面我会写到。 移植Uboot的 另外需要修改的文件就是include文件,在一些通用的uboot 在 include/configs/ 下面会有一个smdk6410.h 的文件。 有关于 ./cpu/samsung/smdk6410/start.S的修改,你都可以参考一下网友的资源,其实也可以直接下载一些网友已经制作好了的开发板对应的uboot,来使用,或者学习他的源码,就可以事半功倍。所以我在详细描述了,

第二、根文件系统的制作

可以参考http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 这篇博文,我就是按照这个来操作的,最后可以从NFS
挂载启动跟文件系统。

第三、Linux 内核的编译和移植。

这一个是重点,因为网上的大多数资源是ARM9 的,而且因为内核版本上的差异问题自己很难发现,所以自己在做这一块费了很大的功夫,如果你需要在内核中添加一些小的驱动程序来测试一下自己的内核,可以参考一下http://blog.csdn.net/acanoe/article/details/7464752

make menuconfig 后加载你自己需要的驱动配置就可以了。 我自己在学习Linux内核移植,是参考网络资源和飞凌提供的ARM Linux2.6.28 源码做的,这些都可以在网上下载到。我要写的是在移植过程中出现的一些问题和解决办法,

1、需要修改nandflash 的分区信息

在 arch/arm/mach-s3c64xx/mach-smdk6410.c 中,这些信息我在飞凌提供的内核中找了好久都没有找到,最后才发现飞凌将这些硬件信息都进行了模块化的管理,在linux2.6.28 内核中这些信息放在了 ./arch/arm/plat-s3c/include/plat 中,而我们要使用的nandflash
分区信息 在partition.h。而在他提供的Linux2.6.36.11 将这些信息放在了 ./arch/arm/mach-s3c64xx/include/mach 中。 中飞凌将这些信息统一目录,然后系统分开调用,也是项目的需要,但这里却极大的增加了我们的开发难度,因为我们不可能一次就能高明白这里调用联系。如果我们需要加载LED 驱动的话就需要这里的 gpio 信息,如果你在编译的时候缺少那个gpio的信息头文件,就可以在这里找到。详细的nand flash 修改方法你可以参考一下http://hi.baidu.com/mountmeng1990/blog/item/0edd39e920980afdcf1b3e20.html。

2、 给内核打yaffs2文件系统的补丁 如果你需要就打上。

cd /mnt/hgfs/share

tar –zxvf /mnt/hgfs/share/cvs-root.tar.gz –C /opt/studyarm

cd /opt/stdudyarm/cvs/yaffs2/

./patch-ker.sh c /opt/studyarm/linux-2.6.29.1/

上面命令完成下面三件事情:

(1) 修改内核fs/Kconfig

增加一行:source "fs/yaffs2/Kconfig"

(2) 修改内核fs/Kconfig

增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/

(3) 在内核fs/目录下创建yaffs2目录

将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;

将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下;

将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.

3http://www.ganxisky.cn/ 、修改的机器号

网上很多关于arm9 的都要这样做,这样做的原理是,在uboot启动的时候会传来一个机器号,如果的内核的机器号和uboot的传来的相同才能启动,而如果不是就不可以启动。 为什么我在写Uboot 时强调如果你是OK6410的板子,后者说是按照飞凌源码来学习的话,不要修改刚才的smdk6410 的参数,因为飞凌uboot
和 他们自己的内核使用这个smdk6410 的机器码来传递。 所以加入你上面的uboot没有修改的话,这里也不需要修改。

4、make menuconfig 配置内核。

我是将飞凌提供的Linux2.6.36.11 内核下的.config 直接copy 到我的Linux2.6.34.11 根目录下的。这时 你在make menuconfig 时 要注意去掉去除部分:1) Device Drivers ----》Graphics support ---> Console display
driver support ---> [ ] VGA text console 这一项。不然会报错为drivers/video/console/vgacon.c:486: error: 'PCIMEM_BASE' undeclared (first use in this function) 。。这一项应该是ARM11 视频VGA输出的驱动,这里我们不需要就去掉。 2) 在 Device Driver -----》 Generic Driver Oprios有一个(sd8686.bin
sd8686_helper.bin) 的是飞凌提供的wifi 模块需要加载的固件 ,如果你需要的话 就将他提供的内核中的这两个硬件拷贝的2.6.34 对应的目录就行。可以使用 命令 find -name sd8686.bin ./ 找到它们。

5 、编译 make zImage

编译好了,以后通过OK6410 USB的下载方式,先将Uboot下载到开发板,在下载你自己编译好的内核到开发板,设置 为关在NFS 根文件系统。 看看你的内核成功启动了没。如果没有成功启动,这里可能的原因有。

1) 假如只显示Starting kernel ... 就不动了的话。可能原因是你编译的内核太大了,超过了3.4M 了 ,这里解决的办法,是在使用dnw 串口控制下载的时候,你擦除一个较大的空间 。我擦除了 100000 500000 。使用命令nand erase 100000 500000 。 然后下载到nandflash 使用命令nand write.e 50008000 100000
500000。 (注意上面的命令只对应飞凌的uboot,其他的uboot我没测试过)。

2) 当只出现Uncompressing Linux... done,booting the kernel 然后停下来不动时。可能出现的原因可以参考一下这篇博文:http://blog.chinaunix.net/space.php?经济管理uid=20543672&do=blog&id=129729
当也可能是你第二次启动错误,或者下载错误,也可以重新下载一下zImage 尝试一下。

3) 当出现drivers/rtc/hctosys.c: unable to open rtc device (rtc0)

可以参考一下http://blog.csdn.net/mirkerson/article/details/6731969这篇博文

但是我在参考这篇博文的时候却发现我的内核 在make menuconfig 以后没有

*** on-CPU RTC drivers ***

<*> Samsung S3C series SoC RTC

这一项,这也是大多2410、 或者ARM9 开发板的博客没有提到的,在我编译时就没有Samsung S3C series SoC RTC 这一项,怎么办呢,我将飞凌提供的2.6.36 make menuconfig 了一下,发现有这一项。我才认识到这个能是内核差异造成的。我同时在两个根目录下搜素 on-CPU 发现在 drivers/rtc/Kconfig 中有这个关键的字符串 然后搜索Samsung 找到在Linux2.6.34 中 config RTC depend on ARCH_S3C24XX
而在Linux2.6.36中 depend on ARCH_S3C24XX || ARCH_S3C64XX 。 才知道Linux2.6.34 的内核中RTC时钟不支持ARM11 。现在要做的就是让它支持。这里你可以选择给内核打ARM 自己的补丁, 当时我们有。我将2.6.36的 RTC 文件目录 全部拷贝到对应的 2.6.34 下 当然 这是危险的,呵呵,不过我还是这样做了,因为打补丁可能会破环你先前的所有工作,所以还是选择这种方式修改。 不过在make zImage 的时候问题又来了,检测到在在rtc-s3c.c
文件中有一个宏变量之前没有定义,

然后使用 grep -r [变量名] ./ 在2.6.36根目录下搜索所有有个变量名字符串的文件,找到2.6.34 中没有这个文件的目录,将其拷贝过去,就可以编译通过了,呵呵这可能是个笨办法,但绝对是个可以很快就绝问题的办法,我的很多问题都是通过 用 grep 这个命令去解决的。

到这里我编译好内核以后下载到开发板上就可以正常的进入文字终端了,如果你还没有成功,一定要细细找,不要着急。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: