Chinaunix首页 | 论坛 | 博客
  • 博客访问: 724605
  • 博文数量: 105
  • 博客积分: 3532
  • 博客等级: 中校
  • 技术积分: 1328
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 18:57
文章分类

全部博文(105)

文章存档

2015年(1)

2014年(1)

2013年(7)

2012年(14)

2011年(21)

2010年(61)

分类: LINUX

2010-04-20 22:35:29

曲折路径

一开始就听说学arm很热,2009年5月左右吧,就买了一个pw2440开发板(主要图便宜,在此不是为了给pw2440做广告),可是当时没把注意力转到arm上来,还在迷恋Java和单片机(本人是一个学习杂乱的人,至少以前是),当时实习的工作也是电子政务,所以ARM就这样被搁浅了,这一晃就毕业了,到了上海电院自动控制工程公司,可是在那公司做的只是上位机软件,前2个月没自己的私人电脑,所以也不能做什么,不过这段时间学习了公司的ARM7开发板,写了部分裸机程序,多少对ARM有所了解了,也想跑2440的裸机程序,结果什么都没跑出来板子出问题了,还寄回公司才弄好。等到买了自己的笔记本,一个很痛苦的问题又出现了,没有并口、串口,这对开发来说简直是致命的。所以,学习一直都在理论中进行,可以说没什么进步,最多是了解一点交叉编译器,这期间弄了N多个交叉编译器,都各有优缺点,包括现在我的机器上都还有好几个交叉编译器,迷茫。到了2010年过完新年后,决定不能就这么下去,想方案,要解决arm和fpga的编程问题,想了很多方案,最后敲定一个:USB转串口,PCMCIA转并口;买了换了好几次才找到适合自己电脑的。应该是在2010.3以后才算是把开发环境搭建好,算算这一搁都快一年了,现在才是一个真正的开始。

u-boot

可是一个毛病一直困扰着我,除了原带的bootloader,其他的bootloader跑上去机子就像死的一样,串口一点乱码都不给,简直气死个人,我搁了2个星期都不管了,后来添加控制LED的代码,证明其实代码其实是跑起来的,我把触摸屏拆了,结合原理图看了具体的电路,发现我的晶振和网上流行的12MHz不同,原来是16.9344MHz,可是改了之后还是没反应(改start.S、my2440.h和my2440.c),看看串口,原来这个开发板用的是UART1,u-boot默认的是UART0,网上的基本上也都是UART0,修改过来后(#define CONFIG_SERIAL2 1),串口终于出东西来了,可是我的串口由于是用USB转的,不能用来下载东西,朋友送了一个自己用成功的u-boot,支持NAND flash、DM9000、tftp,可是用在我这上面来nand倒是可以用了,DM9000好像没驱动起来,提示没发现DM9000的id,后来发现我的CONFIG_DM9000_BASE应该是0x18000300,和别人的不大一样,改过来后DM9000驱动成功了,可是老是ping不通主机,tftp也没法用,我linux和windows下都试了,还是没法下载文件,试图添加USB下载功能,可是也用不了,过了几天,一个朋友帮我解决了这个问题,原来在windows上使用tftp服务器的时候,必须把虚拟机关掉,设定固定的IP,才能用,很顺利,按照这个思想,linux的tftp服务器也可用了,虽然tftp可以下载东西,但是一直有个毛病ping不通主机,tftp下载速度也非常非常慢,下载大于15K以上的文件基本上不能成功,朋友说可能是网线问题,我换了好几根交叉网线,甚至自己也做过,都还是那样,又这样过了几天,决定自己做一个bootloader(以前都是使用别人的打包文件做的,或用别人改好的),还算是比较幸运,看到一个很详细的u-boot-2009.08的移植博客:http://blog.chinaunix.net/u3/101649/showart_2105215.html

的确很好的,结合自己开发板做少量改动就OK,用这个u-boot我可以ping通上位机了,tftp的速度也很快了,可是还是存在一个问题,tftp传输的时候经常失败,博客上和朋友都说是网线问题,我想也是,本想叫朋友给寄一根好用的网线过来的,后来自己搜集了添加USB下载功能的资料:http://hi.baidu.com/zy6666/blog/item/b2f4e81f2c048068f624e4a8.html。当然还会有一些改动的地方的,以后慢慢介绍,或者自己根据编译出错的信息修改。该功能加在这个u-boot上,这就是一个perfect的bootloader了,我在使用过程中(特别是在调试内核和文件系统的过程中),老是要输入很多传输,例如 nand write 0x30000000 0x90000 0x280000,你们感觉老输这些烦吗,特别是输多了,都不知道自己输了几个0,老是输错,这些参数又往往是一样的,后来自己做了一些改进,添加了自己的u-boot命令,例如usb更新bootloader,以前需要usbslave 1 0x30000000;nand erase 0x0 0x80000;nand write 0x30000000 0x0 0x80000;reset ,现在只需要y b;就全部搞定,其他常用命令也都做了简化,挺爽的。

其实在移植了u-boot和要启动内核的时候我才真正知道u-boot在这个过程中扮演的角色,首先把自己从nand搬移到TEXT_BASE = 0x33F80000;然后重新在RAM里面运行自己,初始化板子的各个模块,其实除了存储器和串口的初始化,其他的初始化对内核启动没太大的意义,再一切初始化完了以后,把内核从nand的搬移到RAM的一个地址,一般搬移到0x31000000,用bootm来引导内核,bootm根据mkimage根据给内核zImage加的头信息来决定是否解压内核文件,并搬移到头信息里面指定的一个地址,对于2440来说一般是搬移到0x30008000;u-boot把板子初始化的并要传递给内核的信息保存在0x30000100开始的位置,最后用theKernel (0, machid, bd->bi_boot_params);转到内核(0x30008000)运行,u-boot的认为在这之后就玩完了。看看上面红色句子,theKernel其实就是指向内核的指针(0x30008000),后面的参数,0是使R0寄存器为0值,machid是把器件ID传递给R1寄存器,bd->bi_boot_params是把要传递给内核的参数的首地址(0x30000100)传递给R3寄存器,这是要启动内核的硬性规定

linux kernel

如果你编译内核的时候用make zImage,那么你的内核就是经过压缩的(请区分之前说的压缩,这里是内核自己的压缩),这个内核之前会有一段解压内核的程序,才看机器码,你会发现根本就不是linux-2.6.xx/arch/arm/kernel/head.S的机器码,我也为这个苦恼了很久,并有研究机器码的决心,后来才发现,经过压缩的内核最开始执行的头文件是在linux-2.6.xx/arch/arm/boot/compressed/head.S,你可以结合机器码看,完全正确。/boot/compressed/head.S就是用于解压内核的,解压完了之后才会跳转到/kernel/head.S。为什么要关心这些呢,主要是因为我的开发板用的是UART1,虽然u-boot有传串口为1的信息给内核,可是在解压缩的时候并没有用到这个参数,这样要在配置内核的时候直接配置,而在解压过程中也需要打印一些信息出来,由于UART0没有初始化,所以传输永远不会成功,会停留在Starting kernel ...  。其他的配置感觉自己开发板来决定,具体配置后面讲

file system

文件系统其实没必要做的很复杂,能启动就OK,以后需要什么东西自己可以在板子上修改或添加,yaffs2文件系统用起来还是很舒服的。

 

今天就先写在这里,有错误的地方希望大家指出

 

 

阅读(1810) | 评论(4) | 转发(0) |
0

上一篇:没有了

下一篇:告诉你:嵌入式学习过程是怎么样的?

给主人留下些什么吧!~~

yaoyabad2011-10-19 12:51:09

jerry20000: 原来你也走了这么多弯路啊。.....
是的,没人指点,所以走弯路很痛苦

jerry200002011-09-21 19:03:39

原来你也走了这么多弯路啊。

jerry200002011-09-21 19:03:37

原来你也走了这么多弯路啊。

chinaunix网友2010-04-21 13:20:13

来踩啦,以后经常来想你学习,呵呵~